config去掉system_prompt
This commit is contained in:
@@ -26,7 +26,6 @@ class AgentConfig:
|
|||||||
baseurl: str
|
baseurl: str
|
||||||
key: str
|
key: str
|
||||||
model_id: str
|
model_id: str
|
||||||
system_prompt: str | None
|
|
||||||
temperature: float = 0.7
|
temperature: float = 0.7
|
||||||
max_concurrent: int = 30
|
max_concurrent: int = 30
|
||||||
timeout: int = 2000
|
timeout: int = 2000
|
||||||
@@ -68,8 +67,8 @@ class PromptsCounter:
|
|||||||
|
|
||||||
|
|
||||||
PreSendHandlerType = Callable[[str, str], tuple[str, str]]
|
PreSendHandlerType = Callable[[str, str], tuple[str, str]]
|
||||||
ResultHandlerType = Callable[[str, str, logging.Logger], str]
|
ResultHandlerType = Callable[[str, str, logging.Logger], Any]
|
||||||
ErrorResultHandlerType = Callable[[str, logging.Logger], str]
|
ErrorResultHandlerType = Callable[[str, logging.Logger], Any]
|
||||||
|
|
||||||
|
|
||||||
class Agent:
|
class Agent:
|
||||||
@@ -90,7 +89,7 @@ class Agent:
|
|||||||
self.domain = urlparse(self.baseurl).netloc
|
self.domain = urlparse(self.baseurl).netloc
|
||||||
self.key = config.key.strip() or "xx"
|
self.key = config.key.strip() or "xx"
|
||||||
self.model_id = config.model_id.strip()
|
self.model_id = config.model_id.strip()
|
||||||
self.system_prompt = config.system_prompt or ""
|
self.system_prompt = ""
|
||||||
self.temperature = config.temperature
|
self.temperature = config.temperature
|
||||||
self.max_concurrent = config.max_concurrent
|
self.max_concurrent = config.max_concurrent
|
||||||
self.timeout = config.timeout
|
self.timeout = config.timeout
|
||||||
@@ -158,6 +157,8 @@ class Agent:
|
|||||||
self.logger.warning(f"AI请求连接错误 (async): {repr(e)}")
|
self.logger.warning(f"AI请求连接错误 (async): {repr(e)}")
|
||||||
except (KeyError, IndexError) as e:
|
except (KeyError, IndexError) as e:
|
||||||
raise Exception(f"AI响应格式错误 (async): {repr(e)}")
|
raise Exception(f"AI响应格式错误 (async): {repr(e)}")
|
||||||
|
except ValueError as e:
|
||||||
|
self.logger.warning(f"{e.__repr__()}")
|
||||||
# 如果没有正常获取结果则重试
|
# 如果没有正常获取结果则重试
|
||||||
if retry and retry_count < MAX_RETRY_COUNT:
|
if retry and retry_count < MAX_RETRY_COUNT:
|
||||||
if self.total_error_counter.add():
|
if self.total_error_counter.add():
|
||||||
@@ -181,7 +182,7 @@ class Agent:
|
|||||||
) -> list[Any]:
|
) -> list[Any]:
|
||||||
max_concurrent = self.max_concurrent if max_concurrent is None else max_concurrent
|
max_concurrent = self.max_concurrent if max_concurrent is None else max_concurrent
|
||||||
total = len(prompts)
|
total = len(prompts)
|
||||||
self.logger.info(f"base-url:{self.baseurl},model-id:{self.model_id}")
|
self.logger.info(f"base-url:{self.baseurl},model-id:{self.model_id},concurrent:{self.max_concurrent},temperature:{self.temperature}")
|
||||||
self.logger.info(f"预计发送{total}个请求,并发请求数:{max_concurrent}")
|
self.logger.info(f"预计发送{total}个请求,并发请求数:{max_concurrent}")
|
||||||
self.total_error_counter.max_errors_count = len(prompts) // MAX_REQUESTS_PER_ERROR # 允许多少个异常
|
self.total_error_counter.max_errors_count = len(prompts) // MAX_REQUESTS_PER_ERROR # 允许多少个异常
|
||||||
count = 0
|
count = 0
|
||||||
@@ -258,7 +259,8 @@ class Agent:
|
|||||||
pre_send_handler,
|
pre_send_handler,
|
||||||
result_handler,
|
result_handler,
|
||||||
error_result_handler) -> Any:
|
error_result_handler) -> Any:
|
||||||
result = self.send(client, prompt, system_prompt, pre_send_handler=pre_send_handler,result_handler=result_handler,
|
result = self.send(client, prompt, system_prompt, pre_send_handler=pre_send_handler,
|
||||||
|
result_handler=result_handler,
|
||||||
error_result_handler=error_result_handler)
|
error_result_handler=error_result_handler)
|
||||||
count.add()
|
count.add()
|
||||||
return result
|
return result
|
||||||
@@ -271,7 +273,7 @@ class Agent:
|
|||||||
result_handler: ResultHandlerType = None,
|
result_handler: ResultHandlerType = None,
|
||||||
error_result_handler: ErrorResultHandlerType = None
|
error_result_handler: ErrorResultHandlerType = None
|
||||||
) -> list[Any]:
|
) -> list[Any]:
|
||||||
self.logger.info(f"base-url:{self.baseurl},model-id:{self.model_id}")
|
self.logger.info(f"base-url:{self.baseurl},model-id:{self.model_id},concurrent:{self.max_concurrent},temperature:{self.temperature}")
|
||||||
self.logger.info(f"预计发送{len(prompts)}个请求,并发请求数:{self.max_concurrent}")
|
self.logger.info(f"预计发送{len(prompts)}个请求,并发请求数:{self.max_concurrent}")
|
||||||
self.total_error_counter.max_errors_count = len(prompts) // MAX_REQUESTS_PER_ERROR # 允许多少个异常
|
self.total_error_counter.max_errors_count = len(prompts) // MAX_REQUESTS_PER_ERROR # 允许多少个异常
|
||||||
# 创建单个计数器实例
|
# 创建单个计数器实例
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ You are a professional machine translation engine.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def _result_handler(self, result: str, origin_prompt: str, logger: Logger):
|
def _result_handler(self, result: str, origin_prompt: str, logger: Logger):
|
||||||
|
if result == "":
|
||||||
|
return []
|
||||||
try:
|
try:
|
||||||
result = json_repair.loads(result)
|
result = json_repair.loads(result)
|
||||||
if not isinstance(result, list):
|
if not isinstance(result, list):
|
||||||
@@ -56,6 +58,8 @@ You are a professional machine translation engine.
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
def _error_result_handler(self, origin_prompt: str, logger: Logger):
|
def _error_result_handler(self, origin_prompt: str, logger: Logger):
|
||||||
|
if origin_prompt == "":
|
||||||
|
return []
|
||||||
try:
|
try:
|
||||||
return json_repair.loads(origin_prompt)
|
return json_repair.loads(origin_prompt)
|
||||||
except:
|
except:
|
||||||
@@ -79,11 +83,11 @@ You are a professional machine translation engine.
|
|||||||
self.logger.info(f"json解析错误,解析文本:{chunk},错误:{e.__repr__()}")
|
self.logger.info(f"json解析错误,解析文本:{chunk},错误:{e.__repr__()}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.logger.info(f"send_segments发生错误:{e.__repr__()}")
|
self.logger.info(f"send_segments发生错误:{e.__repr__()}")
|
||||||
|
self.logger.info("术语表提取完成")
|
||||||
return result
|
return result
|
||||||
|
|
||||||
async def send_segments_async(self, segments: list[str], chunk_size: int):
|
async def send_segments_async(self, segments: list[str], chunk_size: int):
|
||||||
self.logger.info("开始提取术语表")
|
self.logger.info("开始术语表提取")
|
||||||
result = {}
|
result = {}
|
||||||
indexed_originals, chunks, merged_indices_list = await asyncio.to_thread(segments2json_chunks, segments,
|
indexed_originals, chunks, merged_indices_list = await asyncio.to_thread(segments2json_chunks, segments,
|
||||||
chunk_size)
|
chunk_size)
|
||||||
@@ -101,4 +105,5 @@ You are a professional machine translation engine.
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.logger.info(f"send_segments发生错误:{e.__repr__()}")
|
self.logger.info(f"send_segments发生错误:{e.__repr__()}")
|
||||||
print(f"术语表:\n{result}")
|
print(f"术语表:\n{result}")
|
||||||
|
self.logger.info("术语表提取完成")
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -57,16 +57,19 @@ Warning: Never wrap the entire JSON object in quotes to make it a single string.
|
|||||||
return system_prompt, prompt
|
return system_prompt, prompt
|
||||||
|
|
||||||
def _result_handler(self, result: str, origin_prompt: str, logger: Logger):
|
def _result_handler(self, result: str, origin_prompt: str, logger: Logger):
|
||||||
|
if result == "":
|
||||||
|
return {}
|
||||||
try:
|
try:
|
||||||
result = json_repair.loads(result)
|
result = json_repair.loads(result)
|
||||||
if not isinstance(result, dict):
|
if not isinstance(result, dict):
|
||||||
raise ValueError("agent返回结果不是dict的json形式")
|
raise ValueError(f"agent返回结果不是dict的json形式,result:{result}")
|
||||||
except:
|
except RuntimeError as e:
|
||||||
logger.error("结果不能正确解析")
|
raise ValueError(f"结果不能正确解析:{e.__repr__()}")
|
||||||
return self._error_result_handler(origin_prompt, logger)
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def _error_result_handler(self, origin_prompt: str, logger: Logger):
|
def _error_result_handler(self, origin_prompt: str, logger: Logger):
|
||||||
|
if origin_prompt == "":
|
||||||
|
return {}
|
||||||
try:
|
try:
|
||||||
return json_repair.loads(origin_prompt)
|
return json_repair.loads(origin_prompt)
|
||||||
except:
|
except:
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ from pydantic import BaseModel, Field, field_validator
|
|||||||
|
|
||||||
from docutranslate import __version__
|
from docutranslate import __version__
|
||||||
from docutranslate.agents.agent import ThinkingMode
|
from docutranslate.agents.agent import ThinkingMode
|
||||||
|
from docutranslate.agents.glossary_agent import GlossaryAgentConfig
|
||||||
from docutranslate.exporter.md.types import ConvertEngineType
|
from docutranslate.exporter.md.types import ConvertEngineType
|
||||||
# --- 核心代码 Imports ---
|
# --- 核心代码 Imports ---
|
||||||
from docutranslate.global_values.conditional_import import DOCLING_EXIST
|
from docutranslate.global_values.conditional_import import DOCLING_EXIST
|
||||||
@@ -220,6 +221,16 @@ app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static")
|
|||||||
# --- Pydantic Models for Service API ---
|
# --- Pydantic Models for Service API ---
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
|
||||||
|
class GlossaryAgentConfigPayload(BaseModel):
|
||||||
|
baseurl: str = Field(..., description="用于术语表生成的Agent的LLM API基础URL。", examples=["https://api.openai.com/v1"])
|
||||||
|
key: str = Field(..., description="用于术语表生成的Agent的LLM API密钥。", examples=["sk-agent-api-key"])
|
||||||
|
model_id: str = Field(..., description="用于术语表生成的Agent的模型ID。", examples=["gpt-4-turbo"])
|
||||||
|
temperature: float = Field(default=0.7, description="用于术语表生成的Agent的温度参数。")
|
||||||
|
max_concurrent: int = Field(default=30, description="Agent的最大并发请求数。")
|
||||||
|
timeout: int = Field(default=2000, description="Agent的API调用超时时间。")
|
||||||
|
thinking: ThinkingMode = Field(default="default", description="Agent的思考模式。")
|
||||||
|
|
||||||
|
|
||||||
# 1. 定义所有工作流共享的基础参数
|
# 1. 定义所有工作流共享的基础参数
|
||||||
class BaseWorkflowParams(BaseModel):
|
class BaseWorkflowParams(BaseModel):
|
||||||
base_url: str = Field(..., description="LLM API的基础URL。", examples=["https://api.openai.com/v1"])
|
base_url: str = Field(..., description="LLM API的基础URL。", examples=["https://api.openai.com/v1"])
|
||||||
@@ -233,6 +244,15 @@ class BaseWorkflowParams(BaseModel):
|
|||||||
examples=["default", "enable", "disable"])
|
examples=["default", "enable", "disable"])
|
||||||
custom_prompt: Optional[str] = Field(None, description="用户自定义的翻译Prompt。", alias="custom_prompt")
|
custom_prompt: Optional[str] = Field(None, description="用户自定义的翻译Prompt。", alias="custom_prompt")
|
||||||
glossary_dict: Optional[Dict[str, str]] = Field(None, description="术语表字典,key为原文,value为译文。")
|
glossary_dict: Optional[Dict[str, str]] = Field(None, description="术语表字典,key为原文,value为译文。")
|
||||||
|
glossary_generate_enable: bool = Field(default=False, description="是否开启术语表自动生成。")
|
||||||
|
glossary_agent_config: Optional[GlossaryAgentConfigPayload] = Field(None,
|
||||||
|
description="用于术语表生成的Agent的配置。如果 `glossary_generate_enable` 为 `True`,此项必填。")
|
||||||
|
|
||||||
|
@field_validator('glossary_agent_config')
|
||||||
|
def check_glossary_config(cls, v, values):
|
||||||
|
if values.data.get('glossary_generate_enable') and not v:
|
||||||
|
raise ValueError("当 `glossary_generate_enable` 为 `True` 时, `glossary_agent_config` 字段是必须的。")
|
||||||
|
return v
|
||||||
|
|
||||||
|
|
||||||
# 2. 为每个工作流创建独立的参数模型
|
# 2. 为每个工作流创建独立的参数模型
|
||||||
@@ -410,6 +430,27 @@ class TranslateServiceRequest(BaseModel):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"summary": "XLSX 带术语表生成",
|
||||||
|
"value": {
|
||||||
|
"file_name": "complex_terms.xlsx",
|
||||||
|
"file_content": "UEsDBBQAAAAIA... (base64-encoded xlsx)",
|
||||||
|
"payload": {
|
||||||
|
"workflow_type": "xlsx",
|
||||||
|
"base_url": "https://api.openai.com/v1",
|
||||||
|
"api_key": "sk-your-main-translator-key",
|
||||||
|
"model_id": "gpt-4o",
|
||||||
|
"to_lang": "简体中文",
|
||||||
|
"glossary_generate_enable": True,
|
||||||
|
"glossary_agent_config": {
|
||||||
|
"baseurl": "https://api.openai.com/v1",
|
||||||
|
"key": "sk-your-agent-key-for-glossary",
|
||||||
|
"model_id": "gpt-4-turbo",
|
||||||
|
"temperature": 0.5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"summary": "DOCX 工作流示例",
|
"summary": "DOCX 工作流示例",
|
||||||
"value": {
|
"value": {
|
||||||
@@ -508,15 +549,28 @@ async def _perform_translation(
|
|||||||
|
|
||||||
workflow: Workflow
|
workflow: Workflow
|
||||||
|
|
||||||
|
# 辅助函数:构建术语表生成配置
|
||||||
|
def build_glossary_agent_config():
|
||||||
|
if payload.glossary_generate_enable and payload.glossary_agent_config:
|
||||||
|
agent_payload = payload.glossary_agent_config
|
||||||
|
return GlossaryAgentConfig(
|
||||||
|
logger=task_logger,
|
||||||
|
to_lang=payload.to_lang,
|
||||||
|
**agent_payload.model_dump()
|
||||||
|
)
|
||||||
|
return None
|
||||||
|
|
||||||
# 2. 根据 payload 的具体类型构建配置并实例化 workflow
|
# 2. 根据 payload 的具体类型构建配置并实例化 workflow
|
||||||
if isinstance(payload, MarkdownWorkflowParams):
|
if isinstance(payload, MarkdownWorkflowParams):
|
||||||
task_logger.info("构建 MarkdownBasedWorkflow 配置。")
|
task_logger.info("构建 MarkdownBasedWorkflow 配置。")
|
||||||
translator_config = MDTranslatorConfig(
|
translator_args = payload.model_dump(include={
|
||||||
**payload.model_dump(include={
|
|
||||||
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
||||||
'temperature', 'thinking', 'chunk_size', 'concurrent', 'glossary_dict'
|
'temperature', 'thinking', 'chunk_size', 'concurrent', 'glossary_dict'
|
||||||
}, exclude_none=True)
|
}, exclude_none=True)
|
||||||
)
|
translator_args['glossary_generate_enable'] = payload.glossary_generate_enable
|
||||||
|
translator_args['glossary_agent_config'] = build_glossary_agent_config()
|
||||||
|
translator_config = MDTranslatorConfig(**translator_args)
|
||||||
|
|
||||||
converter_config = None
|
converter_config = None
|
||||||
if payload.convert_engine == 'mineru':
|
if payload.convert_engine == 'mineru':
|
||||||
converter_config = ConverterMineruConfig(logger=task_logger, mineru_token=payload.mineru_token,
|
converter_config = ConverterMineruConfig(logger=task_logger, mineru_token=payload.mineru_token,
|
||||||
@@ -535,12 +589,14 @@ async def _perform_translation(
|
|||||||
|
|
||||||
elif isinstance(payload, TextWorkflowParams):
|
elif isinstance(payload, TextWorkflowParams):
|
||||||
task_logger.info("构建 TXTWorkflow 配置。")
|
task_logger.info("构建 TXTWorkflow 配置。")
|
||||||
translator_config = TXTTranslatorConfig(
|
translator_args = payload.model_dump(include={
|
||||||
**payload.model_dump(include={
|
|
||||||
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
||||||
'temperature', 'thinking', 'chunk_size', 'concurrent', 'glossary_dict'
|
'temperature', 'thinking', 'chunk_size', 'concurrent', 'glossary_dict'
|
||||||
}, exclude_none=True)
|
}, exclude_none=True)
|
||||||
)
|
translator_args['glossary_generate_enable'] = payload.glossary_generate_enable
|
||||||
|
translator_args['glossary_agent_config'] = build_glossary_agent_config()
|
||||||
|
translator_config = TXTTranslatorConfig(**translator_args)
|
||||||
|
|
||||||
html_exporter_config = TXT2HTMLExporterConfig(cdn=True)
|
html_exporter_config = TXT2HTMLExporterConfig(cdn=True)
|
||||||
workflow_config = TXTWorkflowConfig(
|
workflow_config = TXTWorkflowConfig(
|
||||||
translator_config=translator_config, html_exporter_config=html_exporter_config,
|
translator_config=translator_config, html_exporter_config=html_exporter_config,
|
||||||
@@ -550,13 +606,15 @@ async def _perform_translation(
|
|||||||
|
|
||||||
elif isinstance(payload, JsonWorkflowParams):
|
elif isinstance(payload, JsonWorkflowParams):
|
||||||
task_logger.info("构建 JsonWorkflow 配置。")
|
task_logger.info("构建 JsonWorkflow 配置。")
|
||||||
translator_config = JsonTranslatorConfig(
|
translator_args = payload.model_dump(include={
|
||||||
json_paths=payload.json_paths,
|
|
||||||
**payload.model_dump(include={
|
|
||||||
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
||||||
'temperature', 'thinking', 'chunk_size', 'concurrent', 'glossary_dict'
|
'temperature', 'thinking', 'chunk_size', 'concurrent', 'glossary_dict',
|
||||||
|
'json_paths'
|
||||||
}, exclude_none=True)
|
}, exclude_none=True)
|
||||||
)
|
translator_args['glossary_generate_enable'] = payload.glossary_generate_enable
|
||||||
|
translator_args['glossary_agent_config'] = build_glossary_agent_config()
|
||||||
|
translator_config = JsonTranslatorConfig(**translator_args)
|
||||||
|
|
||||||
html_exporter_config = Json2HTMLExporterConfig(cdn=True)
|
html_exporter_config = Json2HTMLExporterConfig(cdn=True)
|
||||||
workflow_config = JsonWorkflowConfig(
|
workflow_config = JsonWorkflowConfig(
|
||||||
translator_config=translator_config, html_exporter_config=html_exporter_config,
|
translator_config=translator_config, html_exporter_config=html_exporter_config,
|
||||||
@@ -566,13 +624,15 @@ async def _perform_translation(
|
|||||||
|
|
||||||
elif isinstance(payload, XlsxWorkflowParams):
|
elif isinstance(payload, XlsxWorkflowParams):
|
||||||
task_logger.info("构建 XlsxWorkflow 配置。")
|
task_logger.info("构建 XlsxWorkflow 配置。")
|
||||||
translator_config = XlsxTranslatorConfig(
|
translator_args = payload.model_dump(include={
|
||||||
**payload.model_dump(include={
|
|
||||||
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
||||||
'temperature', 'thinking', 'chunk_size', 'concurrent',
|
'temperature', 'thinking', 'chunk_size', 'concurrent',
|
||||||
'insert_mode', 'separator', 'translate_regions', 'glossary_dict'
|
'insert_mode', 'separator', 'translate_regions', 'glossary_dict'
|
||||||
}, exclude_none=True)
|
}, exclude_none=True)
|
||||||
)
|
translator_args['glossary_generate_enable'] = payload.glossary_generate_enable
|
||||||
|
translator_args['glossary_agent_config'] = build_glossary_agent_config()
|
||||||
|
translator_config = XlsxTranslatorConfig(**translator_args)
|
||||||
|
|
||||||
html_exporter_config = Xlsx2HTMLExporterConfig(cdn=True)
|
html_exporter_config = Xlsx2HTMLExporterConfig(cdn=True)
|
||||||
workflow_config = XlsxWorkflowConfig(
|
workflow_config = XlsxWorkflowConfig(
|
||||||
translator_config=translator_config,
|
translator_config=translator_config,
|
||||||
@@ -583,13 +643,15 @@ async def _perform_translation(
|
|||||||
|
|
||||||
elif isinstance(payload, DocxWorkflowParams):
|
elif isinstance(payload, DocxWorkflowParams):
|
||||||
task_logger.info("构建 DocxWorkflow 配置。")
|
task_logger.info("构建 DocxWorkflow 配置。")
|
||||||
translator_config = DocxTranslatorConfig(
|
translator_args = payload.model_dump(include={
|
||||||
**payload.model_dump(include={
|
|
||||||
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
||||||
'temperature', 'thinking', 'chunk_size', 'concurrent',
|
'temperature', 'thinking', 'chunk_size', 'concurrent',
|
||||||
'insert_mode', 'separator', 'glossary_dict'
|
'insert_mode', 'separator', 'glossary_dict'
|
||||||
}, exclude_none=True)
|
}, exclude_none=True)
|
||||||
)
|
translator_args['glossary_generate_enable'] = payload.glossary_generate_enable
|
||||||
|
translator_args['glossary_agent_config'] = build_glossary_agent_config()
|
||||||
|
translator_config = DocxTranslatorConfig(**translator_args)
|
||||||
|
|
||||||
html_exporter_config = Docx2HTMLExporterConfig(cdn=True)
|
html_exporter_config = Docx2HTMLExporterConfig(cdn=True)
|
||||||
workflow_config = DocxWorkflowConfig(
|
workflow_config = DocxWorkflowConfig(
|
||||||
translator_config=translator_config,
|
translator_config=translator_config,
|
||||||
@@ -600,13 +662,15 @@ async def _perform_translation(
|
|||||||
|
|
||||||
elif isinstance(payload, SrtWorkflowParams):
|
elif isinstance(payload, SrtWorkflowParams):
|
||||||
task_logger.info("构建 SrtWorkflow 配置。")
|
task_logger.info("构建 SrtWorkflow 配置。")
|
||||||
translator_config = SrtTranslatorConfig(
|
translator_args = payload.model_dump(include={
|
||||||
**payload.model_dump(include={
|
|
||||||
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
||||||
'temperature', 'thinking', 'chunk_size', 'concurrent',
|
'temperature', 'thinking', 'chunk_size', 'concurrent',
|
||||||
'insert_mode', 'separator', 'glossary_dict'
|
'insert_mode', 'separator', 'glossary_dict'
|
||||||
}, exclude_none=True)
|
}, exclude_none=True)
|
||||||
)
|
translator_args['glossary_generate_enable'] = payload.glossary_generate_enable
|
||||||
|
translator_args['glossary_agent_config'] = build_glossary_agent_config()
|
||||||
|
translator_config = SrtTranslatorConfig(**translator_args)
|
||||||
|
|
||||||
html_exporter_config = Srt2HTMLExporterConfig(cdn=True)
|
html_exporter_config = Srt2HTMLExporterConfig(cdn=True)
|
||||||
workflow_config = SrtWorkflowConfig(
|
workflow_config = SrtWorkflowConfig(
|
||||||
translator_config=translator_config,
|
translator_config=translator_config,
|
||||||
@@ -617,13 +681,15 @@ async def _perform_translation(
|
|||||||
|
|
||||||
elif isinstance(payload, EpubWorkflowParams):
|
elif isinstance(payload, EpubWorkflowParams):
|
||||||
task_logger.info("构建 EpubWorkflow 配置。")
|
task_logger.info("构建 EpubWorkflow 配置。")
|
||||||
translator_config = EpubTranslatorConfig(
|
translator_args = payload.model_dump(include={
|
||||||
**payload.model_dump(include={
|
|
||||||
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
||||||
'temperature', 'thinking', 'chunk_size', 'concurrent',
|
'temperature', 'thinking', 'chunk_size', 'concurrent',
|
||||||
'insert_mode', 'separator', 'glossary_dict'
|
'insert_mode', 'separator', 'glossary_dict'
|
||||||
}, exclude_none=True)
|
}, exclude_none=True)
|
||||||
)
|
translator_args['glossary_generate_enable'] = payload.glossary_generate_enable
|
||||||
|
translator_args['glossary_agent_config'] = build_glossary_agent_config()
|
||||||
|
translator_config = EpubTranslatorConfig(**translator_args)
|
||||||
|
|
||||||
html_exporter_config = Epub2HTMLExporterConfig(cdn=True)
|
html_exporter_config = Epub2HTMLExporterConfig(cdn=True)
|
||||||
workflow_config = EpubWorkflowConfig(
|
workflow_config = EpubWorkflowConfig(
|
||||||
translator_config=translator_config,
|
translator_config=translator_config,
|
||||||
@@ -635,13 +701,15 @@ async def _perform_translation(
|
|||||||
# --- HTML WORKFLOW LOGIC START ---
|
# --- HTML WORKFLOW LOGIC START ---
|
||||||
elif isinstance(payload, HtmlWorkflowParams):
|
elif isinstance(payload, HtmlWorkflowParams):
|
||||||
task_logger.info("构建 HtmlWorkflow 配置。")
|
task_logger.info("构建 HtmlWorkflow 配置。")
|
||||||
translator_config = HtmlTranslatorConfig(
|
translator_args = payload.model_dump(include={
|
||||||
**payload.model_dump(include={
|
|
||||||
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
'base_url', 'api_key', 'model_id', 'to_lang', 'custom_prompt',
|
||||||
'temperature', 'thinking', 'chunk_size', 'concurrent',
|
'temperature', 'thinking', 'chunk_size', 'concurrent',
|
||||||
'insert_mode', 'separator', 'glossary_dict'
|
'insert_mode', 'separator', 'glossary_dict'
|
||||||
}, exclude_none=True)
|
}, exclude_none=True)
|
||||||
)
|
translator_args['glossary_generate_enable'] = payload.glossary_generate_enable
|
||||||
|
translator_args['glossary_agent_config'] = build_glossary_agent_config()
|
||||||
|
translator_config = HtmlTranslatorConfig(**translator_args)
|
||||||
|
|
||||||
workflow_config = HtmlWorkflowConfig(
|
workflow_config = HtmlWorkflowConfig(
|
||||||
translator_config=translator_config,
|
translator_config=translator_config,
|
||||||
logger=task_logger
|
logger=task_logger
|
||||||
|
|||||||
@@ -8,9 +8,14 @@ class Glossary:
|
|||||||
self.glossary_dict[src]=dst
|
self.glossary_dict[src]=dst
|
||||||
|
|
||||||
def append_system_prompt(self,text:str):
|
def append_system_prompt(self,text:str):
|
||||||
|
flag=False
|
||||||
prompt="\n以下为参考术语表:\n"
|
prompt="\n以下为参考术语表:\n"
|
||||||
for src,dst in self.glossary_dict.items():
|
for src,dst in self.glossary_dict.items():
|
||||||
if src in text:
|
if src in text:
|
||||||
prompt+=f"{src}=>{dst}\n"
|
prompt+=f"{src}=>{dst}\n"
|
||||||
|
flag=True
|
||||||
prompt+="术语表结束\n"
|
prompt+="术语表结束\n"
|
||||||
|
if flag:
|
||||||
return prompt
|
return prompt
|
||||||
|
else:
|
||||||
|
return ""
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -21,7 +21,7 @@ class AiTranslatorConfig(TranslatorConfig):
|
|||||||
chunk_size: int = 3000
|
chunk_size: int = 3000
|
||||||
concurrent: int = 30
|
concurrent: int = 30
|
||||||
glossary_dict: dict[str:str] | None = None
|
glossary_dict: dict[str:str] | None = None
|
||||||
glossary_generate_enable: bool = True
|
glossary_generate_enable: bool = False
|
||||||
glossary_agent_config: GlossaryAgentConfig | None = None
|
glossary_agent_config: GlossaryAgentConfig | None = None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ class DocxTranslator(AiTranslator):
|
|||||||
baseurl=config.base_url,
|
baseurl=config.base_url,
|
||||||
key=config.api_key,
|
key=config.api_key,
|
||||||
model_id=config.model_id,
|
model_id=config.model_id,
|
||||||
system_prompt=None,
|
|
||||||
temperature=config.temperature,
|
temperature=config.temperature,
|
||||||
thinking=config.thinking,
|
thinking=config.thinking,
|
||||||
max_concurrent=config.concurrent,
|
max_concurrent=config.concurrent,
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class EpubTranslator(AiTranslator):
|
|||||||
agent_config = SegmentsTranslateAgentConfig(
|
agent_config = SegmentsTranslateAgentConfig(
|
||||||
custom_prompt=config.custom_prompt, to_lang=config.to_lang,
|
custom_prompt=config.custom_prompt, to_lang=config.to_lang,
|
||||||
baseurl=config.base_url, key=config.api_key, model_id=config.model_id,
|
baseurl=config.base_url, key=config.api_key, model_id=config.model_id,
|
||||||
system_prompt=None, temperature=config.temperature, thinking=config.thinking,
|
temperature=config.temperature, thinking=config.thinking,
|
||||||
max_concurrent=config.concurrent, timeout=config.timeout, logger=self.logger,
|
max_concurrent=config.concurrent, timeout=config.timeout, logger=self.logger,
|
||||||
glossary_dict=config.glossary_dict
|
glossary_dict=config.glossary_dict
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -91,7 +91,6 @@ class HtmlTranslator(AiTranslator):
|
|||||||
baseurl=config.base_url,
|
baseurl=config.base_url,
|
||||||
key=config.api_key,
|
key=config.api_key,
|
||||||
model_id=config.model_id,
|
model_id=config.model_id,
|
||||||
system_prompt=None,
|
|
||||||
temperature=config.temperature,
|
temperature=config.temperature,
|
||||||
thinking=config.thinking,
|
thinking=config.thinking,
|
||||||
max_concurrent=config.concurrent,
|
max_concurrent=config.concurrent,
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ class JsonTranslator(AiTranslator):
|
|||||||
baseurl=config.base_url,
|
baseurl=config.base_url,
|
||||||
key=config.api_key,
|
key=config.api_key,
|
||||||
model_id=config.model_id,
|
model_id=config.model_id,
|
||||||
system_prompt=None,
|
|
||||||
temperature=config.temperature,
|
temperature=config.temperature,
|
||||||
thinking=config.thinking,
|
thinking=config.thinking,
|
||||||
max_concurrent=config.concurrent,
|
max_concurrent=config.concurrent,
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ class MDTranslator(AiTranslator):
|
|||||||
baseurl=config.base_url,
|
baseurl=config.base_url,
|
||||||
key=config.api_key,
|
key=config.api_key,
|
||||||
model_id=config.model_id,
|
model_id=config.model_id,
|
||||||
system_prompt=None,
|
|
||||||
temperature=config.temperature,
|
temperature=config.temperature,
|
||||||
thinking=config.thinking,
|
thinking=config.thinking,
|
||||||
max_concurrent=config.concurrent,
|
max_concurrent=config.concurrent,
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ class SrtTranslator(AiTranslator):
|
|||||||
baseurl=config.base_url,
|
baseurl=config.base_url,
|
||||||
key=config.api_key,
|
key=config.api_key,
|
||||||
model_id=config.model_id,
|
model_id=config.model_id,
|
||||||
system_prompt=None,
|
|
||||||
temperature=config.temperature,
|
temperature=config.temperature,
|
||||||
thinking=config.thinking,
|
thinking=config.thinking,
|
||||||
max_concurrent=config.concurrent,
|
max_concurrent=config.concurrent,
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ class TXTTranslator(AiTranslator):
|
|||||||
baseurl=config.base_url,
|
baseurl=config.base_url,
|
||||||
key=config.api_key,
|
key=config.api_key,
|
||||||
model_id=config.model_id,
|
model_id=config.model_id,
|
||||||
system_prompt=None,
|
|
||||||
temperature=config.temperature,
|
temperature=config.temperature,
|
||||||
thinking=config.thinking,
|
thinking=config.thinking,
|
||||||
max_concurrent=config.concurrent,
|
max_concurrent=config.concurrent,
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ class XlsxTranslator(AiTranslator):
|
|||||||
baseurl=config.base_url,
|
baseurl=config.base_url,
|
||||||
key=config.api_key,
|
key=config.api_key,
|
||||||
model_id=config.model_id,
|
model_id=config.model_id,
|
||||||
system_prompt=None,
|
|
||||||
temperature=config.temperature,
|
temperature=config.temperature,
|
||||||
thinking=config.thinking,
|
thinking=config.thinking,
|
||||||
max_concurrent=config.concurrent,
|
max_concurrent=config.concurrent,
|
||||||
|
|||||||
Reference in New Issue
Block a user