DSH 采用插件化架构,实际开发中常需在一个 Provider 逻辑身份下管理多组凭证。dsh-multiprovider 是为此设计的插件,它接管了账号选择、会话亲和性、健康状态和冷却策略,而不涉及具体的模型路由逻辑。
该插件由 monotykamary 维护,遵循 MIT 协议。它为 DeepSeek Harness 提供了 provider-neutral 的多账号调度、会话亲和性、健康监控以及设置界面。
核心功能¶
插件主要提供以下能力:
- 确定性调度:支持轮询、加权、最少进行中和优先级策略。
- 会话亲和性:通过
affinityKey保持相关请求使用同一账号。 - 可见健康状态:展示冷却时间、失败分类和进行中的请求数。
- 凭证管理:使用 Provider 持有的 opaque references(不直接存储密钥)。
- 实时偏好:通过 DSH 设置界面直接启用、调整权重或优先级。
- 归一化失败健康:识别 rate-limit、auth、transient、fatal 等错误类型。
- 可配置冷却:支持指数退避策略。
- 设置界面:在 DSH 设置模态框中提供独立的 Accounts 部分。
安装与启用¶
使用前需确保环境满足:Node.js ^22.19.0 || >=24、pnpm 11 以及 DeepSeek Harness ^0.1.1。
执行以下命令安装:
pnpm dlx @monotykamary/dsh@latest plugin --profile web add dsh-multiprovider
安装后,插件会作为一个 Cordis 服务注入到 ctx.multiprovider 中。
典型用法¶
1. 注册 Provider Inventory¶
在 Provider 插件中注入 multiprovider 服务,并定义账号列表与失败分类逻辑。
import type { Context } from '@monotykamary/cordis'
import type {} from 'dsh-multiprovider'
export function installAccounts(ctx: Context) {
ctx.inject(['multiprovider'], (mctx) => {
mctx.effect(() => mctx.multiprovider.registerProvider({
id: 'anthropic',
label: 'Anthropic',
managementHint: 'Add and remove keys in the Anthropic provider settings.',
accounts: async () => [
{
id: 'work',
label: 'Work key',
authKind: 'api-key',
credentialRef: { kind: 'record', key: 'anthropic/work' },
weight: 3,
metadata: { organization: 'Work' },
},
{
id: 'personal',
label: 'Personal key',
authKind: 'api-key',
credentialRef: { kind: 'record', key: 'anthropic/personal' },
},
],
classifyFailure: (error) => {
const status = (error as { status?: number }).status
if (status === 429) return { kind: 'rate-limit', retryable: true }
if (status === 401 || status === 403) return { kind: 'auth', retryable: true }
if (status !== undefined && status >= 500) return { kind: 'transient', retryable: true }
return { kind: 'fatal', retryable: false }
},
}), 'anthropic: multiprovider accounts')
})
}
2. 获取与释放租约¶
在业务逻辑中通过 acquire 获取账号,操作完成后必须调用 release。
const attempted = new Set<string>()
for (;;) {
const lease = await ctx.multiprovider.acquire({
providerId: 'anthropic',
affinityKey: session.id,
excludeAccountIds: attempted,
})
attempted.add(lease.accountId)
try {
const credential = await resolveCredential(lease.credentialRef)
const result = await runCompleteProviderOperation(credential)
lease.release({ status: 'success' })
return result
} catch (error) {
const disposition = lease.release({ status: 'failure', error })
if (!disposition?.retryable || !isSafeToReplay(error)) throw error
// Reacquiring with excludeAccountIds selects another eligible account.
}
}
注意事项¶
- 凭证安全:凭证以 opaque references 形式存在,不会进入浏览器快照。
- 流式请求:对于流式 LLM 请求,必须持有 lease 直到流完成或失败,而非仅仅创建迭代器。
- 设置安全:设置界面仅允许同源访问以保护凭证。
- 租约释放:必须显式调用
lease.release(),否则账号将无法被其他请求使用。
总结¶
dsh-multiprovider 通过标准化账号管理和健康检查机制,降低了多账号调度的复杂度。其代码库位于 GitHub,可在 SkillHub 目录页查看详情。