用已付费的 AI 订阅登录,直接当模型提供方使用
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/22 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add EricFL1998/dsh-subscription-oauth该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · model
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 10 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 75 处,展示前 75 条)
- 写入本地文件dsh-codex-subscription-main/src/image-original-store.js:27
await mkdir(dirname(filename), { recursive: true, mode: 0o700 }) - 读取本地文件dsh-codex-subscription-main/src/image-original-store.js:38
const stat = await lstat(filename) - 写入本地文件dsh-codex-subscription-main/src/image-original-store.js:74
await mkdir(dirname(directory), { recursive: true, mode: 0o700 }) - 写入本地文件dsh-codex-subscription-main/src/image-original-store.js:75
await mkdir(directory, { recursive: false, mode: 0o700 }) - 写入本地文件dsh-codex-subscription-main/src/image-original-store.js:79
await rename(temporary, join(directory, 'metadata.json')) - 删除本地文件递归dsh-codex-subscription-main/src/image-original-store.js:82
await rm(directory, { recursive: true, force: true }).catch(() => undefined) - 删除本地文件递归dsh-codex-subscription-main/src/image-original-store.js:89
await rm(this.directory(ref.assetId), { recursive: true, force: true }).catch(() => undefined) - 读取本地文件dsh-codex-subscription-main/src/image-original-store.js:100
const metadata = parseMetadata(await readFile(metadataFile, 'utf8')) - 读取本地文件dsh-codex-subscription-main/src/image-original-store.js:103
const buffer = await readFile(originalFile) - 发起网络请求dsh-codex-subscription-main/src/index.js:147
fetch: (input, init) => network.fetch('catalog', input, init), - 发起网络请求dsh-codex-subscription-main/src/index.js:323
fetch: (input, init) => network.fetch('image', input, init), - 发起网络请求dsh-codex-subscription-main/src/index.js:353
fetch: (input, init) => network.fetch('search', input, init), - 发起网络请求dsh-codex-subscription-main/src/index.js:399
fetch: (input, init) => network.fetch('remote', input, init), - 发起网络请求dsh-codex-subscription-main/src/index.js:430
fetch: (input, init) => network.fetch('quota', input, init), - 发起网络请求dsh-codex-subscription-main/src/index.js:491
fetch: (input, init) => network.fetch('quota-reset', input, init), - 发起网络请求dsh-codex-subscription-main/src/oauth-network.js:274
fetch: (area, input, init) => run(area, () => globalThis.fetch(input, init)), - 读取本地文件dsh-codex-subscription-main/src/quota-forecast-store.js:41
if ((await stat(this.filename)).size > this.maxBytes) return undefined - 读取本地文件dsh-codex-subscription-main/src/quota-forecast-store.js:42
return sanitize(JSON.parse(await readFile(this.filename, 'utf8'))) - 写入本地文件dsh-codex-subscription-main/src/quota-forecast-store.js:54
await mkdir(dirname(this.filename), { recursive: true, mode: 0o700 }) - 写入本地文件dsh-codex-subscription-main/src/quota-forecast-store.js:63
await rename(temporary, this.filename) - 删除本地文件dsh-codex-subscription-main/src/quota-forecast-store.js:66
await rm(temporary, { force: true }).catch(() => undefined) - 删除本地文件dsh-codex-subscription-main/src/quota-forecast-store.js:71
await rm(this.filename, { force: true }) - 读取本地文件dsh-codex-subscription-main/src/quota-forecast-store.js:76
const info = await lstat(this.filename) - 读取本地文件dsh-codex-subscription-main/src/remote-control-dsh.js:17
try { return statSync(value).isDirectory() ? value : undefined } catch { return undefined } - 读取本地文件dsh-codex-subscription-main/src/remote-control-dsh.js:32
const stat = statSync(value) - 读取本地文件dsh-codex-subscription-main/src/remote-control-dsh.js:41
return readdirSync(folder, { withFileTypes: true }) - 读取本地文件dsh-codex-subscription-main/src/remote-control-files.js:51
try { entries = await readdir(folder, { withFileTypes: true }) } catch { continue } - 读取本地文件dsh-codex-subscription-main/src/remote-control.js:13
const value = JSON.parse(await readFile(filename, 'utf8'))?.installationId - 写入本地文件dsh-codex-subscription-main/src/remote-control.js:19
await mkdir(dirname(filename), { recursive: true }) - 写入本地文件dsh-codex-subscription-main/src/remote-control.js:21
await writeFile(temporary, `${JSON.stringify({ installationId: created })}\n`, { mode: 0o600 }) - 写入本地文件dsh-codex-subscription-main/src/remote-control.js:22
await rename(temporary, filename) - 发起网络请求dsh-codex-subscription-main/src/sketch-agent-tool.js:41
const value=await bridge.request(sessionId,request,exec.signal) - 发起网络请求dsh-codex-subscription-main/src/subagent-auth.js:63
return await server.request('account/login/start', { type: 'chatgptAuthTokens', ...tokens }, - 发起网络请求dsh-codex-subscription-main/src/subagent-auth.js:69
const result = await server.request(method, { - 发起网络请求dsh-codex-subscription-main/src/subagent-auth.js:78
return server.request(method, { ...params, ...thread }, signal) - 发起网络请求dsh-codex-subscription-main/src/subagent-auth.js:80
return server.request(method, params, signal) - 发起网络请求dsh-codex-subscription-main/src/subagent-auth.js:85
: host.request(method, params, signal)) - 写入本地文件dsh-codex-subscription-main/src/subagent-backend.js:61
await mkdir(nativeHome, { recursive: true }) - 读取本地文件dsh-codex-subscription-main/src/subagent-runtime.js:22
const { version } = JSON.parse(readFileSync(attempt(), 'utf8')) - 读取本地文件dsh-codex-subscription-main/src/subagent-runtime.js:41
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) - 读取本地文件dsh-codex-subscription-main/src/subagent-runtime.js:52
const codex = JSON.parse(readFileSync(codexManifestPath, 'utf8')) - 发起网络请求dsh-codex-subscription-main/src/subscription-transport.js:12
async fetch(request) { - 写入本地文件src/auth/device-id.ts:43
await mkdir(directory, { recursive: true }) - 写入本地文件src/auth/device-id.ts:44
await writeFile(file, `${created}\n`, { encoding: 'utf8', mode: 0o600 }) - 读取本地文件src/auth/device-id.ts:56
raw = await readFile(file, 'utf8') - 读取本地文件src/auth/store.ts:131
raw = await readFile(this.file, 'utf8') - 写入本地文件src/auth/store.ts:229
await mkdir(path.dirname(this.file), { recursive: true }) - 写入本地文件src/auth/store.ts:231
await writeFile(temporary, `${JSON.stringify(this.entries, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 }) - 写入本地文件src/auth/store.ts:233
await rename(temporary, this.file) - 写入本地文件src/auth/store.ts:234
await chmod(this.file, 0o600) - 删除本地文件src/auth/store.ts:236
await rm(temporary, { force: true }) - 发起网络请求src/http.ts:92
if (url === undefined) return fetch(input, init) - 发起网络请求src/http.ts:94
if (proxyUrl === undefined) return fetch(input, init) - 发起网络请求src/http.ts:97
return await fetch(input, { ...init, dispatcher } as RequestInit) - 发起网络请求src/http.ts:99
return fetch(input, init) - 发起网络请求src/providers/antigravity.ts:1166
const response = await this.request(options, model, account, accessToken, signal, level) - 发起网络请求src/providers/antigravity.ts:1193
return await this.request(options, model, account, accessToken, signal) - 发起网络请求src/providers/ark.ts:359
request: (call, model, accessToken, signal) => this.request(call, model, accessToken, signal), - 发起网络请求src/providers/glm.ts:415
request: (call, model, accessToken, signal) => this.request(call, model, accessToken, signal), - 发起网络请求src/providers/grok.ts:920
request: (call, model, accessToken, signal) => this.request(call, model, accessToken, signal), - 发起网络请求src/providers/kimi.ts:540
request: (call, model, accessToken, signal) => this.request(call, model, accessToken, signal), - 写入本地文件src/providers/model-cache.ts:92
await mkdir(path.dirname(this.file), { recursive: true }) - 写入本地文件src/providers/model-cache.ts:95
await writeFile(temporary, `${JSON.stringify(document, null, 2)}\n`, 'utf8') - 写入本地文件src/providers/model-cache.ts:96
await rename(temporary, this.file) - 读取本地文件src/providers/model-cache.ts:102
const parsed = JSON.parse(await readFile(this.file, 'utf8')) as unknown - 读取本地文件src/providers/workbuddy-credits.ts:28
const raw = JSON.parse(await readFile(file, 'utf8')) as unknown - 写入本地文件src/providers/workbuddy-credits.ts:58
await mkdir(path.dirname(file), { recursive: true }) - 写入本地文件src/providers/workbuddy-credits.ts:59
await writeFile(file, JSON.stringify(ledger, null, 2), 'utf8') - 写入本地文件src/providers/workbuddy.ts:48
appendFileSync(path.join(homedir(), '.dsh', 'workbuddy-diag.log'), line) - 读取本地文件src/settings.ts:163
raw = await readFile(this.file, 'utf8') - 写入本地文件src/settings.ts:340
await mkdir(path.dirname(this.file), { recursive: true }) - 写入本地文件src/settings.ts:356
await writeFile(temporary, `${JSON.stringify(document, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 }) - 写入本地文件src/settings.ts:358
await rename(temporary, this.file) - 写入本地文件src/settings.ts:359
await chmod(this.file, 0o600) - 删除本地文件src/settings.ts:361
await rm(temporary, { force: true })
扫描于 2026/10/31(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-attachment@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-home-paths@deepseek-ai/dsh-llm@deepseek-ai/dsh-tools给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
展开完整介绍(143 字)↓
把 Kimi Code、Grok(X Premium)、Google Antigravity、GLM(BigModel)订阅当作 DeepSeek Harness 的大模型服务商用:OAuth 登录、按模型控制可见性、拖动排序 Auto 回退、在设置页查看套餐配额,无需 API 密钥。
README
由 DeepSeek 最新模型翻译生成English · 简体中文
dsh-plugin-subscription-oauth
用你已付费的 AI 订阅作为 DeepSeek Harness 的模型提供方 —— 无需 API Key。
在 设置 → 订阅 里对每个服务登录一次,其模型即进入会话模型选择器,并在连接旁实时显示套餐额度。令牌只保存在本机,所有请求都通过服务自己的 API 发起。
支持的服务
| 服务 | 可用模型 | 登录方式 |
| Kimi Code | kimi-for-coding、k3(1M)、k3-256k —— 直接来自端点自己的模型列表 | OAuth 设备流(显示代码,浏览器确认) |
| Grok (X Premium) | 账号自己的模型列表所报告的一切(如 grok-4.7),⚡ lightspeed 快速变体 | 浏览器 OAuth(自动回调) |
| Google Antigravity | Claude Sonnet/Opus、Gemini Flash、GPT-OSS,带推理档 —— 来自账号自己的列表 | Google 账号 OAuth |
| GLM (BigModel) | 编码主机列出的一切(如 glm-5.3、glm-5.3-flash) | ZCode 浏览器登录(轮询) |
展开完整文档(README 剩余 1 节)
English · 简体中文 dsh-plugin-subscription-oauth 用你已付费的 AI 订阅作为 DeepSeek Harness 的模型提供方 —— 无需 API Key。 在 设置 → 订阅 里对每个服务登录一次,其模型即进入会话模型选择器,并在连接旁实时显示套餐额度。令牌只保存在本机,所有请求都通过服务自己的 API 发起。 支持的服务 | 服务 | 可用模型 | 登录方式 | | Kimi Code | kimi-for-coding、k3(1M)、k3-256k —— 直接来自端点自己的模型列表 | OAuth 设备流(显示代码,浏览器确认) | | Grok (X Premium) | 账号自己的模型列表所报告的一切(如 grok-4.7),⚡ lightspeed 快速变体 | 浏览器 OAuth(自动回调) | | Google Antigravity | Claude Sonnet/Opus、Gemini Flash、GPT-OSS,带推理档 —— 来自账号自己的列表 | Google 账号 OAuth | | GLM (BigModel) | 编码主机列出的一切(如 glm-5.3、glm-5.3-flash) | ZCode 浏览器登录(轮询) | | Volcengine Ark | 套餐自己的编程模型 | 火山引擎 SSO | | Xiaomi MiMo | MiMo 自己的模型列表,读取失败时回退到应用内置的两个模型 | 小米账号(扫码 / 密码) | | WorkBuddy (国内版) | Hy、GLM、Kimi、DeepSeek、MiniMax 模型 | 浏览器 OAuth(腾讯) | 每个服务也会汇入 auto 路由,它横跨全部:选 auto,harness 会按顺序尝试你已启用的模型,直到有响应。 功能 - 每个服务登录一次 —— 无需找、贴、轮换 API Key。插件运行服务自己的 OAuth/设备流,令牌保存在磁盘(~/.dsh/plugins/kimi-oauth/auth.json,权限 0600)。 - 实时套餐额度 —— 设置卡片和输入框 chip 显示每个账号的剩余额度(Kimi 的 5 小时 / 每周窗口 + 额度,Grok 每周额度,Antigravity 的 Gemini + Claude 分组,GLM/Ark/MiMo/WorkBuddy 的额度),带进度条和重置时间。 - 模型选择器集成 —— 每个服务的模型带上下文窗口和推理档出现在选择器里;可按服务隐藏或排序。 - 模型目录来自服务本身,而不是本插件 —— 每个路由只读取一次服务自己的模型列表,并把它缓存为该路由的目录,因此服务端新增、改名或下线的模型无需插件更新即可出现(或消失)。重新读取的时机是登录成功和设置页的刷新模型;浏览选择器不会发出任何请求。 - ⚡ 快速 / lightspeed 变体 —— 对有快速变体的模型(如 Grok 4.7 → grok-4.7-build-fast),模型选择器旁的闪电按钮一键切换;它作为推理档实现,基础模型始终可选。 - 多账号池 —— 一个服务可登录多个账号;某账号额度用尽时自动切到下一个。 - Auto 回退 —— auto 在首选模型被拒(改名、限流、额度尽)时改用下一个已启用模型,且流开始后不再回退。 安装 dsh plugin --profile web add dsh-plugin-subscription-oauth 然后重启 DeepSeek Harness,打开 设置 → 订阅。 安装指定版本,或直接从仓库安装: dsh plugin --profile web add dsh-plugin-subscription-oauth@0.10.2 dsh plugin --profile web add github:EricFL1998/dsh-subscription-oauth 怎么用 1. 打开 设置 → 订阅。 每个服务一张卡片;已登录的排在前面,auto 在最前。 2. 连接 某个服务。会弹出浏览器窗口(或设备代码)开始该服务自己的登录。在那里完成即可 —— 卡片会自动更新。 3. 选模型。 该服务的模型现在出现在输入框模型选择器里,chip 显示实时额度。 4. 展开卡片 管理账号(设默认、退出、刷新令牌)、开关哪些模型显示、排序、手动添加本版本不认识的模型 id、查看凭证文件 / 端点。 提示: 想换某个服务的账号,先退出登录,再重新连接 —— 浏览器登录跟随的是该服务页面当前登录的账号。 它注册了什么 | 界面 | 出现内容 | | ctx.llm | kimi、grok、antigravity、glm、ark、mimo、workbuddy 和 auto 路由(模型、推理、流式) | | 设置 | 订阅 区块:每个服务一张卡片 | | 模型选择器 | 每个服务自己的模型,外加横跨全部的 auto | | 输入框 chip | 当前服务的实时套餐额度 | 隐藏某个服务 想让某个服务的模型不进选择器但又不卸载,在 profile 的 cordis.patch.yml 里把它从路由列表去掉即可: $DSH_HOME/profiles/<profile>/cordis.patch.yml plugins: dsh-plugin-subscription-oauth: providers: [kimi, grok, antigravity, glm, ark, mimo, workbuddy] 去掉不想要的即可。默认为全部已实现的路由。 安全 - 凭证保存在本机 ~/.dsh/plugins/kimi-oauth/auth.json(权限 0600,原子写入),每个服务一段。 - 插件只连接各服务自己的域名和 OAuth 端点 —— 无遥测,无第三方中转。 - 仅你自己的订阅;不在机器间共享任何内容。 开发 完整的 wire 协议、令牌生命周期、故障排查和测试方法见 开发者 README。 License MIT
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
EricFL1998/dsh-subscription-oauth
用已付费的 AI 订阅登录,直接当模型提供方使用
相关插件 · 模型接入
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