DSH WorkBuddy Connect
corrinehu/dsh-workbuddy-connect将 WorkBuddy 桌面 App 包含的模型自动接入 DeepSeek Harness,在 DSH 对话窗口里零配置使用。
English | 简体中文
非官方 DeepSeek Harness 的 LLM provider 插件,用于 Command Code,移植自 pi-commandcode-provider(MIT 协议)。
这是一个社区集成。你需要自己的 Command Code 账号、API key 或订阅,并遵守 Command Code 的服务条款。本项目与 Command Code, Inc. 无关。
· 已验证引擎 · dsh >=0.2.1-rc.2 <0.2.2-0(0.2.1 通道中 0.2.1-rc.2 及以后的每个 RC) 安装 —— 网页端 · dsh plugin --profile web add @mars-sea/dsh-commandcode-provider@latest 安装 —— 终端端 · dsh plugin --profile dsh-tui add @mars-sea/dsh-commandcode-provider@latest 配置文件 · $DSH_HOME/settings.yaml → llm-commandcode: API key 环境变量 · COMMANDCODE_API_KEY 用量面板 · /commandcode
dsh plugin add 命令安装 commandcode provider 路由,带实时模型目录。FREE 徽章、峰谷时段、图片支持与上下文长度,免费模型置顶。≈),按持久化历史逐次请求计价。web_search 工具由 Command Code 承载(/alpha/web-search),复用聊天同一个 key 与端点。x-cmd-zdr: 1),默认关闭。max_tokens。/settings → Command Code 页面。模型选择器 —— 套餐档位、折扣/FREE、峰谷时段、Image 与上下文标注:
用量面板 —— /commandcode 的分账户报告:
设置页 —— 带实时额度的账户列表、模型显示、隐私开关与连接参数:
dsh plugin --profile web add @mars-sea/dsh-commandcode-provider@latest本构建准入 dsh `>=0.2.1-rc.2 <0.2.2-0` —— 0.2.1 通道中 0.2.1-rc.2 及以后的每个 RC。0.2.1-rc.2 是 npm latest 指向的版本,0.2.1-rc.3 挂在 next;两者都跑过完整引擎矩阵(npm run test:engine、npm run test:install)。更晚的 0.2.1-rc.4 无需更新插件即可准入,但在 dsh.compatibility.dshReleases 补上记录之前不算已验证。下一个 minor 被刻意排除(含 0.2.2-rc.*)—— 区间上界写成 <0.2.2-0 正是为了这一点。使用 0.2.0-rc.2、0.2.1-alpha.5 或更早版本的配置需先升级引擎,再安装本构建。兼容性细节 —— engines.dsh 准入规则、按引擎配对的包版本、验证证据 —— 见引擎兼容。
更早的 dsh 版本已不再支持:覆盖 dsh 0.1.7 的最后一个插件版本是 0.11.17,0.1.2–0.1.6 线的最后一个版本是 0.11.11,0.5.0 时代 Harness 线的最后一个版本是 0.9.1 —— 三者都按精确版本安装,且都不再维护。
pnpm 11 会拦下刚发布的新版本。 它的minimumReleaseAge默认为 1440 分钟,发布不足一天的版本会被跳过,@latest解析到上一个版本 —— 而且是静默的,命令照样以成功退出。想装 24 小时内发布的版本,必须写精确版本号:@mars-sea/dsh-commandcode-provider@0.11.15。这一点对每个 profile 都成立,包括下面的终端界面。
更新 —— 用与安装时相同的 tag,然后重启 Web 应用。每个 profile 各自更新 —— 终端界面有独立的插件列表:
dsh plugin --profile web update @mars-sea/dsh-commandcode-provider@latest
dsh plugin --profile dsh-tui update @mars-sea/dsh-commandcode-provider@latest最简单的途径是官方 CLI(Node.js 22+):
npm i -g command-code@latest
cmd login # macOS/Linux;Windows 原生版:cmdc login也可以不装 CLI,直接在 设置 → Command Code 点击「登录 Command Code」:浏览器会打开 commandcode.ai 授权页(与 cmd login 相同的流程),完成后密钥自动写入本机凭据服务。还可以在 Keys 设置页 创建 key 后手动粘贴,或 export COMMANDCODE_API_KEY="user_..."。
登录流程依赖 Host 与浏览器在同一台机器(回环回调)。Host 在远程机器上时请使用手动粘贴;若组合配置里写了字面量 apiKey,它仍优先于登录写入的凭据。验证方式:重启后,在 设置 → Command Code 填入 API key 并保存。设置 → Models 出现 Command Code 卡片,模型选择器在 commandcode 下列出实时目录。选择套餐内包含的模型发送消息即可。
每个 dsh profile 有独立的插件列表,所以上面那条 Web 安装命令不会装到终端里 —— 还要把插件装进 dsh-tui profile,并写死精确版本号(新版本发布后的 24 小时内,只写包名或 @latest 会被静默解析到上一个版本,结果就是全新的终端安装既没有 /settings → Command Code 页面,也看不到任何 commandcode 模型):
dsh plugin --profile dsh-tui add @mars-sea/dsh-commandcode-provider@latest之后在模型选择器里选,或者直接指定:
/model commandcode/deepseek/deepseek-v4.1-flash/model 会列出所有已注册的 provider,Command Code 的实时目录连同套餐/优惠/上下文标注一起出现;/commandcode 用量面板在终端里同样可用。
填写 API key。 终端没有网页版 Models 页面,所以插件会在终端设置页里声明自己的页面 —— `/settings` → Command Code —— 包含 API key、API 地址、隐藏套餐外模型、当前账号和命令语言。key 字段是只写的:它只显示"是否已配置",输入的内容写进凭据库,不会写进任何 settings 文档。同一页面还把整个模型目录列成勾选框,按套餐档位分组、免费模型排在最前;默认全部勾选 —— 未设置白名单就等于"显示全部模型",选择会以「单模型覆盖」的形式保存在网页端编辑的 visibleModels 列表旁边,两个界面可以混用。
也可以在终端外配置 key。凭据解析先命中者生效,顺序如下:
apiKey 最优先,写了就一直用它。apiKeyEnv,默认 COMMANDCODE_API_KEY)。在 Web、桌面端、SDK、ACP 等挂载了凭据服务的 profile 里由凭据服务统一解析:0.2.1-alpha.3 起已保存的凭据优先于启动环境变量;更早的版本顺序相反,那时环境变量优先。.env、$DSH_HOME/.env 生效 —— 在页面上保存过的 key 不会到达 headless 运行,请为这类运行导出变量或写 .env。~/.commandcode/auth.json。export COMMANDCODE_API_KEY="user_..." # 启动环境变量
cmd login # 写入 ~/.commandcode/auth.json把 Command Code 设为默认模型。 dsh-TUI 写死了自己的 agent 路由,它的 agent-default-model 设置不会覆盖它。请在自己的 profile patch($DSH_HOME/profiles/dsh-tui/cordis.patch.yml)里覆盖 agent-loop 行:
- id: agent-loop
inject: [tuiStartup]
config:
agents:
- id: main
provider: commandcode
model: deepseek/deepseek-v4.1-flash
reasoningEffort: max
cwd: !!js process.cwd()插件注册了 /commandcode 斜杠命令,显示各账户的用量状态:
/commandcode (或 /commandcode status)命令的文案跟随 shell 的语言设置:在 llm-commandcode 插件配置里显式写 lang: 'en' | 'zh' 优先;否则读 LC_ALL/LANG;再否则回退到 zh。web 设置页是独立表面,跟随浏览器自身的语言偏好。
有多个 Command Code 订阅时,插件可以在一个账户达到用量限额后自动切换到下一个账户:
default 账户。modelAccountRules)。每个账户行直接显示套餐、状态以及 5 小时 / 每周额度条,展开可查看完整报告,也可运行 /commandcode。等价的 YAML 见配置一节。
设置 → Command Code 把选项分为:账户(密钥、网页登录、实时额度、固定账户、专用模型)、模型与上下文(隐藏套餐外模型、可见模型、上下文长度、输出上限)、隐私与安全(零数据保留)、集成与显示(联网搜索、侧边栏额度卡片)、高级设置(API 地址、超时、传输重试、图片卸载)。同一组选项也位于 $DSH_HOME/settings.yaml,修改即刻生效,无需重启:
llm-commandcode:
apiKeyEnv: COMMANDCODE_API_KEY # 第一顺位(default)账户
activeAccount: COMMANDCODE_API_KEY_2 # 可选:手动指定当前账户
accounts: # 可选:之后的轮换顺序
- label: Go #2
apiKeyEnv: COMMANDCODE_API_KEY_2
modelAccountRules: # 可选:按模型路由到账户(第一条命中生效)
- models: # 目录模型 id(可多选)
- deepseek/deepseek-v4-pro
account: COMMANDCODE_API_KEY_2
visibleModels: # 可选:只在选择器中显示这些模型;不填显示全部
- deepseek/deepseek-v4-pro
apiBase: https://api.commandcode.ai
workingDir: /path/to/project # 可选
modelsCachePath: ~/.commandcode/models-cache.json
requestTimeoutMs: 300000 # 默认 300s(与官方 CLI 一致)
streamIdleTimeoutMs: 300000 # 默认 300s
# offloadSeenImagesForCache: true # 可选:模型回复后不再重发旧图片
showSidebarQuota: true # 可选:侧边栏套餐与配额卡片(默认关闭)
zdr: true # 可选:只经由零数据保留上游(默认关闭)
# contextWindow: 131072 # 可选:对所有模型的自定义上下文长度
# contextWindowOverrides: # 可选:按模型的上下文长度;优先于 contextWindow
# deepseek/deepseek-v4-pro: 65536
# maxOutputTokens: 65536 # 可选:单轮输出上限;0 = 不发送 max_tokens配置项 · 作用 contextWindow、contextWindowOverrides · 替换模型目录里的 context_length —— 宿主据此计量上下文并触发压缩(issue #86)。目录值偏大时会话会撞上 context_length_exceeded,偏小时又会过早压缩,用它把窗口调成模型真实容量。取值必须是 1 – 10 000 000 的整数 token,接受 32K/1M 简写。 maxOutputTokens · 单轮 max_tokens 上限。插件每次请求本来就带 max_tokens,取「模型公布上限、运行时学到的上限、网关上限 131 072」三者最小 —— 被动硬限制,到点平台直接切断,模型收不到任何提示。填正整数只能收紧;填 0 则不发送该字段,这是「长回答写到一半被切断」的解法(0 只对 CLI 与 OpenAI 两条传输生效,Claude 走的 Anthropic Messages 端点必填该字段)。留空表示清除该配置,不是写入 0。 offloadSeenImagesForCache · 在 CLI 传输上,即使此前所有请求消息逐字节一致,新图片也可能让服务端报告的缓存命中量退回第一张历史图片处。开启后,同一模型看过图片并回复后,旧图会被替换成稳定文字占位,后续文本更容易保持缓存。它只能缓解费用上涨,未修复 Command Code 服务端的多模态缓存行为;模型如需重新查看已 offload 的图片,必须重新读取原文件。默认关闭。实测证据。
当你的 dsh 部署加载了 web 能力(@deepseek-ai/dsh-web + @deepseek-ai/dsh-tool-web)时,模型所用的 web_search 工具会由本插件的 commandcode 搜索 provider 承载 —— 它用与聊天相同的 API key 与 base URL 调用 Command Code Provider API 的 /alpha/web-search 端点,无需另外配置搜索 key、端点或模型。
默认开启。 插件的 设置 → Command Code 页里有一个「用 Command Code 承载联网搜索」开关(webSearch),开启时插件会自动把 commandcode 选为当前搜索后端;关闭则把选择权交还给之前的后端(比如 modsearch 等其他搜索插件可继续工作 —— 不会被强制回退到 dsh 自带的 DeepSeek 搜索)。该开关在下一次搜索时生效,无需重启。
commandcode 注册进 ctx.web;没有它,本插件仍是纯聊天插件。commandcode 保持已注册但未被选中,并把这一状态报出来,而不是覆盖对方。只有在没人 pin 该字段时才接管,并记住被顶掉的后端,在关闭开关或卸载插件时恢复。若想更稳妥地固定,可设置 searchProvider: commandcode(或 $DSH_WEB_SEARCH_PROVIDER=commandcode)。numResults 会被收敛到 Command Code 的取值范围(1–10,默认 5);结果映射为 dsh 的 WebSearchSource 结构(url/title/snippet)。这里直接使用 Command Code Provider API(与官方 CLI 内置的 web_search 相同),因此与 DeepSeek 原生搜索后端不同。Command Code 可以让请求只经由「不留存提示词与回复、也不用于训练」的上游 —— 官方 CLI 的开关是 CMD_ZDR=1,Provider API 上则是在请求头发 x-cmd-zdr: 1(官方文档)。
默认关闭。 在「隐私与安全」卡片里打开「零数据保留(ZDR)」(zdr),或写进 profile 配置。
422 cmd_zdr_no_providers;插件不会去掉请求头重试。/provider/v1/chat/completions 以 reasoning_content 回传,/alpha/generate 则在重建的 assistant 轮次里带上 reasoning 块。两种传输都只重放带配对工具结果的工具调用。inputSchema、生成的根 $ref)不再会让整个回合以 schema must be a JSON Schema of 'type: "object"' 失败。本插件只在本地与你的 Command Code 账号之间通信:本地仅读写凭据存储与模型缓存文件(兜底读取 ~/.commandcode/auth.json);网络仅访问 Command Code API。无遥测。打开零数据保留(同样默认关闭)后,聊天请求必须经由 ZDR 上游;没有可用 ZDR 上游的模型会报错,不会按常规方式继续发送。
cordis.patch.yml,注释掉(或移除)llm-commandcode 行,或设置 disabled: true,然后重启。dsh plugin --profile web remove @mars-sea/dsh-commandcode-provider。你在 dsh 凭据库和 ~/.commandcode/auth.json 中的 API key 不会被改动。npm install
npm run typecheck # tsc --noEmit
npm run build # tsdown -> lib/在 profile 里试用本地构建:dsh plugin --profile web add /path/to/dsh-commandcode-provider。修改 src/ 后需重新运行 npm run build 并重启应用。
发布包提供插件根入口、/client 网页入口、/locale/*.json 语言包及 /package.json 元数据。源码只保存在仓库中;未发布的 ./src/* 不再列入导出声明。npm run test:pack 根据实际打包文件核对入口。
本 README 背后的工程细节在 docs/agent-reference/ 下:
engines.dsh 准入GitHub 仓库 · GitHub Releases · npm 包 · Linux.do 社区
MIT —— 见 LICENSE。部分内容移植自 pi-commandcode-provider(MIT)。