用 dsh-llm-wechat 把微信网关的 Deepseek-v4-flash 接到 DeepSeek Harness

前言

DeepSeek Harness(dsh)是 DeepSeek 开源的智能体运行时,官方仓库把它概括成一句话:一切皆插件。模型适配、工具、会话、沙箱和网页界面,都可以在配置层增删,不必改核心源码。项目目前仍是开发者预览,接口会继续变。社区里已经出现独立的插件目录站点,把 GitHub 上带 dsh-plugin 话题的仓库集中展示;需要说明的是,这类目录与 DeepSeek / 幻方没有官方从属关系,不能当成官方应用商店。

很多人已经能在本机用 dsh web 跑智能体,模型这一侧通常走官方 DeepSeek API。另一条路是微信小程序「Coding Plan」提供的 Deepseek-v4-flash,入口在 chatapi.weixin.qq.com,协议表面上是 OpenAI 兼容。直接拿官方 dsh-llm-deepseek 去打这个网关,会碰到三件事:思考内容不在 reasoning_content 里,而是连同 <think> / </think> 整段塞进 content;工具调用后续 delta 会显式发 id: null / name: null,把首个片段里的正确值覆盖掉;DSH 把工具结果放在 tool-result 块里,发给网关时还要展开成 role: tool 消息。原生解析器处理不了这些差异,思考进不了思考块,正文里会留下标签,工具调用也不稳定。

dsh-llm-wechat 做的事情很具体:复用官方 DeepSeekAdapter,只在响应侧加一层流式转译,让 DSH 把这条微信网关当成官方 DeepSeek 来用。它不是把微信聊天窗口接到 Harness 的机器人通道——社区里另有一批 iLink / 扫码登录的微信桥,不要和这个插件混在一起。

本文按社区目录详情页、GitHub 仓库 README / package.json / cordis.patch.yml / lib/index.js / lib/wechat-translate.js,以及官方 deepseek-ai/deepseek-harness 交叉核对后整理。

这是什么

dsh-llm-wechat 是一款 DeepSeek Harness 的 LLM 适配插件,由 sulfide2085 维护,GitHub 仓库为 sulfide2085/dsh-llm-wechat。社区目录把它归在「通知与集成」,主要语言是 JavaScript。截至 2026-08-18,目录页与 GitHub 都显示 6 星。package.json 里的版本是 0.1.0-rc.6,包名写成 @deepseek-ai/dsh-llm-wechat,并声明许可证为 MIT;仓库根目录目前没有单独的 LICENSE 文件,GitHub 的 license 字段因此为空。安装前仍应自己打开源码核对。

README 写明:这是从项目内拆出来独立维护的公开仓库,源码就在 dsh-llm-wechat 里。它注册的 provider route 是 wechat,默认对接 https://chatapi.weixin.qq.com/openai/v1,模型目录默认只有一条:Deepseek-v4-flash(界面显示名 WeChat Deepseek-V4-Flash)。请求序列化、错误映射、模型解析、重试策略都继承官方 dsh-llm-deepseekDeepSeekAdapter,不修改任何 DSH / pi-ai 源码。

它解决的问题可以压成一句话:让 DSH 把微信 Coding Plan 这条网关的流,转成上层能识别的标准格式——思考进思考块、工具调用正常、正文无标签。

核心功能

仓库 README 和源码对能力边界写得很清楚,下面只列已经核对过的部分。

1、流式 think 标签转译。 微信网关在 thinking 开启时,会把「思考 + 最终答案」整体放进 delta.content,思考在前、答案在后,中间用 </think> 分隔,也可能带显式的 <think> 开标签。插件在 parseSsetranslate 之间插入 ThinkTagSplitter 状态机:把闭标签之前的文本重排进 reasoning_content,之后留给 content。2026-08-16 的提交把切分改成增量输出,只保留标签长度级别的小尾巴用来识别跨 chunk 被切开的标签,不再整段缓冲到 </think> 才往外吐。思考未闭合时,流结束会走 flush() 兜底。stripThinkingTags 默认开启;thinking 关闭或不剥离时,拦截器不解析 JSON,原样透传。

2、工具调用字段不被 null 覆盖。 微信后续 delta 会显式发 id: null / name: nullWechatAdapter 只接受非空字符串去更新 id/name,避免把首个 delta 里已经拿到的正确值冲掉。

3、工具结果按官方完整版展开。 DSH 把工具结果放在 tool-result 块里,序列化时展开为独立的 role: tool 消息;空结果兜底写成 (no output),避免网关忽略空 content。

4、只在 wechat 通道追加强约束。 微信模型看到 system 里的 SDK 工具声明后,偶发会直接调用 glob / pwsh 等 collapsed 工具,触发 unknown tool。插件在 system 末尾追加一段 TOOL USAGE RULE:除 run_code 外不要直接调工具,必须写进 run_codeawait tools.name(...)。这段只作用于 wechat 通道,不影响其他 provider。README 也写明,这只能缓解,不能 100% 消除。

5、推理档位开箱即用。 微信网关只认 off / high / max。插件的 resolveModel 无条件返回这三档,默认 high。模型选择器里会出现 WeChat → Deepseek-V4-Flash,以及推理等级下拉。传其他值会在发请求前报 UNSUPPORTED_REASONING_EFFORTthinking: disabled 会锁死 off 档。

6、对着网关超时做了请求级截止。 微信单次请求大约有 60 秒硬超时。插件默认 requestTimeoutMs55 秒,超时以 TIMEOUT 快速失败并交给重试策略,避免半开连接一直占着并发槽,空闲 watchdog 要等满默认 5 分钟才释放。

安装与启用

社区目录详情页给出的安装命令如下,在 DeepSeek Harness 终端里运行即可:

dsh plugin add github:sulfide2085/dsh-llm-wechat

插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前请检查源代码仓库和许可证。如需可复现安装,目录页建议固定 commit 哈希:

dsh plugin add github:sulfide2085/dsh-llm-wechat#commit

#commit 换成实际哈希。本文核对当日,仓库 master 最新提交是 03e2107bfc3d48a517b516934c973fdc3aa4392b(2026-08-16)。

仓库 README 还写了本地目录装法,适合已经 clone 源码、并指定 web profile 的情况:

dsh plugin --profile web add ./dsh-llm-wechat

dsh plugin add 会把包以 link: 方式装进 profile,并把 dsh.bundle 声明的 patch 层(cordis.patch.yml)追加到 dsh.profile.bundles,无需手动改文件。README 里的 npm 安装命令(dsh plugin --profile web add @deepseek-ai/dsh-llm-wechat)标注为「待发布」,目前不要按已上架的包去装。

装完之后还要准备 Token。README 要求在 $DSH_HOME/.credentials.yaml 写入微信 Coding Plan 的 API Token,也可以在启动环境导出同名变量:

WECHAT_API_KEY: <微信 Coding Plan 的 API Token>

然后在 $DSH_HOME/settings.yaml 增加 llm-wechat: 段。README 写这段是热加载,改完不必为配置本身重启;首次启用仍建议按仓库的接入清单重启一次 dsh web。示例配置如下(字段与官方 dsh-llm-deepseek 对齐,另外多了 stripThinkingTagsrequestTimeoutMs):

llm-wechat:
  apiKeyEnv: WECHAT_API_KEY
  baseURL: https://chatapi.weixin.qq.com/openai/v1
  thinking: enabled
  reasoningEffort: high
  maxTokens: 48000
  defaultContextWindow: 200000
  models:
    - id: Deepseek-v4-flash
      name: WeChat Deepseek-V4-Flash
      contextWindow: 200000
      maxTokens: 48000
  stripThinkingTags: true
  streamIdleTimeoutMs: 300000
  requestTimeoutMs: 55000

README 把 48000 / 200000 标成微信网关的 maxOutput / maxInput 上限。reasoningEffort 可选 off | high | max,默认 high

如果之前在 llm-pi-ai.providers.weixin 配过微信,必须删掉该段。插件注册的 route 是 wechat,旧配置留着会触发 DUPLICATE_ADAPTER;选择器里也可能出现两组重复条目,而且旧组没有推理等级。

