dsh-llm-cc-switch:把 CC Switch 账号桥接进 DSH 模型选择器

前言

在 DSH(DeepSeek Harness)里接第三方模型,常见做法是自己在 profile 里配 provider、baseURL 和密钥。若你同时在桌面端用 farion1231/cc-switch 管理 Claude Code、Codex、OpenCode 等多套账号,两套配置容易脱节:CC Switch 里增删账号,DSH 侧还要手工改一遍。

dsh-llm-cc-switch 是维护者 Hoemr(Wei Chen)发布的 DSH 插件,分类为模型推理。它把 CC Switch SQLite 数据库里的账号按 harness 类别映射成 DSH 的 provider 路由与模型项,并在每次操作时重新读取 ~/.cc-switch/cc-switch.db,与 CC Switch 保持同步,一般无需重启 DSH。

这是什么

一句话:DSH 的 CC Switch 桥接插件——把 CC Switch 管理的账号直接变成 DSH 可选模型,每次操作都重读 cc-switch.db。

映射方式

CC Switch DSH
harness(claude / claude-desktop / codex / opencode / grokbuild 等) provider 路由(如 cc-switch/claude → 选择器里显示「Claude Code」)
账号(MiniMax、DeepSeek、Xiaomi MiMo 等) 该类别下的模型(显示为 MiniMax · claude-opus-4 [200k] · anthropic 这类形式)

端点、协议、密钥在每次请求时按账号动态解析,不会在 DSH 端持久化。协议支持 anthropic-messages、openai-completions、openai-responses,内部复用 DSH 自带的 @deepseek-ai/dsh-llm-pi-ai,流式、工具调用、重试语义与官方适配器一致。

以 tp- 开头的 token-plan 密钥可自动改用 Authorization: Bearer 发送(默认前缀可在配置里改)。每个账号的 baseURL 在加载时会经 scheme + host 白名单校验,不在白名单的行会被跳过,作为对 cc-switch.db 内异常 env 的防护。

支持的 harness

CC Switch app_type 支持情况 备注
claude 支持 通过 ANTHROPIC_AUTH_TOKEN / ANTHROPIC_BASE_URL 解析
claude-desktop 支持 同上
codex 支持 auth.json + model_providers TOML + modelCatalog
opencode 支持 按 npm 选 anthropic-messages 或 openai-completions
grokbuild 支持 TOML [model.<profile>] + models.default
gemini · openclaw · hermes · pi 暂未接入 上游 settings_config 形态尚未稳定,默认 appTypes 不含

前提

  1. CC Switch 桌面端(SQLite 版本,数据目录 ~/.cc-switch/,含 cc-switch.db 与 settings.json)
  2. DSH Desktop(内置 @deepseek-ai/dsh-llm-pi-ai 与 @earendil-works/pi-ai)
  3. Node ≥ 22.19

README 中记录的兼容性示例:插件 0.3.1 已在 DSH Desktop 0.2.0-rc.2 等版本线验证;package.json 当前版本为 0.3.2。peer 范围见仓库说明,DSH 大版本升级后若 profile 形状变化,适配器测试会先失败而非静默在选择器里出错。

安装与启用

官方 README 的安装方式不是单独的 dsh plugin add 一行命令,而是把包加入目标 profile 的 package.json 与 dsh.profile.bundles,再执行:

dsh plugin --profile <name> install

启动 DSH 后,选择器里会出现新类别;在 CC Switch 里增删改账号后,下次选择或发起请求即可生效,通常不必重启 DSH。若 CC Switch 新增一种此前未支持的全新 harness 类型,类别路由需在 DSH 启动时注册,此时需要重启 DSH 才能看到新类别。

配置

在 cordis.patch.yml 里为该插件的 config 段可按需覆盖。下面摘录 README 中的示例(注释项表示可选):

- insert:
    - id: cc-switch
      name: 'dsh-llm-cc-switch'
      config:
        appTypes: [claude, claude-desktop, codex, opencode, grokbuild]
        contextWindow: 200000
        maxTokens: 64000
        streamIdleTimeoutMs: 300000
        bearerAuthPrefixes: [tp-]
        urlAllowlist:
          schemes: ["http:", "https:", "ws:", "wss:"]
        opencodeSession:
          enabled: true
          header: x-opencode-session

urlAllowlist.schemes / hosts 是闭集白名单:未配置 host 限制时仍按 scheme 过滤;不在白名单的 baseURL 对应账号不会进入路由。OpenCode Go / Zen 对会话头有要求时,命中 opencodeSession.hosts 的账号会补上 DSH 会话 id 相关头,避免 400 MissingSessionID;设 enabled: false 可关闭该行为。

典型用法

日常使用:在 CC Switch 里维护账号,在 DSH 模型选择器里按 harness 类别挑选对应账号下的模型即可,密钥与 baseURL 由插件按库内配置解析。

若要在自有代码里读账号与路由,README 提供 CcSwitchStore API(路径 dsh-llm-cc-switch/source/internal):

import { CcSwitchStore } from "dsh-llm-cc-switch/source/internal";

const store = new CcSwitchStore({ dbPath: "/custom/cc-switch.db" });
await store.accounts();
await store.routes();
await store.accountOf("claude-desktop", "<uuid>");

账号身份是 (appType, accountId) 对,而不是裸 UUID;内部路由形如 cc-switch-account/<appType>:<accountId>。扩展其他账号源可实现 AccountStore 子类并 registerAccountSource,在 config.source 中指定名称,无需改插件本体。

安全性与限制

插件以只读方式打开 cc-switch.db,不写入 CC Switch 状态;密钥从 settings_config 直读到请求,无中间缓存。日志对密钥与敏感头做了脱敏。安装前建议自行审阅源码与 MIT 许可证;插件在当前 DSH 进程权限下运行,能访问的路径与 CC Switch 数据库一致。

已知限制(摘自 README):

  • 仅支持 API Key 类账号;Codex 官方 OAuth、Claude 官方登录类账号会被跳过。
  • 模型为纯文本模态,图片输入暂未声明。
  • grokbuild 解析器目前只接受直接出现的 api_key,env_key 形式需等上游提供解析产物。

结尾

若你已在用 CC Switch 统一管理多 harness 账号,又希望在 DSH 里用同一套数据源选模型,dsh-llm-cc-switch 把「读库 → 映射类别与模型 → 按请求解析端点」串成一条链路,并强调每次操作重读数据库与 baseURL 护栏。进一步了解可访问 GitHub 仓库 与 社区目录页。社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye