deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:Aa728848/dsh-chatgpt-subscription
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
让 DSH(DeepSeek Harness)通过 ChatGPT 订阅使用 Gpt 系列模型的插件。
插件注册 codex-chatgpt Provider(显示名 “Codex(ChatGPT 订阅)”),以当前 Host 用户的 ChatGPT OAuth 登录态访问模型,并在设置页展示账号信息、连接状态与订阅额度。支持 Windows 与 Linux。
本插件同时接入 7 条订阅线路,每条各自独立注册 Provider、独立登录、独立额度卡片。
| Provider ID | 订阅 | 协议 | 登录方式 | 模型目录来源 |
|---|---|---|---|---|
codex-chatgpt |
ChatGPT(Plus / Pro / Business…) | Responses | 浏览器 OAuth(localhost:1455 回调) | 实时 /backend-api/codex/models |
kimi-code |
Kimi 会员 | Anthropic Messages | 设备码(RFC 8628) | 实时 /v1/models + 本地兜底 |
command-code |
Command Code | Anthropic / OpenAI 双轨 | 浏览器 OAuth 或粘贴 API Key | 实时 /provider/v1/models |
workbuddy-subscription |
腾讯 WorkBuddy / CodeBuddy | OpenAI 兼容(仅流式) | 扫描桌面端凭据或官方浏览器授权 | 实时 /v3/config |
claude-subscription |
Claude Pro / Max | Anthropic Messages | 手动粘贴 / loopback 回调 | 实时 /v1/models + 本地兜底 |
minimax-code |
MiniMax Code 编程订阅 | Anthropic Messages | 复用桌面端登录态 或设备码 | 硬编码(见下) |
antigravity |
Google Antigravity | Gemini | Google OAuth | 内置表 |
只有 minimax-code 是硬编码目录,而且是有意的:该端点的
GET /v1/models未对订阅流量开放(返回 503direct_route_not_configured),任何「实时目录」都只会是一个必然失败的请求。其取值转录自本机官方客户端的config.yaml。线路之间互不影响:某条线路的登录失败、额度耗尽或上游故障都不会波及其它线路;它们共用同一套号池内核与账号卡片,但不是同一个池。
⚠️ 合规提示:
claude-subscription使用的订阅凭据转发方式与 Anthropic 现行条款存在冲突(详见该章节开头的「风险须知」),且插件未获官方授权;antigravity线路的用户亦有账号被限制的公开报告。请自行评估风险。功能特性
0600 文件存储;明文不发送给 Client;GET /backend-api/codex/models):openai-beta: responses=experimental:GET /backend-api/codex/models,与官方随包的 codex-rs/models-manager/models.json 同源):default_reasoning_summary: none,官方以此为准。此前本插件在未配置时发 summary: auto,而摘要属于计费生成,等于每一轮都多花一块官方从不花的额度;现在默认省略该字段,用户显式选择 auto / concise / detailed 时照旧发送,选「无」也改为省略字段而不是发 summary: none(后者是让后端先生成再丢弃)。low:官方客户端每轮都发送模型目录里的 default_verbosity(当前全部为 low)。此前本插件在未配置时整个不发 text 字段,于是服务端套用隐含的 medium——一个从未打开过该设置的用户,会拿到比官方客户端更啰嗦、也更贵的回答。现在未配置时按目录发 low,显式选择仍以用户为准。supportsOutputVerbosity 的模型发送 text,避免把一个模型可能拒收的字段强加给它;prompt_cache_key,让后端复用提示前缀;x-codex-turn-state,让它续接该轮;max_output_tokens:订阅版 Responses 端点在部分账号/模型上直接以 400 Unsupported parameter: max_output_tokens 拒收该字段(#29,实测 gpt-6-sol / gpt-6.1-sol),官方 CLI 的请求结构里也没有这个字段;输出长度由服务端默认值决定,撞上限仍以 max-tokens 结束原因上报(详见「模型目录」);{ type: 'image', attachment } 下发的粘贴图片会经附件服务读出字节并按 Gemini inlineData 发出,读不出的图片降级为一条可见的说明文本而不是被静默丢弃。单次请求的图片 base64 负载超过 12 MiB 时,最旧的图片按上游同款占位文案替换为文本,避免整条请求被体积上限拒绝;pwsh / powershell、bash、sh 与 shell,并按 PowerShell、Bash 或 POSIX sh 注入对应说明;AbortSignal;Retry-After;codex_image_generate 工具,生成图片后通过 DSH 附件系统保存并在会话中渲染;codex-chatgpt 模型显示最紧张窗口的剩余额度。command-code Provider,使用 Command Code 的 Provider API 与账户 API;模型 id 决定线路:claude-* 走 Anthropic Messages(/provider/v1/messages),其余模型走 OpenAI Chat Completions(/provider/v1/chat/completions),因为该 API 会拒绝把模型发到格式不符的端点;127.0.0.1:5959 起顺延,/callback 接受 Studio 页面的跨域 POST),也可在设置页手动粘贴 API Key;两条路径都先用 /alpha/whoami 验证再加密保存;/provider/v1/models,每个模型的 context_length 作为默认上下文窗口,可逐模型覆盖;src/host/command-code/model-catalog.ts,转录自官方 CLI 的模型注册表):是否接受图片输入、支持哪些思考档位由该表决定,未知模型回落纯文本;deepseek/deepseek-v4.1-flash 与 deepseek/deepseek-v4-flash-vision-exp 支持图片,而 deepseek/deepseek-v4-flash、deepseek/deepseek-v4-pro 不支持;z-ai/glm-5.3-flash 支持而 zai-org/GLM-5.3 不支持;command-code 路由显式声明 normal 策略(最多 3 次,1.5s 起指数退避、15s 上限、0.2 抖动),覆盖 RATE_LIMIT、SERVER、TIMEOUT、TRANSPORT;"{\"error\":{\"type\":\"server_error\"}}")被归类为 SERVER 并自动重试;Retry-After 让退避按对方的节奏走;401/403 与 ABORTED 明确不重试;kimi-code Provider,接入 Moonshot 的 Kimi Code 订阅(https://www.kimi.com/code)。它与 Moonshot 开放平台(pay-as-you-go)是两套互不通用的系统:订阅的模型接口是 https://api.kimi.com/coding/v1,凭据只来自订阅 OAuth;把开放平台的 key 或 base URL 用在这里会被判为 401 Invalid Authentication;auth.kimi.com):设置页点「设备码登录」后直接展示用户码与一次性链接(浏览器会自动打开),装好后无需回调端口、无浏览器环境也能手工完成;slow_down 会按 RFC 调宽轮询间隔,设备码过期会自动重新申请而不是直接失败;max(300s, expires_in×0.5) 自动续期,同进程并发调用共用一次刷新;被拒的 refresh token 进入冷却并提示重新登录;src/host/kimi-code/adapter.ts)。会重试(有界退避,最多 3 次,1.5s 起步、15s 上限、0.2 抖动,并遵守上游 Retry-After):"{\"error\":{\"message\":\"Upstream model provider is temporarily unavailable. Please try again in a moment.\",\"type\":\"server_error\"}}");too many requests / engine is currently overloaded)、连接失败与流停滞;k3(1M 上下文,需 Allegretto+;Moderato 上限 256K,故默认按 256K 计算,可用上下文覆盖升到 1M)、k3-256k、kimi-for-coding(K2.8 Preview)、kimi-for-coding-highspeed(约 6× 速度、3× 额度),运行时以 GET /v1/models 为准;low / high / max(其余写法收敛映射,未知档位不发送);关闭思考发 thinking:{type:"disabled"},开启时发 thinking:{type,effort,keep:"all"};reasoning_content(无推理则回传空串——服务要求的是空值而非省略,否则 400);temperature(采样参数按模型固定,显式值会报错);stop 按上限裁剪为最多 5 条、每条 ≤32 字节,超长整条丢弃(截断的停止串会在错误位置终止生成);reasoning_content 计入输出,固定 32K 会把 max 档的长推理中途截断并返回 length;调用方已知 prompt 规模时上限会被下调到放得下,未知时不做猜测;total message size N exceeds limit 2097152,官方文案不给建议,这里直接按真实序列化体积拦截并提示压缩会话或检查大工具结果;prompt_cache_key 与 Anthropic cache_control 标记均被忽略(设与不设、同 key 与异 key 命中的是同一缓存),设备 id 与协议切换也不影响;/messages 与 /chat/completions 共享同一缓存;system 或工具列表一旦变化会使整个前缀缓存失效(实测归零)。因此应保持工具集合稳定、把新增内容追加在末尾;prompt_cache_options(OpenAI 兼容线路)或顶层 cache_control(Anthropic 兼容线路)控制缓存写入时长,与上面的「无法干预」不矛盾——那一条说的是缓存身份(由内容前缀哈希决定),TTL 管的是另一回事;k3、kimi-for-coding):text/image,但它是可合并扩展的接口,本插件用 TypeScript 模块增强把它扩到 video(未改动 DSH 任何代码),因此视频走 DSH 真实的能力通道,而不是只能显示在提示里;{type:'video_url',video_url:{url:'data:…'}}。视频与图片各有独立预算(图片 2 MB、视频 48 MiB base64,最旧优先省略),请求体校验只在确实带视频时才放宽到 64 MiB;k3-256k 只接受图片、文档白名单外的容器、以及未文档化视频内容块的 Anthropic 线路;dynamically_loaded_tools(仅 K3)已实现:K3 接受消息级工具声明(messages[].tools),可在会话中途用「无 content 字段的 system 消息」注入完整工具定义。官方把「保持顶层 tools 字节稳定」列为该特性的目的之一——中途修改/删除已发出的声明会使缓存从该点起失效,而在末尾追加不影响已缓存前缀,所以这是提升缓存命中的正道。声明按请求重发(服务端不保留),且仅在模型声明该能力时发送;workbuddy-subscription Provider,接入腾讯 WorkBuddy / CodeBuddy 订阅。workbuddy 分开,安装插件不会覆盖或隐藏原有自定义 API;*.info 凭据,也可从设置页选择国区/国际区并通过官方浏览器授权添加账号;AccountPoolCore 并复用同一张设置卡片,具备顺序耗尽 / 轮询调度 / 粘性会话、429 冷却换号、账号级失效保留、设为主账号与备注;internalId 是唯一路由键,identityKeys(uuid / email / 派生 seed)是只增不换的别名集,同一账号再次登录会合并而不是产生幽灵账号;auth 块),以免桌面端掉线——桌面账号的 refresh token 会轮换,若只写进插件自己的加密存储,IDE 手里就只剩一个已作废的 token。同一进程内的并发调用共用一次刷新,且不会二次刷新;POST {backend}/v2/chat/completions,但有两条硬约束:只支持流式(stream:false → 400 code 11101),且首条消息必须是 system(否则国际区返回 400 code 11128)。因此请求构造器始终发送 stream:true,并在调用方没给系统提示时补一条中性的,避免手搓的一次性请求踩到这条规则;*.workbuddy.ai / *.codebuddy.ai 走国际区 https://www.<apex>,其余走国区 https://copilot.tencent.com;code 11102,因此模型选择器按当前账号区域过滤;/v3/config(官方 CLI 启动时读的就是它):每个模型的真实上下文上限、输出上限、是否接受图片、以及可用的思考档位都在这里,不做任何按模型名猜测。/v1/models 在这条线路上是 404,所以此前只能靠内置表——现在内置表只作为离线兜底,且是从真实 /v3/config 转录的(早期手写版本把 glm-5.3、kimi-k3 的窗口猜成 200K/256K,实际都是 1M);deepseek-v4.1-flash 默认 300K、最大 1M)。本线路不发送显式长度参数,所以 DSH 的压缩与溢出判断按默认服务长度计算,不会让请求越过后端实际接受的窗口;reasoning_effort 时返回空的 reasoning_content(实测同一提示:不带字段 0 字符,带字段 130–215 字符)——不发送等于静默丢弃模型的思考;effort 字段是默认值,既不是完整档位表也不是「只此一档」:实测这类模型接受 low / high / max(其余取值被上游收敛到最近档),因此使用这三档的标准表(WORKBUDDY_STANDARD_EFFORTS);显式声明了 supportedEfforts 的模型则原样采信;minimax-m3、kimi-k3、国区 glm-5.3 都报 medium 却只有三档),这种值会收敛到最近档——否则默认档被判不支持而丢弃,退化成上一条的空 reasoning_content;code 11150);src/host/workbuddy/adapter.ts):code 11134 归为 SERVER 并走有界退避(最多 3 次,1.5s 起步、15s 上限、0.2 抖动);code 6004 / code 14003,其中 6004 的正文带重置时刻)归为 RATE_LIMIT 并遵守 Retry-After;finish_reason 或 data: [DONE] 结束,两者都缺失说明连接中途断开,此时抛出错误而不是把半截文本当成完整回答;/billing/meter/get-user-resource,卡片展示套餐名、本周期已用/上限、剩余额度与重置时间;设置页为「设置 → 订阅服务 → WorkBuddy」标签页,对话输入框右侧有该线路的额度胶囊。minimax-code Provider,接入 MiniMax Code 编程订阅。它与 MiniMax 开放平台(按量计费的 API Key)是两套互不通用的系统:https://agent.minimax.cn/mavis/api/v1/llm/v1/messages);authorization: Bearer <accessToken> 认证——实测 x-api-key 一律返回 401 "{\"code\":401,\"message\":\"token is required\"}",因此本线路没有 x-api-key 回退分支(回退只会在每次请求上白花一个往返);~/.minimax/auth/<buildEnv>/<region>/mcode-public/auth.json。rename),失败或中断都让原文件保持逐字节不变;auth.lock(那是桌面端自己的刷新锁,第二方碰它就可能打断官方客户端的刷新);auth.json 归桌面端所有,本插件只读;若本机没有它,才在设置页用 RFC 8628 设备码流程(PKCE S256)登录,凭据存到本插件自己的 $DSH_HOME/storages/minimax-code-credentials.json;cn 用 account.minimax.cn / agent.minimax.cn,global 用对应 .io 域名。两个区域的目录都会被探测,因此国际区账号不会因为没有国区文件而「未登录」;读回凭据时以记录里存的区域为准,而不是拿默认区域覆盖它;src/host/minimax-code/model-catalog.ts):GET /v1/models 未对订阅流量开放(503 "{\"errorCode\":50115,\"errorReason\":\"direct_route_not_configured\"}"),所以任何「实时目录」都只会是一个必然失败的请求;~/.minimax/config.yaml 的模型表,不从不存在的接口推断;{type:'enabled'|'disabled'});M3.1 Flash Preview 强制开启并可指定档位({type:'enabled',effort:...})。未知或越档的取值一律回落到该模型目录声明的默认档,不会把模型没有声明的档位发出去;text 与 image;要加 video 必须先有真正的读取器(对照 Kimi Code 线路的 video-store.ts);src/host/minimax-code/adapter.ts):上游模型供应商临时不可用(5xx)归为 SERVER、429 归为 RATE_LIMIT、连接未产出响应归为 TRANSPORT,走 DSH retry policy 的有界退避(最多 3 次,1.5s 起步、15s 上限、0.2 抖动);但 429 的正文若说的是余额/额度耗尽,则判为终局——重试只会推迟用户真正需要看到的提示;invalid_grant,而这条终局判定会被记成「该账号需要重新登录」并写进号池(重启也在);PRE_EXPIRY_REFRESH_MS 为 5 分钟,轮换发生在服务端还没有拒收之前;② 同一份凭证的轮换按身份(recordKey / loginEpoch)单飞,后到的调用者要么加入在途轮换、要么采纳结果,绝不二次花费同一枚令牌;onRelogin 此前未接线);⑥ 响应未返回新 refresh token 时沿用旧值,不再当作失败;MAX_MESSAGE_BODY_BYTES(2,097,152),理由写着「两条线路上游都是同一族端点」。2,097,152 与 total message size N exceeds limit 2097152 是 Kimi Code 自己文档里的网关上限(见其错误参考),MiniMax 没有任何文档这样规定;DEFAULT_MAX_MESSAGE_BODY_BYTES(64 MB,MiniMax 对带媒体请求自己公布的请求体量级),普通会话永远不会被本地拒绝,守卫只拦真正的失控请求(如每轮追加数 MB 工具结果的死循环),且仍在花掉连接之前拦下并给出同样的可操作提示;DSH_MINIMAX_CODE_MAX_BODY_BYTES 指定;取值非正整数时回落到默认值而不是关闭守卫;offloadOldestRequestImages,其预算是 Kimi 的 1,500,000——那是为塞进 Kimi 自己的 2 MB 请求体上限而定的数字。MiniMax 的模型表允许单图 10 MB 原始字节(base64 约 13.3 MB),超出近 9 倍,于是一张普通截图就被换成占位文本;DEFAULT_MAX_REQUEST_IMAGE_BYTES(16 MB,装得下模型 10 MB 单图上限并留出余量,且远在 64 MB 请求体上限之内),可用 DSH_MINIMAX_CODE_MAX_IMAGE_BYTES 覆盖;offloadOldestRequestImages(options, maxBytes) 现把预算变成参数,缺省仍是 Kimi 的值,其余线路行为逐字节不变;/v1/token_plan/remains(api.minimax.cn / api.minimaxi.com / api.minimax.io)只接受平台 API 密钥:mcode-public 登录态在四种认证写法(Bearer / 原始 / x-api-key / 两者都带)下全部被拒,且是 HTTP 200 + base_resp.status_code: 1004——不是 401,很容易被误读为成功;mmx CLI 能用该端点,是因为它的 OAuth 是平台登录,与本线路的 mcode 登录是两套身份;packages/tui/src/account/matrix-account-client.ts):GET https://agent.minimaxi.com/v1/api/openplatform/coding_plan/remains(国际 agent.minimax.io),路径与平台端点完全不同。本插件用的就是这条(本线路的 agent.minimax.cn 优先、官方主机兜底);yy / x-timestamp / x-signature / User-Agent: MiniMaxCode 四个「官方客户端标识头」——官方注释自己写明这些是「把请求标记为来自 MiniMax 第一方客户端」的字面量;types.ts 已明确决定不伪造官方客户端身份(伪造既失信,也可能是封号理由),因此默认不发,宁可拿到一个拒绝让卡片如实说明;DSH_MINIMAX_CODE_QUOTA_ATTRIBUTION=1 显式选择该取舍;mmx quota show。返回的每个 model_remains 行带两个窗口(5 小时滚动 + 每周),卡片因此有两根条,各自显示重置时刻与「已用/总量」;weekly_boost_permille,可超过 100%);status: 3 通常表示「不限量」,但两个总量都为 0 时它表示「当前套餐不含该模型」——渲染成不限量会凭空许诺额度;base_resp 非 0 视为凭据被拒,只试一台就停并记住 30 分钟;② 其它失败按 unreachable 区分、记住 10 分钟;③ /status 只读缓存、绝不在轮询里发网络请求;1M / 512K / 200000),「恢复默认」以 null 语义在 host 侧删除该键而不是写入 0;src/host/common/account-pool.ts)与同一张共享账号卡片,具备顺序耗尽 / 轮询 / 粘性调度、429 冷却换号、设为主账号与备注。身份键不是令牌:桌面端凭据用它自己的 recordKey(同一个记录槽每次轮换都是同一账号,因此在池里原地更新),插件自持凭据用 loginEpoch(每次设备码登录就是一次独立会话)——用刷新令牌做键在每次轮换后都会把同一账号看成新账号;POST /accounts {action:'adopt'}):只读取、只新增一行,不改动官方客户端的任何文件;重复导入按记录槽身份原地更新,不会产生重复账号。在设置页新发起的设备码登录会自动加入号池(pollWebLogin 的 onSave 钩子)——没有这个钩子,新登录只会写进镜像文件而号池看不见,这正是「多账号登录没配好」的根因;该钩子的失败不会让登录失败,因为凭据此时已经落盘。claude-subscription Provider,以 Claude Pro / Max 订阅的 OAuth 登录态访问 Claude 模型(Anthropic Messages 接口),不使用 API Key、也不按量计费;Authorization: Bearer 且 x-api-key 必须缺省;user-agent: claude-cli/<版本>、x-app: cli;anthropic-beta 至少含 oauth-2025-04-20 与 claude-code-20250219;system 的首个块必须是 Claude Code 身份声明;state(state: verifier),那会把本应保密的 verifier 写进授权 URL、地址栏、浏览器历史乃至剪贴板。本线路是两次独立随机抽样,并有测试断言授权 URL 中不出现原始 verifier;<code>#<state>;也容错接受整条重定向 URL)。可选 loopback 回调,绑定 127.0.0.1 并顺序探测可用端口(Windows 的保留端口段会让固定端口绑定失败)。端口探测失败降级为手动而不是报错。切换模式等于作废当前流程并重新发起——授权码与签发它的那次请求的 redirect_uri 绑定,这是该流程最常见的失败;state 只拒绝那一个请求,不会终止正在进行的合法登录。回调服务器只绑 loopback、只应答 /callback、只接受本机来源;src/host/claude/model-catalog.ts),不从模型名推断。该表转录自本机随 harness 安装的参照目录,只证明抄录忠实,不证明服务端提供这些模型——服务端自己的 GET /v1/models 才是权威,且它只覆盖上下文窗口,能力字段不被改写;thinkingMode):mid-convo → {type:'adaptive', block_binding:{prefix_mismatch_behavior:'drop_block'}} 外加 output_config.effort;adaptive → {type:'adaptive'};budget → {type:'enabled', budget_tokens}(预算算术按参照实现转录;思考预算计入 max_tokens,必须为回答留出至少 1024 token);none → 不发思考字段;mid-convo 排在最前且无条件:claude-fable-5-1 与 claude-opus-5 同时带 forceAdaptiveThinking,把它们当成普通 adaptive 会静默丢掉 block_binding 与 output_config,而参照实现自己的注释写明该缺失会导致持续 400;block_binding 本身必须由 anthropic-beta: thinking-binding-controls-2026-08-01 授权(官方文档:缺该 beta 时返回 400 block_binding: Extra inputs are not permitted)。因此请求头从已构建的请求体读出是否带 block_binding,带则追加该 beta;redacted_thinking 同样回放),无签名则丢弃。工具名在出站时按 Claude Code 规范大小写归一化、入站时按大小写无关匹配回用户工具名;若两个工具归一化后碰撞,则放弃归一化原样发送,避免把结果投给错误的工具;src/host/common/account-pool.ts)与同一张共享账号卡片,具备顺序耗尽 / 轮询 / 粘性调度、429 冷却换号、设为主账号与备注;recordKey(同一个记录槽每次轮换都是同一账号,因此在池里原地更新),插件自持凭据用 loginEpoch(每次设备码登录就是一次独立会话)——用刷新令牌做键在每次轮换后都会把同一账号看成新账号;GET /api/oauth/usage 的 utilization 是已用百分比 0–100;/v1/messages 响应头 anthropic-ratelimit-unified-5h-utilization 是分数 0–1,重置时间是 epoch 秒;QUOTA_FULL_REFRESH_MS 做一次完整读取;ttl: '1h' 必须同时带 anthropic-beta: extended-cache-ttl-2025-04-11,否则被拒(与 block_binding 同理)。插件从已构建的请求体读出所选档位并据此发出该 beta,两者不可能不一致;settings.register 的一代(≤0.1.6)仍写进 harness 的设置文档;SettingsForms 取代,偏好改由插件自己持久化到 <dshHome>/storages/dsh-chatgpt-subscription-preferences.json(0600、原子写;读取失败或校验不过就回落默认值);storages/*-models.json 水合,因此重启后不会像被重置;agent-default-model 设置提供;tool-subagent 行的 maxDepth(默认 3),0.1.6 起改由 subagent 服务的设置项提供(默认 1);provider-managed 表示把预算交给进程外提供方;400 Unsupported parameter: max_output_tokens 拒收该参数(#29),官方 Codex CLI 的 ResponsesApiRequest 里同样没有这个字段。它的实际用途是作为 DSH 侧的输出预留量(defaultMaxTokens),供压缩判定把完成部分计入上下文窗口;请求本身交给服务端决定长度。撞上服务端上限时该轮仍以 max-tokens 结束原因呈现(后端以 response.incomplete 收尾)。| 显示名 | 模型 slug |
|---|---|
| 6.1 Sol | gpt-6.1-sol |
| 6 Astra | gpt-6-astra |
| 6 Sol | gpt-6-sol |
| 6 Luna | gpt-6-luna |
| 5.6 Sol | gpt-5.6-sol |
| 5.6 Terra | gpt-5.6-terra |
| 5.6 Luna | gpt-5.6-luna |
| 5.5 | gpt-5.5 |
| 5.4 | gpt-5.4 |
| 5.4 Mini | gpt-5.4-mini |
| 5.3 Codex Spark | gpt-5.3-codex-spark |
目录只用于展示;账号实际可用的模型由 ChatGPT 套餐、workspace 策略与上游兼容状态决定。
GPT-6 系列(6.1 Sol / 6 Astra / 6 Sol / 6 Luna)支持文本、图片输入和工具调用,默认思考档位为 medium,可选 low、medium、high、xhigh、max。从旧会话带入的 none / minimal 会按 OpenAI 官方迁移说明 转为 low。三个模型的默认 384K 与上限 872K 均取自 2026-09-23 的 Codex 模型目录(gpt-6-sol / gpt-6-luna 于 2026-09-22 发布,能力与 gpt-6-astra 一致;目录里的 context_window 是 272K,本插件把默认有效上下文提高到 384K,仍低于 872K 上限);Codex Ultra 涉及客户端的子代理编排,本插件不将它作为 Responses 思考参数暴露。
新配置默认显示 GPT-6 系列与 GPT-5.6 系列;已有配置保留原来的模型勾选,可在 设置 → Codex 订阅 → 可用模型 中勾选 6 Sol / 6 Luna。
~/.dsh(或 $DSH_HOME),凭据文件会强制使用 0600、目录使用 0700;latest / next / alpha 三个标签上,多数人跑的是比 alpha 落后几个版本的 latest)。需要桥接的破坏性变更:tool-result 内容块改为 role: "tool" 消息)、删除了 settings.register(偏好改由插件自有存储落盘)、并让 agent preset 不再从 ~/.dsh/.agent-presets 读取。插件在请求边界、设置服务与 preset 注册三处同时适配。present 工具,mode 枚举那时也还写作 code。直接从 npm 安装已发布的插件包:
# Windows PowerShell、Bash 和 POSIX sh 均可执行
# 如果全局安装了 dsh
dsh plugin --profile web add @eddyskywalker/dsh-chatgpt-subscription
# 或使用 npx 直接运行
npx @deepseek-ai/dsh plugin --profile web add @eddyskywalker/dsh-chatgpt-subscription
版本阶段:上面两条命令装到的是 npm latest 标签指向的版本(撰写时为 0.10.12)。包不预置 publishConfig.tag,因此稳定版一发布就落在 latest——也就是 npm install 与 dsh plugin add 解析到的那个标签;预发布版只进 alpha,需要显式带上标签或版本号:
dsh plugin --profile web add @eddyskywalker/dsh-chatgpt-subscription@alpha
npm install @eddyskywalker/dsh-chatgpt-subscription@alpha
DSH 没有插件市场;Web 界面的 Plugins 页提供按包名安装的入口(底层与 dsh plugin add 相同):
@eddyskywalker/dsh-chatgpt-subscription 并安装;dsh web。如需进行二次开发或本地源码调试:
git clone https://github.com/Aa728848/dsh-chatgpt-subscription.git
cd dsh-chatgpt-subscription
npm install
npm run build
# Linux
npx @deepseek-ai/dsh plugin --profile web add "link:/absolute/path/to/dsh-chatgpt-subscription"
# Windows PowerShell
npx @deepseek-ai/dsh plugin --profile web add "link:C:\absolute\path\to\dsh-chatgpt-subscription"
dsh web;DSH 模型选择器应显示 “Codex(ChatGPT 订阅)”。GPT-6 系列与 GPT-5.6 系列的有效上下文窗口在“Codex 订阅 → 增强功能”中配置。子代理的模型与思考深度由 DSH 自身的设置决定(Subagent 卡片授权的模型清单,以及 agent-default-model 的默认路由;该卡片 0.1.5 及以前在「设置」页,0.1.6 起在 Plugins 页);最大嵌套深度由 DSH 侧决定(0.1.5 及以前取 preset 中 tool-subagent 的 maxDepth,默认 3;0.1.6 起取 subagent 服务的设置,默认 1)。
设置 → Codex 订阅 → 网络代理 同时控制 GPT 与 Antigravity(Gemini)的 Host 请求,可选择系统代理(自动检测)、自定义代理或直连。Gemini 模型生成、网页登录后的令牌交换、令牌刷新、账号信息、项目发现、配额与模型目录查询均使用此设置;修改后对后续请求生效,无需重启 DSH。浏览器中的 Google 授权页面使用浏览器自己的网络设置。
dsh web;command-code 会像其他 Provider 一样出现在 DSH 模型选择器中。线路按模型 id 自动选择:claude-* 走 Anthropic Messages,其余走 OpenAI Chat Completions;设置卡片的模型标签会显示每个模型对应的线路。
路由归属:DSH 的 registerAdapter 对重复 Provider 是 all-or-nothing 并抛 DUPLICATE_ADAPTER,因此若 command-code 已被别的适配器占用(典型情况是内置 llm-pi-ai 用同一端点声明过同名 Provider),本插件不会加载失败,而是在卡片上显示“模型路由已被其他 Provider 占用”;从占用方的配置里移除该 Provider 后,插件会在下一次路由变更事件时自动接管,无需重启 DSH。
上下文窗口默认取 Command Code 模型目录的 context_length,可在卡片中逐模型覆盖(用于 DSH 的压缩与溢出判断,支持 1M / 512K / 200000 等写法)。默认思考深度逐模型生效:下拉里列出的档位可按模型能力选用(minimal / low / medium / high / xhigh / max),实际发给上游前会按当前模型声明的档位取值——模型不声明该档位时不发送。对 Anthropic 线路映射为 thinking 预算(minimal 1K / low 2K / medium 8K / high 16K / xhigh 24K / max 32K),预算放不下时该请求不启用 thinking;对 OpenAI 线路映射为 reasoning_effort。
额度来自 /alpha/billing/credits、/alpha/billing/subscriptions 与 /alpha/usage/summary,三条线路相互独立容错,页面可见时最多每 60 秒刷新一次;解析不出有界额度时显示空态而不是 0%。
额度卡片展示:套餐名(由订阅返回的机器 id 查表得出,表在 src/host/command-code/plans.ts,按最长前缀匹配)、订阅状态与续费日期、滚动窗口用量(windowLimits 的 fiveHour / weekly,按官方 CLI 同款标签 5-hour / Weekly 显示,并各自带重置倒计时),以及余额明细(月度额度 / 已购额度 / 赠送额度,另附合计)。服务只回报数字不回报名称的字段一律补上可读标签——窗口按 key 命名,余额按池命名,实在没有名字的兜底为 Extra allowance 并注明来源,不会渲染成 meter-1 这类无意义编号。
搜索来源 切换 DSH 的搜索后端;网页抓取来源由下面的抓取模式决定。模式为 auto(默认)时跟随此处的搜索选择:选择 ChatGPT 来源后,网页也改由本插件在 Host 抓取,并使用上述网络代理设置;模式为 dsh 时即使选了 ChatGPT 搜索,抓取也仍由 DSH 原有来源完成。纯 TUN 模式可使用直连,流量由虚拟网卡接管。来源切换即时生效,DSH web 服务重载后会重新注册插件后端,并保留切回 DSH 默认来源所需的配置。设置页在该选择器下方只读展示 Host 上报的抓取来源、切换器状态、抓取模式与插件上限;Host 未提供这些字段(较旧的 Host)时整个区块不显示。
网页抓取后端(web_fetch) DSH 内置抓取 provider 会先解析域名、校验并固定解析结果,而且只在进程环境变量里读到代理时才走代理——系统代理对它不可见。代理工具(Clash/Mihomo 等)常把域名解析成自己的 fake-ip 地址(默认 198.18.0.0/15),于是内置 provider 直接以 WEB_BLOCKED_URL(resolves to a non-public IP address)拒绝,代理根本没被用上。因此在 auto 模式下,只要插件配置了可用代理(网络代理 选系统代理且检测到,或填写自定义代理),web_fetch 就改用本插件的 provider:由代理解析源站,与 DSH 对“走代理的请求”采用的语义一致;未配置代理时仍由 DSH 内置 provider 抓取,保留其解析与固定策略。若在纯 TUN 模式下把代理设为直连,内置 provider 会重新接管(auto 模式下),此时可改回系统代理让插件接管抓取。代理如果在 DSH 启动之后才可用(代理工具后启动,或首次探测失败),插件会在下一次探测到代理时重新选择抓取后端,不必重启或改设置。
抓取模式与上限属于插件部署配置,不在设置页的偏好里:设置页只读展示当前值,要改写在 profile 的 cordis.patch.yml 里,重载插件或重启 DSH 后生效。
写在安装时已有的那一条插件行上(id: dsh-chatgpt-subscription,包名 @eddyskywalker/dsh-chatgpt-subscription)的 config 片段:
# $DSH_HOME/profiles/<profile>/cordis.patch.yml
- id: dsh-chatgpt-subscription
config:
fetchProvider: auto # auto | plugin | dsh
fetchMaxBodyChars: 100000 # 解码后正文保留的字符数
fetchMaxResponseBytes: 2097152 # 响应体保留的字节数(2 MiB)
patch 按 id 定位条目并整体替换它的
config,所以在这一行上追加字段时请保留原有的其它字段。
| 字段 | 默认 | 含义 |
|---|---|---|
fetchProvider |
auto |
auto 跟随搜索来源(有可用代理或选了 Codex 搜索时用插件抓取);plugin 始终用本插件抓取;dsh 强制保留 DSH 原有的抓取来源,即使有代理或选了 Codex 搜索也不接管 |
fetchMaxBodyChars |
100000 |
解码后交给工具的正文上限(字符) |
fetchMaxResponseBytes |
2097152 |
进入解码前的响应体上限(字节) |
两者都必须是正安全整数,否则该配置不被接受(DSH 不会把非法值当成 0 使用)。
必须说清的四条边界:
fetchMaxResponseBytes 是“读进来之后再截断”,不是下载量或内存的硬上限。 实现仍是 response.arrayBuffer() 先把整个响应体读进内存,超出部分才被切掉;调小它省不下下载流量和峰值内存,只能限制进入解码与工具结果的内容量。web_fetch 的内容,DSH 工具结果本身还有自己的裁剪预算,因此调大它们并不保证取回完整页面。dsh 模式,或 auto 模式下本次抓取没落到插件)时不适用。设置页会直接写明这一点。http/https 与目标地址不得落在私网/回环的校验,域名交给解析它的代理解析,解析失败也放行。抬高上限不改变这条边界。卸载前建议先在设置页点击 “注销”,它会删除当前平台的凭据和 Host 内存中的额度缓存。
若 DSH 已异常退出,可在确认路径后手动处理凭据文件:
%DSH_HOME%\storages\dsh-chatgpt-subscription\oauth.dpapi,未设置 DSH_HOME 时为 %USERPROFILE%\.dsh\storages\dsh-chatgpt-subscription\oauth.dpapi;security delete-generic-password -s dsh-chatgpt-subscription -a oauth 删除;$DSH_HOME/storages/dsh-chatgpt-subscription/oauth.json,未设置 DSH_HOME 时为 ~/.dsh/storages/dsh-chatgpt-subscription/oauth.json。Windows 文件只能由创建它的用户通过 DPAPI 解密。macOS 凭据由登录钥匙串在本机加密保存。Linux 文件是未额外加密的 JSON,依赖目录
0700和文件0600隔离;不要复制、打印或提交该文件。跨平台迁移需要重新登录。
插件自带一个 调度模式 agent preset(id dispatch),随 npm 安装一起分发:0.1.7 起 harness 不再从发现根目录读取 preset,插件改为运行时注册(src/host/agent-preset.ts:探测 @deepseek-ai/dsh-agent-preset 能否解析、agentPresets 服务是否在场,然后在 presets/dispatch/preset.yml 与 agent.cordis.yml 转录出的定义上调用 register(),注册失败只记 warn);0.1.6 及以前仍按老办法把包内 presets/dispatch/ 同步到 <dshHome>/.agent-presets/。两条路都让装了本插件的机器在新建会话时直接选到它,不需要手工拷贝文件。
为什么不用静态声明行:0.1.7 的 preset 声明要写进 bundle patch,而
assertEntriesLoaded会把「无 fiber 且未 disabled」的条目判为启动失败——@deepseek-ai/dsh-agent-preset在 ≤0.1.6 上并不存在,静态声明会让那些机器直接开不了机。声明行也不能按运行环境条件化,所以选择运行时注册 + 能力探测。
同步在每个 profile 启动时执行一次(幂等):
@deepseek-ai/dsh-workflow-worker-thread,而 harness 0.1.6 把它改名成了 @deepseek-ai/dsh-workflow-ptc,指向不存在的包会让整个 preset 被判为 broken、既不可选也不可复制。同步时用 import.meta.resolve 探测当前安装能解析哪个名字(旧名仍在就保留,否则改写成新名;两个都不可用时不改写,因为改名只会掩盖试过哪个),所以同一份 preset 在 0.1.5 与 0.1.6 上都能挂载;BUNDLED_PRESET_IDS),绝不改动用户手写的 preset 或其它插件的 preset;路径解析不写死相对路径:
src/host/preset-sync.ts从模块位置向上查找最近的package.json作为包根,因此src/布局、打包后的lib/布局,以及通过 pnpm symlink / Windows junction 安装都能正确解析。注意fs.cpSync({ recursive: true })在 Node 22 + Windows 上遇到含非 ASCII 的源路径会直接崩进程(nodejs/node#54476),所以复制是逐条目实现的。
DSH 的 Agent Teams(bundle @deepseek-ai/dsh-experimental-agent-team-profile)会在每个会话自己的作用域里注册一套与内置同名的协调工具。工具注册表按作用域链解析、近的层遮蔽远的层,所以一旦该 bundle 被组合进来,会话里的 send_message、list_agents、interrupt_agent 就都换成了 teammate 版:
list_agents() 只列 Team 成员(Lead 自己显示为 lead),看不到 subagent 派出去的子代理;send_message 的 target 只接受成员名,把子代理的 session id 传进去会抛 active teammate "…" not found(实测);subagent 的孩子只能等完成通知,无法追问。dispatch preset 现在每个任务开始时先侦测一次协作模式(persona 的 R0.5),再按模式选择协调词汇(R-T):
| 侦测为 | 判据 | 协调词汇 | 派发 |
|---|---|---|---|
| teammate | spawn_teammate / wait_agent 存在 |
list_agents()、send_message({ target: <成员名> })、wait_agent()、team_task_* |
spawn_teammate(无路由参数,继承主代理路由)或 subagent(按 R2 显式路由) |
| subagent | 二者都不存在 | list_agents()、send_message({ agent_id })、interrupt_agent |
subagent / subagent_fork |
两种模式下 R0 分诊、R1 职责边界、R3 自治、R6 验收都照常执行;模型路由守卫(subagentModelAuthorization)不变——它默认把 spawn_teammate 与 subagent_fork 同为 inherit 模式(见下),校验的是成员实际继承到的路由,而不是要求它给出并不存在的路由参数。
不要把
spawn_teammate加进subagentModelTools。该列表是 explicit 模式:要求每次调用成对给出provider+model,而spawn_teammate的参数里根本没有这两个字段(DSH 设计如此:成员一律继承 Lead 的路由),结果是每一次 teammate 创建都会被硬拒,且模型无法通过补参数自救。它的正确归属是subagentModelInheritTools(默认已包含)。
spawn_teammate 目前无法指定 provider/model,这不是插件的问题,而是 Agent Teams 有意不做 per-teammate 路由。三层都已核对:
| 层 | 能否带路由 | 证据 |
|---|---|---|
| 工具入参 | ❌ | spawn_teammate 的 schema 只有 name/description/prompt/context |
| Team 服务 | ❌ | SpawnTeammateRequest.provider 是 subagent 后端名(spawn/fork),不是 LLM provider;且无 model 字段 |
| 底层 API | ✅ | ContinuableStartSpec.request 可带 agentOptions(含 provider/model/reasoningEffort),但 Team 服务构造 request 时只放 prompt 与 parent,整个省略 |
因此成员必然跑在 Lead 自己的路由上——这正是守卫把它归 inherit 模式的原因,也是不应把它加进 explicit 的 subagentModelTools 的原因。
插件侧无法绕过,四条路都已验证死:pre-execute 明确排除输入改写(参数已被记录与呈现,PreToolDecision 只有 allow/deny/cancel/ask);agentTeams 服务在内部丢弃后包装不到;注册自定义 subagent provider 也拿不到路由(agentOptions 在 continuation manager 就已解析完,provider 只返回 seed);唯一能改子会话路由的 selectForNextRequest 只作用于「下一个请求」,而 teammate 创建后立刻开跑,抢不进去。
上游正路:在 packages/experimental/agent-team/src/roster.ts 构造 startContinuable 的 request 处补上 agentOptions,并给 SpawnTeammateRequest 加字段、给工具 schema 加参数、创建前接 assertAllowedModelSelection。该改动落地后,spawn_teammate 就应从 subagentModelInheritTools 移到 subagentModelTools(explicit)——否则它会变成「能选模型却没人管」。
实践提醒:inherit 模式校验的是当前会话路由。若当前会话跑在允许清单之外的路由上(例如默认模型与勾选清单不是同一条),teammate 与
subagent_fork都会被拒绝——拒绝文案会指出恢复路径(改用显式路由的subagent,或先把会话切到清单内的模型)。subagent的显式路由不受影响。
| 字段 | 默认 | 含义 |
|---|---|---|
syncAgentPresets |
true |
启动时是否把包内 preset 同步到 <dshHome>/.agent-presets;设为 false 则完全不写用户目录 |
不想让插件写 home 目录时,可把 syncAgentPresets 设为 false,再自行拷贝包内的 presets/dispatch/ 到 <dshHome>/.agent-presets/dispatch/。
DSH 设置页的「Subagent」卡片会把勾选的模型写成会话级的允许列表(会话日志事件 subagent/model-selection-policy)。DSH 内置委派工具只拒绝模型显式填写且不在列表内的路由;调用里不写 provider/model 时,子代理会继承父级模型,于是白名单之外的主模型(例如 deepseek-official/deepseek-flash)仍会被子代理使用。
插件在 Host 工具注册表上补一个单调守卫(ctx.tools.guard),在委派执行前要求每次委派都必须写明路由:
provider 与 model 必须成对给出,且该路由必须落在列表内——缺省不再回退到配置默认值或父级模型;model)同样被拒绝,拒绝理由会指出缺的是哪一个字段;list_subagent_models 查出已授权路由,再按拒绝理由里列出的路由(例如 antigravity/gemini-3.8-flash)重试;该工具也只展示已授权路由;inherit 模式(subagentModelInheritTools,默认 ['subagent_fork', 'spawn_teammate']):有些委派工具按设计就没有路由参数,子代理必然跑在调用者自己的路由上——subagent_fork(复用对话与 KV Cache)与 Agent Teams 的 spawn_teammate(成员一律继承 Lead 的路由)都是这一类。「工具不能选」不等于「这个选择被授权」,所以守卫改为校验它实际继承到的路由:允许清单内有该路由就放行,没有就拒绝,并说明该工具无法改路由、要么改用能显式指定路由的 subagent、要么先把本会话切到清单内的模型。设为 [] 可关闭 inherit 模式的全部校验。
守卫装在 DSH 工具注册表的调度入口上,因此 run_code(代码模式 / PTC)里通过 SDK 调用的 tools["subagent"] 同样被拦截:该子调用走的是与直接调用相同的 prepare → guard → dispatch 流水线,拒绝理由以 ToolCallError 抛回程序。也就是说模型无法靠把委派写进代码里绕过白名单(test/subagent-model-authorization-ptc.test.ts 用真实 ToolRuntime + 假 code runtime 验证了放行、缺省拒绝与越权拒绝三条路径)。
配置项(插件行 config,全部可省略):
| 字段 | 默认 | 含义 |
|---|---|---|
subagentModelAuthorization |
true |
是否启用上述授权守卫;设为 false 回到 DSH 原有行为 |
subagentModelTools |
['subagent'] |
需要授权的委派工具名(explicit:必须成对给出 provider+model);preset 里自定义了 toolName 时在此列出 |
subagentModelInheritTools |
['subagent_fork', 'spawn_teammate'] |
按设计继承调用者路由的委派工具(校验实际继承到的路由);设 [] 关闭 |
subagentModelScope |
session |
session 只约束记录了允许列表的会话;preference 额外用当前设置卡列表约束未记录的会话 |
改动只在设置卡片里保存过的勾选生效:设置改动只影响之后新建的会话(DSH 的会话快照语义),已运行的会话继续使用它自己记录的那份列表。
升级提示:从 0.3.2 起,带有允许列表的会话里任何未写明
provider+model的委派都会被拒绝(此前只有写明且不在列表内的路由会被拒绝)。这是有意的行为变更——它消除了「子代理悄悄继承主代理模型」的漏洞;把subagentModelAuthorization设为false可回到 DSH 原始行为。
dsh web;verification_uri);kimi-code 会像其他 Provider 一样出现在 DSH 模型选择器中。上下文窗口默认取模型目录值,可逐模型覆盖(用于 DSH 的压缩与溢出判断,支持 1M / 256K / 200000 等写法)——注意 k3 的 1M 上下文需要 Allegretto 及以上套餐,因此默认按 256K 计算,升级后再在此覆盖为 1M。默认思考档位只提供 low / high / max 三档与「关闭思考」(服务对这三档以外的取值直接报 400);切换模型或切换档位都会使上下文缓存失效,建议在同一会话内保持一致。
区域:默认使用中国大陆主机(auth.kimi.com / api.kimi.com)。国际账号可设置 DSH_KIMI_CODE_OAUTH_HOST=https://auth.kimi.ai 与 DSH_KIMI_CODE_BASE_URL=https://api.kimi.ai/coding 后重新登录;环境变量同时会钉住区域,设置页会显示当前解析到的主机。
插件注册 command-code Provider,对接 Command Code 的两套接口:
| 用途 | 地址 |
|---|---|
| 模型生成(Anthropic 格式) | https://api.commandcode.ai/provider/v1/messages |
| 模型生成(OpenAI 格式) | https://api.commandcode.ai/provider/v1/chat/completions |
| 模型目录(公开) | https://api.commandcode.ai/provider/v1/models |
| 账号信息 | https://api.commandcode.ai/alpha/whoami |
| 额度与用量 | /alpha/billing/credits、/alpha/billing/subscriptions、/alpha/usage/summary |
| 浏览器登录页 | https://commandcode.ai/studio/auth/cli |
模型 id 决定线路(claude-* 为 Anthropic),这也决定了请求体形态:Anthropic 线路的系统提示词放在顶层 system、工具用 input_schema、工具结果用 tool_result 内容块;OpenAI 线路的系统提示词是 messages[0]、工具用 function.parameters、工具结果用 role: "tool"。两条线路都只把 DSH 交付的可见文本、图片与工具调用发出去——reasoning 块不会被回放,因为这里的上游都不接受缺少签名的思考块。
模型能力表(src/host/command-code/model-catalog.ts)逐模型声明 inputModalities、reasoningEfforts、contextWindow 与可选的输出上限,内容转录自官方 CLI 的模型注册表——公开的 /provider/v1/models 只有 id、名称与 context_length,既不说模态也不说思考档位,而族级前缀推断在同一厂商内部就会出错(见上)。模型不在表内时按纯文本、无思考档位处理:DSH 会把图片转成一条可见的占位文本让用户改选模型,而反过来把图片发给不接受它的端点会让整个请求失败。
图片以 base64 内联(OpenAI 线路 image_url 的 data: URL,Anthropic 线路 image 块的 base64 source);单次请求的图片负载超过 12 MiB 时按最旧优先替换为本插件同款占位文案。读不出字节的图片降级为可见说明文本,不会被静默丢弃。
失败分类与重试:command-code 路由在注册时携带一份显式的 normal retry policy(maxRetries: 3、initialDelayMs: 1500、maxDelayMs: 15000、jitterRatio: 0.2),可重试码为 RATE_LIMIT、SERVER、TIMEOUT、TRANSPORT——与 codex-chatgpt 路由同源,只是未包含该路由的历史码 SERVER_ERROR/NETWORK。分类规则:HTTP 5xx(含上游 502)→ SERVER;连接层失败(fetch 抛错)→ TRANSPORT;429 → RATE_LIMIT 并附 Retry-After(上限 10 分钟);401/403 → INVALID_CREDENTIAL(换 Key,不重试);流式空闲超时由看门狗转成 TIMEOUT。策略由 DSH 的 dsh-llm-retry 插件在 agent/request-error 上执行,每次重试都会写入 llm/retry 会话事件。
凭据存储:API Key 使用与 Antigravity 相同的系统凭据存储——Windows 是 CurrentUser DPAPI($DSH_HOME/storages/command-code-credentials.json.dpapi),macOS 是登录钥匙串,Linux 是 Secret Service(服务名 dsh-command-code,账号键按旧凭据文件绝对路径生成)。旧版明文 JSON 只作为迁移来源,读取后加密回写、校验并删除;注销会同时清理两者。凭据只存在于 Host 内存与系统凭据存储中,不会进入浏览器、settings.yaml 或日志。
浏览器登录的回环服务器只在 127.0.0.1 上监听 5959 起的空闲端口,只接受与该次登录 state 匹配的回调,10 KB 请求体上限,5 分钟超时;回调成功后浏览器标签页会跳到 /callback/complete 上的人工可读页面。登录成功后 Studio 页面回传的 API Key 会先经 /alpha/whoami 验证,验证失败的 Key 不会被保存。
所有路由都以 /command-code/api 为前缀:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /status |
账号(脱敏)、额度、模型目录与路由归属 |
| POST | /login |
开始浏览器登录,返回登录页地址 |
| GET | /login/status |
查询登录进度 |
| POST | /login/apikey |
校验并保存手动填写的 API Key |
| POST | /logout |
注销并清理凭据与缓存 |
| GET / POST | /quota |
强制刷新额度(POST)或读取当前状态(GET) |
| GET / POST | /models |
读取或更新勾选的模型与上下文窗口 |
| POST | /settings |
更新默认思考深度与上下文窗口覆盖 |
| POST | /catalog/refresh |
强制刷新模型目录 |
| POST | /connection/test |
用已存凭据调用 /alpha/whoami 测试连接 |
与 codex-chatgpt 线路一样,所有修改状态的路由只接受同源 JSON POST,并校验 Origin 与 Host。
workbuddy-subscription 会像其他 Provider 一样出现在 DSH 模型选择器中,并可与名为 workbuddy 的自定义 API 同时存在。上下文窗口默认取网关 /v3/config 声明的默认服务长度,可逐模型覆盖(用于 DSH 的压缩与溢出判断,支持 1M / 300K / 200000 等写法);默认思考深度逐模型生效,选项由当前账号各模型实际声明的档位取并集(仅部分模型支持的档位会标注数量),档位不在该模型集合内时不会被发送。
凭据目录按平台解析,可用 CODEBUDDY_AUTH_DIR 覆盖(与官方工具链一致):
| 平台 | 默认目录 |
|---|---|
| Windows | %LOCALAPPDATA%\CodeBuddyExtension\Data\Public\auth |
| macOS | ~/Library/Application Support/CodeBuddyExtension/Data/Public/auth |
| Linux | $XDG_DATA_HOME/CodeBuddyExtension/Data/Public/auth(默认 ~/.local/share) |
目录里通常同时存在当前凭据与若干带时间戳的历史快照。插件优先取 workbuddy-desktop.info / codebuddy-desktop.info 这类规范文件名,其余按 token 剩余有效期取最长的一个——只按文件 mtime 选会选到过期快照。卡片会列出目录里所有可用凭据,标明各自区域。
上游接口:
| 用途 | 路径(前缀为区域后端) |
|---|---|
| 模型生成 | POST /v2/chat/completions(仅流式) |
| 模型目录 | GET /v3/config |
| 浏览器授权 | POST /v2/plugin/auth/state + GET /v2/plugin/auth/token |
| 令牌续期 | POST /v2/plugin/auth/token/refresh |
| 额度 | POST /billing/meter/get-user-resource |
| 签到状态 | POST /billing/meter/checkin-activity-status(仅国区) |
| 每日签到 | POST /billing/meter/daily-checkin(仅国区) |
两区后端分别是 https://copilot.tencent.com(国区)与 https://www.workbuddy.ai / https://www.codebuddy.ai(国际区)。请求身份统一使用 CLI UA(CLI/2.63.2 CodeBuddy/2.63.2):实测 CodeBuddyIDE 被 /v3/config 以 400 code 12403 拒绝,国际区对话端点也直接返回 401,因此不做按端点切换。
每日自动签到(仅国区;语义与 workbuddy2api 的 daily_checkin.py 对齐):DSH 启动时自动签到一轮,运行期间每 10 分钟幂等补检(当日已签的账号不再发请求);签到前先查签到状态,token 过期会自动续期并回写(桌面账号写回 CodeBuddy 自己的凭据文件)。失败当天最多自动重试 3 次;活动尚未开启的账号不会当天放弃——首次签到状态若报无权益,之后每小时复查一次,避免开机早于活动开放时间就错过当天。国际区账号不参与(国际后端没有签到活动)。DSH 没开机的当天不会签到——插件不是常驻服务。设置页「每日签到」区块可开关自动签到、查看「今日已签 x/y · 无活动 z · 失败 w」并手动「立即签到」(手动会重跑一轮并绕过开关与重试上限)。签到状态存在 storages/workbuddy-checkin.json,token 不出 Host。
所有路由都以 /workbuddy/api 为前缀:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /status |
账号、额度、模型目录与路由归属(每次都重扫凭据目录) |
| GET | /accounts |
列出桌面扫描及插件托管账号(不含 token) |
| POST | /accounts/login |
按国区/国际区启动官方浏览器授权 |
| GET | /accounts/login/status |
读取授权轮询状态(不含 token) |
| POST | /accounts/action |
删除插件托管账号,或隐藏/恢复桌面账号 |
| POST | /rescan |
清缓存并重扫凭据目录 |
| GET / POST | /quota |
强制刷新额度(POST)或读取当前状态(GET) |
| GET / POST | /models、/settings |
读取或更新勾选模型、上下文窗口与默认思考深度 |
| POST | /catalog/refresh |
强制刷新网关模型目录 |
| POST | /connection/test |
用已识别凭据向上游发一次最小请求测试连接 |
| POST | /checkin/now |
立即执行一轮每日签到(忽略开关与重试上限、不受无活动复查节流限制;当日已签的账号仍跳过) |
与其它线路一样,所有修改状态的路由只接受同源 JSON POST,并校验 Origin 与 Host。
本线路以 Claude Pro / Max 订阅登录访问模型。Anthropic 现行条款写明不允许第三方应用提供 Claude.ai 登录、也不允许代用户经 Free / Pro / Max 凭据转发请求,并保留不经预告的执法权;本插件未获 Anthropic 任何授权或认可,你的账号可能因此被限制、暂停或终止。
此前版本在设置卡片上设有一个必须显式接受的确认步骤,并配套一条主机侧门禁;该步骤与门禁均已移除, 现在打开卡片即可直接使用。移除的只是那一步交互——上面这段事实、以及由此产生的风险,都不因移除而改变。 是否使用请自行判断并承担后果。
<授权码>#<state> 整段复制粘贴回来即可(也接受直接粘贴整条重定向 URL)。若使用 loopback 回调模式,
本机一个可用端口会被自动探测并绑定 127.0.0.1;claude-subscription 会像其他 Provider 一样出现在 DSH 模型选择器中。上下文窗口默认取内置能力表声明的窗口,
可逐模型覆盖(用于 DSH 的压缩与溢出判断,支持 1M / 512K / 200000 等写法);默认思考深度只对声明了
档位的模型生效。档位原样透传(ReasoningEffortId 在 harness 里是无约束 brand,本仓库多条线路都直接使用
xhigh),不做任何收敛,以免把用户选的档位静默降级。
模型表共 16 条:14 条转录自本机随 harness 安装的参照目录,另加 2 条本地新增:Claude Opus 5.5
(claude-opus-5-5,官方 2026-09-22 发布,1M 上下文 / 128K 输出 / 支持图片,档位 low–max),以及
Claude Sonnet 5.5(claude-sonnet-5-5,官方 2026-09-28 发布,规格同上;不支持 temperature、思考不可关闭;
官方默认档位为 high,且思考块与会话前缀绑定,因此走 mid-convo 分支并带 block_binding)。以下说明针对 Opus 5.5。
它有一条与其它模型不同的硬约束:思考永远开启、不能关闭——官方文档明确 thinking:{type:"disabled"}
与 {type:"enabled",budget_tokens:N} 都会返回 400,因此能力表把它标为不可关闭思考,档位表是控制思考深度的
唯一手段。它的默认档位是 medium(其余带 effort 的模型默认 high),这一点被刻意保留:本仓库有两类模型走
「强制 effort」分支,若把 Opus 5.5 一并归入,就会静默把每次请求抬高一档、花更多钱,因此它走的是普通 adaptive
分支。但它(与 Fable 5.1、Sonnet 5.5 一样)是官方文档列明的思考块前缀校验模型:2026-08-31 之后创建的账号,一旦
前缀变化(压缩、工具列表变化、图片卸载)回放思考块就会每次都 400,因此能力表用 bindsThinkingToPrefix 标记它,
adaptive 分支对这类模型额外发送 block_binding: drop_block(不强制 effort)。
它还有一条版本门槛:上游要求申报的客户端版本 ≥ 2.1.280 才为该模型提供服务。能力表用 minCliVersion
记录这一点(只有这一行有门槛,其余 15 行缺省——缺省表示「未知」而不是「无门槛」,不臆造数字)。插件申报的
默认版本为 2.1.285(不低于首次提供 Sonnet 5.5 的 Claude Code 2.1.284),并且在发出请求之前就本地校验「申报版本 vs 该模型门槛」,不满足时直接给出模型、当前
版本与要求版本,而不是白花一个往返让上游返回 400。测试另有一条不变量:申报的默认版本必须 ≥ 表中每个模型的
门槛——这条锁让「加了高门槛模型却忘了抬版本」无法通过 CI。
如果你本机已经登录过 Claude Code,可以点「收编本机登录」把它作为一条账号导入,省去再次登录。 两点必须清楚:
| 用途 | 路径 | 鉴权 |
|---|---|---|
| 模型生成 | POST https://api.anthropic.com/v1/messages?beta=true |
Authorization: Bearer <access token>,且 x-api-key 必须缺省 |
| 模型目录 | GET https://api.anthropic.com/v1/models |
同上 |
| 订阅额度 | GET https://api.anthropic.com/api/oauth/usage |
同上,另带 user-agent: claude-code/<版本> |
| 授权 / 令牌 | https://claude.ai/oauth/authorize、https://platform.claude.com/v1/oauth/token |
PKCE S256(端点可用环境变量覆盖) |
请求带有 Claude Code 身份头(user-agent、x-app、anthropic-beta),并在 system 首块声明 Claude Code 身份。
这是订阅令牌被服务端接受的前提,已在代码与测试中显式锁定。
所有路由都以 /claude/api 为前缀:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /status |
账号、额度、模型目录、登录流程与路由归属 |
| POST | /login |
开始 OAuth 登录,立即返回流程状态(不阻塞) |
| GET | /login/status |
轮询登录流程状态(客户端每 2 秒一次,无 SSE) |
| POST | /login/cancel |
取消登录并释放回调端口 |
| POST | /login/input |
提交手动粘贴的授权码 / 重定向 URL |
| POST | /adopt |
收编本机 Claude Code 登录(只读,作快照入池) |
| POST | /adopt/disable |
停止收编(不触碰 Claude Code 的文件) |
| GET / POST | /quota |
读取或强制刷新额度;失败以 quotaError 呈现而非请求失败 |
| GET / POST | /models、/settings |
读取或更新勾选模型、上下文窗口、默认思考深度与选中账号 |
| POST | /catalog/refresh |
强制刷新模型目录 |
| POST | /connection/test |
向上游发一次最小请求测试连接 |
| POST | /accounts |
号池动作:set-primary / set-alias / delete / clear-cooldown / clear-auth-failed / strategy |
| POST | /logout |
注销(号池感知) |
所有路由都挂在本线路自己的 /minimax-code/api 前缀下(与 antigravity / claude / command-code /
kimi-code / workbuddy 一致),不占用 Codex 那条线路的 /api/dsh-chatgpt-subscription 前缀。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /status |
账号、区域、凭据来源与路径、硬编码模型目录、路由归属(serving / conflict)与凭据归属(ownedByPlugin) |
| POST | /login/start |
开始设备码授权(可带 region) |
| POST | /login/poll |
轮询一次授权结果 |
| POST | /login/cancel |
取消授权 |
| POST | /logout |
注销本插件自己那份凭据;桌面端的登录态会拒绝并说明原因 |
| POST | /test |
向上游发一次最小 Messages 请求测试连接 |
| GET / POST | /models、/settings |
读取或更新启用开关、勾选模型、上下文窗口覆盖与默认思考深度;两个路径等价(kimi/claude 叫 /models,workbuddy/command-code 叫 /settings) |
| GET / POST | /accounts |
号池动作:set-primary / set-alias / delete / clear-cooldown / strategy / relogin / adopt(adopt = 把桌面端当前登录态导入号池,只读、不改动官方客户端文件) |
| GET / POST | /quota |
读取用量快照(POST 强制刷新):Token Plan 的 5 小时与每周窗口。上游读失败不算请求失败——quota 是可选字段,失败时卡片显示“暂无数据”,对话不受任何影响 |
与其它线路一样,所有修改状态的路由只接受同源 JSON POST,并校验 Origin 与 Host。响应里永远不含
access token / refresh token / 授权码 / PKCE verifier;诊断里提到某个令牌时只输出它的
SHA-256 指纹前缀(sha256:.../len:...),不是令牌的任何一段原文——早前版本会打印前 6 个字符,
那本身就是一次凭据泄露,因为同一个字符串会被渲染到设置卡片并写进 Host 日志(有测试锁定)。
Antigravity 的 access token / refresh token 使用独立的系统凭据存储:Windows 使用 CurrentUser DPAPI($DSH_HOME/storages/antigravity-oauth.json.dpapi),macOS 使用登录钥匙串,Linux 使用 Secret Service。macOS / Linux 的服务名为 dsh-antigravity,账号键按旧凭据文件的绝对路径生成,隔离不同的 DSH_HOME。
WorkBuddy token 仅在 Host 内处理,从不进入浏览器(/workbuddy/api 响应不含 accessToken / refreshToken,有测试锁定)。桌面扫描账号仍使用 CodeBuddy 自己的登录态文件:续期只原子写回其 auth 块;从本插件删除时只隐藏/恢复,绝不删除原文件。通过浏览器授权添加的账号归本插件所有,保存在独立系统凭据存储中:Windows CurrentUser DPAPI($DSH_HOME/storages/workbuddy-accounts.json.dpapi)、macOS 登录钥匙串、Linux Secret Service;这类账号可在设置页真正删除。
MiniMax Code 的 access token / refresh token 同样只在 Host 内处理,从不进入浏览器(/minimax-code/api 的响应只含非机密事实,有测试锁定)。号池的身份键也刻意不含机密:桌面端凭据用 recordKey(路径摘要)、插件凭据用 loginEpoch,不是刷新令牌的哈希——用令牌做键在每次轮换后都会把同一账号看成新账号。它的凭据不是本插件自持的:正常路径是只读复用 MiniMax Code 桌面端自己的 ~/.minimax/auth/<buildEnv>/<region>/mcode-public/auth.json,续期时通过「同目录临时文件 + rename」原子写回,不创建、不删除、不等待桌面端的 auth.lock,也不留任何旁路副本——不会在桌面端的目录里写出明文 .dsh-bak 之类的第二份凭据。只有本机没有桌面端凭据时,本插件才把设备码登录得到的凭据存到自己的 $DSH_HOME/storages/minimax-code-credentials.json;登出只删这一份,桌面端的登录态绝不撤销、绝不删除(撤销它等于把用户从正在运行的官方客户端踢下线)。诊断中提及令牌时只输出 SHA-256 指纹前缀,不含令牌原文。
Claude 订阅的 access token / refresh token 同样只在 Host 内处理,从不进入浏览器(/claude/api 的响应只含非机密事实,有测试锁定)。它保存在独立系统凭据存储中:Windows CurrentUser DPAPI($DSH_HOME/storages/claude-credentials.json.dpapi)、macOS 登录钥匙串、Linux Secret Service;号池另用一份同样加密的文件 $DSH_HOME/storages/claude-pool.json。凭据文档是多账号结构,账号身份由不可变的 internalId 与只增不换的别名集共同表达,任何路由键都不是令牌或其摘要(令牌会轮换,用它做键会产生幽灵账号)。每次写入都先读回校验再落盘,校验失败会抛错且不破坏既有数据。
收编(adopt)是只读的:本插件从不创建、修改、移动或删除 Claude Code 的任何文件;它只读取。收编得到的快照永不由本插件刷新(原因见上文)。
macOS 钥匙串服务名为 Claude Code-credentials(未核实,本仓库不读取它:一份第三方指南与真实客户端对该名称说法不一致,因此它被明确列为非目标)。
升级后首次访问 Antigravity 凭据时,会读取旧 storages/antigravity-oauth.json,加密保存并读回校验;成功后删除旧 JSON,通常无需重新登录。失败会保留旧文件并报告错误,不会回退到明文存储。注销同时清理旧文件和新凭据。Linux 需要 secret-tool(libsecret 工具包)及可用、已解锁的 Secret Service 钥匙环;无桌面服务的主机也需要配置该服务。系统凭据存储保护落盘数据,不防御当前用户下已获权限的进程。
Antigravity 的 Gemini 用量以流结束时的上游累计计数为准,缓存输入单列、思考 token 计入输出并另行提供明细;DSH 使用该输出计数计算 tok/s。Gemini 工具往返会保留原始思考签名,并在支持的运行时请求思考摘要;若上游没有返回摘要文本,插件不会生成替代内容。
以下为 Codex(ChatGPT 订阅)Provider 的存储与网络边界:
http://localhost:1455/auth/callback,登录任务五分钟超时,同一时刻只允许一个;https://auth.openai.com/oauth/token;https://chatgpt.com/backend-api/codex/responses、https://chatgpt.com/backend-api/codex/images/generations、https://chatgpt.com/backend-api/codex/alpha/search 和 https://chatgpt.com/backend-api/wham/usage,没有 endpoint override;security 命令读写;明文只经过 Host 内存和 security 命令行参数,Keychain 在本机加密保存;0600 权限,同时拒绝符号链接;该文件没有应用层加密,同 UID 进程、root、备份和磁盘快照仍可读取;198.18.0.0/15)被接受——那正是本机代理声称拥有该域名的表现;本机解析不出的域名交给代理处理。与 DSH 内置 provider 的差别是不固定(pin)连接地址,因为 fake-ip 环境下这一步无法成立;settings.yaml 或日志;block-end;畸形参数终止本次生成;Origin 与 Host。所有路由都以 /api/dsh-chatgpt-subscription 为前缀:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /status |
查询账号、连接状态与额度 |
| POST | /login/start |
开始 OAuth 登录 |
| GET | /login/events?loginId=... |
SSE 订阅登录进度 |
| POST | /login/cancel |
取消登录任务 |
| POST | /logout |
注销并清除凭据与额度缓存 |
| POST | /token/refresh |
刷新 token |
| POST | /quota/refresh |
刷新额度 |
| POST | /connection/test |
测试连接 |
| POST | /preferences/update |
更新搜索来源和 composer 快捷用量偏好 |
状态响应只包含脱敏 email、套餐、账号 ID 后四位、token 到期时间和额度 DTO。
npm run typecheck
npm test
npm run build
npm pack --dry-run
npm run typecheck里的tsc -b不带--force时会重放lib/*.tsbuildinfo,在一份陈旧构建上只要几秒就返回——看起来绿了,却从未真正编译过。改 harness 版本或新增类型相关的代码后,请以npx tsc -b --force为准,并把tsc -p test/tsconfig.json单独跑一遍(测试树不在-b的范围内)。
vitest.config.ts 把 testTimeout 设为 60s、maxWorkers 限到 4 是有原因的,改回去会让套件重新变得不稳定:多条目测真的会 spawn powershell.exe 跑 Windows DPAPI 凭据存储,隔离测量最慢的一条要 12–14s。超时余量不够时不只是那一条失败——超时后仍在飞的请求会落进下一个用例的 fetch mock,把邻居也判失败(表现为 expected to be called 4 times, but got 8 times)。限并发不增加耗时:这些用例受子进程延迟约束,4 个 worker 约 51s,15 个约 54s。
测试使用 mock OAuth、Responses SSE 和 Wham usage,不需要真实 ChatGPT 凭据。真实账号的端到端登录与生成应在独立 DSH profile 中人工验收,避免影响日常 profile。
Kimi Code、MiniMax Code、Command Code、Claude、WorkBuddy 遇到“输入加输出预留超限”时,插件可在 HTTP 400/422 的完整 token 计数证明输入仍能放下、且上游确实采用了请求输出上限的情况下,仅降低输出上限重试一次。消息、工具和历史保持不变,摘要请求也适用。降低后的输出仍可能截断,截断不会冒充完整摘要。Codex 不支持该输出参数,不走此恢复;输入本身超限、模糊错误或流内错误仍交给 Harness 处理。这不是对所有压缩故障的通用修复。
MiniMax、Kimi、Codex、Claude、Command Code、WorkBuddy 和 Antigravity 的错误处理会将明确的上下文超限错误交给 Harness 的溢出恢复机制。该机制需要宿主启用压缩后端;它不是无条件重发同一个超限请求。认证、配额、请求体字节限制和输出截断不会因此被当作上下文超限。手动压缩仍需生成完整摘要;如果摘要请求本身超限、被截断或缺少正文,修正错误分类也不能保证它成功。请保留失败会话中的 compaction/end 错误、provider/model、宿主及插件版本,以便定位。
| 现象 | 处理 |
|---|---|
| 1455 端口占用 | 结束旧登录任务或占用该端口的进程后重试;插件卸载会关闭 listener |
| 模型选择器里没有新发布的模型 | 该模型必须出现在 /backend-api/codex/models 返回的列表里(该列表是「这个账号能调什么」的权威)。若后端已发布而选择器没有,点设置页的强制刷新目录;仍不出现则说明当前套餐/workspace 无权调用 |
| 回答在中途被截断 | 可能是撞到服务端的输出上限。对话报文不发送 max_output_tokens(该参数会被上游 400 拒收,见「模型目录」),长度由服务端决定;被截断会以 max-tokens 结束原因呈现,可用增强功能里的上下文覆盖或换模型调整 |
| 断网后首次打开设置页很慢 | 目录有本地快照兜底,重启后第一次渲染不需要网络;若仍慢说明快照不可写(home 只读),此时不影响功能 |
| 登录后仍是 401 | 刷新 token;若刷新 token 已失效,注销并重新登录,不会循环请求 |
| 额度显示旧数据 | 设置页会保留最后成功值;等待 15 秒节流窗口后手动刷新 |
| 429 | 插件遵守 Retry-After,不会高频轮询;模型请求由 DSH retry policy 有界重试 |
| 模型不可用 | 检查 ChatGPT 套餐、workspace 权限与当前模型可用性 |
web_fetch 报 resolves to a non-public IP address |
机器启用了系统代理(fake-ip DNS),但插件没有可用代理可接管抓取:在 设置 → Codex 订阅 → 网络代理 选择系统代理(自动检测)或填写自定义代理 |
| DPAPI 读取失败 | 确认 DSH 以创建凭据时的同一 Windows 用户运行;必要时清理凭据后重新登录 |
| Linux 凭据存储不可用 | 确认凭据属于当前用户且权限为 0600,父目录权限为 0700;修复权限或注销后重新登录 |
| Linux 上工具调用语法错误 | 确认 DSH 暴露的是 bash、sh 或 shell,并使用相应的 Bash/POSIX 语法与 / 路径 |
command-code 模型不出现在选择器里 |
卡片上若显示“模型路由已被其他 Provider 占用”,从占用方(常见是 llm-pi-ai 的 command-code 条目)移除该 Provider,插件会在下一次路由变更时自动接管;否则检查是否勾选了模型 |
| Command Code 登录失败 | 确认 5959–5968 端口未被占用;无浏览器环境改用手动填写 API Key;state 校验失败时重开一次登录 |
| Command Code 返回 401 | 设置页重新登录或重新粘贴 API Key;插件不会保存无法通过 /alpha/whoami 的 Key |
| Claude 模型报格式错误 | 该 API 只接受把 claude-* 发到 /messages;请使用插件自动选择的线路,不要手工把 Claude 模型指向 OpenAI 端点 |
| Command Code 额度显示为空 | 账户 API 的账单/用量线路可能只对部分套餐开放;空态是解析不出有界额度时的正常表现,可点「刷新用量」重试 |
Command Code 报 502 Upstream model provider is temporarily unavailable |
这是上游模型供应商的瞬时故障,不是账号或 API Key 的问题:插件会按 DSH retry policy 自动重试(最多 3 次);连续失败即换用同一账号下的其他模型,或稍后再试 |
| Kimi Code 登录后立即失效 | 设备码只有几分钟有效期;重新点「设备码登录」即可。若刷新令牌被拒,卡片会明确提示重新登录(插件不会反复重试被拒的令牌) |
Kimi Code 返回 401 does not have access to k3 / supports only … up to … context |
这是套餐权限而非凭据问题:k3 需 Moderato 及以上、其 1M 上下文需 Allegretto 及以上。换用 kimi-for-coding 或 k3-256k,或把该模型的上下文覆盖降到 256K |
Kimi Code 返回 403 reached your … usage limit |
账号额度用尽(5 小时 / 7 天 / 月度共享池)。卡片会显示各窗口的重置时间;共享池耗尽时即使 Kimi Code 池还有余额也会被拒 |
Kimi Code 报 502 Upstream model provider is temporarily unavailable |
上游模型供应商的瞬时故障,与账号、模型、凭据都无关:插件会按 DSH retry policy 自动重试(最多 3 次,并遵守上游 Retry-After);连续失败可稍后再试或换用同账号下其他模型 |
Kimi Code 报 429 engine is currently overloaded |
服务容量问题(工作日 14:00–17:00 高峰更常见),会自动退避重试;若响应里带 error.type = exceeded_current_quota_error 则属于配额耗尽,插件不会重试而是提示补充额度 |
| Kimi Code 额度显示为空 | 卡片会同时给出失败原因(/v1/usages 的 401/403/5xx 文案),按提示处理后点「刷新用量」重试;确认用的是订阅账号——开放平台的 key 在这里不会被接受 |
| Kimi Code 报「rejected the stored credential (401). Sign in again…」但发消息却是好的 | 这是过期 access token,不是被拒的账号:Kimi 的 access token 只有 15 分钟,而设置卡片过去会把号池里存着的那个 token 直接拿去查用量,因此只要 15 分钟内没走过一次 Kimi 请求,卡片就必然拿到 401。现在卡片会先刷新再请求(401 还会触发一次强制续期),因此不必重新登录;若卡片仍提示重新登录,才是真的刷新令牌被拒,按提示处理即可 |
| Kimi Code 账号一栏为空 | 账号身份取自 OAuth token 自身的 JWT 声明,套餐名取自 /me(/usages 自 2026-09 起不再返回 user_level_name)。重新登录或点「刷新用量」即可写入;若仍为空但显示「已登录」,点「测试连接」可确认凭据是否仍被接受 |
| Claude 相关接口返回 403 | 403 现在是同源校验的结果(修改状态的路由只接受同源 JSON POST)。若出现在浏览器里,检查是否从其它来源发起了请求;插件已不再有任何"确认后才能用"的门禁 |
| 授权后粘贴授权码报「请把 # 后面的部分一起复制」 | 手动流程需要 <授权码>#<state> 整段。只粘贴授权码是不被接受的:用流程自己的 state 顶上会架空 state 参数、把粘贴框变成登录 CSRF 的入口,因此插件宁可报错也不猜 |
| loopback 回调收不到 / 端口绑定失败 | 端口探测失败会自动降级为手动粘贴(卡片会说明原因),照提示粘贴授权码即可。另:若浏览器把 localhost 解析到 ::1,依赖浏览器的跨地址族回退可达本机 v4 监听,这是假定而非实测 |
选择某个模型报 claude_code_version_too_old(例如 Opus 5.5 要求 2.1.280+) |
上游会校验本插件申报的客户端版本,新模型有各自的最低版本要求。插件现在会在发出请求之前本地拦下并告知模型、当前版本与要求版本(归类为请求问题而非凭据问题,不会把你登出——重新登录也不会有帮助)。用 DSH_CLAUDE_CLI_VERSION 抬高申报版本即可;已发布版本 ≥2.1.283 时 Opus 5.5 可直接使用 |
| 模型请求报持续 400 / 「You're out of extra usage」 | 可能是身份或版本门槛:订阅令牌要求 Claude Code 身份头与 system 首块,且服务端会校验你申报的客户端版本。此类错误被归类为请求问题而非凭据问题,不会把你登出 |
| 额度显示为空 / 某项显示「—」 | 额度接口的键集随账号类型变化,未提供的窗口会显示为未知而不会伪造 0。注意 utilization 是已用百分比,0% 表示尚未使用(正常态),不是额度耗尽;真正的耗尽会以 429 与响应头状态呈现。接口被限流时卡片保留上次成功快照并标注时间 |
| 收编后提示「本机 Claude Code 登录已过期」 | 这是设计如此:收编的是快照,插件永不刷新它(Claude Code 刷新同一枚轮换令牌,两个进程各自刷新会互相作废)。回 Claude Code 重新登录后再收编一次即可 |
| 账号被标为「无法识别账号身份」 | 服务端这个账号既没返回 uuid 也没返回 email,插件无法在再次登录时自动认出它。用卡片上的手动合并把它并入既有账号;这是已知限制,插件不会用假 id 掩盖它 |
| 模型不出现在选择器里 | 依次检查:卡片是否显示「模型路由已被其他 Provider 占用」(另一适配器持有该 id 时本插件会如实报告冲突而非抛错);以及模型是否已勾选 |
| Kimi Code 发送视频却没有画面 | k3-256k 不支持视频,切到 k3 或 kimi-for-coding;容器须在白名单内(mp4/mpeg/mov/avi/x-flv/mpg/webm/wmv/3gpp);若该模型走的是 Anthropic 线路,视频会降级为文字(该协议没有文档化的视频块)。以上情况模型都会收到明确的文字说明,据此向你说明而不是凭空回答 |
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。