dsh-fastcel:让 Vercel AI Gateway 会话从最快 Provider 起聊

前言

DeepSeek Harness(DSH)里若走 Vercel AI Gateway,同一模型往往对应多家 Provider,吞吐差异很大。README 举例:deepseek/deepseek-v4.1-flash-1017 有 22 家 Provider,某次观测最快约 394 tok/s、最慢约 42 tok/s;网关默认路由未必会落到最快的一家。若不干预,首轮请求可能落在中等速度的 Provider 上,而会话 affinity 又会让后续消息尽量留在该 Provider,首轮选错会拖慢整段对话。

下面介绍社区插件 dsh-fastcel(维护者 DavidCarliez,GitHub:DavidCarliez/dsh-fastcel)。它是 fastcel 的 Harness 版:在每次发往 ai-gateway.vercel.sh 的推理请求里,按公开 endpoint 统计把 Provider 排成「最快优先」,并通过 providerOptions.gateway.order 交给网关;失败时按该顺序依次回退。

这是什么

dsh-fastcel 是 DeepSeek Harness 插件,分类为模型推理。一句话:每次经 Vercel AI Gateway 的新会话,尽量从当前统计下最快的 Provider 开始;并在 Web 界面展示排名与实际落点。

许可证为 MIT(见仓库 package.json),当前包版本 0.1.0。

核心机制

fastcel 如何排序 Provider

每次 harness 向 ai-gateway.vercel.sh 发起的模型调用,插件会附带该模型 Provider 列表(最快在前):

  1. 从公开接口 GET /v1/models/{model}/endpoints 读取统计(与 vercel.com/ai-gateway/models 上展示同源,无需额外 key)。按模型缓存 15 分钟;过期后仍用旧数据,后台刷新。
  2. 按最近一小时的 median throughput 排序。以下情况排到队尾:Provider 已 deprecated;最近 15 分钟成功率低于 90%;请求带 tools 但该 Provider 不支持;上下文窗口小于当前会话所需。
  3. 将列表写入请求体的 providerOptions.gateway.order。若第一家失败,网关按该顺序继续尝试。

若统计拉取失败,请求原样发出,由网关自行选择。

已有路由优先: 请求体里已经带有 providerOptions.gateway.order 或 providerOptions.gateway.only 时,插件不会改写。

插件不在请求之间持久保存排名;每次请求携带当时算出的顺序。网关自带的 sort: "tps" 在作者测试时多数 Provider 无有效值,fastcel 因此改用 endpoint 统计排序(详见上游 fastcel 文档说明)。

与会话 affinity 的关系

Vercel AI Gateway 默认开启 session affinity:会记住本会话上一次成功的 Provider,后续消息优先仍走该家以保持 prompt cache。

典型过程:

  1. 首条消息:尚无记忆,走 fastcel 列表第一位。
  2. 后续消息:即使排名变化,仍尽量留在已选 Provider。
  3. 空闲或失败之后:空闲超过该 Provider 的 cache lifetime(多数约 5 分钟,OpenAI/Azure 约 10 分钟,DeepSeek 自有 API 约 1 小时),或该 Provider 请求失败,网关会忘记绑定;下一条消息再按当时最快 Provider 起聊。

新会话或 subagent 视为新对话,从当时最快 Provider 开始。

在 Harness 中的挂载方式

pi-ai 适配器自行构造 gateway 请求且无改 body 的钩子,因此 fastcel 分两层工作:

  • 监听 llm/stream,为每次模型调用建立带 session、以及上一轮结束后 token 数的 request scope。
  • 钩住进程 fetch:仅当请求来自上述 scope、为 POST 且目标为 https://ai-gateway.vercel.sh 的 /v1/messages、/v1/chat/completions 或 /v1/responses,且 JSON body 含 model 时,注入 order 并发送;从流式回复中读取网关 routing 记录。其它请求不受影响。停用插件会移除 hook。

安装与启用

依赖(README 原文):

  • DeepSeek Harness 0.2.1-rc.2(已测,web profile)
  • Node.js 22+
  • pi-ai 路由指向 Vercel AI Gateway,例如 profile 的 cordis.patch.yml:
- id: llm-pi-ai
  name: "@deepseek-ai/dsh-llm-pi-ai"
  config:
    providers:
      vercel-ai-gateway:
        apiKeyEnv: VERCEL_AI_GATEWAY_API_KEY
        models:
          - id: deepseek/deepseek-v4.1-flash-1017
          - id: openai/gpt-oss-120b

任意 endpoint 为 https://ai-gateway.vercel.sh 的 pi-ai 路由均可;插件按请求 host 识别网关,不按路由名称。

在插件仓库目录执行:

npm ci
npm run build
dsh plugin --profile web add "link:$PWD"

然后重启 harness。安装、重启或移除插件时,应确保当前没有正在生成的回复。移除:

dsh plugin --profile web remove dsh-fastcel

重启 harness。

插件以当前 DSH 进程权限运行,并会改写发往 AI Gateway 的推理请求;安装前请自行审阅源码与 MIT 许可证。

典型用法

选用任意经 Vercel AI Gateway 的模型后,输入框下方(新建会话页则在输入框上方选项行)会出现当前排名首位,格式类似:

⚡ subconscious · 394 tok/s

若模型厂商自有 API 作为 Provider,面板会标注 first-party,例如 deepseek (first-party) · 191 tok/s(指 DeepSeek 自有 API,不是模型名本身)。未走 gateway 的模型不显示该条。

面板展示的是最近一次回复实际使用的 Provider;更早开始的会话可能仍绑在另一家,与 affinity 行为一致。

命令 作用
/fastcel 打开当前会话模型的排名面板;Web 外以文本表格输出
/fastcel <model> 输出指定 gateway 模型排名,如 /fastcel zai/glm-5.1
/fastcel refresh 丢弃缓存、重新拉统计并打印当前会话模型排名

点击 ⚡ 行同样打开面板:列出 Provider(最快在前)、吞吐、首 token 时延、近 15 分钟 uptime;说明 first-party 与被降序原因;底部一行说明本会话最后一条回复由谁服务及 affinity 状态。面板打开时会随回复更新。routing 信息来自网关每条回复末尾的记录,无需额外请求。

适用场景与注意

适合: 已在 DSH 中配置 vercel-ai-gateway、希望新会话尽量落在当前最快 Provider、并想直观看到路由与排名时。

注意:

  • 部分 Provider 可能对账户标记 plan_not_eligible,网关会跳过并尝试列表中下一家。
  • 统计为公开 endpoint 数据,15 分钟粒度;/fastcel refresh 可强制刷新。
  • 重启 harness 会清空内存中最近会话的 served-by 记录。
  • DSH 社区插件目录(如 skillhub.cn)为独立站点,与 DeepSeek / 幻方无官方从属关系;本文事实以 GitHub README 与 package.json 为准。

结尾

dsh-fastcel 在不改写你已有 providerOptions 的前提下,为 Gateway 推理请求注入按吞吐排序的 Provider 顺序,并在 Web 端展示排名与实际落点,适合关心 Gateway 多 Provider 路由效率的 DSH 用户。

  • 目录页:https://www.skillhub.cn/plugins/DavidCarliez/dsh-fastcel
  • 源码与文档:https://github.com/DavidCarliez/dsh-fastcel
羽毛球分组比赛记分
小程序二维码

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

小夜