一句话:
@hackforjoy/dsh-openai-siwc让 DeepSeek Harness(DSH)通过 OpenAI 官方的Sign in with ChatGPT(SIWC)机制登录你的 ChatGPT 账号,并使用你的 ChatGPT Plus / Pro 套餐额度调用模型——不需要 API Key,也不改动 DSH 一行核心代码。
- GitHub:https://github.com/HackForJoy/dsh-openai-siwc
- npm:https://www.npmjs.com/package/@hackforjoy/dsh-openai-siwc
这是社区插件,与 OpenAI、DeepSeek 均无隶属或背书关系。
为什么做这个插件
DeepSeek Harness 是一个插件化的 Agent 运行环境。很多人手里已经有 ChatGPT Plus 或 Pro 订阅,却还得为 Agent 单独申请、充值一个 API Key。
OpenAI 为开源客户端提供了一条官方路径:ChatGPT plan usage for open-source clients。应用通过 Sign in with ChatGPT 完成授权,用户确认后,符合条件的推理请求直接计入他的 ChatGPT 套餐。dsh-openai-siwc就是把这条官方路径接进 DSH 的 provider 插件。
需要先说清楚它不是什么:
- 不是传统的 Codex OAuth(复用 Codex CLI 的固定 client、调用 ChatGPT 网页后端)。本插件只走官方文档描述的 SIWC 流程和公开的
api.openai.com/v1接口。 - 不是API Key provider。它不会把 SIWC token 当作 API Key 使用,请求失败时也不会悄悄切换到别的计费方式。
它能做什么
在 DSH 的模型选择器里选择ChatGPT plan (Sign in with ChatGPT)下的模型,就能像使用其他 provider 一样驱动 Agent:
- 流式输出、多轮对话
- 工具调用:DSH 的全部工具都能用(按官方要求放在一个 namespace 中),工具结果会回传给模型
- 图片输入:给对话附加图片,支持图片的模型直接"看图",工具结果里的图片也会发送
- 推理强度:选择器里可以选 Low / Medium / High / Xhigh / Max,选 Default 则使用服务端默认值
- 模型能力全部来自你账号的模型目录:输入类型、上下文窗口、可选的推理档位都由
/v1/models返回的数据决定,不靠硬编码,也不做猜测
还有几条斜杠命令:
/siwc login [new] # 登录(或添加另一个 ChatGPT 账号) /siwc status # 登录状态、授权范围、token 剩余时间、最近一次错误(不显示任何 token) /siwc models # 拉取当前账号可用的模型 /siwc logout # 登出,并在 OpenAI 端撤销会话三步上手
使用条件:ChatGPTPlus 或 Pro账号(官方说明 plan usage 面向符合资格的用户,Free 账号在登录时会被拒绝);DSH 0.2.1-rc.3;Node.js ≥ 22。
1. 安装
DSH="/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh"# macOS"$DSH"plugin--profile<profile>add@hackforjoy/dsh-openai-siwc2. 登录:重启 DSH 后,在一个会话里执行/siwc login。插件会打开系统浏览器,你在 ChatGPT 页面上确认授权、允许使用 ChatGPT 套餐即可。浏览器显示 “Sign-in finished” 后回到 DSH。
3. 使用:在模型选择器里选一个模型,按需调整推理强度,开始对话。
小提示:DSH 首页的空白输入框不显示命令输出,
/siwc命令请在已有会话中执行。
安全是第一位的
这个插件替你保管的是能消耗你 ChatGPT 套餐额度的令牌,所以安全设计贯穿始终:
- 严格遵循官方协议:动态客户端注册、仅监听
127.0.0.1的回环回调、PKCE S256、state 与 nonce 校验;ID Token 用官方 JWKS 验签,并校验 issuer、audience、过期时间和 nonce。 - 授权范围检查:只有在用户明确授予 ChatGPT plan 使用权限时才发起推理。
- 令牌不外泄:令牌只放在请求头里,不进 URL、日志、诊断输出或命令结果;所有错误信息都经过脱敏处理。OpenAI 端点写死在代码中,不能通过配置改成别的地址。
- 安全存储与刷新:凭证存放在 DSH 的凭证存储中(权限
0600、原子写入);刷新在跨进程独占的写入区间内完成,多个 DSH 进程不会争用同一个轮换的 refresh token。 - 真正的登出:
/siwc logout会先在 OpenAI 端撤销会话,再删除本地令牌;如果撤销未能确认,会明确告诉你。 - 不绕过任何服务端限制:资格、用量上限、模型权限都以服务端为准,错误原样上报,不重试、不切换计费方式。
完整的威胁模型见仓库里的docs/security/threat-model.md。
工程上的几点坚持
以官方文档为唯一协议依据。每个端点、参数和错误码都能在官方文档里找到出处,核实记录在docs/research/openai-siwc-protocol.md。文档没有写明的行为,一律先标为"待验证",再用真实账号确认。
真实环境验收,不只是跑通 mock。在隔离的 DSH 环境中,用真实的 Plus 账号逐项验证了登录、退出后再次登录、模型列表、流式输出、多轮对话、工具调用、图片识别、推理强度、令牌刷新与轮换、登出与远程撤销,并扫描了日志和会话文件,确认没有令牌泄露。真实环境也教会了我们一些文档里没写的事,例如:
- 模型目录里会出现 API 并不接受的推理档位(
ultra),因此可选档位要和 API 允许的值取交集; - 流式响应不带
Content-Type头; - 不符合资格的账号是在换码阶段被拒绝的。
这些发现都已记录在仓库文档中,并体现在实现和测试里。
测试与真实服务对齐。157 个单元测试和集成测试运行在真实的 DSH 服务(LLM 运行时、授权服务、凭证存储、附件存储)之上,对接一个严格实现官方协议的 mock:校验 PKCE、强制参数一致、refresh token 轮换并拒绝重用,并复刻真实服务的行为。测试永远不会碰你真实的~/.dsh。
可验证的发布。每个版本都由 GitHub Actions 构建一次,同一个 tarball 同时挂到 GitHub Release 并发布到 npm(npm Trusted Publishing,不存储任何 token),附带 SLSA provenance:
# 校验 GitHub Release 附件sha256sum-cSHA256SUMS# 校验 npm 包的签名与来源证明npmaudit signatures零核心改动。插件只使用 DSH 的公开扩展点:ctx.llm、ctx.credentials、ctx.authorization,以及可选的ctx.commands、ctx.attachments。
已知限制
- 目前只验证过 DSH 0.2.1-rc.3。DSH SDK 仍是预发布版本,插件会跟随 DSH 版本发布对应的更新。
- 同一时间只有一个活动账号(可以保存多个账号,登录时选择)。
- DSH 0.2.1 的设置界面还没有为第三方授权流程提供按钮,所以登录要通过
/siwc login完成。 - 这条路径的可用性和额度由 OpenAI 决定:Plus 用户的 5 小时用量上限在所有使用 ChatGPT 套餐的应用间共享,可以在 https://chatgpt.com/settings/usage 查看和管理。
参与进来
项目以 MIT 协议开源,欢迎试用、提 Issue 和 PR:
- 🐙 GitHub:https://github.com/HackForJoy/dsh-openai-siwc
- 📦 npm:
@hackforjoy/dsh-openai-siwc - 🔒 安全问题请通过 GitHub 的私密漏洞报告提交,不要公开发 Issue。
如果你也在用 DeepSeek Harness,又刚好有 ChatGPT 订阅,不妨试一试。