LM Warden

每个应用一个密钥,每个密钥一个页面。

给每位同事、每台笔记本电脑、每个 CI 任务和每个智能体都分配自己的密钥。密钥页面会显示它的用量,以及其请求在队列中的等待时间(中位数和 p95),时间范围可以拖动选择,也可以直接输入。轮换密钥时可设置宽限期;优先级可设为 P0 到 P9:等待中的 P9 请求总是排在 P8 请求之前。

暂停它后,新请求会被拒绝,而已经在运行的请求会继续完成:

$ curl -i http://gpu-box:8080/v1/chat/completions \
    -H "Authorization: Bearer vw_…" -d '{…}'
HTTP/1.1 403 Forbidden
content-type: application/json

{"detail":"token paused"}

来自 2026 年 9 月 23 日的一个本地实例。主机和密钥已替换,其他标头已删减。

图 13demo-agent 的页面,也就是图 1 中产生负载的那个密钥:屏幕上这一小时内有 37 个请求和 43k 个生成的 token。然后它的 God mode 停靠面板打开(一个可选开启的实时视图,显示某个密钥的提示词和回复,默认关闭),回复在写出的同时流式显示。提示词是我们自己的。
Stats 页面上过去 7 天(9 月 16 日到 23 日)的 Requests 图表:每个请求一个标记,颜色表示 API 密钥,大小表示生成的 token 数,形状表示结束原因,纵轴是对数刻度的耗时,从 100 ms 到 10,000 s。大多数标记位于 3 到 100 秒之间;有一个密钥显示出两列密集的标记,从不到一秒一直延伸到几百秒。
图 14所有密钥的请求都在一张图表上,来自同一个 Stats 页面:过去 7 天,28,906 个请求,按十五分之一抽样绘制。一个标记代表一个请求,颜色取决于它的密钥,大小取决于它生成的 token 数,形状取决于它的结束方式,高度是对数刻度上的耗时。平稳的琥珀色是 opencode-laptop,两列密集的粉色是 research-notebook。记录于 2026 年 9 月 23 日;密钥名称已替换。左右滚动图片可查看整周。

想离开?改一下 base_url 就行。

它支持 /v1/chat/completions 和 /v1/models,并且 /v1/models 会报告每个模型的 max_model_len。它还在 /v1/messages 支持 Anthropic Messages API,因此 Claude Code 把 ANTHROPIC_BASE_URL 指向 warden 的根 URL 即可(Claude Code 会自己加上 /v1/messages 路径);它也在 /v1/responses 支持 OpenAI Responses API,因此 Codex CLI 可以使用你加载的模型。权重位于普通的 HuggingFace 缓存中,make export-hf-cache 会把它打包成 tarball 交给你;每个引擎启动时使用的确切命令行参数(argv)只需一次 GET 即可取得,因此不需要我们也能重建一套可用的环境。把下面的 diff 反过来看,就是迁出的步骤。

  import os
  from openai import OpenAI

  client = OpenAI(
-     base_url="https://api.openai.com/v1",
-     api_key=os.environ["OPENAI_API_KEY"],
+     base_url="http://gpu-box:8080/v1",
+     api_key=os.environ["LM_WARDEN_KEY"],   # a vw_ key from API tokens
  )

  reply = client.chat.completions.create(
-     model="gpt-4o-mini",
+     model="gpt-oss-20b",   # the served name of a model you loaded
      messages=[{"role": "user", "content": "What is a KV cache?"}],
  )