LM Warden

Jeden klucz na aplikację i strona dla każdego klucza.

Daj każdemu współpracownikowi, laptopowi, zadaniu CI i agentowi własny klucz. Strona klucza pokazuje, ile zużył i jak długo jego żądania czekały w kolejce, medianę i p95, w dowolnym oknie, które zaznaczysz myszą lub wpiszesz. Wymieniaj klucz (rotacja) z okresem przejściowym i ustawiaj jego priorytet od P0 do P9: oczekujące żądanie P9 zawsze idzie przed P8.

Wstrzymaj go, a nowe żądania będą odrzucane, podczas gdy te już wykonywane się zakończą:

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

Z lokalnej instancji, 23 września 2026 r. Host i klucz zastąpione, pozostałe nagłówki obcięte.

Rys. 13Strona klucza demo-agent, który wygenerował obciążenie z rys. 1: 37 żądań i 43 tys. wygenerowanych tokenów w godzinie widocznej na ekranie. Potem otwiera się jego panel God mode (opcjonalny podgląd na żywo promptów i odpowiedzi jednego klucza, domyślnie wyłączony), a odpowiedzi pojawiają się w miarę pisania. Prompty są nasze.
Wykres Requests ze strony Stats z ostatnich 7 dni, od 16 do 23 września: jeden znacznik na żądanie, kolor według klucza API, rozmiar według wygenerowanych tokenów, kształt według powodu zakończenia, na tle czasu trwania w skali logarytmicznej od 100 ms do 10 000 s. Większość znaczników leży między 3 a 100 sekundami; jeden klucz ma dwie gęste kolumny sięgające od ułamka sekundy do kilkuset sekund.
Rys. 14Żądania wszystkich kluczy na jednym wykresie z tej samej strony Stats: ostatnie 7 dni, 28 906 żądań, narysowane co piętnaste. Znacznik to jedno żądanie: kolor według klucza, rozmiar według wygenerowanych tokenów, kształt według sposobu zakończenia, wysokość według czasu trwania w skali logarytmicznej. Równomierny bursztynowy pas to opencode-laptop, dwie gęste różowe kolumny to research-notebook. Zarejestrowano 23 września 2026 r.; nazwy kluczy zastąpiono. Przewiń obraz w bok, aby zobaczyć cały tydzień.

Aby odejść, wystarczy zmienić base_url.

LM Warden obsługuje /v1/chat/completions i /v1/models, a /v1/models podaje max_model_len każdego modelu. Obsługuje też Anthropic Messages API pod /v1/messages, więc w Claude Code wystarczy ustawić ANTHROPIC_BASE_URL na główny adres URL instancji LM Warden (ścieżkę /v1/messages Claude Code dodaje sam), oraz OpenAI Responses API pod /v1/responses, więc Codex CLI może używać załadowanego przez ciebie modelu. Wagi leżą w zwykłym cache HuggingFace, który make export-hf-cache przekazuje ci jako archiwum tar, a dokładne argumenty wiersza poleceń (argv), z jakimi uruchomiono każdy silnik, są dostępne jednym żądaniem GET, więc działającą konfigurację można odtworzyć bez nas. Poniższy diff pokazuje zmiany potrzebne do przejścia na LM Warden; aby odejść, wystarczy cofnąć te same zmiany.

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