dsh-codebuddy-code
v0.2.0
Published
CodeBuddy LLM provider bundle for the DeepSeek Harness web GUI: registers the `codebuddy` provider route, its Models-page card, and its model picker entries, authenticating against the machine's CodeBuddy desktop-app login
Maintainers
Readme
dsh-codebuddy-code
CodeBuddy LLM 提供商 bundle,为 DeepSeek Harness Web GUI 的 LLM 能力接入腾讯 CodeBuddy。它不是独立的聊天面板——而是把 CodeBuddy 作为模型提供商注册进 dsh 的 ctx.llm seam:web 模型设置里出现 CodeBuddy 提供商卡片,聊天框的模型选择器里可直接选到 CodeBuddy 的模型并用它对话。
它做什么
安装并重启后:
- Settings → Models 出现一个 CodeBuddy 卡片(由
registerConfigurableProviders提供),带设置表单、无凭据小圆点(因为 token 来自本机登录而非产品 API key)。 - 聊天框模型选择器 列出 CodeBuddy 的模型,默认目录与 CodeBuddy CLI 的
cliagent 一致(glm-5.x、kimi-k3-1/kimi-k2.x、minimax-m3/minimax-m2.7、hy3、deepseek-v4-pro/deepseek-v4-flash、deepseek-v3-2-volc等,可在llm-codebuddy:设置段的models里改),选中即可用 CodeBuddy 云接口对话。
Token 来源(每次请求按序解析):
- 环境变量覆盖:
CODEBUDDY_AUTH_TOKEN或CODEBUDDY_API_KEY。 - CodeBuddy 桌面端登录文件:
%LOCALAPPDATA%\CodeBuddyExtension\Data\Public\auth\Tencent-Cloud.coding-copilot.info,带过期检查——请先用 CodeBuddy 桌面端(或/login)完成登录。 - 仅当 CodeBuddy 未登录时,回退到 WorkBuddy 桌面端登录文件
%LOCALAPPDATA%\CodeBuddyExtension\Data\Public\auth\workbuddy-desktop.info(两者写入相同结构,均可通过设置覆盖路径)。
都不存在/过期时,请求以 LlmError: MISSING_CREDENTIAL 失败(不是插件加载失败),错误信息会列出每个候选被拒绝的原因。
请求走 POST https://copilot.tencent.com/v2/chat/completions,SSE 流式。地址可在配置里改。
目录结构
dsh-codebuddy-code/
├── package.json # 声明 dsh.bundle + 对 in-closure 运行时包的依赖
├── cordis.patch.yml # bundle 层:插入 llm-codebuddy 行
└── src/
├── index.js # 插件入口:注册 provider、settings 段、session 解析
├── adapter.js # fetch + SSE 适配器
├── serialize.js # harness 消息 → CodeBuddy wire 请求
├── translate.js # wire chunk → harness StreamChunk
├── sse.js # SSE 解码
└── types.js # wire 格式说明本包是 packages/llm/llm-codebuddy(workspace TypeScript,rc.5)的自包含 JS 移植,面向已安装的 dsh。若你从源码 checkout 跑 dsh,用 workspace 包即可;这里的内嵌版本与已安装 dsh 完全兼容,不需要发布或构建 workspace 包。
安装
需要一个已初始化的 web profile。从 npm 安装(已发布):
dsh plugin --profile web add dsh-codebuddy-code然后重启 dsh web 并打开 GUI。
dsh plugin --profile web remove dsh-codebuddy-code 同时移除依赖与 bundle 层。
开发者:打包为 tgz(可选)
普通用户无需这一步——直接 dsh plugin --profile web add dsh-codebuddy-code 从 npm 安装即可。仅当你在本地开发、需要手动打包时:
cd plugins/dsh-codebuddy-code
npm pack
# 生成 dsh-codebuddy-code-0.1.0.tgz该包所有依赖(@deepseek-ai/dsh-llm、@deepseek-ai/dsh-settings、@deepseek-ai/dsh-timeout、@deepseek-ai/dsh-invariants、@deepseek-ai/cordis、@deepseek-ai/schemastery、eventsource-parser)都已在已安装 dsh 的 profile 依赖闭包 / module fallback 里,bundle 以 peer 直接依赖的形式解析到同一实例,无需额外 pnpm install。
配置
Settings → CodeBuddy 同名的 llm-codebuddy: settings 段($DSH_HOME/settings.yaml,改动即时生效、无需重启):
llm-codebuddy:
endpoint: https://copilot.tencent.com/v2/chat/completions # 可选
tokenPath: C:\Users\you\AppData\Local\CodeBuddyExtension\Data\Public\auth\Tencent-Cloud.coding-copilot.info # 可选
workbuddyTokenPath: C:\Users\you\AppData\Local\CodeBuddyExtension\Data\Public\auth\workbuddy-desktop.info # 可选,CodeBuddy 未登录时回退
thinking: enabled # enabled | disabled(默认 disabled)
reasoningEffort: off # off | high | max(默认 off)
maxTokens: 4096 # 默认 4096
defaultContextWindow: 1000000 # 默认 1000000
models:
- id: hy3
name: CodeBuddy-Hy3
- id: glm-5.2
name: CodeBuddy-GLM-5.2
- id: glm-5.1
name: CodeBuddy-GLM-5.1
- id: glm-5.0
name: CodeBuddy-GLM-5.0
- id: glm-5.0-turbo
name: CodeBuddy-GLM-5.0-Turbo
- id: glm-5v-turbo
name: CodeBuddy-GLM-5V-Turbo
- id: glm-4.7
name: CodeBuddy-GLM-4.7
- id: minimax-m3
name: CodeBuddy-MiniMax-M3
- id: minimax-m2.7
name: CodeBuddy-MiniMax-M2.7
- id: kimi-k3-1
name: CodeBuddy-Kimi-K3
- id: kimi-k2.7
name: CodeBuddy-Kimi-K2.7
- id: kimi-k2.6
name: CodeBuddy-Kimi-K2.6
- id: kimi-k2.5
name: CodeBuddy-Kimi-K2.5
- id: deepseek-v4-pro
name: CodeBuddy-V4-Pro
- id: deepseek-v4-flash
name: CodeBuddy-V4-Flash
- id: deepseek-v3-2-volc
name: CodeBuddy-V3.2-Volc
streamIdleTimeoutMs: 300000 # 默认 300000
retryPolicy: {} # 可选验证可用
- 先确认 CodeBuddy 桌面端已登录(
%LOCALAPPDATA%\CodeBuddyExtension\Data\Public\auth\Tencent-Cloud.coding-copilot.info存在且有auth.accessToken);未登录时插件会回退到 WorkBuddy 登录文件。 - 重启
dsh web,打开 Settings → Models,应看到 CodeBuddy 卡片。 - 回到聊天框,点模型选择器,选 CodeBuddy 下某个模型,发一条消息。
已知限制
- 网关只会在一次工具调用的第一个 SSE delta 里携带
function.name,后续 delta 的name是空字符串""。适配器的 translate 只在name非空时覆盖已记录的调用名(否则空值会把正确名称冲掉,产生unknown tool "",且第二轮把name: ""发回时网关返回 HTTP 400model_param_invalid— "the request parameters were rejected by the model provider")。不要改回「只要name !== undefined就覆盖」。 - 网关安全策略会拦截广告
deepseek-harness客户端的user-agent(HTTP 400 code11128,request illegal/ "blocked by security policy")。适配器用中性的user-agent: codebuddy-dsh发送请求——不要改回 dsh 的归属attributionHeaders(),否则 CodeBuddy 网关会拒绝所有请求。 - 纯文本路由:不支持图片输入,适配器会以
UNSUPPORTED_CONTENT拒绝并说明。 reasoning_effort: 'off'是合法 harness 值,但被网关以 HTTP 400 拒绝,故适配器把off映射为thinking: { type: 'disabled' },从不发送该字段。- 无
stop语义差异遵循 OpenAI 兼容;stream_options不发(网关在 finish chunk 上已附usage)。 - 推理内容只在带工具调用的轮次被回放为
reasoning_content(与 DeepSeek 思维模式一致)。
结构与来源
源码是 packages/llm/llm-codebuddy 的 JS 移植(该 workspace 包仍是源码 checkout 下的首选实现)。二者共享同一契约:provider route codebuddy、settings namespace llm-codebuddy、同一套 request/serialize/translate 逻辑。
