用 OAuth 登录订阅账号,把各家大模型接入为可用提供商
25.9/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/21 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add randomix777/dsh-plugin-subs该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · model
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 62 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 115 处,展示前 70 条)
- 执行外部命令固定命令lib/index.js:308
return execFileSync("/usr/bin/security", [ - 读取本地文件lib/index.js:328
return readFileSync(credentialsFilePath(), "utf8"); - 执行外部命令固定命令lib/index.js:348
const output = execFileSync("/usr/bin/security", [ - 执行外部命令固定命令lib/index.js:397
execFileSync("/usr/bin/security", [ - 读取本地文件lib/index.js:418
raw = readFileSync(path, "utf8"); - 读取本地文件lib/index.js:427
if (!existsSync(dir)) mkdirSync(dir, { - 写入本地文件lib/index.js:427
if (!existsSync(dir)) mkdirSync(dir, { - 写入本地文件lib/index.js:431
writeFileSync(path, updated, { - 写入本地文件lib/index.js:435
chmodSync(path, 384); - 读取本地文件lib/index.js:502
text = await readFile(path, "utf8"); - 读取本地文件lib/index.js:507
text = await readFile(legacyAuthFilePath(), "utf8"); - 删除本地文件lib/index.js:514
await rm(legacyAuthFilePath(), { force: true }); - 写入本地文件lib/index.js:537
await mkdir(dirname(path), { recursive: true }); - 写入本地文件lib/index.js:540
await writeFile(tmp, JSON.stringify(store, null, 2), { mode: 384 }); - 写入本地文件lib/index.js:541
await chmod(tmp, 384); - 删除本地文件lib/index.js:544
await rm(tmp, { force: true }); - 读取本地文件lib/index.js:1107
text = await readFile(path, "utf8"); - 删除本地文件lib/index.js:1127
await rm(tmp, { force: true }); - 发起网络请求lib/index.js:1733
const response = await fetch(CODEX_TOKEN_URL, { - 发起网络请求lib/index.js:1753
const response = await fetch(CODEX_TOKEN_URL, { - 发起网络请求lib/index.js:2021
let response = await this.request(options, session, watchdog.signal); - 发起网络请求lib/index.js:2024
response = await this.request(options, session, watchdog.signal); - 发起网络请求lib/index.js:2041
return fetch(CODEX_API_URL, { - 执行外部命令固定命令lib/index.js:2441
const match = execFileSync("claude", ["--version"], { - 发起网络请求lib/index.js:2467
const response = await fetch(CLAUDE_PROFILE_URL, { headers: { authorization: `Bearer ${accessToken}` } }); - 读取密钥环境变量lib/index.js:4064
return process.env.ANTIGRAVITY_CLIENT_SECRET || ANTIGRAVITY_PUBLIC_CLIENT_SECRET; - 请求外部主机openrouter.ailib/index.js:5659
const r = await fetch("https://openrouter.ai/api/v1/usage", { headers: { authorization: `Bearer ${s}` }, signal }); - 执行外部命令固定命令lib/auth/claude-code-creds.js:36
return execFileSync('/usr/bin/security', ['find-generic-password', '-s', PRIMARY_SERVICE, '-w'], { - 读取本地文件lib/auth/claude-code-creds.js:48
return readFileSync(credentialsFilePath(), 'utf8'); - 执行外部命令固定命令lib/auth/claude-code-creds.js:70
const output = execFileSync('/usr/bin/security', ['find-generic-password', '-s', PRIMARY_SERVICE], { - 执行外部命令固定命令lib/auth/claude-code-creds.js:115
execFileSync('/usr/bin/security', ['add-generic-password', '-s', PRIMARY_SERVICE, '-a', account, '-w', updated, '-U'], { - 读取本地文件lib/auth/claude-code-creds.js:128
raw = readFileSync(path, 'utf8'); - 读取本地文件lib/auth/claude-code-creds.js:140
if (!existsSync(dir)) - 写入本地文件lib/auth/claude-code-creds.js:141
mkdirSync(dir, { recursive: true, mode: 0o700 }); - 写入本地文件lib/auth/claude-code-creds.js:142
writeFileSync(path, updated, { encoding: 'utf8', mode: 0o600 }); - 写入本地文件lib/auth/claude-code-creds.js:143
chmodSync(path, 0o600); - 读取本地文件lib/auth/store.js:47
text = await readFile(path, 'utf8'); - 读取本地文件lib/auth/store.js:56
text = await readFile(legacyAuthFilePath(), 'utf8'); - 删除本地文件lib/auth/store.js:65
await rm(legacyAuthFilePath(), { force: true }); - 写入本地文件lib/auth/store.js:92
await mkdir(dirname(path), { recursive: true }); - 写入本地文件lib/auth/store.js:95
await writeFile(tmp, JSON.stringify(store, null, 2), { mode: 0o600 }); - 写入本地文件lib/auth/store.js:98
await chmod(tmp, 0o600); - 写入本地文件lib/auth/store.js:99
await rename(tmp, path); - 删除本地文件lib/auth/store.js:102
await rm(tmp, { force: true }); - 写入剪贴板lib/client/SubscriptionsSection.js:443
return (_jsxs("div", { style: styles.card, children: [_jsxs("div", { style: styles.cardHeader, children: [_jsx("span", { style: { ...styles.dot, backg - 写入剪贴板lib/client.js:857
navigator.clipboard.writeText(deviceFlowInfo[id].userCode ?? "").then(() => { - 读取本地文件lib/providers/catalog-store.js:121
text = await readFile(path, 'utf8'); - 写入本地文件lib/providers/catalog-store.js:138
await mkdir(dirname(path), { recursive: true }); - 写入本地文件lib/providers/catalog-store.js:141
await writeFile(tmp, JSON.stringify(store, null, 2)); - 写入本地文件lib/providers/catalog-store.js:142
await rename(tmp, path); - 删除本地文件lib/providers/catalog-store.js:145
await rm(tmp, { force: true }); - 执行外部命令固定命令lib/providers/claude.js:31
const raw = execFileSync('claude', ['--version'], { timeout: 3000, encoding: 'utf8' }); - 发起网络请求lib/providers/claude.js:82
const response = await fetch(CLAUDE_PROFILE_URL, { - 发起网络请求lib/providers/claude.js:132
const response = await fetch(CLAUDE_TOKEN_URL, { - 发起网络请求lib/providers/claude.js:154
const response = await fetch(CLAUDE_TOKEN_URL, { - 发起网络请求lib/providers/claude.js:420
let response = await this.request(options, session, watchdog.signal); - 发起网络请求lib/providers/claude.js:423
response = await this.request(options, session, watchdog.signal); - 发起网络请求lib/providers/claude.js:480
return fetch(CLAUDE_API_URL, { - 发起网络请求lib/providers/codex.js:155
const response = await fetch(CODEX_TOKEN_URL, { - 发起网络请求lib/providers/codex.js:176
const response = await fetch(CODEX_TOKEN_URL, { - 发起网络请求lib/providers/codex.js:507
let response = await this.request(options, session, watchdog.signal); - 发起网络请求lib/providers/codex.js:511
response = await this.request(options, session, watchdog.signal); - 发起网络请求lib/providers/codex.js:532
return fetch(CODEX_API_URL, { - 读取密钥环境变量lib/providers/gemini.js:135
const response = await this.#fetchFn(url + '?key=' + (process.env.GEMINI_API_KEY || ''), { - 发起网络请求lib/providers/grok.js:43
const response = await fetch(GROK_DISCOVERY_URL); - 发起网络请求lib/providers/grok.js:150
const response = await fetch(discovery.tokenEndpoint, { - 发起网络请求lib/providers/grok.js:177
const response = await fetch(session.tokenEndpoint, { - 发起网络请求lib/providers/grok.js:496
let response = await this.request(options, session, watchdog.signal); - 发起网络请求lib/providers/grok.js:500
response = await this.request(options, session, watchdog.signal); - 发起网络请求lib/providers/grok.js:537
return fetch(GROK_API_URL, {
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:openrouter.ai
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DSH 插件:为 Claude、Codex、Grok、Antigravity、OpenRouter、Agnes AI 提供 OAuth 登录,把订阅制大模型接入 DeepSeek Harness 当服务商用
README
由 DeepSeek 最新模型翻译生成DSH 插件订阅
DeepSeek Harness 的 AI LLM 插件,通过 OAuth 登录订阅制 LLM 提供商并将其作为 LLM 提供商暴露。
功能
- 所有提供商的 OAuth 认证 — 无需 API key
- 直接从订阅解析 Composer 模型
- 支持流式、工具调用和图片输入(取决于提供商)
- 订阅用量状态显示在订阅设置中
- 每个提供商内置模型目录,可在配置中覆盖
提供商一览
已上线
| 路由 | 订阅 | 说明 |
| claude | Claude Pro/Max | 从 Claude Code 自动导入凭据;先运行 claude 登录 |
| codex | ChatGPT Plus/Pro | 实时获取模型列表(chatgpt.com/backend-api/codex/models) |
| grok | X Premium/Premium+ | 实时获取模型列表;含 x_search、image_generate、video_generate 工具 |
| antigravity | Google One AI Premium / Antigravity | 静态目录(Gemini 3 Pro / 3.1 Pro / 3 Flash、Claude 4.6 Sonnet / Opus);直接 OAuth,无需环境变量 |
展开完整文档(README 剩余 1 节)
DSH 插件订阅
DeepSeek Harness 的 AI LLM 插件,通过 OAuth 登录订阅制 LLM 提供商并将其作为 LLM 提供商暴露。
功能
- 所有提供商的 OAuth 认证 — 无需 API key
- 直接从订阅解析 Composer 模型
- 支持流式、工具调用和图片输入(取决于提供商)
- 订阅用量状态显示在订阅设置中
- 每个提供商内置模型目录,可在配置中覆盖
提供商一览
已上线
| 路由 | 订阅 | 说明 |
| claude | Claude Pro/Max | 从 Claude Code 自动导入凭据;先运行 claude 登录 |
| codex | ChatGPT Plus/Pro | 实时获取模型列表(chatgpt.com/backend-api/codex/models) |
| grok | X Premium/Premium+ | 实时获取模型列表;含 x_search、image_generate、video_generate 工具 |
| antigravity | Google One AI Premium / Antigravity | 静态目录(Gemini 3 Pro / 3.1 Pro / 3 Flash、Claude 4.6 Sonnet / Opus);直接 OAuth,无需环境变量 |
| openrouter | OpenRouter (OAuth PKCE) | 登录换取永久 API key;静态目录(GPT-4o / GPT-4o Mini / Claude Sonnet & Haiku 4.5 / Gemini 2.5 Flash) |
| agnes | Agnes AI (OAuth) | OAuth PKCE 换取 access token(逆向自 AgnesCode);静态目录(Agnes 2.5/2.0 Flash、GPT-4o、Claude Sonnet 4.5 via AgnesCode) |
| qwen | 通义千问 Qwen Coding Plan | Device-flow OAuth via chat.qwen.ai;无需 API Key,点击连接即完成授权 |
| spark | 讯飞星火 | OAuth PKCE via spark-api.xf-yun.com;需设置 SPARK_CLIENT_ID / SPARK_CLIENT_SECRET |
| ernie | 百度文心一言 | OAuth PKCE via openapi.baidu.com;需设置 ERNIE_CLIENT_ID / ERNIE_CLIENT_SECRET |
即将推出
Gemini、Perplexity AI、GitHub Copilot、Mistral AI、Cursor、Hugging Face、Windsurf、Replicate、fal.ai、Cohere、Voyage AI、Lepton AI、OctoAI。
安装
从 npm 安装(预构建,无需编译)
dsh plugin --profile web add dsh-plugin-subs
或从 GitHub 源码安装
dsh plugin --profile web add github:randomix777/dsh-plugin-subs
使用步骤
1. dsh web,打开打印的 URL。
2. 设置 → 订阅:点击对应 provider 的「连接」。
- Claude:自动从 Claude Code 导入凭据(需先运行 claude 并登录)。
- Codex / Grok / OpenRouter:在新标签页中完成 OAuth 授权。
- Antigravity:无需环境变量,直接在标签页中完成授权;可选通过 ANTIGRAVITY_CLIENT_ID / ANTIGRAVITY_CLIENT_SECRET 覆盖凭据。
- Qwen Code:通过 chat.qwen.ai Device-flow OAuth 授权;无需 API Key 或环境变量,点击「连接」即完成登录。
- Spark / ERNIE:先设置环境变量,再在标签页中完成授权。
- Agnes AI:浏览器授权后,手动粘贴回调 URL 或授权码(DSH 无法自动捕获 agnes:// 协议)。
3. 在任意会话中打开模型选择器(/model),选择对应 provider 下的模型。
未登录时:该 provider 不出现在选择器里;直接请求会报 MISSING_CREDENTIAL,不影响其他功能。
环境变量
Antigravity 和 Qwen 使用插件内嵌的公开客户凭据,无需手动配置。仅星火和文心一言需要环境变量:
可选:覆盖内置的 Antigravity OAuth 客户端凭据
export ANTIGRAVITY_CLIENT_ID="your-custom-oauth-client-id"
export ANTIGRAVITY_CLIENT_SECRET="your-custom-oauth-client-secret"
讯飞星火(在 https://console.xfyun.cn 注册应用)
export SPARK_CLIENT_ID="your-spark-client-id"
export SPARK_CLIENT_SECRET="your-spark-client-secret"
百度文心一言(在 https://console.bce.baidu.com/ai/ 注册应用)
export ERNIE_CLIENT_ID="your-ernie-client-id"
export ERNIE_CLIENT_SECRET="your-ernie-client-secret"
星火、ERNIE 需要在对应平台注册 OAuth 应用并设置环境变量。Qwen 和 Antigravity 点击连接即可直接登录。
配置
providers:
- id: llm-subscriptions
name: dsh-plugin-subs
config:
providers: [codex, claude, grok, antigravity, openrouter, agnes, qwen, spark, ernie] # 子集;默认九个全启用
streamIdleTimeoutMs: 300000
models: # 覆盖实时发现/内置目录 codex:
- { id: gpt-5.6-sol, name: GPT-5.6 Sol, contextWindow: 272000, inputModalities: [text, image] }
工具
随 provider 启用自动注册:
- x_search(Grok)—— xAI 托管的 X 搜索,返回 { answer, citations }。
- image_generate(ChatGPT 或 Grok)—— 经 Codex 后端调用 gpt-image-2,或经 Grok 调用 grok-imagine-image-2.0。provider 参数指定首选提供方(默认 gpt,可选 grok);首选方未登录时自动回退到另一方。图片保存到 ~/.dsh/plugins/subscriptions/images/。
- video_generate(Grok)—— 调用 grok-imagine-video-1.5(异步提交 + 轮询);MP4 保存到 ~/.dsh/plugins/subscriptions/videos/,视频在对话中内联播放。
限制与已知问题
- 各 provider 的可用性取决于你的订阅状态;未登录时该 provider 不可用
- 图片生成依赖 image_generate 工具,需要 Codex 或 Grok 已登录
- X 搜索依赖 x_search 工具,需要 Grok 已登录且订阅包含 API 访问权限
- Antigravity 的 Google OAuth 凭据通过环境变量提供(安全考虑,未硬编码)
- OpenRouter 登录后获得永久 API key,无需刷新
- Agnes AI 的回调协议 agnes:// 无法被 DSH 自动捕获,需手动粘贴回调 URL 或授权码
- 国内提供商(Spark / ERNIE)需在各自开放平台注册 OAuth 应用并设置环境变量
- Qwen Code 使用 Device-flow OAuth:在任何浏览器中打开验证 URL 并输入验证码;流程可取消,过期时间为 expires_in 秒
项目结构
- lib/index.js — 主 bundle(编译产物),所有后端逻辑
- lib/client.js — 浏览器 bundle,UI 组件
- lib/client/*.js — 拆分客户端源码(国际化、UI 组件)
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
randomix777/dsh-plugin-subs
用 OAuth 登录订阅账号,把各家大模型接入为可用提供商
相关插件 · 模型接入
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