From 78ee7f9e8895d5701b64bb84227132d656692f46 Mon Sep 17 00:00:00 2001 From: xunbu Date: Tue, 30 Dec 2025 20:20:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9Bprovider?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docutranslate/agents/agent.py | 3 ++- docutranslate/agents/provider/__init__.py | 1 + docutranslate/agents/provider/provider.py | 16 ++++++++++++++++ .../agents/thinking/thinking_factory.py | 19 +++++++++---------- docutranslate/app.py | 13 +------------ docutranslate/static/index.html | 2 +- 6 files changed, 30 insertions(+), 24 deletions(-) create mode 100644 docutranslate/agents/provider/__init__.py create mode 100644 docutranslate/agents/provider/provider.py diff --git a/docutranslate/agents/agent.py b/docutranslate/agents/agent.py index 185e863..7411056 100644 --- a/docutranslate/agents/agent.py +++ b/docutranslate/agents/agent.py @@ -15,6 +15,7 @@ from urllib.parse import urlparse import httpx import tiktoken +from docutranslate.agents.provider import get_provider_by_domain from docutranslate.agents.thinking.thinking_factory import get_thinking_mode, ProviderType from docutranslate.logger import global_logger from docutranslate.utils.utils import get_httpx_proxies @@ -303,7 +304,7 @@ class Agent: # 新增:初始化 encoding 用于估算 self.encoding = self._get_encoding_for_model(self.model_id) - self.provider=config.provider if config.provider is not None else self.domain + self.provider=config.provider if config.provider is not None else get_provider_by_domain(self.domain) def _get_encoding_for_model(self, model_name: str): """获取 tiktoken encoding,如果失败则使用 cl100k_base 兜底""" diff --git a/docutranslate/agents/provider/__init__.py b/docutranslate/agents/provider/__init__.py new file mode 100644 index 0000000..b7d9277 --- /dev/null +++ b/docutranslate/agents/provider/__init__.py @@ -0,0 +1 @@ +from .provider import get_provider_by_domain,ProviderType \ No newline at end of file diff --git a/docutranslate/agents/provider/provider.py b/docutranslate/agents/provider/provider.py new file mode 100644 index 0000000..9b3f5ee --- /dev/null +++ b/docutranslate/agents/provider/provider.py @@ -0,0 +1,16 @@ +from typing import TypeAlias, Literal + +ProviderType: TypeAlias = Literal["ollama", "bigmodel", "aliyun", "volces", "google", "siliconflow", "default"] + +def get_provider_by_domain(domain:str)->ProviderType: + if domain == "open.bigmodel.cn": + return "bigmodel" + elif domain == "dashscope.aliyuncs.com": + return "aliyun" + elif domain == "ark.cn-beijing.volces.com": + return "volces" + elif domain == "generativelanguage.googleapis.com": + return "google" + elif domain == "api.siliconflow.cn": + return "siliconflow" + return "default" \ No newline at end of file diff --git a/docutranslate/agents/thinking/thinking_factory.py b/docutranslate/agents/thinking/thinking_factory.py index 9aada95..70690ba 100644 --- a/docutranslate/agents/thinking/thinking_factory.py +++ b/docutranslate/agents/thinking/thinking_factory.py @@ -1,13 +1,14 @@ from typing import TypeAlias, Literal, Any -ProviderType: TypeAlias = Literal["ollama", "open.bigmodel.cn", "dashscope.aliyuncs.com", "ark.cn-beijing.volces.com", "generativelanguage.googleapis.com", "api.siliconflow.cn", "api.302.ai","api.openai.com"]|str +from docutranslate.agents.provider import ProviderType + ModeType: TypeAlias = Literal["ollama", "bigmodel", "aliyun", "volces", "google", "siliconflow", "default"] ThinkingField: TypeAlias = str EnableValueType: TypeAlias = str | dict[str,Any] | bool DisableValueType: TypeAlias = str | dict[str,Any] | bool ThinkingConfig: TypeAlias= tuple[ThinkingField, EnableValueType, DisableValueType] -thinking_mode: dict[ModeType,ThinkingConfig] = { +thinking_mode: dict[ProviderType,ThinkingConfig] = { "ollama": ("reasoning_effort", "medium", "none"), "bigmodel": ("thinking", {"type": "enabled"}, {"type": "disabled"}), "aliyun": ( @@ -53,18 +54,16 @@ def get_thinking_mode_by_model_id(model_id: str) -> ThinkingConfig : def get_thinking_mode(provider: ProviderType, model_id: str) -> ThinkingConfig : provider = provider - if provider == "open.bigmodel.cn": + if provider == "bigmodel": return thinking_mode["bigmodel"] - elif provider == "dashscope.aliyuncs.com": + elif provider == "aliyun": return thinking_mode["aliyun"] - elif provider == "ark.cn-beijing.volces.com": + elif provider == "volces": return thinking_mode["volces"] - elif provider == "generativelanguage.googleapis.com": + elif provider == "google": return thinking_mode["google"] - elif provider == "api.siliconflow.cn": + elif provider == "siliconflow": return thinking_mode["siliconflow"] - elif provider == "api.302.ai": - return get_thinking_mode_by_model_id(model_id) elif provider == "ollama": return thinking_mode["ollama"] - return thinking_mode["default"] \ No newline at end of file + return get_thinking_mode_by_model_id(model_id) \ No newline at end of file diff --git a/docutranslate/app.py b/docutranslate/app.py index 1096ee4..6d0bcbf 100644 --- a/docutranslate/app.py +++ b/docutranslate/app.py @@ -317,18 +317,7 @@ app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static") # =================================================================== # --- Pydantic Models for Service API --- -# =================================================================== - -ProviderType: TypeAlias = Literal[ - "ollama", - "open.bigmodel.cn", - "dashscope.aliyuncs.com", - "ark.cn-beijing.volces.com", - "generativelanguage.googleapis.com", - "api.siliconflow.cn", - "api.302.ai" - ] | str - +# ================================================================= # 4. 创建最终的请求体模型 diff --git a/docutranslate/static/index.html b/docutranslate/static/index.html index 44d2972..f05af9a 100644 --- a/docutranslate/static/index.html +++ b/docutranslate/static/index.html @@ -1 +1 @@ - DocuTranslate - 交互式文档翻译

