前言¶
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 |
可安全重試 |