Skip to content

dsh-chat-translate

Verified

@lynn123411/dsh-chat-translate · v3.5.9 · MIT · Web UI

Assistant reply-body translation for the DeepSeek Harness Web UI (OpenAI-compatible channel)

Install

dsh plugin add @lynn123411/dsh-chat-translate

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Published to npm without a public repository. Inspect the package contents before installing.

Tags

Readme

@lynn123411/dsh-chat-translate

DeepSeek Harness Web 界面的助手回答正文翻译插件。它接管助手行的渲染:正文块不论源语言,一律送翻译模型加工成自然简体中文(如 I traced the failing path to a stale lock file. → 中文;模型写出的生硬机器腔中文同样送一遍润色——弱模型的中文恰恰最需要加工),译文按原 markdown 结构重新渲染。只翻正文:Think 卡的思考链、工具调用行、用户消息、代码块、空白块不动。切换译文与原文在贴着正文左缘的一条 10px 透明窄带上,不污染会话上下文。

功能

  • 正文一律翻成简体中文:不论源语言,正文的每一块都送模型改写——整段中文、纯数字、纯标点的块同样照送,只有 trim 后为空的块不送译;提示词要求保留意义、语气、专名、数字与术语,并原样保留 markdown 记号。模型返回与原文一模一样的文字时同样算翻译过、同样可切换。
  • 块一写完就翻:正文只往后追加,写定的块立刻送译,正在长的尾块保持原文;行进入视口(150px 缓冲)后开始首跑,先回的段先出中文。
  • 译文与原文一键切换:鼠标停在正文左缘那条 10px 透明窄带上时,光标右边出一条气泡报出此刻能做的动作(读译文时「查看原文」,读原文时「查看译文」),点一下切过去,再点切回来;正文整块不响应点击,选中文字、拖选复制都不会误触。
  • 失败保持原文、只手点重试:失败分两类——通道伤(超时、断流、空返回)与设置没配好(缺 Key / Base URL / 模型)。失败块保持原文,左缘留下一个 ↻ 按钮,悬停报出哪一类失败与原因;点它只重发这一块,已成功的块原地不动。失败不自动重试,一块失败不连坐。
  • 设置没配好不再无声:缺 Key / Base URL / 模型时如实报出「设置没配好」,气泡与读屏都指向配置页;总开关关着则是纯粹的「不要翻译」,不挂任何标记。
  • 开关两个入口:输入框下方那一行的「译」胶囊与本插件配置页的总开关,读写同一个 enabled,状态同步、拨一下即时生效。
  • 配置页挂在「插件」页:注册进 plugins.bundle.config(key 为包名),路径是「插件」→ 本插件详情页;卡片提供总开关、API Key、Base URL、模型、单次请求超时、保存与「测试 AI 通道」。配置项、安装与校验见 DETAILS.md。

特性

  • 接管助手行渲染:经 keyed slot conversation.chat.node(key assistant-step,priority -1)替换宿主的助手行渲染器。正文块从数据层拿原始 markdown(AssistantBlock.text),译文同样以 markdown 交给宿主公开的基线组件 MarkdownText(micromark + GFM + KaTeX)重渲染——表格、列表、加粗、行内代码、公式的结构由官方渲染器保证,插件不自拼 markup。接管渲染器抛错时按框架退位规则退出该 cell,宿主原渲染器自动回位。
  • 除正文外与宿主逐分支等价:Think 折叠行(含工作细节策略下的摘要预览、Turn-process 折叠隐藏与页内搜索揭示)、连续图片组、工具调用行、未知内容块、中断前缀行尾的「已停止」都交回宿主渲染,chrome 文案复用宿主 chat 词典,两侧逐字一致。
  • 正文排版原生,左缘不画任何东西:正文没有竖线、没有缩进,文字位置与列表、引用的缩进与宿主默认逐字一致。两个可点物都落在正文之外:成功块是左缘 10px 宽的透明窄带(不占正文一个像素),失败块是一个 ↻ 按钮(dsh-ct-retry),失败段不放窄带——一段落只对应一个动作。窄带与 ↻ 都落在宿主正文列左侧的空白里,不压任何宿主元素。
  • 结构重装配,形状问题只修不拒:宿主先把块按 markdown 结构切段——代码围栏与纯空白段逐字保留、永不送模型——散文段再按输入上限(4096 估算 token)切片、相邻片段打包成一个请求(输出上限 8192 token)。回来的译文过形状修复(repairShape):按段落块对齐,块内结构行(记号类别、表格竖线数、链接个数、缩进代码缩进)逐一对齐并把行首前缀修回原文同款,散文行自由重排,空行布局一律取原文,[文字](URL) 的 URL 按出现序逐字拼回。修不齐的片段自动重掷一次,仍不齐就照收模型的译文——形状问题不否决内容,失败标记只留给「这一段没译出来」。
  • 内容寻址的翻译池:客户端按原文内容记已送达的译文,同一段原文在别处出现直接复用,不再打通道;行键加文本清单判同代,换代(文本被整份重写)时旧结果作废,迟到的旧代结果丢弃。
  • 上游重试按块作废:唯一让已写定的块作废的是上游模型自己重试(整次尝试清空从零重来);那时按块判断,内容一字未变的块其中文留在原地,真变了的块才重翻。
  • 单通道:OpenAI 兼容协议:对接任意 OpenAI 兼容的 chat/completions 服务(OpenAI、DeepSeek、通义、Ollama、本地 vLLM 等)。Key / Base URL / 模型三者齐备才翻译,缺任何一项保持原文并如实报「设置没配好」,不做降级兜底。API Key 经 DSH 凭据服务读写 ~/.dsh/.credentials.yaml 的 TRANSLATE_API_KEY。
  • 串行与超时:同时最多一个在途请求,单次超时 aiTimeoutMs(默认 600000 毫秒,范围 500–900000);每行首跑与每次手点都等到真实结果。
  • 缓存按提示词修订号整体作废:磁盘池 ~/.dsh/dsh-chat-translate/cache.json(1000 条 LRU)在文档里登记 rev,换提示词语义时整池作废,同一修订号下命中即复用。
  • 跟随宿主显示设置:Think 行的折叠摘要预览跟随「工作细节」模式(读 ui-chat 配置的 transcriptView,含旧取值映射),设置缺席时按 standard。
  • DSH 原生配置接入:配置就是本插件在 profile 里的插件配置——配置页经 ctx.configForms 读写 dsh-chat-translate 条目的 config,用户层落在当前 profile 的 patch;无任何自研配置文件,译文从不写回会话上下文。
  • 改完点保存才生效:Base URL、模型、超时与 API Key 都是草稿——打字期间一个字都不写盘,点一次「保存」才作为一批提交上去;提交成功后自动探一次通道,把结果报在页面上(探不通不改保存结果)。空着保存等于清除该项,超时草稿不合法时保存被拦住。唯一即时生效的是总开关。

安装

dsh plugin --profile web add @lynn123411/dsh-chat-translate