dsh-think-translate
Verifieddsh-think-translate · v1.2.10 · MIT · Web UI
Display-layer translation for the DSH web app: thinking chain, task cards, and optional answer text, in 8 target languages (local Ollama / any OpenAI-compatible or Anthropic endpoint / Google / Bing, fail-open)
Install
dsh plugin add dsh-think-translate Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
为 DeepSeek Harness Web UI 提供显示层翻译:把界面上的思考链(Think 行)、任务卡片、回答正文翻译为你选择的目标语言,原文完整保留在会话记录中,译文绝不进入模型上下文。
✨ 特性
DeepSeek 系模型经常用中文思考——或者用它们碰巧习惯的语言。dsh-think-translate 在你观看时把 Think 行、任务卡片和回答渲染成你的语言,就像给模型的思考配上字幕。
- 🕵️ 任意思考链都能读 — 推理、思维链、任务卡片与回答实时翻译,按批流式出现
- 8 种目标语言 — 中文 / English / 日本語 / 한국어 / Español / Français / Deutsch / Русский
- 单一语言界面 — 设置面板、思考行、任务卡片全部跟随目标语言(不混中英),选择持久化
- 本地 Ollama — 复用已有安装和模型;已启用的 Ollama 排在第一位或点击测试时,按需启动服务并加载模型。缺少软件或模型时,点击准备按钮后才安装/下载,并显示实时进度
- 🧠 零上下文成本 — 纯显示层:模型看到的仍是原文,译文绝不占用上下文窗口
- Google / Bing 兜底 — 本地模型不可用时自动切换(google 通过 Node CONNECT 隧道走系统代理,绕过反爬)
- 代码工件自动跳过 — 文件路径、命令、URL、正则、纯代码行不翻译
- 句子分批翻译 — 长思考链按句子分批串行翻译,本地小模型也能保持质量
- 🧩 段落与句子感知切分 — 长思考链按空行切分(保留段落结构)再按句分批,本地小模型也能保持质量
- 流式输出 — 思考过程中译文逐批出现,展开 Think 行可对照原文
- 🎚️ 可调翻译时机 — 三档:全部预翻译 / 懒加载历史(默认)/ 仅展开时翻译
- 🔗 动态提供方链 — 列表顺序就是投递顺序:拖动排序、逐行开关;内置 google gtx / bing / 本地 Ollama,外加任意数量的自定义端点
- 🔌 自定义提供方(OpenAI 与 Anthropic) — 设置面板里可添加任意 OpenAI 兼容端点(任何
/v1/chat/completions网关)或原生 Anthropic Messages API(Claude):类型、预设、接口地址、API 密钥、模型 - 🪄 继承 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 条目提供 - ⏱️ 失败韧性 — 失败结果仅在内存缓存 30 秒,避免频繁重试;冷却结束后自动重试,每行保留独立的测试按钮
📦 安装
# 方式一:npm(推荐)
dsh plugin --profile web add dsh-think-translate
# 然后重启 web
# 方式二:GitHub
dsh plugin --profile web add github:UncleK/dsh-think-translate
# 方式三:手动(junction + patch)
# 1. 链接包到 profile 的 node_modules
New-Item -ItemType Junction -Path "$HOME\.dsh\profiles\node_modules\dsh-think-translate" `
-Target "<仓库路径>"
# 2. 在 "$HOME\.dsh\profiles\web\cordis.patch.yml" 加入:
# - insert:
# - id: dsh-think-translate
# name: dsh-think-translate
# 3. 重启 web
🧯 DSH 升级之后
第三方客户端插件走 DSH 的客户端模块图,而这张图每个进程只在启动时组合一次,一次失败的组合会被记在内存里直到重启。于是升级 DSH 后常撞到这三件事:
- 从源码启动失败:
client bundles not found; run \pnpm run build` before launch—— 新版客户端包需要先构建:在 harness 仓库根目录跑pnpm run build,再重新启动dsh web`。 - 插件 UI 不见了(Think 行没有译文、设置里没有“思考链翻译”)—— 重启一次
dsh web;只刷新页面有时不够。 - 本地模型列表是空的 ——
ollama服务当前用的模型目录里没有模型:查ollama list(或GET /api/tags)以及该服务实际生效的OLLAMA_MODELS;模型文件在别的盘时,可用目录联接把服务的默认目录指过去。
插件侧无需任何配置:它不依赖 DSH 内部包的加载顺序(只绑定 slots 服务,可选使用 @deepseek-ai/dsh-client-ui-primitives),因此老版本(≤ 0.1.1-rc)与当前版本线(≥ 0.1.2-alpha.1,含 0.1.5-rc.1)都能直接跑。
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,无需添加版本豁免。
1.2.6 修复 DSH 0.2 中思考与回答重复显示的问题:助手渲染器现在遵守 reasoning/response 分组,出错时的原文回退也按组显示。
**1.2.7 本地准备:**已启用的 Ollama 排到第一位,或点击其测试按钮时,会自动查找已有安装并启动、加载模型。缺少软件或模型时,点击首次准备入口后才安装/下载,并显示分阶段进度。自动安装软件支持 Windows,其他系统提供官方指南。“当前使用”按优先级选择第一个已启用且验证成功的提供方,测试后面的行不会覆盖已成功的前面一行。
**1.2.8 传输与恢复:**普通 HTTP/HTTPS 翻译请求改用 Node 原生网络,不再为每个文本批次启动 curl;SOCKS 代理和 Ollama 安装器保留 curl 兼容路径。失败结果在内存缓存 30 秒,冷却结束后思考与回答翻译会自动恢复重试。请求超时为本地模型加载和提供方回退留出时间。
**1.2.10 DSH 配置兼容:**发现提供方时跟随当前 Desktop/Web profile,读取 profiles/<profile>/cordis.patch.yml(id + config),随后应用 home 补丁与启动覆盖;继续支持旧版 settings.yaml。默认模型行支持 default-model,凭据仍从 DSH home 的 .credentials.yaml 解析且只留在内存;重新扫描会显示实际读取的配置路径。
**1.2.9 语言修复:**日语词汇提示仅用于日语目标,OpenAI/Anthropic 请求带上完整语言名称。Bing 使用 auto-detect,并将中文目标映射为 zh-Hans/zh-Hant。中文检测先排除路径、代码和 JSON:已是简体的正文跳过,常用繁体区别字触发转换请求,日语/韩语正文正常翻译。升级时一次性清理旧译文缓存,保留设置。
🚀 使用
- 打开 设置 → 思考链翻译
- 选择目标语言(比如日本語)——设置面板、思考行、任务卡片全部切换为该语言
- 管理供应商链(拖动排序,勾选即启用):
- 内置:google gtx / bing(免费,使用系统代理)与本地模型(Ollama);复用已有软件和模型,缺少时点击准备按钮后才安装/下载,并显示进度(支持 7b/14b 或自定义模型)
- DSH 供应商:
profiles/<profile>/cordis.patch.yml/ 旧版settings.yaml里已配置的端点会自动出现(只读,勾选即加入链);列表下方的 继承 DSH 已配置的 API 会重新扫描并一键全部加入——不用重填 baseURL 或密钥(密钥在请求时从 DSH 自己的凭据里解析) - 密钥可以直接填,也可以由预设或 DSH 行带上
apiKeyEnv:那类行显示env:NAME徽标,密钥在请求时解析、绝不写入config.json。编辑表单里没有环境变量输入框(值会原样保留),清空某个字段会真的删除它(以显式删除提交),所以从环境变量名切回字面密钥是可行的 - 取消勾选即跳过该供应商;更细的说明以 README.md 为准
- 发消息让模型思考,展开 Think 行查看译文
⚙️ 工作原理
浏览器 → POST /_xlate/translate(同源,无 CORS)
→ host 供应商链(fail-open,可排序):
chain: [provider1, provider2, ...] ← 设置里拖拽排序
google / bing / openai 兼容 / anthropic 任选
fallback 链(可选,默认关闭,配置里开启)
→ 浏览器直连兜底
- 提供方配置 存在
config.json(运行期生成,已 gitignore):chain(有序 id)、fallback(enabled + chain,仅配置文件)、providers(每项的type/enabled/baseURL/apiKey/apiKeyEnv/model)。旧的priority配置会自动迁移;声明apiKeyEnv的提供方在请求时从该环境变量解析密钥(字面apiKey作为兜底),解析出的密钥绝不写回config.json;patch 里显式的null表示删除该字段,UI 就是用它清空字段的 - DSH 发现 在加载时读取 harness 的
profiles/<profile>/cordis.patch.yml/ 旧版settings.yaml(llm-pi-ai.providers)与.credentials.yaml(refs);被发现的提供方标记为source: "dsh",解析出的密钥只留在内存中(绝不写入config.json),/_xlate/dsh-scan路由可按需重新读取 - host 半边(
lib/index.js):供应商适配器、LRU 缓存(600)、/_xlate/models模型列表、/_xlate/model/pull+pull-status模型下载管理(完成后自动配置启用) - client 半边(
lib/client.js):8 语言 UI、段落/句子分批翻译、流式 Think 行、设置与译文缓存持久化(localStorage) - 纯显示层:原文完整保留在会话日志与模型上下文中
🛠 开发
- 无需构建:
lib/client.js是浏览器 bundle(源码即产物),lib/index.js是 host ESM - 修改 client 后刷新页面即生效;修改 host 后需重启 web
- 8 语言文案在
lib/client.js的UI_TEXT字典中
📄 License
MIT
