Files
docutranslate/docutranslate/translator/ai_translator/base.py
2025-08-29 09:37:06 +08:00

71 lines
2.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SPDX-FileCopyrightText: 2025 QinHan
# SPDX-License-Identifier: MPL-2.0
from abc import abstractmethod
from dataclasses import dataclass, field
from typing import TypeVar
from docutranslate.agents.agent import ThinkingMode
from docutranslate.agents.glossary_agent import GlossaryAgentConfig, GlossaryAgent
from docutranslate.ir.document import Document
from docutranslate.translator.base import Translator, TranslatorConfig
@dataclass(kw_only=True)
class AiTranslatorConfig(TranslatorConfig):
base_url: str | None = field(default=None,metadata={"description": "OpenAI兼容地址当skip_translate为False时为必填项"})
api_key: str | None = field(default=None,metadata={"description": "当skip_translate为False时为必填项"})
model_id: str | None = field(default=None,metadata={"description": "当skip_translate为False时为必填项"})
to_lang: str = "简体中文"
custom_prompt: str | None = None
temperature: float = 0.7
thinking: ThinkingMode = "default"
timeout: int = 2000
chunk_size: int = 3000
concurrent: int = 30
glossary_dict: dict[str:str] | None = field(default=None)
glossary_generate_enable: bool = False
glossary_agent_config: GlossaryAgentConfig | None = None
skip_translate: bool = False
T = TypeVar('T', bound=Document)
class AiTranslator(Translator[T]):
"""
翻译中间文本原地替换Translator不做格式转换
"""
def __init__(self, config: AiTranslatorConfig):
super().__init__(config=config)
self.skip_translate = config.skip_translate
self.glossary_agent = None
self.glossary_dict_gen = None
if not self.skip_translate and (config.base_url is None or config.api_key is None or config.model_id is None):
raise ValueError("skip_translate不为false时base_url、api_key、model_id为必填项")
if config.glossary_generate_enable:
if config.glossary_agent_config:
self.glossary_agent = GlossaryAgent(config.glossary_agent_config)
else:
glossary_agent_config = GlossaryAgentConfig(
to_lang=config.to_lang,
baseurl=config.base_url,
key=config.api_key,
model_id=config.model_id,
temperature=config.temperature,
thinking=config.thinking,
max_concurrent=config.concurrent,
timeout=config.timeout,
logger=self.logger,
)
self.glossary_agent = GlossaryAgent(glossary_agent_config)
@abstractmethod
def translate(self, document: T) -> Document:
...
@abstractmethod
async def translate_async(self, document: T) -> Document:
...