dsh-think-translate 1.2.12 → 1.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.zh-CN.md CHANGED
@@ -1,122 +1,125 @@
1
- <div align="center">
2
-
3
- # 🐋 dsh-think-translate
4
-
5
- **语言:** [English](README.md) · [中文](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Español](README.es.md) · [Français](README.fr.md) · [Deutsch](README.de.md) · [Русский](README.ru.md)
6
-
7
- [![npm version](https://img.shields.io/npm/v/dsh-think-translate?color=4D6BFE&label=npm)](https://www.npmjs.com/package/dsh-think-translate)
8
- [![license](https://img.shields.io/npm/l/dsh-think-translate?color=4D6BFE)](LICENSE)
9
- [![dsh](https://img.shields.io/badge/powered_by-dsh-4D6BFE?style=flat-square&logo=deepseek&logoColor=white)](https://github.com/deepseek-ai/deepseek-harness)
10
-
11
- <img src="demo/demo.gif?v=2" width="46%" alt="dsh-think-translate demo" style="border:1px solid #4D6BFE;border-radius:8px;margin:4px" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="demo/demo2.gif?v=2" width="41%" alt="dsh-think-translate demo 2" style="border:1px solid #4D6BFE;border-radius:8px;margin:4px" />
12
-
13
- </div>
14
-
15
- ---
16
-
17
- 为 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) Web UI 提供**显示层翻译**:把界面上的**思考链(Think 行)、任务卡片、回答正文**翻译为你选择的目标语言,原文完整保留在会话记录中,译文**绝不进入模型上下文**。
18
-
19
- ## ✨ 特性
20
-
21
- DeepSeek 系模型经常用中文思考——或者用它们碰巧习惯的语言。dsh-think-translate 在你观看时把 Think 行、任务卡片和回答渲染成*你的*语言,就像给模型的思考配上字幕。
22
-
23
- - **🕵️ 任意思考链都能读** — 推理、思维链、任务卡片与回答实时翻译,按批流式出现
24
- - **8 种目标语言** — 中文 / English / 日本語 / 한국어 / Español / Français / Deutsch / Русский
25
- - **单一语言界面** — 设置面板、思考行、任务卡片全部跟随目标语言(不混中英),选择持久化
26
- - **本地 Ollama** — 复用已有安装和模型;已启用的 Ollama 排在第一位或点击测试时,按需启动服务并加载模型。缺少软件或模型时,点击准备按钮后才安装/下载,并显示实时进度
27
- - **🧠 零上下文成本** — 纯显示层:模型看到的仍是原文,译文绝不占用上下文窗口
28
- - **Google / Bing 兜底** — 本地模型不可用时自动切换(google 通过 Node CONNECT 隧道走系统代理,绕过反爬)
29
- - **代码工件自动跳过** — 文件路径、命令、URL、正则、纯代码行不翻译
30
- - **句子分批翻译** — 长思考链按句子分批串行翻译,本地小模型也能保持质量
31
- - **🧩 段落与句子感知切分** — 长思考链按空行切分(保留段落结构)再按句分批,本地小模型也能保持质量
32
- - **流式输出** — 思考过程中译文逐批出现,展开 Think 行可对照原文
33
- - **🎚️ 可调翻译时机** — 三档:全部预翻译 / 懒加载历史(默认)/ 仅展开时翻译
34
- - **🔗 动态提供方链** — 列表顺序就是投递顺序:拖动排序、逐行开关;内置 google gtx / bing / 本地 Ollama,外加任意数量的自定义端点
35
- - **🔌 自定义提供方(OpenAI 与 Anthropic)** — 设置面板里可添加任意 OpenAI 兼容端点(任何 `/v1/chat/completions` 网关)或原生 **Anthropic Messages API**(Claude):类型、预设、接口地址、API 密钥、模型
36
- - **🪄 继承 DSH 已配置的提供方** — 自动发现 `profiles/<profile>/cordis.patch.yml` / 旧版 `settings.yaml`(`llm-pi-ai.providers`)里的只读 DSH 行,一个按钮重新扫描并全部加入链;密钥在请求时从 `.credentials.yaml` 解析,绝不写入插件配置;harness 自己的默认路线也算:`default-model` / `agent-default-model` 指向 `deepseek-official` 时,DeepSeek 官方 API 也会作为一条 DSH 条目提供
37
- - **⏱️ 失败韧性** — 失败结果仅在内存缓存 30 秒,避免频繁重试;冷却结束后自动重试,每行保留独立的测试按钮
38
-
39
- ## 📦 安装
40
-
41
- ```bash
42
- # 方式一:npm(推荐)
43
- dsh plugin --profile web add dsh-think-translate
44
- # 然后重启 web
45
-
46
- # 方式二:GitHub
47
- dsh plugin --profile web add github:UncleK/dsh-think-translate
48
-
49
- # 方式三:手动(junction + patch)
50
- # 1. 链接包到 profile 的 node_modules
51
- New-Item -ItemType Junction -Path "$HOME\.dsh\profiles\node_modules\dsh-think-translate" `
52
- -Target "<仓库路径>"
53
- # 2. 在 "$HOME\.dsh\profiles\web\cordis.patch.yml" 加入:
54
- # - insert:
55
- # - id: dsh-think-translate
56
- # name: dsh-think-translate
57
- # 3. 重启 web
58
- ```
59
-
60
- ## 🧯 DSH 升级之后
61
-
62
- 第三方客户端插件走 DSH 的客户端模块图,而这张图**每个进程只在启动时组合一次**,一次失败的组合会被记在内存里直到重启。于是升级 DSH 后常撞到这三件事:
63
-
64
- - **从源码启动失败**:`client bundles not found; run \`pnpm run build\` before launch` —— 新版客户端包需要先构建:在 harness 仓库根目录跑 `pnpm run build`,再重新启动 `dsh web`。
65
- - **插件 UI 不见了**(Think 行没有译文、设置里没有“思考链翻译”)—— **重启一次 `dsh web`**;只刷新页面有时不够。
66
- - **本地模型列表是空的** —— `ollama` 服务当前用的模型目录里没有模型:查 `ollama list`(或 `GET /api/tags`)以及该服务实际生效的 `OLLAMA_MODELS`;模型文件在别的盘时,可用目录联接把服务的默认目录指过去。
67
-
68
- 插件侧无需任何配置:它不依赖 DSH 内部包的加载顺序(只绑定 `slots` 服务,可选使用 `@deepseek-ai/dsh-client-ui-primitives`),因此老版本(≤ 0.1.1-rc)与当前版本线(≥ 0.1.2-alpha.1,含 0.1.5-rc.1)都能直接跑。
69
-
70
- DSH **0.2.0-rc.2** 请使用 **dsh-think-translate 1.2.5 或更新版本**。1.2.5 修复了 `todo_write` 的 slot 注册冲突,并声明支持 0.2 版本范围。执行 `dsh plugin --profile web add dsh-think-translate@latest` 后重启 DSH,无需添加版本豁免。
71
-
72
- **1.2.6** 修复 DSH 0.2 中思考与回答重复显示的问题:助手渲染器现在遵守 reasoning/response 分组,出错时的原文回退也按组显示。
73
-
74
- **1.2.7 本地准备:**已启用的 Ollama 排到第一位,或点击其测试按钮时,会自动查找已有安装并启动、加载模型。缺少软件或模型时,点击首次准备入口后才安装/下载,并显示分阶段进度。自动安装软件支持 Windows,其他系统提供官方指南。“当前使用”按优先级选择第一个已启用且验证成功的提供方,测试后面的行不会覆盖已成功的前面一行。
75
-
76
- **1.2.8 传输与恢复:**普通 HTTP/HTTPS 翻译请求改用 Node 原生网络,不再为每个文本批次启动 curl;SOCKS 代理和 Ollama 安装器保留 curl 兼容路径。失败结果在内存缓存 30 秒,冷却结束后思考与回答翻译会自动恢复重试。请求超时为本地模型加载和提供方回退留出时间。
77
-
78
- **1.2.12:**提供方开关统一由 Host 执行,失败后浏览器不再直连 Google。围栏代码、缩进代码和行内代码不发送给翻译服务,按原文精确拼回;流式输出中尚未闭合的代码同样保护。清理旧译文缓存,保留设置。 升级后请完整重启 DSH Web 或 Desktop;仅刷新页面可能继续引用旧客户端资源。
79
-
80
- **1.2.11 Bing 修复:**保留免费 Bing 通道。翻译请求跟随会话页最终域名,避免国内 `www.bing.com` → `cn.bing.com` 跳转丢失 POST 正文;SOCKS/curl 同步原生浏览器请求头,修复 HTTP 401。空响应和非 JSON 响应给出明确错误。
81
-
82
- **1.2.10 DSH 配置兼容:**发现提供方时跟随当前 Desktop/Web profile,读取 `profiles/<profile>/cordis.patch.yml`(`id` + `config`),随后应用 home 补丁与启动覆盖;继续支持旧版 `settings.yaml`。默认模型行支持 `default-model`,凭据仍从 DSH home 的 `.credentials.yaml` 解析且只留在内存;重新扫描会显示实际读取的配置路径。
83
-
84
- **1.2.9 语言修复:**日语词汇提示仅用于日语目标,OpenAI/Anthropic 请求带上完整语言名称。Bing 使用 `auto-detect`,并将中文目标映射为 `zh-Hans`/`zh-Hant`。中文检测先排除路径、代码和 JSON:已是简体的正文跳过,常用繁体区别字触发转换请求,日语/韩语正文正常翻译。升级时一次性清理旧译文缓存,保留设置。
85
-
86
- ## 🚀 使用
87
-
88
- 1. 打开 **设置 → 思考链翻译**
89
- 2. 选择**目标语言**(比如日本語)——设置面板、思考行、任务卡片全部切换为该语言
90
- 3. 管理**供应商链**(拖动排序,勾选即启用):
91
- - 内置:**google gtx / bing**(免费,使用系统代理)与**本地模型(Ollama)**;复用已有软件和模型,缺少时点击准备按钮后才安装/下载,并显示进度(支持 7b/14b 或自定义模型)
92
- - **DSH 供应商**:`profiles/<profile>/cordis.patch.yml` / 旧版 `settings.yaml` 里已配置的端点会自动出现(只读,勾选即加入链);列表下方的 **继承 DSH 已配置的 API** 会重新扫描并一键全部加入——不用重填 baseURL 或密钥(密钥在请求时从 DSH 自己的凭据里解析)
93
- - 密钥可以直接填,也可以由预设或 DSH 行带上 **`apiKeyEnv`**:那类行显示 `env:NAME` 徽标,密钥在请求时解析、绝不写入 `config.json`。编辑表单里没有环境变量输入框(值会原样保留),清空某个字段会真的删除它(以显式删除提交),所以从环境变量名切回字面密钥是可行的
94
- - 取消勾选即跳过该供应商;更细的说明以 [README.md](README.md) 为准
95
- 4. 发消息让模型思考,展开 Think 行查看译文
96
-
97
- ## ⚙️ 工作原理
98
-
99
- ```
100
- 浏览器 → POST /_xlate/translate(同源,无 CORS)
101
- → host 供应商链(fail-open,可排序):
102
- chain: [provider1, provider2, ...] ← 设置里拖拽排序
103
- google / bing / openai 兼容 / anthropic 任选
104
- fallback 链(可选,默认关闭,配置里开启)
105
- → 所有已启用提供方失败时保留原文
106
- ```
107
-
108
- - **提供方配置** 存在 `config.json`(运行期生成,已 gitignore):`chain`(有序 id)、`fallback`(enabled + chain,仅配置文件)、`providers`(每项的 `type`/`enabled`/`baseURL`/`apiKey`/`apiKeyEnv`/`model`)。旧的 `priority` 配置会自动迁移;声明 `apiKeyEnv` 的提供方在请求时从该环境变量解析密钥(字面 `apiKey` 作为兜底),解析出的密钥绝不写回 `config.json`;patch 里显式的 `null` 表示删除该字段,UI 就是用它清空字段的
109
- - **DSH 发现** 在加载时读取 harness 的 `profiles/<profile>/cordis.patch.yml` / 旧版 `settings.yaml`(`llm-pi-ai.providers`)与 `.credentials.yaml`(`refs`);被发现的提供方标记为 `source: "dsh"`,解析出的密钥只留在内存中(绝不写入 `config.json`),`/_xlate/dsh-scan` 路由可按需重新读取
110
- - **host 半边**(`lib/index.js`):供应商适配器、LRU 缓存(600)、`/_xlate/models` 模型列表、`/_xlate/model/pull` + `pull-status` 模型下载管理(完成后自动配置启用)
111
- - **client 半边**(`lib/client.js`):8 语言 UI、段落/句子分批翻译、流式 Think 行、设置与译文缓存持久化(localStorage)
112
- - 纯显示层:原文完整保留在会话日志与模型上下文中
113
-
114
- ## 🛠 开发
115
-
116
- - 无需构建:`lib/client.js` 是浏览器 bundle(源码即产物),`lib/index.js` 是 host ESM
117
- - 修改 client 后刷新页面即生效;修改 host 后需重启 web
118
- - 8 语言文案在 `lib/client.js` 的 `UI_TEXT` 字典中
119
-
120
- ## 📄 License
121
-
122
- MIT
1
+ <div align="center">
2
+
3
+ # 🐋 dsh-think-translate
4
+
5
+ **语言:** [English](README.md) · [中文](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Español](README.es.md) · [Français](README.fr.md) · [Deutsch](README.de.md) · [Русский](README.ru.md)
6
+
7
+ [![npm version](https://img.shields.io/npm/v/dsh-think-translate?color=4D6BFE&label=npm)](https://www.npmjs.com/package/dsh-think-translate)
8
+ [![license](https://img.shields.io/npm/l/dsh-think-translate?color=4D6BFE)](LICENSE)
9
+ [![dsh](https://img.shields.io/badge/powered_by-dsh-4D6BFE?style=flat-square&logo=deepseek&logoColor=white)](https://github.com/deepseek-ai/deepseek-harness)
10
+
11
+ <img src="demo/demo.gif?v=2" width="46%" alt="dsh-think-translate demo" style="border:1px solid #4D6BFE;border-radius:8px;margin:4px" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="demo/demo2.gif?v=2" width="41%" alt="dsh-think-translate demo 2" style="border:1px solid #4D6BFE;border-radius:8px;margin:4px" />
12
+
13
+ </div>
14
+
15
+ ---
16
+
17
+ 为 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) Web UI 提供**显示层翻译**:把界面上的**思考链(Think 行)、任务卡片、回答正文**翻译为你选择的目标语言,原文完整保留在会话记录中,译文**绝不进入模型上下文**。
18
+
19
+ ## ✨ 特性
20
+
21
+ DeepSeek 系模型经常用中文思考——或者用它们碰巧习惯的语言。dsh-think-translate 在你观看时把 Think 行、任务卡片和回答渲染成*你的*语言,就像给模型的思考配上字幕。
22
+
23
+ - **🕵️ 任意思考链都能读** — 推理、思维链、任务卡片与回答实时翻译,按批流式出现
24
+ - **8 种目标语言** — 中文 / English / 日本語 / 한국어 / Español / Français / Deutsch / Русский
25
+ - **单一语言界面** — 设置面板、思考行、任务卡片全部跟随目标语言(不混中英),选择持久化
26
+ - **本地 Ollama** — 复用已有安装和模型;已启用的 Ollama 排在第一位或点击测试时,按需启动服务并加载模型。缺少软件或模型时,点击准备按钮后才安装/下载,并显示实时进度
27
+ - **🧠 零上下文成本** — 纯显示层:模型看到的仍是原文,译文绝不占用上下文窗口
28
+ - **Google / Bing 兜底** — 本地模型不可用时自动切换(google 通过 Node CONNECT 隧道走系统代理,绕过反爬)
29
+ - **代码工件自动跳过** — 文件路径、命令、URL、正则、纯代码行不翻译
30
+ - **🚨 自动审查拒绝理由** — 自动审查拒绝一次调用时,审批卡片会追加目标语言的拒绝理由,看清原因再决定“拒绝 / 允许一次”
31
+ - **句子分批翻译** — 长思考链按句子分批串行翻译,本地小模型也能保持质量
32
+ - **🧩 段落与句子感知切分** — 长思考链按空行切分(保留段落结构)再按句分批,本地小模型也能保持质量
33
+ - **流式输出** — 思考过程中译文逐批出现,展开 Think 行可对照原文
34
+ - **🎚️ 可调翻译时机** — 三档:全部预翻译 / 懒加载历史(默认)/ 仅展开时翻译
35
+ - **🔗 动态提供方链** — 列表顺序就是投递顺序:拖动排序、逐行开关;内置 google gtx / bing / 本地 Ollama,外加任意数量的自定义端点
36
+ - **🔌 自定义提供方(OpenAI 与 Anthropic)** — 设置面板里可添加任意 OpenAI 兼容端点(任何 `/v1/chat/completions` 网关)或原生 **Anthropic Messages API**(Claude):类型、预设、接口地址、API 密钥、模型
37
+ - **🪄 继承 DSH 已配置的提供方** — 自动发现 `profiles/<profile>/cordis.patch.yml` / 旧版 `settings.yaml`(`llm-pi-ai.providers`)里的只读 DSH 行,一个按钮重新扫描并全部加入链;密钥在请求时从 `.credentials.yaml` 解析,绝不写入插件配置;harness 自己的默认路线也算:`default-model` / `agent-default-model` 指向 `deepseek-official` 时,DeepSeek 官方 API 也会作为一条 DSH 条目提供
38
+ - **⏱️ 失败韧性** — 失败结果仅在内存缓存 30 秒,避免频繁重试;冷却结束后自动重试,每行保留独立的测试按钮
39
+
40
+ ## 📦 安装
41
+
42
+ ```bash
43
+ # 方式一:npm(推荐)
44
+ dsh plugin --profile web add dsh-think-translate
45
+ # 然后重启 web
46
+
47
+ # 方式二:GitHub
48
+ dsh plugin --profile web add github:UncleK/dsh-think-translate
49
+
50
+ # 方式三:手动(junction + patch)
51
+ # 1. 链接包到 profile 的 node_modules
52
+ New-Item -ItemType Junction -Path "$HOME\.dsh\profiles\node_modules\dsh-think-translate" `
53
+ -Target "<仓库路径>"
54
+ # 2. 在 "$HOME\.dsh\profiles\web\cordis.patch.yml" 加入:
55
+ # - insert:
56
+ # - id: dsh-think-translate
57
+ # name: dsh-think-translate
58
+ # 3. 重启 web
59
+ ```
60
+
61
+ ## 🧯 DSH 升级之后
62
+
63
+ 第三方客户端插件走 DSH 的客户端模块图,而这张图**每个进程只在启动时组合一次**,一次失败的组合会被记在内存里直到重启。于是升级 DSH 后常撞到这三件事:
64
+
65
+ - **从源码启动失败**:`client bundles not found; run \`pnpm run build\` before launch` —— 新版客户端包需要先构建:在 harness 仓库根目录跑 `pnpm run build`,再重新启动 `dsh web`。
66
+ - **插件 UI 不见了**(Think 行没有译文、设置里没有“思考链翻译”)—— **重启一次 `dsh web`**;只刷新页面有时不够。
67
+ - **本地模型列表是空的** —— `ollama` 服务当前用的模型目录里没有模型:查 `ollama list`(或 `GET /api/tags`)以及该服务实际生效的 `OLLAMA_MODELS`;模型文件在别的盘时,可用目录联接把服务的默认目录指过去。
68
+
69
+ 插件侧无需任何配置:它不依赖 DSH 内部包的加载顺序(只绑定 `slots` 服务,可选使用 `@deepseek-ai/dsh-client-ui-primitives`),因此老版本(≤ 0.1.1-rc)与当前版本线(≥ 0.1.2-alpha.1,含 0.1.5-rc.1)都能直接跑。
70
+
71
+ DSH **0.2.0-rc.2** 请使用 **dsh-think-translate 1.2.5 或更新版本**。1.2.5 修复了 `todo_write` 的 slot 注册冲突,并声明支持 0.2 版本范围。执行 `dsh plugin --profile web add dsh-think-translate@latest` 后重启 DSH,无需添加版本豁免。
72
+
73
+ **1.2.6** 修复 DSH 0.2 中思考与回答重复显示的问题:助手渲染器现在遵守 reasoning/response 分组,出错时的原文回退也按组显示。
74
+
75
+ **1.2.7 本地准备:**已启用的 Ollama 排到第一位,或点击其测试按钮时,会自动查找已有安装并启动、加载模型。缺少软件或模型时,点击首次准备入口后才安装/下载,并显示分阶段进度。自动安装软件支持 Windows,其他系统提供官方指南。“当前使用”按优先级选择第一个已启用且验证成功的提供方,测试后面的行不会覆盖已成功的前面一行。
76
+
77
+ **1.2.8 传输与恢复:**普通 HTTP/HTTPS 翻译请求改用 Node 原生网络,不再为每个文本批次启动 curl;SOCKS 代理和 Ollama 安装器保留 curl 兼容路径。失败结果在内存缓存 30 秒,冷却结束后思考与回答翻译会自动恢复重试。请求超时为本地模型加载和提供方回退留出时间。
78
+
79
+ **1.2.13:**自动审查拒绝卡片保留原文并异步追加译文,提供默认开启的独立开关。关闭开关、切换语言或移除卡片后,旧结果不再回写;俄文等非英语原因可正常翻译成英文。感谢 [llg1634](https://github.com/llg1634) 在 [#13](https://github.com/UncleK/dsh-think-translate/issues/13) 提供问题报告、初始补丁和测试。升级后请完整重启 DSH Web 或 Desktop。
80
+
81
+ **1.2.12:**提供方开关统一由 Host 执行,失败后浏览器不再直连 Google。围栏代码、缩进代码和行内代码不发送给翻译服务,按原文精确拼回;流式输出中尚未闭合的代码同样保护。清理旧译文缓存,保留设置。 升级后请完整重启 DSH Web 或 Desktop;仅刷新页面可能继续引用旧客户端资源。
82
+
83
+ **1.2.11 Bing 修复:**保留免费 Bing 通道。翻译请求跟随会话页最终域名,避免国内 `www.bing.com` → `cn.bing.com` 跳转丢失 POST 正文;SOCKS/curl 同步原生浏览器请求头,修复 HTTP 401。空响应和非 JSON 响应给出明确错误。
84
+
85
+ **1.2.10 DSH 配置兼容:**发现提供方时跟随当前 Desktop/Web profile,读取 `profiles/<profile>/cordis.patch.yml`(`id` + `config`),随后应用 home 补丁与启动覆盖;继续支持旧版 `settings.yaml`。默认模型行支持 `default-model`,凭据仍从 DSH home 的 `.credentials.yaml` 解析且只留在内存;重新扫描会显示实际读取的配置路径。
86
+
87
+ **1.2.9 语言修复:**日语词汇提示仅用于日语目标,OpenAI/Anthropic 请求带上完整语言名称。Bing 使用 `auto-detect`,并将中文目标映射为 `zh-Hans`/`zh-Hant`。中文检测先排除路径、代码和 JSON:已是简体的正文跳过,常用繁体区别字触发转换请求,日语/韩语正文正常翻译。升级时一次性清理旧译文缓存,保留设置。
88
+
89
+ ## 🚀 使用
90
+
91
+ 1. 打开 **设置 → 思考链翻译**
92
+ 2. 选择**目标语言**(比如日本語)——设置面板、思考行、任务卡片全部切换为该语言
93
+ 3. 管理**供应商链**(拖动排序,勾选即启用):
94
+ - 内置:**google gtx / bing**(免费,使用系统代理)与**本地模型(Ollama)**;复用已有软件和模型,缺少时点击准备按钮后才安装/下载,并显示进度(支持 7b/14b 或自定义模型)
95
+ - **DSH 供应商**:`profiles/<profile>/cordis.patch.yml` / 旧版 `settings.yaml` 里已配置的端点会自动出现(只读,勾选即加入链);列表下方的 **继承 DSH 已配置的 API** 会重新扫描并一键全部加入——不用重填 baseURL 或密钥(密钥在请求时从 DSH 自己的凭据里解析)
96
+ - 密钥可以直接填,也可以由预设或 DSH 行带上 **`apiKeyEnv`**:那类行显示 `env:NAME` 徽标,密钥在请求时解析、绝不写入 `config.json`。编辑表单里没有环境变量输入框(值会原样保留),清空某个字段会真的删除它(以显式删除提交),所以从环境变量名切回字面密钥是可行的
97
+ - 取消勾选即跳过该供应商;更细的说明以 [README.md](README.md) 为准
98
+ 4. 发消息让模型思考,展开 Think 行查看译文
99
+
100
+ ## ⚙️ 工作原理
101
+
102
+ ```
103
+ 浏览器 → POST /_xlate/translate(同源,无 CORS)
104
+ → host 供应商链(fail-open,可排序):
105
+ chain: [provider1, provider2, ...] ← 设置里拖拽排序
106
+ google / bing / openai 兼容 / anthropic 任选
107
+ fallback 链(可选,默认关闭,配置里开启)
108
+ → 所有已启用提供方失败时保留原文
109
+ ```
110
+
111
+ - **提供方配置** 存在 `config.json`(运行期生成,已 gitignore):`chain`(有序 id)、`fallback`(enabled + chain,仅配置文件)、`providers`(每项的 `type`/`enabled`/`baseURL`/`apiKey`/`apiKeyEnv`/`model`)。旧的 `priority` 配置会自动迁移;声明 `apiKeyEnv` 的提供方在请求时从该环境变量解析密钥(字面 `apiKey` 作为兜底),解析出的密钥绝不写回 `config.json`;patch 里显式的 `null` 表示删除该字段,UI 就是用它清空字段的
112
+ - **DSH 发现** 在加载时读取 harness 的 `profiles/<profile>/cordis.patch.yml` / 旧版 `settings.yaml`(`llm-pi-ai.providers`)与 `.credentials.yaml`(`refs`);被发现的提供方标记为 `source: "dsh"`,解析出的密钥只留在内存中(绝不写入 `config.json`),`/_xlate/dsh-scan` 路由可按需重新读取
113
+ - **host 半边**(`lib/index.js`):供应商适配器、LRU 缓存(600)、`/_xlate/models` 模型列表、`/_xlate/model/pull` + `pull-status` 模型下载管理(完成后自动配置启用)
114
+ - **client 半边**(`lib/client.js`):8 语言 UI、段落/句子分批翻译、流式 Think 行、设置与译文缓存持久化(localStorage)
115
+ - 纯显示层:原文完整保留在会话日志与模型上下文中
116
+
117
+ ## 🛠 开发
118
+
119
+ - 无需构建:`lib/client.js` 是浏览器 bundle(源码即产物),`lib/index.js` 是 host ESM
120
+ - 修改 client 后刷新页面即生效;修改 host 后需重启 web
121
+ - 8 语言文案在 `lib/client.js` 的 `UI_TEXT` 字典中
122
+
123
+ ## 📄 License
124
+
125
+ MIT