🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

订阅账号接入 EricFL1998/dsh-subscription-oauth

DeepSeek Harness
EricFL199810 天前有提交已提供中文文档扫描:含敏感能力

用已付费的 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
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 10 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
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
预览分享卡片长什么样 ↓EricFL1998/dsh-subscription-oauth
分享 · DeepSeek Harness Hub
EricFL1998/dsh-subscription-oauth

用已付费的 AI 订阅登录,直接当模型提供方使用

回到顶部