前言¶
DeepSeek Harness (DSH) 支持通过插件扩展功能。针对 Codex CLI 用户,如果希望在 DSH 中直接使用 Codex 的订阅模型(如 gpt-6-astra),需要解决后端接口不兼容的问题。dsh-codex-provider 插件通过适配器层,将 DSH 与 ChatGPT 的订阅后端连接起来,复用 OAuth 会话凭证。
插件介绍¶
这是一个由 HaydenSmith1121 维护的插件,旨在为 DeepSeek Harness 提供对 Codex 模型的支持。它不依赖 API Key,而是读取 Codex CLI 登录后的会话信息(~/.codex/auth.json),通过 OAuth 认证访问订阅模型。
核心价值在于:不需要购买 OpenAI API Key 即可使用 Codex 的模型,且不产生额外的按 token 计费账单,仅消耗 ChatGPT 订阅额度。
安装与启用¶
Web Profile¶
安装插件:
dsh plugin --profile web add dsh-codex-provider
安装完成后,重启 dsh web,进入 设置 → 模型,即可看到 Codex (ChatGPT) 选项。
Headless Profile¶
dsh plugin --profile headless add dsh-codex-provider
安装后,需要在 headless.patch.yml 中配置默认模型:
- id: agent-default-model
config:
provider: codex
model: gpt-6-astra
核心能力¶
插件实现了以下功能:
- 流式输出:支持 SSE 逐帧转换,边生成边显示。
- 工具调用:支持
function_call/function_call_output与 DSH 的tool-call/tool-result映射。 - 推理档位:支持
low到ultra等档位,不支持该档位时会明确报错。 - 思考内容:支持展示
reasoning_summary事件。 - 图片输入:支持上传图片并转换为
input_image。 - 多轮历史:支持助手轮次与工具结果的回放。
- 用量显示:读取订阅剩余额度。
工作原理与网络¶
认证与会话¶
插件必须依赖 Codex CLI 已登录的会话。它读取 ~/.codex/auth.json 中的 access/refresh token。插件仅读取该文件,不会写回数据,也不会影响 codex 命令本身的登录态。
网络与代理¶
由于 Codex 后端接口不在 api.openai.com,且后端在受限网络下无法直连,插件自行实现了 HTTP CONNECT 隧道:
export HTTPS_PROXY=http://127.0.0.1:7897
NO_PROXY生效(支持域名后缀匹配)。- 本机地址(
127.0.0.1、localhost)永不走代理。 - 不使用 Node 全局
fetch,而是自己实现传输层。
源站容灾¶
Codex 后端有两个等价源站,插件在主源站(https://chatgpt.com/backend-api/codex)连接失败(TRANSPORT / TIMEOUT)时会自动切换至备用源站(https://chat.openai.com/backend-api/codex)。
模型探测¶
模型目录并非硬编码,而是从后端 /models 接口实时获取。插件会从本地 Codex 安装中探测 client_version,确保请求头与第一方客户端一致。
已知限制与错误码¶
已知限制¶
- 依赖订阅:依赖 ChatGPT 订阅的可接受使用政策。
- 接口变动:后端接口不是公开契约,可能随时变化。
- Stop 序列:不支持
stop序列,会报UNSUPPORTED_OPTION。 - 用量面板:用量显示依赖未文档化的后端接口,解析失败时会静默降级。
错误码说明¶
DSH 按路由码恢复策略,以下是插件定义的错误分类:
| 场景 | Code | 说明 |
|---|---|---|
| 没有可读的 Codex 会话 | MISSING_CREDENTIAL |
提示运行 codex login |
| 凭证被拒绝 | AUTH |
401/403,作废缓存 token |
| 订阅额度耗尽 | QUOTA |
usage_limit_reached,需等待重置 |
| 请求频率限制 | RATE_LIMIT |
瞬时 429,可重试 |
| 超出上下文 | CONTEXT_WINDOW_EXCEEDED |
|
| 后端不提供该模型 | UNKNOWN_MODEL |
|
| 模型不支持图片 | UNSUPPORTED_CONTENT |
|
| 不支持 stop 序列 | UNSUPPORTED_OPTION |
明确拒绝 |
| 模型不支持该推理档位 | UNSUPPORTED_REASONING_EFFORT |
|
| 连接/超时/代理拒绝 | TRANSPORT / TIMEOUT / PROXY_REJECTED |
|
| 模型返回空回复 | EMPTY_RESPONSE |
可安全重试 |