dsh-plugin-llm-codebuddy
腾讯 CodeBuddy 的 DeepSeek Harness(dsh)适配插件。
它把 CodeBuddy 的模型目录与对话端点接入 harness,注册为名为 codebuddy 的
LLM 路由,让你的 CodeBuddy 账号额度直接用于 dsh 里的对话。插件是只读的:
读取凭据与目录、流式对话、按需刷新令牌,不会自行创建或删除凭据。
装上之后你会多得到这些:
- 模型选择器上直接看价格与促销——模型名后面挂促销徽章,最右边是积分倍率。
- 账号额度可视化——侧栏进度条、输入框旁的胶囊、插件详情页的同心圆环,三处同源。
- 用 CodeBuddy 账号接管网页搜索与抓取——一个开关,不抢别人的位置。
- 限流与偶发失败有人兜底——429 会告诉你重置时刻,瞬时失败自动退避重试。
安装
dsh plugin 会把参数转交给该 profile 目录下的包管理器,因此安装就是一次普通的包安装:
dsh plugin --profile web add dsh-plugin-llm-codebuddy
装好后重启 dsh web(或让 profile 重新加载)生效。
登录
CodeBuddy 使用浏览器签发的令牌认证。安装后在 设置 → 插件 → CodeBuddy 里点「登录」,浏览器完成授权即可;令牌写入 harness 的凭据存储,不作为配置项,也不会被本插件另存一份。
- 未登录时模型列表为空,实际发起请求会以「缺少凭据」失败。
- 访问令牌临近过期会自动刷新;刷新失败不会删除凭据,只有刷新令牌本身也过期 才会提示重新登录。
配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
baseURL |
https://copilot.tencent.com/v2 |
对话接口地址。 |
defaultContextWindow |
128000 |
目录未标注容量的模型所用上下文窗口。 |
defaultMaxTokens |
8192 |
目录未标注容量的模型所用最大输出。 |
streamIdleTimeoutMs |
300000 |
对话流的空闲超时。 |
模型目录
模型来自 CodeBuddy 的目录接口,会随服务端编辑自动更新,无需重启。只在目录里 标注了容量(上下文与最大输出均为正)的模型才会出现在选择器中;未标注容量的 条目不出现在列表里,但仍可用模型 id 直接指定,此时按上面的默认值保守处理。
已知问题:部分模型的自动压缩不会触发
CodeBuddy 目录里标注的「最大输出」有时比模型本身的上下文窗口还大:
| 模型 | 上下文窗口 | 目录标注的最大输出 |
|---|---|---|
minimax-m3 |
512,000 | 524,288 |
kimi-k3-1 |
1,000,000 | 1,048,576 |
harness 判断「什么时候该自动压缩会话」时,会先把这段输出预留从窗口里减掉。这两个 模型减出来是负数,于是自动压缩永远不触发,上下文一路增长,最后由网关报上下文 超限。
已经验证过:这不是网关的限制(发同样大的 max_tokens 网关照收,而且输出会精确
停在那个数),是客户端按目录声明值算出来的结果。把输出预留压到窗口以内,这两个
模型的判断就恢复正常,其余模型不受影响。
本插件目前没有修这个(仍然直接使用目录声明的值)。如果你常用上面这两个模型、 又遇到了上下文超限,先换一个模型试试。
模型选择器上的价格与促销
CodeBuddy 的模型目录里带着促销与订阅信息,插件把它们直接摆到模型选择器里,省得 每次去官方 IDE 里对一遍:
Hy3 [限时免费] x0
- 徽章:模型名后面是当前生效的促销(限时免费、夜间折扣、错峰使用……)与订阅 权益(订阅优先)。徽章颜色由 CodeBuddy 服务端给出。
- 倍率:最右边的
x0.29是这个模型的积分倍率,倍率越低越便宜(x0就是 免费)。促销生效时显示的是折后的倍率——限时免费期间是x0。 - 悬停看详情:基础倍率 → 当前生效倍率、促销说明、促销的时间窗、模型简介。
促销按 CodeBuddy 给的时间窗自动出现和消失(比如「每晚 23:00–次日 8:00」那种夜间 折扣,白天就没有)。插件每分钟向 CodeBuddy 对一次目录,所以时间窗翻转后最多一分 钟内生效。
徽章只属于 CodeBuddy 提供的模型:用别的 provider 时,模型名照常显示,不会有徽章 或倍率。
用量额度
插件提供三个入口查看账号额度,数据同源,因此任何两处显示的数字都不会互相矛盾。
侧栏指示器(默认关闭)
侧栏底部用两条进度条回答「还剩多少、还能自由花多少」:
- 第一条「本月剩余」:灰轨是总剩余,高亮段是本月内到期的那部分,条长就是 本月剩余占总剩余的比例——一眼看出「总剩看着不少,本月能自由花的只是一小段」。 右侧数字是本月消耗率,消耗率越高颜色在同一灰蓝色系内越深。
- 第二条「最近剩余」:把未来到期的额度按 ≤1 天 / 1–2 天 / 2–7 天分成三段, 每段宽度按该档额度分配,段内实心部分是该档的已用比例。没有任何短期到期额度时 整条隐藏。
悬停可看到本月已用/额度、本月剩余、总剩余,以及每个到期段的精确数值。
默认关闭是因为侧栏底部是常驻区域,加进度条会改变默认界面。
输入框额度胶囊(默认开启)
输入框工具行、模型选择器左侧显示 CodeBuddy · 本月 xx%,点击打开完整明细。
只在当前选中 CodeBuddy 模型时出现——额度是 CodeBuddy 账号的属性,用别的
provider 时它既无意义也不该占位。
同心圆环
插件详情页与胶囊弹窗展示同一套同心圆环,中心与三环由内向外分别是:
| 位置 | 内容 |
|---|---|
| 中心 | 总剩余积分 |
| 内环 | 已用积分(占总额度的比例) |
| 中环 | 本月到期(占本月额度的比例) |
| 外环 | 未来 7 天,按天分段 |
三个环是同一种读法:空轨表示未使用,彩色弧表示已使用,弧长就是已用的比例。 分段环也不例外——每一天未用的部分与另外两环同一个底色,只有已用的部分才是 当天自己的颜色,所以七个环段彼此可分辨,一眼能看出「哪几天有额度、各用了多少」。
按天分段的宽度按当天发放的额度分配,段与段之间留有空隙。当天没有发放额度
是特殊情况:它不画彩色弧,只留一小段很淡的占位,既让七个位置保持稳定(便于记住
「第几天」),又不会让人误以为那天有额度可花;图例里也会显式写「—」而不是 0 / 0。
打开或数据刷新时,三个环会从零顺时针生长出来,并逐环错开;如果你在系统里设置了 「减少动态效果」,动画会被跳过,静态图形照常显示。
每日签到
圆心是签到按钮:点它就给 CodeBuddy 账号签到,领当日积分(Buddy 加油站)。
- 未签到时圆心是干净的,鼠标移上去会浮起一圈淡底,提示「这里可点」。
- 签到成功后圆心铺上一层灰绿,中心数字换成深墨色——铺色的过程与三环的生长 动画同一个节奏(同一条曲线、同一时长),读起来是一次动作。
- 已签到时圆心再点不动:按钮是真的
disabled,键盘也到不了。 - 签到失败才会弹一条提示(成功不打扰,因为「颜色变了」本身就是结果);提示里 会带上服务端给的原因,例如「活动未开启」。
签到成功会顺带刷新一次额度读数——签到加了积分,数字得跟着变。
签到只在你点的时候发生,插件不会定时替你签。
读数时效
额度读数由宿主向 CodeBuddy 拉取,每 60 秒刷新一次。
同账号的重复读取由宿主缓存吸收:多个入口、多次重开面板或刷新页面都不会各自再打 一次 CodeBuddy,只有缓存过期后才在后台刷新一次。
用 CodeBuddy 接管网页搜索与抓取
开启后,harness 内置的 web_search 与 web_fetch 会改走 CodeBuddy 网关,
复用同一个账号,不需要额外凭据。
开关在 设置 → 插件 → CodeBuddy → 「使用 CodeBuddy 搜索」,且只在已登录时 出现(未登录时插件根本不注册相关后端,开关无从生效)。
| 行为 | 说明 |
|---|---|
| 默认值 | 关闭。安装插件不会静默抢走搜索位。 |
| 生效时机 | 即时,无需重启。 |
| 范围 | 一个开关同时控制搜索与抓取。 |
| 退出登录 | 自动释放,不影响其他搜索提供方。 |
| 重新登录 | 开关仍为开时自动恢复接管。 |
开关旁有一枚生效态徽标,用来区分「开关想怎样」和「实际怎样」:
| 徽标 | 含义 |
|---|---|
| CodeBuddy 搜索生效中(绿) | 搜索确实走 CodeBuddy 网关。 |
| 未接管搜索(灰) | 你主动关掉了,或未登录。 |
| 接管未生效(琥珀) | 开关已开且已登录,但接管没成立(宿主未提供相关能力等)。 |
没有这枚徽标时,「开关开着却没生效」与「开关是关的」看起来一模一样。接管通过 运行时选择实现,关闭时会还原成原来那个提供方,因此可以和其他搜索插件共存。
遇到频率限制(429)时的行为
当账号额度被限流,CodeBuddy 返回 429,并在提示里给出重置时刻(例如
「将在 2026-09-27 17:30:18 UTC+8 重置」)。插件会读出这个时刻,接下来怎么走
由一个开关决定:
| 「遇到 429 等待重置」开关 | 行为 |
|---|---|
| 关(默认) | 429 按普通失败处理:快速重试几次(约 5 次、15 秒内)后抛出错误,报文里的重置时刻随错误消息原样保留,可据此切换模型继续。 |
| 开 | 等到服务给出的重置时刻再自动重试;但最多只等 5 小时。 |
- 5 小时是硬上限,与开关无关:重置时刻更远时,插件也不会挂上这个等待——一个 回合为一个可能长到隔夜的重置默默挂住,不如立刻失败让人接手。
- 等待路径(开关开且 ≤5 小时)在对话里有一条可展开的倒计时提示,说明第几次 重试与失败原因,随时可中断。
- 报文里读不出重置时刻时(服务抽风,少见):与开关无关,按普通失败重试几次后 失败;宿主日志会留一份报文原文供核对。
- 提示里的重置时间会原样保留,不会因为错误分类而丢失(分类特意不用
QUOTA—— 界面会把它换成一句通用文案,把那句话吃掉)。
开关在 设置 → 插件 → CodeBuddy →「遇到 429 等待重置」,即时生效,无需重启。
与 CodeBuddy 网关的两处兼容
CodeBuddy 网关对请求的写法有自己的规矩,harness 默认发出来的样子过不去。插件在 请求出门前做了两处调整——不调整的话,每一轮对话都会被网关当场拒收。
去掉系统提示开头的身份声明
harness 给每轮对话加的系统提示,开头固定有一句「You are an AI agent powered by DeepSeek Harness…」。CodeBuddy 网关按渠道校验调用方,以这句开头的请求一律 拒收:
HTTP 400 · code=11128 · Illegal API invocation from an unapproved channel
界面上表现为一句「Request blocked. Please send it again」。这看着像登录出了问题, 其实不是:同一份凭据、同一组请求头,只要把这句去掉就立刻正常返回。
网关只认开头那一句(出现在别处不拦),也不区分大小写。所以插件只在开头摘掉 它,系统提示的其余部分一个字都不动;整条系统提示只剩这一句时干脆整条不发 (空提示对网关没有意义,还可能被当成非法请求)。
把你这一轮说的话放在最后
harness 在你的消息后面还会附上运行时上下文(AGENTS.md、运行时快照、技能清单、 当前时间),而 CodeBuddy 把一轮里最后一条用户消息当成你这次的提问。不重排的话, 网关读到的是那些附带内容,不是你问的话。
所以插件把每一轮里你的话挪到该轮用户消息的末尾。每一轮都这么排(包括已经结束的 轮次),这样一轮对话无论出现在哪都长得一样,请求前缀保持稳定,网关那边的缓存照旧 命中。
尚未支持
- 命令行登录命令。
- 目录与用户自定义模型条目的合并。
许可证
MIT,见 LICENSE。
No comments yet. Be the first to write one.