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"}

Снято на локальном экземпляре 23 сентября 2026 г. Хост и ключ заменены, остальные заголовки удалены.

Рис. 13Страница demo-agent — ключа, который создавал нагрузку на рис. 1: 37 запросов и 43 тыс. сгенерированных токенов за показанный час. Затем открывается его панель God mode (просмотр промптов и ответов одного ключа в реальном времени; включается отдельно, по умолчанию выключен), и ответы появляются по мере генерации. Промпты написаны нами.
График Requests со страницы Stats за последние 7 дней, с 16 по 23 сентября: по отметке на запрос, цвет — по ключу API, размер — по числу сгенерированных токенов, форма — по причине завершения; по вертикали — длительность в логарифмической шкале от 100 мс до 10 000 с. Большинство отметок лежит между 3 и 100 секундами; у одного ключа два плотных столбца от долей секунды до нескольких сотен секунд.
Рис. 14Запросы всех ключей на одном графике той же страницы Stats: последние 7 дней, 28 906 запросов, показан каждый пятнадцатый. Одна отметка — один запрос: цвет — по ключу, размер — по числу сгенерированных токенов, форма — по тому, чем завершился запрос, высота — длительность в логарифмической шкале. Ровная янтарная полоса — это opencode-laptop, два плотных розовых столбца — research-notebook. Снято 23 сентября 2026 г.; имена ключей заменены. Прокрутите изображение вбок, чтобы увидеть всю неделю.

Чтобы уйти с LM Warden, достаточно поменять base_url.

LM Warden поддерживает /v1/chat/completions и /v1/models, причем /v1/models сообщает max_model_len каждой модели. Кроме того, он поддерживает Anthropic Messages API на /v1/messages, поэтому в Claude Code достаточно указать в ANTHROPIC_BASE_URL корневой URL сервера LM Warden (путь /v1/messages Claude Code добавит сам). Есть и OpenAI Responses API на /v1/responses, так что Codex CLI может работать с загруженной вами моделью. Веса лежат в обычном кэше Hugging Face, который make export-hf-cache упаковывает в архив tar, а точную командную строку (argv), с которой был запущен каждый движок, можно получить одним GET-запросом, так что рабочую конфигурацию можно воссоздать без нас. Diff ниже показывает переход на LM Warden; чтобы уйти, проделайте его в обратную сторону: верните прежний адрес API, ключ и имя модели.

  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?"}],
  )