为 DeepSeek Harness 增加一个 provider 路由 chatgpt,它用已登录的 ChatGPT…
38.6/100
综合分
11
GitHub 星标
1,581
npm 周下载
—/5
用户评分
数据截至 2026/10/30 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-plugin-chatgptnpm 源 · dsh-plugin-chatgpt 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · model
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 2 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-plugin-chatgpt @ 0.1.16
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/27 23:42:36
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 14 处,展示前 14 条)
- 发起网络请求lib/api/client.js:88
const response = await fetch(`${baseOf(endpoints)}/models`, { - 发起网络请求lib/api/client.js:159
const response = await fetch(`${baseOf(options.endpoints)}/responses`, { - 发起网络请求lib/auth/refresh.js:54
const response = await fetch(options.tokenUrl ?? TOKEN_URL, { - 读取本地文件lib/auth/host-id.js:27
text = readFileSync(file, 'utf8'); - 写入本地文件lib/auth/host-id.js:56
mkdirSync(dirname(options.file), { recursive: true }); - 写入本地文件lib/auth/host-id.js:59
writeFileSync(options.file, `${id}\n`, { encoding: 'utf8', flag: 'wx', mode: 0o600 }); - 发起网络请求lib/auth/sign-in.js:190
const response = await fetch(options.tokenUrl ?? TOKEN_URL, { - 读取本地文件lib/auth/store.js:30
text = readFileSync(file, 'utf8'); - 写入本地文件lib/auth/store.js:97
mkdirSync(dirname(file), { recursive: true, mode: 0o700 }); - 写入本地文件lib/auth/store.js:99
writeFileSync(temporary, `${JSON.stringify(document, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 }); - 写入本地文件lib/auth/store.js:101
renameSync(temporary, file); - 删除本地文件lib/auth/store.js:104
rmSync(temporary, { force: true }); - 发起网络请求lib/auth/revoke.js:41
const response = await fetch(options.discoveryUrl ?? DISCOVERY_URL, { - 发起网络请求lib/auth/revoke.js:94
const response = await fetch(endpoint, {
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-llm@deepseek-ai/dsh-typert-protocol@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 免APIkey接入
- 模型出现在选择器
在 DeepSeek Harness(dsh)里把 ChatGPT 订阅当模型服务商用,走 OAuth 登录 ChatGPT,不用 API key,账号自带的模型直接出现在模型选择器里。
最近更新
在 GitHub 查看全部 →v0.1.132026-10-16
· 变更内容
· 修复:在 DSH 中保留 SIWC 历史与重放状态
· 修复:遵循账户默认值并尊重显式上下文预算
· 新功能:按模型配置上下文预算
· 新贡献者
· @ckanner 首次贡献于
完整变更日志:
v0.1.02026-10-05
用 ChatGPT 账号通过 OAuth 登录,把该订阅的模型当作 DeepSeek Harness 的服务商路由来用。
· 安装无需构建步骤
本次发布带预构建 tarball,安装时不需要 pnpm 的构建批准:
dsh plugin --profile add
或者你更想自己构建,就从源码安装:
dsh plugin --profile add /path/to/dsh-plugin-chatgpt
装完重启 harness:配置档在启动时组装。
· 功能
· 在「设置 → 模型」里登录,位置在插件自己的服务商行上。卡片会显示授权 URL,弹窗被拦截时可以粘贴重定向 URL,登录后显示账号而不是 token。
· 账号自带的模型会出现在模型选择器里,容量和推理等级按账号上报的来。
· 退出登录时先在授权服务器吊销授权,再清本地,服务器没确认会明说。
· 说明
· 路由名是 chatgpt,不是 openai:内置服务商占用了那个名字,注册表拒绝重名。
· 凭据放在 $DSH_HOME/chatgpt-subscription/,仅所有者可访问。
· 该路由不上报提示词缓存读取,所以编辑器的缓存命中读数在这里是零;其他用量数字是真实的。
---
这个资产已被取代——请改从 npm 安装。
dsh-plugin-chatgpt@0.1.0 无法加载:它的文件列表只写了入口点,没写入口点导入的模块,所以包能装干净,导入时才失败。这个版本因此在 npm 上被弃用,后续版本已修复。
请用注册表,它总能解析到当前版本:
dsh plugin --profile add dsh-plugin-chatgpt
本次发布留在这里作为历史记录;它的资产不是能用的安装。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成dsh-plugin-chatgpt
为 DeepSeek Harness 增加一个 provider 路由 chatgpt,它用已登录的 ChatGPT 订阅而不是 API key 来应答模型调用。登录采用 OpenAI 公布的 Sign in with ChatGPT 流程,因此由账号自己的套餐为推理付费。路由命名为 chatgpt 而非 openai,因为内置的 pi-ai 插件已经占用了后者。模型及其上下文窗口与推理级别都来自你自己账号的列表,因此可选范围跟着套餐走,而不是一份写死的清单。
把 DeepSeek Harness 接入 ChatGPT
Table of Contents
- 使用本包
- 你会得到什么
- 实现说明
- 延伸阅读
- 模型体验
- 已知限制与待办
- 开发者说明
使用本包
安装到 profile
安装就是一行:
dsh plugin --profile <name> add dsh-plugin-chatgpt
装完重启 harness:profile 在启动时组合。
展开完整文档(README 剩余 1 节)
dsh-plugin-chatgpt
为 DeepSeek Harness 增加一个 provider 路由 chatgpt,它用已登录的 ChatGPT 订阅而不是 API key 来应答模型调用。登录采用 OpenAI 公布的 Sign in with ChatGPT 流程,因此由账号自己的套餐为推理付费。路由命名为 chatgpt 而非 openai,因为内置的 pi-ai 插件已经占用了后者。模型及其上下文窗口与推理级别都来自你自己账号的列表,因此可选范围跟着套餐走,而不是一份写死的清单。
把 DeepSeek Harness 接入 ChatGPT
Table of Contents
- 使用本包
- 你会得到什么
- 实现说明
- 延伸阅读
- 模型体验
- 已知限制与待办
- 开发者说明
使用本包
安装到 profile
安装就是一行:
dsh plugin --profile <name> add dsh-plugin-chatgpt
装完重启 harness:profile 在启动时组合。卸载:
dsh plugin --profile <name> remove dsh-plugin-chatgpt
该包已在 npm 上,因此从 registry 安装就是全部步骤,不涉及任何构建:
dsh plugin --profile <name> add dsh-plugin-chatgpt@0.1.9 # pin a version, or omit it for the latest
改从仓库地址安装则会从源码构建,而 pnpm 在构建脚本被允许之前会拒绝 git 依赖:add https://github.com/ckanner/dsh-plugin-chatgpt 会以 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 失败,直到在 profile 的 pnpm-workspace.yaml 里把 dsh-plugin-chatgpt 加进 onlyBuiltDependencies。
本包声明了 dsh.bundle,因此添加它会把该 bundle 追加到 profile 的 dsh.profile.bundles,并把它的行插入到组合中。可以不启动就检查这一层:
dsh --profile <name> --dump-config # shows a "# == dsh-plugin-chatgpt" layer
没有声明 dsh.bundle 的包不会激活任何层,dsh plugin 只会给出警告。
登录
打开设置 → 模型。本插件拥有一行 ChatGPT,该行的卡片提供 Sign in with ChatGPT。卡片会显示授权 URL 并支持选中复制;当浏览器无法访问回环地址时,可以粘贴最终的回调 URL;完成后卡片报告该账号——套餐、token 下次刷新时间、以及它提供多少个模型——并提供 Sign out 按钮。任何 token 都不会到达页面。
退出登录会先在授权服务器撤销可再生会话,再清除本地凭据;若服务器未能确认,卡片会如实说明。
模型页上的 ChatGPT 行,账号从这里登录
无头 harness 不需要浏览器,可以直接驱动同一个会话对象:
import { ChatGptAuth } from 'dsh-plugin-chatgpt/src/auth/manager.ts'
const auth = new ChatGptAuth({
stateDir: ${process.env.DSH_HOME ?? ${process.env.HOME}/.dsh}/chatgpt-subscription,
agentNameHint: 'DeepSeek Harness',
})
const attempt = await auth.begin()
console.log('Open this URL in your browser:\n' + attempt.authorizationUrl)
// The browser redirects to the loopback listener this attempt bound. If the
// redirect cannot reach it — a headless host, or a blocked popup — paste the // final URL back instead. // await attempt.submit('<the full redirect URL from your browser>')
const credential = await attempt.result
auth.adopt(credential)
授权凭据以仅属主可读的权限存放在 stateDir 下。attempt.submit() 对格式错误或不匹配的值会拒绝,并让本次尝试保持存活,所以粘贴错了可以改正重试。
你会得到什么
一个 provider 路由,像内置 provider 一样出现在 设置 → 模型 里,带有该账号有权使用的模型清单、上下文窗口和推理级别。在那里选中某个模型,就是把它放进模型选择器的方式,不涉及任何单独的挑选界面。
模型元数据来自账号列表。适配器默认跟随各模型在账号目录中声明的上下文窗口,并在目录刷新时采用更新值。可用 contextWindowLimit 设置全局预算,或用 modelContextWindowLimits 为指定模型设置预算;显式配置会按填写的值采用。登录仍在这一行的卡片上。
例如,在插件配置中加入以下字段,即可把没有单独配置的模型的 DSH 上下文预算设为 1,000,000 token,即使目录声明的最大值是 872,000 也不会缩小。删除此字段后,这些模型恢复账号默认值。这些设置与 Codex 配置相互独立。DSH 仍会为压缩预留空间;它们不会改变服务端的请求限制。
contextWindowLimit: 1000000
单独配置模型预算时,以完整模型 ID 为字典键。优先级为指定模型配置、全局预算、账号默认值。下面的示例中,Astra 使用 1,000,000,Sol 使用 800,000,其余模型使用 500,000。全局字段是可选的;省略它可让其余模型跟随各自账号默认值。
contextWindowLimit: 500000
modelContextWindowLimits:
gpt-6-astra: 1000000
gpt-6.1-sol: 800000
修改会在 DSH 下次解析模型时生效。删除某个模型项后,该模型恢复当前全局预算;未设置全局预算时则恢复账号默认值。字典键按区分大小写的完整模型 ID 匹配,不使用显示名称或通配符。
模型选择器里,账号自己的模型列在 ChatGPT 分组下
这个安装可以花掉的套餐份额是在 ChatGPT 设置里按应用单独设定的:
该应用在套餐中的额度占比,在 ChatGPT 设置里逐应用设置
实现说明
实现细节 — 点击展开
| 源码 | 职责 |
| cordis.patch.yml | 配置层:插入一行,指明路由与状态目录。 |
| src/index.ts | 插件入口:持有适配器实例并注册路由。 |
| src/auth/protocol.ts | 所公布流程的精确端点、scope 与 loopback 规则。 |
| src/auth/sign-in.ts | 授权:loopback 监听与粘贴重定向 URL,两条路径并行竞争。 |
| src/auth/manager.ts | 已存凭据、当前账号,以及单飞刷新。 |
| src/auth/store.ts | 原子写、仅属主可读的凭据存储。 |
| src/api/events.ts | 解码 Responses 事件流及其失败形态。 |
| src/convert/request.ts | Harness 请求转 Responses 请求体,含该路由拒收的字段。 |
| src/convert/harness.ts | DSH 请求边界,含会话身份与回放元数据。 |
| src/convert/replay.ts | 原生输出校验及限定账号和模型的 DSH 回放封装。 |
| src/convert/blocks.ts | 线上事件转 Harness 的编号内容块。 |
| src/api/client.ts | 两次 HTTP 调用:列出模型、跑一轮。 |
| src/models/describe.ts | 可用性与容量,优先采用账号所报的值而非内置目录。 |
| src/adapter.ts | provider 契约面向 Harness 的那一半。 |
代码强制而非仅记录的三条规则:
- 请求绝不携带 temperature、max_output_tokens、top_p、truncation 等套餐额度路由拒收的字段。它们被显式列在 REFUSED_FIELDS 中,因此不会被误加回来。
- response.completed 是唯一成功的终态。没有它就以结束的流算作错误,因为「被截断却看起来已完成」的回答比一个可见的失败更糟。
- 运行时读取账号元数据。 插件使用当前账号的授权请求 GET /v1/models。内置目录补充缺失的描述,带测量日期的清单可加入未列出的模型。模型可用性、容量和报告给 DSH 的上下文预算是不同的概念。
延伸阅读
- Sign in with ChatGPT: OSS token sharing — 本包所实现的公开流程。
- Models and inference — 列表与请求约束。
- Preview limitations — 该路由目前尚不具备的能力。
模型体验
本 bundle 只插入一行 provider,该行的插件拥有全部面向模型的行为;配置层本身不贡献任何 prompt、工具或上下文。
请求上下文与条件
模型能看到什么
每轮发往 chatgpt 的请求都保留消息、助手内容块、工具调用及结果的原始顺序。system 与 developer 指令在原位置作为 developer 消息发送,并向 DSH 声明在历史中追加系统提示更新。助手的原生输出(含加密推理)通过 DSH 的 replayState 保存;授权、路由、模型一致且内容未变化时,完整回放这些数据。
Token 影响
可变。可见上下文来自 DSH;回放加密推理也可能计入输入 token,可读的思考摘要不能替代它。适配器不自行截断历史,由 DSH 按报告的上下文预算执行压缩。输出预留保持低于该预算,但这条路由不接受输出 token 上限。
KV Cache 影响
适配器在多轮工具调用和会话恢复中保留可复用前缀及不透明推理状态。本地授权命名空间、client 注册、端点、provider、会话 ID 和调用用途的固定长度哈希同时用于 prompt_cache_key 与 session_id 请求头;刷新 token 不改变它。重新授权会生成新命名空间,旧凭据在首次读取时补齐;无会话 ID 的调用则省略两者。GPT-5.6 及以后由 OpenAI 自动处理缓存路由,key 不保证命中。SIWC 要求 store: false 并在 HTTP 请求中携带完整历史,响应存储与提示词缓存是两件事。与 Pi 的公共 SIWC 路线一样,这里继续省略缓存保留期与 options,等待按模型和路由验证。参见官方缓存指南及推理回放说明。
已知限制与待办
- 已有历史仍可使用 — 旧会话缺失的加密回放数据无法恢复,但可见消息和工具记录会按顺序回放。对于被编辑、裁剪、来自其他适配器、格式错误或不兼容的元数据,会退回可见历史,避免重新引入已丢弃内容。此集成要求 DSH 宿主支持 finish.replayState 和 systemPromptUpdate: "in-history";参见回放设计与验证方案。
- UI 一次只展示一个账号 — 宿主为每个已授权账号分别保存,并可按 subject 退出其中任一个,但卡片只显示与切换当前账号,因此添加第二个账号需要先退出当前账号。
- 图片与文件不会被发送 — 图片或文件块携带的是持久化的附件引用,本适配器尚未解析它,因此到达模型时是占位文本 [image omitted: not yet supported]。该省略是可见的而非静默的,但内容确实丢失了。
- 套餐额度路由仍处于 preview — computer use、Code Interpreter、file search、hosted MCP、图像生成与 tool_search 无论本插件发送什么都会被上游拒绝;而 multi_agent、temperature 和 max_output_tokens 属于必须省略的十五个字段之列。
- 名单混合了两个权威性不同的来源 — 账号的列表提供「被宣传的」模型,并附带接口自己的元数据;实测可用但列表未提及的模型来自 src/models/served.ts,并记录测量日期。若列表在测量过期后发生变化,会显示出已经不再应答的额外模型;includeUnlisted: false 可把名单收窄为账号自己的回答。
- 一个安装对应一个 host id — host id 以状态目录为作用域。两个 profile 共用一个目录,对 OpenAI 而言就是一个安装;两个目录就是两个,各自需要单独授权。
- agent_name_hint 是常量 — 默认 DeepSeek Harness,可按 profile 覆盖;但它是人类在授权页上读到的名字,也是 OpenAI 记录的此应用身份,因此改动它会改变既有授权凭据的归属。
- 上下文增长受可配置预算约束 — 默认跟随各模型的账号目录窗口,不设置统一固定上限。contextWindowLimit 和 modelContextWindowLimits 中的每个值都必须是至少 1,024 的安全整数。指定模型值优先于全局值;参照 Pi 的覆盖逻辑,两者均优先于目录元数据,且不按目录最大值缩小。未显式配置且账号元数据缺失时,使用内置回退值。实际触发点与预留空间仍由 DSH 的压缩策略控制。这是上下文预算,不是消费硬上限或缓存命中目标。
- 退出登录是两件事,卡片会说明发生了哪一件 — 可再生会话会先在授权服务器撤销,再清除本机凭据,因为本地删除的授权凭据可能在别处仍然有效。服务器无法送达时,本地登出仍然完成,而结果会明确说明远端撤销未被确认。额度耗尽时会指向 ChatGPT 自己的用量页面,并说明该错误码既不指明原因、也不给出重置时间:套餐的共享用量与应用级限制都可能是原因,因此网站上看起来远未接近上限的套餐与一次拒绝可以同时为真。
- 每个 Config 字段都是 volatile(),这是有实际作用的 — Harness 只根据 volatile 字段构建插件的 settings 表单,没有 volatile 字段的插件就不会有 settings 命名空间。而模型页只为命名空间存在的行渲染 provider 行,所以没有 volatile 字段的 schema 会让这条路由、以及依附其上的卡片,根本无法显示。volatile 字段在使用处以 .get() 读取,而不是被当作值捕获。
- 客户端半会自己挂载它的 Remote 命名空间 — 打包的第三方插件无法自行访问 ctx.remote.<namespace>:Gateway 只从生成出来的 descriptor contribution 安装命名空间,而承载这些内容的包是在构建期按固定的 workspace 包列表生成的。没有任何机制为树外包生成它,生成器也未发布,因此本插件在 src/remote-methods.ts 里自行挂载该 contribution。有测试会读取控制器源码,在两边列表不一致时失败——因为只在一边新增方法,会在用户点击的瞬间才报错。
- 登录后会向浏览器通告新的模型清单 — 模型选择器会缓存宿主 catalog,只在宿主声明有变化时重载,因此在登录时把空清单填满的插件必须发布 llm/adapters-updated。否则模型确实在服务,却永远不会出现在选择器里——看起来就像 provider 坏了。账号卡片会报告该账号提供多少个模型,或说明清单为何读不到。
- 缓存统计来自实测,不作预测 — 百分比按服务端计数计算为 cacheReadTokens / (inputTokens + cacheReadTokens + cacheWriteTokens)。旧版本曾重排工具历史并丢弃原生推理,其低命中率不能证明 SIWC 存在固有上限。前缀保持测试不等于线上命中率测试;应固定模型与推理级别,预热后比较缓存读写、总输入、延迟和额度影响。
- 每个安装各自注册一个 client — ChatGPT 设置里每个注册对应一行应用,名称取自 agent_name_hint;本插件在登出后仍保留「账号 ↔ client」的映射,因此同一安装下次登录会复用原来那一行,而不是再添一行。第二个 state 目录对 OpenAI 而言就是第二个安装,会单独注册;删除某个 state 目录即等于忘记那个安装。
Dev Note
npm test # node --test, no build step
npm run typecheck # entry point checked against dev-types/ shims
npm run build # tsc emits the host half and the declarations, esbuild the browser bundle
npm run verify:harness -- /path/to/deepseek-harness # actual DSH assembler, offline
dev-types/ 存放 Harness 的 LLM 与 Cordis 接缝的开发期声明,转录自 Harness 源码。它们不发布、也从不随包分发;宿主以 peer dependency 的形式提供真实包。在真实 Harness 中做端到端挂载仍然是权威的验证方式。
当上游目录更新时,重新生成模型目录:
node scripts/generate-model-catalog.mjs /path/to/@earendil-works/pi-ai
发版
一次发版就是一个 tag:提版本、打 tag、推送。release 流水线会跑 CI 的全部检查,只在 registry 上还没有该版本时才发布,而无论是否发布都会记录 GitHub Release。
npm version 0.1.14
git push --follow-tags
发布凭据走仓库的 NPM_TOKEN secret 或 npm 可信发布(工作流 release.yml);Release 那一半用运行自带的 token。关键在「先问 registry」:它让手工发布过的版本在打 tag 时只补 Release 而不会失败,也让重跑同一个 tag 能修复缺失的 Release。workflow_dispatch 会发布 manifest 里的版本,并在 tag 不存在时自动创建。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
ckanner/dsh-plugin-chatgpt
为 DeepSeek Harness 增加一个 provider 路由 chatgpt,它用已登录的 ChatGPT…
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个给…
★ 761已汉化DSH
68.7
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 379已汉化DSH
67.8
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1