典型用法

仓库给第三方用户的接入顺序是:

  1. 用上一节的 dsh plugin add 装插件;
  2. $DSH_HOME/.credentials.yamlWECHAT_API_KEY
  3. (可选)在 $DSH_HOME/settings.yamlllm-wechat: 段,设置默认档位(不写则默认 high);
  4. 重启 dsh web
  5. 模型选择器里选 WeChat → Deepseek-V4-Flash,再选推理等级 off / high / max,然后开聊。

档位对应关系以 README 为准:

  • offthinking: {type: "disabled"},不思考,适合简单问题或省 token;
  • high:开启思考 + reasoning_effort: high,日常推荐;
  • max:开启思考 + reasoning_effort: max,思考最长,也更容易撞上微信约 60 秒网关超时。

错误码与官方 adapter 对齐,包括 AUTH(401/403)、RATE_LIMIT(429)、TIMEOUT(408/超时)、QUOTACONTEXT_WINDOW_EXCEEDEDTRANSPORTSTREAM_CLOSED(流结束没有 [DONE])、MALFORMED_RESPONSEEMPTY_RESPONSEMISSING_CREDENTIALUNSUPPORTED_REASONING_EFFORT。没有 key 时,源码会提示把 WECHAT_API_KEY 存进 credentials 服务(Web 的 Models 页也会写),或在启动环境里导出。

适用场景与注意事项

适合已经在用 DeepSeek Harness,并且手里有微信 Coding Plan Token、希望把 Deepseek-v4-flash 接到 dsh web 模型选择器的人。它补的是 LLM 提供方,不是微信收发消息。如果你要的是扫码后在微信里跟智能体对话,需要另找 iLink 通道类插件,不要装错。

使用前有几条仓库自己写下的限制,需要按原文理解:

  • 约 60 秒请求超时。 max 档思考可以很长(README 写实测可达 19k+ 字符),容易被网关掐断,表现为 TIMEOUT / 408。日常用 highmax 需要更大的 maxTokens,并接受更高失败率。
  • 限流。 README 写每 5 小时大约 1200 请求配额,并发上限 6。Agent 多步工具循环会很快把配额打满,触发 RATE_LIMIT(429)。
  • 工具规则遵循不稳定。 system 强约束只能降低直接调用 collapsed 工具的概率。
  • 只支持文本。 微信网关本身不支持图像输入。
  • 与官方 adapter 的同步是手工的。 translate / parseSse / serializeRequest 是从 dsh-llm-deepseek 复制的(那些符号模块私有,无法 import)。官方升级不会自动同步,DSH 大版本之后要重新对齐。peerDependencies 已放宽为 *,npm 不会在安装期拦住不兼容的核心包,升级 DSH 后仍需自己回归。

Harness 目前是开发者预览,官方 README 写明会有破坏性变更。社区目录收录日期写的是 2026-08-06,仓库实际创建于 2026-08-14;目录页上的「最近推送」停在 2026-08-14,GitHub 上还能看到 2026-08-16 的性能修复提交。以仓库页面为准。

再重复一次目录页的安全提示:插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前检查源代码和许可证;需要可复现安装时固定 commit。

小结

dsh-llm-wechat 把微信 Coding Plan 网关上的 Deepseek-v4-flash,接到 DeepSeek Harness 的 LLM 缝上。它不改 Harness 源码,只做三件脏活:把混在 content 里的思考标签流式拆进 reasoning_content,挡住工具调用 delta 里的 null 覆盖,并把 tool-result 展开成网关能吃的 role: tool 消息。装上之后,模型选择器里会出现 WeChat 这一路,思考档位 off / high / max 直接能选。

网关自己的 60 秒超时、配额和工具遵循问题,插件解决不了。Token、旧的 llm-pi-ai.providers.weixin 配置、以及 DSH 升级后的回归,都要自己处理。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-llm-wechat/

GitHub:https://github.com/sulfide2085/dsh-llm-wechat

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