Philosophie
GoModel wird mit standardmäßig aktivierten Admin-Endpunkten ausgeliefert. Das Ziel ist einfach: Sie sollen GoModel deployen können und sofort sehen, was passiert – ohne zusätzliche Dienste, ohne separaten Monitoring-Stack, ohne Konfiguration. Die Admin-Schicht besteht aus zwei unabhängig steuerbaren Teilen:- Admin-REST-API (
/admin/*) – maschinenlesbare JSON-Endpunkte für Nutzungsdaten, Budgets und den Modellbestand. Wie alle anderen API-Routen durchGOMODEL_MASTER_KEYgeschützt. - Admin-Dashboard-UI (
/admin/dashboard) – ein schlankes, eingebettetes HTML-Dashboard, das dieselben Daten visualisiert. Keine externen Abhängigkeiten, keine zu installierenden JavaScript-Frameworks – es ist in das Binary einkompiliert.
Konfiguration
Das Verhalten von Admin-Schicht und Dashboard wird über Umgebungsvariablen (oder den entsprechenden YAML-Blockadmin:) gesteuert. Unter
Admin-Konfiguration finden Sie die vollständige Tabelle der
Variablen, Standardwerte und den entsprechenden YAML-Block admin:.
Die Dashboard-UI setzt eine aktivierte REST-API voraus. Wenn Sie
ADMIN_ENDPOINTS_ENABLED=false setzen, aber ADMIN_UI_ENABLED=true belassen, wird die UI
automatisch deaktiviert und eine Warnung in die Logs geschrieben.Authentifizierung
Die Admin-REST-API-Endpunkte (/admin/*) akzeptieren zwei Arten von Zugangsdaten als Bearer-Token:
GOMODEL_MASTER_KEY– hat immer Admin-Zugriff.- Ein verwalteter API-Key mit Dashboard-Zugriff – verwaltete Keys werden standardmäßig ohne Dashboard-Zugriff erstellt, sodass ein für Modell-Traffic ausgegebener Key weder das Audit-Log lesen noch neue Keys ausstellen oder Gateway-Einstellungen ändern kann. Requests mit einem verwalteten Key ohne diesen Zugriff liefern
403mit dem Fehlercodedashboard_access_denied.
"dashboard_access": true bei POST /admin/auth-keys) oder nachträglich:
GET /admin/auth-keys enthalten restricted und effective_models – die
Katalogmodelle, die ein Request mit diesem Key tatsächlich aufrufen kann, nach Anwendung der
User-Path-Richtlinien, der eigenen Allowlist des Keys und der modellseitigen Richtlinien.
Beschränken Sie einen Key auf bestimmte Modelle mit dem optionalen Feld allowed_models bei
POST /admin/auth-keys (fehlt es, gibt es wie bei jedem anderen optionalen Erstellungsfeld
keine Beschränkung auf Key-Ebene) oder nachträglich mit
PUT /admin/auth-keys/<key-id>/allowed-models ({"allowed_models": ["anthropic/*", "openai/gpt-4o"]};
eine explizit leere Liste hebt die Beschränkung auf Key-Ebene auf; ein fehlendes Feld wird abgelehnt). Allowlists auf Gruppen- und
Benutzerebene verwalten Sie über die Benutzer-Endpunkte.
Dashboard-Zugriff regelt nur /admin/*. Modell-Endpunkte und der Self-Service-Endpunkt GET /v1/usage bleiben für jeden verwalteten Key verfügbar, mit Ausnahme der Provider-Passthrough-Routen (/p/{provider}/...): Verwaltete Keys werden ohne Passthrough-Zugriff erstellt; Sie erteilen ihn mit "passthrough_access": true bei POST /admin/auth-keys oder mit PUT /admin/auth-keys/<key-id>/passthrough-access (siehe Passthrough-Zugriffskontrolle).
Keys aus LiteLLM importieren
POST /admin/auth-keys/import fügt einen virtuellen LiteLLM-Key über den SHA-256-Hash
hinzu, den LiteLLM dafür speichert, sodass Clients weiterhin dasselbe sk-...-Token senden. GoModel
erhält das Token selbst nie.
POST /admin/auth-keys (description,
user_path, labels, allowed_models, dashboard_access, expires_at) und
antwortet mit 201 und dem Key, der dann "imported_from": "litellm" anzeigt.
redacted_value ist der key_name von LiteLLM, etwa sk-...k6Hd, und lautet standardmäßig
sk-.... Ein Eintrag in allowed_models, der ein virtuelles Modell benennt, wird durch die
Modelle ersetzt, an die es routet, da die Modelllisten von LiteLLM-Keys Modellgruppen benennen und
Allowlists das aufgelöste Modell abgleichen. Die Liste wird
einmalig aufgelöst: Wird das virtuelle Modell später auf ein anderes Ziel umgestellt, ändert sich der Key nicht.
Der Import eines bereits früher importierten Tokens aktualisiert stattdessen diesen Key und
antwortet mit 200: Name, Pfad, Labels, erlaubte Modelle und Ablaufdatum. Dashboard-Zugriff
und eine Deaktivierung bleiben unverändert. "enabled": false kennzeichnet einen Key, den die
Quelle gesperrt hat: Ein früherer Import wird deaktiviert und ansonsten nicht verändert,
und ein nie importierter Key wird nicht erstellt (204). Ein Hash, der zu einem von GoModel ausgestellten Key gehört, liefert 409
mit dem Code auth_key_exists.
Tokens, die mit sk- beginnen, werden nur gegen importierte Keys geprüft und
sk_gom_-Tokens nur gegen von GoModel ausgestellte Keys. Ohne importierte Keys
werden sk--Tokens wie bisher abgelehnt. Deaktivieren Sie einen importierten Key wie jeden
anderen. Der Import-Endpunkt erfordert globalen Admin-Zugriff.
Ein importierter Key ist genau so stark wie der LiteLLM-Key. Bei LiteLLM können Sie
benutzerdefinierte Keys wie sk-1234 wählen; ersetzen Sie solche durch einen neuen GoModel-Key, statt
sie zu importieren.
Bereichsbeschränkter Admin-Zugriff
Deruser_path eines verwalteten Keys begrenzt auch, was dieser verwalten darf. Ein Key mit
Dashboard-Zugriff und ohne user_path (oder mit /) ist ein globaler Admin und sieht
alles, wie der Master-Key. Ein an /team/alpha gebundener Key ist ein bereichsbeschränkter
Admin: Er liest und verwaltet nur /team/alpha und dessen Nachfahren
(/team/alpha/service, /team/alpha/service/worker, …). Der
Header X-GoModel-User-Path erweitert den Bereich eines Keys nie.
Erweiterungsidentitäten wie SSO-Sessions folgen derselben Regel: Der User-Path der Session
ist der Teilbaum, den sie verwaltet. Eine Erweiterung bindet daher Gateway-Admins
an / und Team-Admins an die Wurzel des Teams.
Mit GET /admin/access finden Sie heraus, um welche Art es sich bei Zugangsdaten handelt:
- Endpunkte für Nutzung, Audit, API-Keys, Benutzer, Budgets und Rate-Limits werden
auf den Bereich gefiltert. Ein fehlender
user_path-Filter bedeutet die Wurzel des Bereichs; einuser_pathaußerhalb des Bereichs liefert403mit dem Codeuser_path_out_of_scope. - Über eine ID adressierte Objekte, die zu einem anderen Teilbaum gehören (ein Audit-Eintrag, ein
API-Key), liefern
404– genau so, als gäbe es sie nicht. - Neue API-Keys und Benutzerrichtlinien verwenden standardmäßig die Wurzel des Bereichs und können nicht außerhalb davon erstellt werden. Auf diese Weise erstellte Keys mit Dashboard-Zugriff sind ihrerseits bereichsbeschränkte Admins dieses Teilbaums.
- Ein Key kann seine eigenen Labels, erlaubten Modelle oder Zugriffs-Flags nicht ändern
(
403 auth_key_self_update); er kann sich aber weiterhin selbst deaktivieren. Ein Key mit erlaubten Modellen kann den Keys, die er erstellt oder bearbeitet, nur Modelle geben, die ihm selbst erlaubt sind:openai/*kannopenai/gpt-4o-minivergeben, aber wederanthropic/*noch einen unbeschränkten Key (403 allowed_models_out_of_scope). Diese Regeln gelten auch für globale Keys, die außerdem keinen Key mit umfassenderen Modellen importieren und ihr eigenes Token nicht erneut importieren können, außer mit"enabled": false, um es zu deaktivieren. - Nur Budgets und Rate-Limits für User-Paths sind sichtbar und bearbeitbar; Regeln für Labels, Provider und Modelle gelten Gateway-weit.
- Gateway-weite Endpunkte liefern
403mit dem Codeadmin_scope_denied: Provider-Status und -Zugangsdaten, Laufzeiteinstellungen und deren Aktualisierung, API-Key-Import, Tagging-Einstellungen, virtuelle Modelle, Workflows, Guardrails, MCP-Server, Preisüberschreibungen, Cache-Übersicht, Live-Logs, Token-Durchsatz, Neuberechnung der Preise, Zurücksetzen aller Budgets und Rate-Limits sowie Änderungen der Budgeteinstellungen. Das Dashboard blendet die entsprechenden Seiten und Aktionen aus.
/v1-Lebenszyklusobjekte; siehe
User Path → Objekteigentum.
Die Seiten der Dashboard-UI (/admin/dashboard) und die statischen Assets (/admin/static/*) überspringen die Authentifizierung, damit die Dashboard-Oberfläche erreichbar ist, ohne API-Keys im Browser zu konfigurieren – die Daten, die sie lädt, erfordern weiterhin einen Key mit Dashboard-Zugriff.
REST-API-Endpunkte
Alle Admin-API-Endpunkte sind unter/admin eingehängt.
Alter Pfad-Alias – bis zum 09.08.2026 sind dieselben Endpunkte auch
unter
/admin/api/v1/* erreichbar. Responses auf dem alten Pfad enthalten
Deprecation: true, Sunset: Sun, 09 Aug 2026 00:00:00 GMT und einen Link-Header,
der auf den neuen Pfad verweist. Zur Migration ersetzen Sie in Ihren Skripten /admin/api/v1/ durch
/admin/. Ein Endpunkt wurde zusätzlich innerhalb von /admin verschoben:
/admin/api/v1/dashboard/config → /admin/runtime/config.GET /admin/access
Gibt den Admin-Bereich des Aufrufers zurück, damit sich Skripte und das Dashboard anpassen können. Siehe Bereichsbeschränkter Admin-Zugriff. Response:scope ist global (Master-Key oder ein Key ohne user_path) oder
user_path; user_path ist nur bei bereichsbeschränkten Zugangsdaten vorhanden.
GET /admin/usage/summary
Gibt aggregierte Statistiken zur Token-Nutzung für ein konfigurierbares Zeitfenster zurück. Query-Parameter:
Verwenden Sie
start_date/end_date für explizite Zeiträume oder days als Kurzform. Sind beide angegeben, haben start_date/end_date Vorrang.
Jede Nutzungszeile erfasst den verwalteten Auth-Key, der den Request gestellt hat. Daher
beantwortet auth_key_id die Frage „Wie viel hat dieser Key ausgegeben?“. Jeder Reporting-Endpunkt
unter /admin/usage/* außer throughput akzeptiert den Parameter, und Einträge von /admin/usage/log
enthalten ihn. /admin/usage/recalculate-pricing akzeptiert diesen
Filter nicht. Requests mit dem Master-Key sowie Zeilen, die erfasst wurden, bevor es dieses Feld
gab, haben keine Key-ID.
GET /admin/usage/daily
Gibt eine Aufschlüsselung der Token-Nutzung pro Zeitabschnitt für ein konfigurierbares Zeitfenster zurück, gruppiert nach dem angegebenen Intervall. Query-Parameter:
Das Format des Felds
date in der Response hängt vom Intervall ab: YYYY-MM-DD (täglich), YYYY-Www (wöchentlich), YYYY-MM (monatlich) oder YYYY (jährlich).
Response:
GET /admin/usage/sessions
Gibt eine begrenzte Seite mit der Nutzung zurück, gruppiert nach erkannten, auf den User-Path bezogenen Sessions und sortiert nach der letzten Session-Aktivität. Zeilen ohne erkannte Session werden ausgelassen. Die Summen für Requests und Tokens enthalten Treffer im lokalen Response-Cache. Die Kostensummen enthalten nur Requests, die an Provider gingen, sodass vermiedene Cache-Kosten nicht als Ausgaben erscheinen. Query-Parameter:GET /admin/usage/endpoints
Gibt die Nutzung gruppiert nach Request-Endpunkt zurück, sodass Sie sehen, was Chat, Audio oder Embeddings kosten. Jede Zeile enthält dieoperation, zu der ihr Endpunkt gehört;
Endpunkte mit derselben Bedeutung teilen sich eine Operation, sodass /v1/chat/completions und
/v1/messages beide chat_completions sind. Summieren Sie die Zeilen nach operation, um eine
Ansicht pro Operation zu erhalten. Für Endpunkte, die das Gateway nicht klassifiziert, wird operation
weggelassen.
Der Endpunkt akzeptiert die Zeitraumparameter (days, start_date, end_date) und die
Datenfilter model, provider, label, user_path, session_id,
auth_key_id, endpoint, operation und cache_mode.
Endpunkt- und Operationsfilter
Jeder Reporting-Endpunkt unter/admin/usage/* außer throughput sowie
/admin/cache/overview akzeptiert zwei Endpunktfilter:
Operationen:
chat_completions, responses, conversations, embeddings,
batches, files, audio_speech, audio_transcriptions,
audio_translations, image_generations, image_edits, realtime, mcp,
systemone und provider_passthrough. Eine unbekannte Operation liefert 400.
Provider-Passthrough-Traffic (/p/{provider}/...) zählt als
provider_passthrough, unabhängig davon, welchen Endpunkt er upstream erreicht.
/admin/usage/log gleicht seinen search-Text zusätzlich mit dem Endpunkt ab.
Cache-Modus
Jeder Treffer im Response-Cache wird als Nutzungseintrag erfasst, mit demuser_path des Aufrufers und einem cache_type von exact oder semantic. Die Nutzungs-Endpunkte
lassen diese Einträge standardmäßig weg, sodass Requests, Tokens und Kosten durchweg
die Ausgaben bei Providern beschreiben. Übergeben Sie cache_mode, um das zu ändern:
/admin/usage/summary, /admin/usage/daily, /admin/usage/log,
/admin/usage/models, /admin/usage/labels, /admin/usage/user-paths,
/admin/usage/endpoints und
/v1/usage (siehe die Usage API). Nicht erkannte
Werte fallen auf uncached zurück. /admin/usage/sessions ignoriert den Parameter: Die Summen für
Requests und Tokens der Sessions enthalten immer Cache-Treffer, während die Kostenfelder
nur Provider-Kosten enthalten.
Zwei Endpunkte ignorieren den Parameter bewusst: /admin/cache/overview meldet immer nur
Cache-Treffer, und /admin/usage/sessions schließt sie immer ein (die Kostenfelder
enthalten nur Provider-Kosten).
GET /admin/audit/stats
Gibt in Zeitabschnitte eingeteilte Request-Zahlen zurück, gruppiert nach den Statusklassen2xx/4xx/5xx, dazu eine Zusammenfassung der Gesamterfolgsquote und die durchschnittliche Request-Dauer pro
Provider. Darauf basieren die Diagramme „Requests by Status“ und „Provider Latency“ auf
der Seite „Overview“ des Dashboards. Die Daten stammen aus dem Audit-Log (Audit-Logging ist standardmäßig aktiviert;
LOGGING_ENABLED).
Query-Parameter:
Zeiträume bis 3 Tage verwenden stündliche Abschnitte (
"interval": "hour"); längere Zeiträume verwenden
tägliche Abschnitte ("interval": "day"). Die Abschnitte werden vom Beginn des Zeitraums
bis zum aktuellen Zeitpunkt mit Nullwerten aufgefüllt.
Response:
provider_latency-Reihe ist Index für Index an buckets ausgerichtet. Einträge sind
null für Abschnitte, in denen der Provider keinen erfolgreichen Request bedient hat, und die
Durchschnittswerte umfassen nur erfolgreiche (2xx) Requests, die den Provider erreicht haben – Treffer im lokalen
Response-Cache und fehlgeschlagene Requests sind ausgenommen. Ist das Audit-Logging
deaktiviert, werden leere Abschnitte zurückgegeben.
Budget-Endpunkte
Budgets werden unter/admin/budgets verwaltet. Diese Endpunkte sind
verfügbar, wenn die Budgetverwaltung aktiviert ist.
PUT, DELETE und reset-one identifizieren ein Budget über den zusammengesetzten
Schlüssel (user_path, period) bzw. (user_path, period_seconds) für benutzerdefinierte Zeiträume.
Diese Operationen wirken nicht global pro Zeitraum. Für die pfadbezogenen Routen PUT und
DELETE muss user_path URL-kodiert werden; die Form des Requests finden Sie unter Budgets.
Unter Budgets finden Sie Request-Beispiele und das Durchsetzungsverhalten.
Benutzer-Endpunkte
GET /admin/users gibt jeden Knoten zurück, den das Gateway kennt – gespeicherte
Richtlinien, die User-Paths verwalteter API-Keys und deren Vorfahren –, sortiert nach
Pfad:
allowed_models ist die eigene Liste des Knotens in kanonischer Form (anthropic/ für einen
Provider-Platzhalter, / für alles); inherited_from listet die Vorfahren auf,
deren Listen ebenfalls gelten. effective_models ist das Ergebnis auf Pfadebene – die Liste des Knotens, die Listen seiner Vorfahren
und die modellseitigen Richtlinien virtueller Modelle –, ausgewertet mit demselben
Autorisierer, den auch die Inferenz verwendet; die eigenen allowed_models eines verwalteten API-Keys können
einen Request weiter einschränken. Eine leere Liste mit restricted: true bedeutet, dass die Schnittmenge der Listen
des Knotens leer ist. configured ist false für Knoten, die sich nur aus Keys
oder Nachfahren ergeben; managed: true kennzeichnet in der Konfiguration deklarierte Richtlinien,
die hier schreibgeschützt sind (409, Code user_managed).
PUT /admin/users akzeptiert {"user_path": "/acme/eng", "allowed_models": ["anthropic/*"], "description": "..."}
und gibt den aktualisierten Baum zurück. Selektoren werden gegen die konfigurierten
Provider validiert. Die Abgleichsregeln finden Sie unter Benutzer.
GET /admin/models
Gibt alle registrierten Modelle mit Provider-Typ und konfiguriertem Provider-Namen zurück. Response:/v1/models: Die Admin-Version enthält für jedes Modell sowohl provider_type als auch provider_name. So erkennen Sie sowohl die Provider-Familie als auch die konkret konfigurierte Provider-Instanz, die das Modell bereitstellt.
GET /admin/models/metadata
Gibt zurück, woher die Metadaten eines Modells stammen: die zusammengeführten Metadaten, die das Gateway ausliefert (effective), und jede Ebene, aus der sie zusammengeführt wurden. provider ist das, was der
Provider in seiner eigenen Modellliste gemeldet hat, catalog der Eintrag in
ai-model-list und
config die Metadaten-Überschreibung aus config.yaml; eine Ebene mit null weiß nichts
über das Modell. sources nennt für jedes effektive Feld die maßgebliche Ebene
(config, provider, catalog oder inferred für Modi, die aus der
Modell-ID abgeleitet wurden). Die Rangfolge finden Sie unter Modell-Metadaten.
Die Seite Models des Dashboards ruft diesen Endpunkt ab, wenn eine Zeile aufgeklappt wird. Dafür wird
nichts gespeichert: Die Ebenen werden bereits pro Modell vorgehalten, und der Katalogeintrag
wird bei Bedarf aufgelöst.
Query-Parameter:
provider(erforderlich): Name der Provider-Instanz oder Provider-Typmodel(erforderlich): unveränderte Upstream-Modell-ID
400 zurück, wenn ein Parameter fehlt, und 404, wenn das Modell nicht
registriert ist.
Plugin-, Guardrail- und Workflow-Endpunkte
Die Response-Formate sind unter Plugins
und Workflows dokumentiert. Die Plugin- und Guardrail-Endpunkte
antworten mit
503 und dem Code feature_unavailable, solange das Plugin-System
ausgeschaltet ist (PLUGINS_ENABLED=false und GUARDRAILS_ENABLED=false).
Admin-Dashboard
Das Dashboard ist eine serverseitig gerenderte HTML-Seite, die in das GoModel-Binary eingebettet ist. Sie erreichen es unter:DASHBOARD_LIVE_LOGS_ENABLED=true öffnet das Dashboard
GET /admin/live/logs und streamt kompakte Vorschauen des Audit-/Nutzungs-Lebenszyklus. So
können die Seiten „Audit Logs“ und „Usage“ einen Request anzeigen, während er den
Workflow durchläuft, noch bevor das asynchrone Schreiben in die Datenbank abgeschlossen ist. Der Stream verwendet Sequenz-Cursor,
begrenzte Wiederholung und Heartbeat-Events, damit sich wieder verbindende Browser nach kurzen
Netzwerkunterbrechungen aufholen können.
Die persistierten Audit- und Nutzungstabellen bleiben die maßgebliche Datenquelle. Fällt der
Cursor des Browsers aus dem Wiederholungspuffer heraus, sendet der Stream ein Reset-Event,
und das Dashboard lädt die Daten neu über die normalen REST-Endpunkte.