dsh-multiprovider:DeepSeek Harness 多账号调度与健康管理插件

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 目录页查看详情。

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

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

小夜