DocuTranslate

{{ t(currentWorkflowConfig.insertHelpKey || 'insertModeHelpTxt') }}
{{ t('segmentModeHelp') }}

{{ t('parsingEngineHelp') }}
{{ t('modelVersionHelp') }}

{{ t('glossaryHelp') }}

GitHub主页(欢迎star❤):
https://github.com/xunbu/docutranslate

交流QQ群: 1047781902

version:{{ version ? 'v' + version : '' }}

{{ t('taskListTitle') }}

LOGO

{{ t('noTaskPlaceholder') }}

{{ t('taskCardIdLabel') }}: {{ task.backendId || t('taskCardIdPlaceholder') }}

{{ t('taskCardFileDrop') }}

{{ t('taskCardFileSelected') }}

{{ t('taskCardFilenameLabel') }} {{ task.fileName || task.file.name }}
{{ t('taskCardLogLabel') }}
{{ task.statusMessage || t('taskCardStatusWaiting') }}
{{ previewMode === 'bilingual' ? t('preview_bilingual') : t('preview_translatedOnly') }}
{{ t('previewOriginal') }}
{{ t('previewTranslated') }}
\ No newline at end of file + DocuTranslate - 交互式文档翻译

DocuTranslate

{{ t(currentWorkflowConfig.insertHelpKey || 'insertModeHelpTxt') }}
{{ t('segmentModeHelp') }}

{{ t('parsingEngineHelp') }}
{{ t('modelVersionHelp') }}

{{ t('glossaryHelp') }}

GitHub主页(欢迎star❤):
https://github.com/xunbu/docutranslate

交流QQ群: 1047781902

version:{{ version ? 'v' + version : '' }}

{{ t('taskListTitle') }}

LOGO

{{ t('noTaskPlaceholder') }}

{{ t('taskCardIdLabel') }}: {{ task.backendId || t('taskCardIdPlaceholder') }}

{{ t('taskCardFileDrop') }}

{{ t('taskCardFileSelected') }}

{{ t('taskCardFilenameLabel') }} {{ task.fileName || task.file.name }}
{{ t('taskCardLogLabel') }}
{{ task.statusMessage || t('taskCardStatusWaiting') }}
{{ previewMode === 'bilingual' ? t('preview_bilingual') : t('preview_translatedOnly') }}
{{ t('previewOriginal') }}
{{ t('previewTranslated') }}
\ No newline at end of file