Filozofia
GoModel dostarcza endpointy administracyjne domyślnie włączone. Cel jest prosty: wdrażasz GoModel i od razu widzisz, co się dzieje – bez dodatkowych usług, bez osobnego stosu monitoringu, bez konfiguracji. Warstwa administracyjna składa się z dwóch niezależnie sterowanych części:- Admin REST API (
/admin/*) – endpointy JSON czytelne dla maszyn, udostępniające dane o użyciu, budżetach i inwentarzu modeli. Chronione przezGOMODEL_MASTER_KEY, tak jak wszystkie inne trasy API. - Admin Dashboard UI (
/admin/dashboard) – lekki, wbudowany dashboard HTML, który wizualizuje te same dane. Bez zewnętrznych zależności i bez frameworków JavaScript do instalowania – jest wkompilowany w plik binarny.
Konfiguracja
Zachowanie warstwy administracyjnej i dashboardu sterujesz zmiennymi środowiskowymi (lub równoważnym blokiem YAMLadmin:). Pełną tabelę zmiennych, wartości domyślnych
i równoważny blok YAML admin: znajdziesz w sekcji
Konfiguracja administracyjna.
Dashboard UI wymaga włączonego REST API. Jeśli ustawisz
ADMIN_ENDPOINTS_ENABLED=false, ale zostawisz ADMIN_UI_ENABLED=true, UI
zostanie automatycznie wyłączone, a w logach pojawi się ostrzeżenie.Uwierzytelnianie
Endpointy Admin REST API (/admin/*) akceptują dwa rodzaje danych uwierzytelniających jako token Bearer:
GOMODEL_MASTER_KEY– zawsze ma dostęp administracyjny.- Zarządzany klucz API z dostępem do dashboardu – zarządzane klucze są domyślnie tworzone bez dostępu do dashboardu, więc klucz wydany na ruch do modeli nie może czytać logu audytowego, wydawać nowych kluczy ani zmieniać ustawień gatewaya. Requesty wykonane zarządzanym kluczem bez tego dostępu zwracają
403z kodem błędudashboard_access_denied.
"dashboard_access": true w POST /admin/auth-keys) albo później:
GET /admin/auth-keys zawierają restricted i effective_models – modele
z katalogu, które request z tym kluczem faktycznie może wywołać, po uwzględnieniu
polityk ścieżki użytkownika, własnej listy dozwolonych modeli klucza oraz polityk po stronie modeli.
Ogranicz klucz do konkretnych modeli opcjonalnym polem allowed_models w
POST /admin/auth-keys (pominięcie oznacza brak ograniczenia na poziomie klucza, tak jak w przypadku
każdego innego opcjonalnego pola przy tworzeniu) lub później przez
PUT /admin/auth-keys/<key-id>/allowed-models ({"allowed_models": ["anthropic/*", "openai/gpt-4o"]};
jawnie pusta lista znosi ograniczenie na poziomie klucza; pominięcie pola jest odrzucane). Listami dozwolonych
modeli na poziomie grup i użytkowników zarządzasz przez endpointy użytkowników.
Dostęp do dashboardu dotyczy wyłącznie /admin/*. Endpointy modeli i samoobsługowy endpoint GET /v1/usage pozostają dostępne dla każdego zarządzanego klucza, z wyjątkiem tras passthrough do providerów (/p/{provider}/...): zarządzane klucze są tworzone bez dostępu do passthrough, a nadajesz go przez "passthrough_access": true w POST /admin/auth-keys lub PUT /admin/auth-keys/<key-id>/passthrough-access (zobacz Kontrola dostępu do passthrough).
Import kluczy z LiteLLM
POST /admin/auth-keys/import dodaje wirtualny klucz LiteLLM na podstawie hasha SHA-256,
który LiteLLM dla niego przechowuje, dzięki czemu klienci wysyłają dalej ten sam token sk-.... GoModel
nigdy nie otrzymuje samego tokenu.
POST /admin/auth-keys (description,
user_path, labels, allowed_models, dashboard_access, expires_at) i
odpowiada 201 z kluczem, który potem pokazuje "imported_from": "litellm".
redacted_value to key_name z LiteLLM, np. sk-...k6Hd, a domyślnie
sk-.... Wpis w allowed_models wskazujący model wirtualny jest zastępowany
modelami, do których ten model kieruje, ponieważ listy modeli kluczy w LiteLLM wskazują grupy modeli,
a listy dozwolonych modeli dopasowują rozwiązany model. Lista jest
rozwiązywana jednorazowo: późniejsza zmiana celu modelu wirtualnego nie zmienia klucza.
Ponowny import wcześniej zaimportowanego tokenu aktualizuje ten klucz i
odpowiada 200: aktualizowane są nazwa, ścieżka, etykiety, dozwolone modele i data wygaśnięcia. Dostęp
do dashboardu i dezaktywacja pozostają bez zmian. "enabled": false oznacza klucz
zablokowany w źródle: wcześniej zaimportowany klucz zostaje dezaktywowany i poza tym pozostaje bez zmian,
a klucz nigdy nieimportowany nie jest tworzony (204). Hash należący do klucza wydanego przez GoModel daje odpowiedź 409
z kodem auth_key_exists.
Tokeny zaczynające się od sk- są sprawdzane wyłącznie względem zaimportowanych kluczy, a
tokeny sk_gom_ wyłącznie względem kluczy wydanych przez GoModel. Bez zaimportowanych kluczy
tokeny sk- są odrzucane tak jak wcześniej. Zaimportowany klucz dezaktywujesz tak samo jak
każdy inny. Endpoint importu wymaga globalnego dostępu administracyjnego.
Zaimportowany klucz jest dokładnie tak silny jak klucz w LiteLLM. LiteLLM pozwala wybierać
własne klucze, takie jak sk-1234; zamiast je importować, zastąp je nowym kluczem GoModel.
Zakresowy dostęp administracyjny
user_path zarządzanego klucza ogranicza również to, czym klucz może administrować. Klucz z
dostępem do dashboardu i bez user_path (lub z /) jest globalnym administratorem i widzi
wszystko, tak jak master key. Klucz przypisany do /team/alpha jest administratorem
zakresowym: odczytuje i zarządza wyłącznie /team/alpha i jego potomkami
(/team/alpha/service, /team/alpha/service/worker, …). Nagłówek
X-GoModel-User-Path nigdy nie poszerza zakresu klucza.
Tożsamości z rozszerzeń, takie jak sesje SSO, podlegają tej samej regule: ścieżka użytkownika
sesji to poddrzewo, którym ona administruje, więc rozszerzenie przypisuje administratorów gatewaya
do /, a administratorów zespołów do katalogu głównego zespołu.
Użyj GET /admin/access, aby sprawdzić, jakim typem administratora są dane uwierzytelniające:
- Endpointy użycia, audytu, kluczy API, użytkowników, budżetów i rate limitów są filtrowane
do zakresu. Pominięty filtr
user_pathoznacza katalog główny zakresu;user_pathspoza zakresu zwraca403z kodemuser_path_out_of_scope. - Obiekty adresowane przez ID, które należą do innego poddrzewa (wpis audytu,
klucz API), zwracają
404, dokładnie tak, jakby nie istniały. - Nowe klucze API i polityki użytkowników domyślnie trafiają do katalogu głównego zakresu i nie mogą być tworzone poza nim. Klucze z dostępem do dashboardu utworzone w ten sposób stają się z kolei administratorami zakresowymi tego poddrzewa.
- Klucz nie może zmieniać własnych etykiet, dozwolonych modeli ani flag dostępu
(
403 auth_key_self_update); nadal może się sam dezaktywować. Klucz z dozwolonymi modelami może nadawać kluczom, które tworzy lub edytuje, tylko modele, które sam ma dozwolone:openai/*może nadaćopenai/gpt-4o-mini, ale nieanthropic/*ani klucza bez ograniczeń (403 allowed_models_out_of_scope). Te reguły dotyczą również kluczy globalnych, które także nie mogą zaimportować klucza z szerszym zestawem modeli ani ponownie zaimportować własnego tokenu, chyba że z"enabled": false, aby go dezaktywować. - Widoczne i edytowalne są tylko budżety i rate limity dla ścieżek użytkownika; reguły dla etykiet, providerów i modeli obowiązują w całym gatewayu.
- Endpointy obejmujące cały gateway zwracają
403z kodemadmin_scope_denied: status providerów i dane uwierzytelniające, ustawienia runtime i ich odświeżanie, import kluczy API, ustawienia tagowania, modele wirtualne, workflow, guardrails, serwery MCP, nadpisania cennika, przegląd cache’u, logi na żywo, przepustowość tokenów, ponowne przeliczanie cen, reset wszystkich budżetów i rate limitów oraz aktualizacja ustawień budżetów. Dashboard ukrywa odpowiednie strony i akcje.
/v1; zobacz
User Path → Własność obiektów.
Strony Dashboard UI (/admin/dashboard) i zasoby statyczne (/admin/static/*) pomijają uwierzytelnianie, więc powłoka dashboardu jest dostępna bez konfigurowania kluczy API w przeglądarce – dane, które ładuje, nadal wymagają klucza z dostępem do dashboardu.
Endpointy REST API
Wszystkie endpointy Admin API są zamontowane pod/admin.
Starszy alias ścieżki – do 2026-08-09 te same endpointy są także
dostępne pod
/admin/api/v1/*. Odpowiedzi na starszej ścieżce zawierają
Deprecation: true, Sunset: Sun, 09 Aug 2026 00:00:00 GMT oraz nagłówek Link
wskazujący nową ścieżkę. Aby zmigrować, zastąp /admin/api/v1/ przez
/admin/ w swoich skryptach. Jeden endpoint został też przeniesiony w obrębie /admin:
/admin/api/v1/dashboard/config → /admin/runtime/config.GET /admin/access
Zwraca zakres administracyjny wywołującego, aby skrypty i dashboard mogły się do niego dostosować. Zobacz Zakresowy dostęp administracyjny. Odpowiedź:scope ma wartość global (master key albo klucz bez user_path) lub
user_path; user_path występuje tylko dla zakresowych danych uwierzytelniających.
GET /admin/usage/summary
Zwraca zagregowane statystyki użycia tokenów w konfigurowalnym oknie czasowym. Parametry zapytania:
Użyj
start_date/end_date dla jawnych zakresów albo days jako skrótu. Gdy podano oba, pierwszeństwo mają start_date/end_date.
Każdy wiersz użycia zapisuje zarządzany klucz, który wykonał request, więc
auth_key_id odpowiada na pytanie „ile wydał ten klucz?”. Przyjmuje go każdy endpoint raportowy
pod /admin/usage/* z wyjątkiem throughput, a wpisy /admin/usage/log
go zawierają. /admin/usage/recalculate-pricing nie przyjmuje tego
filtra. Requesty wykonane z master key oraz wiersze zapisane, zanim to pole
istniało, nie mają id klucza.
GET /admin/usage/daily
Zwraca rozbicie użycia tokenów na okresy w konfigurowalnym oknie czasowym, pogrupowane według wskazanego interwału. Parametry zapytania:
Format pola
date w odpowiedzi zależy od interwału: YYYY-MM-DD (daily), YYYY-Www (weekly), YYYY-MM (monthly) lub YYYY (yearly).
Odpowiedź:
GET /admin/usage/sessions
Zwraca ograniczoną stronę użycia pogrupowanego według wykrytych sesji w zakresie ścieżki użytkownika, posortowaną według ostatniej aktywności sesji. Wiersze bez wykrytej sesji są pomijane. Sumy requestów i tokenów obejmują trafienia w lokalnym cache’u odpowiedzi. Sumy kosztów obejmują tylko requesty wysłane do providera, więc koszt uniknięty dzięki cache’owi nie jest raportowany jako wydatek. Parametry zapytania:GET /admin/usage/endpoints
Zwraca użycie pogrupowane według endpointu requestu, dzięki czemu widzisz, ile kosztuje czat, audio czy embeddingi. Każdy wiersz zawieraoperation, do której należy jego endpoint;
endpointy o tym samym znaczeniu mają wspólną operację, więc /v1/chat/completions i
/v1/messages to oba chat_completions. Zsumuj wiersze według operation, aby uzyskać
widok per operacja. operation jest pomijane dla endpointów, których gateway nie
klasyfikuje.
Endpoint przyjmuje parametry zakresu dat (days, start_date, end_date) oraz
filtry danych model, provider, label, user_path, session_id,
auth_key_id, endpoint, operation i cache_mode.
Filtry endpointów i operacji
Każdy endpoint raportowy pod/admin/usage/* z wyjątkiem throughput, a także
/admin/cache/overview, przyjmuje dwa filtry endpointów:
Operacje:
chat_completions, responses, conversations, embeddings,
batches, files, audio_speech, audio_transcriptions,
audio_translations, image_generations, image_edits, realtime, mcp,
systemone i provider_passthrough. Nieznana operacja zwraca 400.
Ruch passthrough do providerów (/p/{provider}/...) liczy się jako
provider_passthrough, niezależnie od tego, do jakiego endpointu trafia w upstreamie.
/admin/usage/log dopasowuje także tekst search do endpointu.
Tryb cache
Każde trafienie w cache odpowiedzi jest zapisywane jako wpis użycia, zuser_path wywołującego i cache_type o wartości exact lub semantic. Endpointy
użycia domyślnie pomijają te wpisy, więc requesty, tokeny i koszt opisują
wydatki u providerów. Przekaż cache_mode, aby to zmienić:
/admin/usage/summary, /admin/usage/daily, /admin/usage/log,
/admin/usage/models, /admin/usage/labels, /admin/usage/user-paths,
/admin/usage/endpoints oraz
/v1/usage (zobacz Usage API). Nierozpoznane
wartości są traktowane jak uncached. /admin/usage/sessions go ignoruje: sumy
requestów i tokenów sesji zawsze obejmują trafienia w cache, a pola kosztów pozostają
wyłącznie kosztami providerów.
Dwa endpointy celowo go ignorują: /admin/cache/overview zawsze raportuje
tylko trafienia w cache, a /admin/usage/sessions zawsze je uwzględnia (jego pola kosztów
pozostają wyłącznie kosztami providerów).
GET /admin/audit/stats
Zwraca liczby requestów w przedziałach czasowych, pogrupowane w klasy statusów2xx/4xx/5xx,
ogólne podsumowanie wskaźnika sukcesu oraz średni czas trwania requestu per
provider. Na tym opierają się wykresy „Requests by Status” i „Provider Latency” na
stronie Overview w dashboardzie. Dane pochodzą z logu audytowego (logowanie audytowe jest domyślnie włączone;
LOGGING_ENABLED).
Parametry zapytania:
Zakresy do 3 dni używają przedziałów godzinowych (
"interval": "hour"); dłuższe zakresy używają
przedziałów dziennych ("interval": "day"). Przedziały są wypełniane zerami od początku
zakresu do bieżącego momentu.
Odpowiedź:
provider_latency odpowiada indeks po indeksie tablicy buckets. Wpisy mają wartość
null dla przedziałów, w których provider nie obsłużył żadnego udanego requestu, a
średnie obejmują tylko udane (2xx) requesty, które dotarły do providera – trafienia w lokalnym
cache’u odpowiedzi i nieudane requesty są wykluczone. Jeśli logowanie audytowe jest
wyłączone, zwraca puste przedziały.
Endpointy budżetów
Budżetami zarządzasz pod/admin/budgets. Te endpointy są
dostępne, gdy zarządzanie budżetem jest włączone.
PUT, DELETE i reset-one identyfikują jeden budżet przez złożony klucz
(user_path, period) lub (user_path, period_seconds) dla okresów niestandardowych.
Te operacje nie działają globalnie dla okresu. Dla tras PUT i
DELETE ze ścieżką w URL zakoduj user_path w URL; kształt requestu opisuje strona Budżety.
Przykłady requestów i zachowanie egzekwowania znajdziesz na stronie Budżety.
Endpointy użytkowników
GET /admin/users zwraca każdy węzeł znany gatewayowi – zapisane
polityki, ścieżki użytkowników zarządzanych kluczy API i ich przodków – posortowane według
ścieżki:
allowed_models to własna lista węzła w postaci kanonicznej (anthropic/ dla
wildcarda providera, / dla wszystkiego); inherited_from wymienia przodków,
których listy również obowiązują. effective_models to wynik na poziomie ścieżki – lista węzła, listy jego przodków
i polityki modeli wirtualnych po stronie modeli – wyliczony przez ten sam
mechanizm autoryzacji, którego używa inferencja; własne allowed_models zarządzanego klucza API może dodatkowo
zawęzić request. Pusta lista z restricted: true oznacza, że listy węzła
nie mają części wspólnej. configured ma wartość false dla węzłów wynikających tylko z kluczy
lub potomków; managed: true oznacza polityki zadeklarowane w konfiguracji,
które są tu tylko do odczytu (409, kod user_managed).
PUT /admin/users przyjmuje {"user_path": "/acme/eng", "allowed_models": ["anthropic/*"], "description": "..."}
i zwraca zaktualizowane drzewo. Selektory są walidowane względem skonfigurowanych
providerów. Reguły dopasowania opisuje strona Użytkownicy.
GET /admin/models
Zwraca wszystkie zarejestrowane modele wraz z typem providera i nazwą skonfigurowanego providera. Odpowiedź:/v1/models: wersja administracyjna zawiera dla każdego modelu zarówno provider_type, jak i provider_name, co pozwala zrozumieć zarówno rodzinę providera, jak i konkretną skonfigurowaną instancję providera, która obsługuje model.
GET /admin/models/metadata
Zwraca źródła metadanych jednego modelu: scalone metadane, które serwuje gateway (effective), oraz każdą warstwę, z której zostały scalone. provider to dane, które
provider zwrócił we własnej liście modeli, catalog to wpis z
ai-model-list, a
config to nadpisanie metadanych w config.yaml; warstwa null nie ma żadnych informacji
o modelu. sources wskazuje zwycięską warstwę dla każdego efektywnego pola
(config, provider, catalog lub inferred dla trybów odgadniętych z
ID modelu). Kolejność pierwszeństwa opisuje strona Metadane modeli.
Strona Models w dashboardzie pobiera te dane po rozwinięciu wiersza. Nic
nie jest dla nich zapisywane: warstwy są już przechowywane per model, a wpis z katalogu
jest rozwiązywany na żądanie.
Parametry zapytania:
provider(wymagane): nazwa instancji providera lub typ provideramodel(wymagane): surowe ID modelu w upstreamie
400, gdy brakuje parametru, i 404, gdy model nie jest
zarejestrowany.
Endpointy pluginów, guardrails i workflow
Kształty odpowiedzi opisują strony Pluginy
i Workflow. Endpointy pluginów i guardrails
odpowiadają
503 z kodem feature_unavailable, gdy system pluginów
jest wyłączony (PLUGINS_ENABLED=false i GUARDRAILS_ENABLED=false).
Admin Dashboard
Dashboard to renderowana po stronie serwera strona HTML wbudowana w plik binarny GoModel. Otwórz go pod adresem:DASHBOARD_LIVE_LOGS_ENABLED=true, dashboard otwiera
GET /admin/live/logs i streamuje zwięzłe podglądy cyklu życia audytu i użycia. Dzięki
temu strony Audit Logs i Usage pokazują request w trakcie przechodzenia przez
workflow, zanim zakończy się asynchroniczny zapis do bazy danych. Stream używa kursorów
sekwencji, ograniczonego odtwarzania i zdarzeń heartbeat, więc ponownie łączące się przeglądarki mogą nadrobić
zaległości po krótkich przerwach w sieci.
Źródłem prawdy pozostają utrwalone tabele audytu i użycia. Jeśli
kursor przeglądarki wypadnie poza bufor odtwarzania, stream wysyła zdarzenie resetu,
a dashboard przeładowuje dane ze zwykłych endpointów REST.