Skip to main content

Dobre wartości domyślne

GoModel kieruje się filozofią dobrych wartości domyślnych. Oznacza to, że ustawienia domyślne powinny wystarczyć, żeby z niego korzystać.

Jak nadpisać ustawienia domyślne?

Konfiguracja przechodzi przez trzy warstwy. Każde ustawienie ma rozsądną wartość domyślną, więc możesz uruchomić serwer bez żadnej konfiguracji.
GoModel działa od razu, bez plików konfiguracyjnych, więc możesz go wypróbować w minutę.Zacznij tutaj: Szybki start
GoModel automatycznie wykrywa providerów na podstawie dobrze znanych zmiennych środowiskowych.

Metody konfiguracji

1. Zmienne środowiskowe

Najczęstszy sposób konfigurowania GoModel. Ustaw dowolną z poniższych zmiennych, żeby nadpisać wartości domyślne.

Serwer

Body requestów może być skompresowane za pomocą Content-Encoding: gzip (lub x-gzip) albo zstd; SDK TypeSafe domyślnie kompresują zstd body o rozmiarze 1 KiB lub większym. Gateway dekoduje je przed routingiem, więc guardrails, audyt i providerzy widzą zwykłe body, a BODY_SIZE_LIMIT dotyczy zarówno rozmiaru po kompresji, jak i po zdekodowaniu (413, gdy którykolwiek go przekracza). Inne kodowania zwracają 415. STREAM_STALL_TIMEOUT (server.stream_stall_timeout w YAML) chroni gateway przed klientami, którzy otwierają odpowiedź streamingową i przestają ją czytać. Każdy zapis do klienta dostaje nowy termin, więc timeout zadziała tylko wtedy, gdy socket klienta pozostaje pełny przez cały ten czas, a nigdy wtedy, gdy wolny model po prostu nie ma nic do wysłania. Gdy timeout zadziała, połączenie zostaje zamknięte, request do upstreamowego providera jest anulowany, a wpis audytowy zapisuje client_stalled – również wtedy, gdy stream został zaserwowany z cache’u odpowiedzi. Zwiększ tę wartość dla klientów, którzy w uzasadniony sposób wstrzymują odczyt streamu na dłużej niż minutę; ustaw 0, żeby ją wyłączyć.

Adresy klientów za proxy

Każdy adres klienta raportowany przez GoModel – we wpisach audytowych, kluczach rate limitów, logach – to adres połączenia, które dotarło do gatewaya, więc za reverse proxy wszystkie wskazują na proxy. Ustaw SERVER_TRUSTED_PROXIES na sieci, w których stoją Twoje własne proxy, a GoModel odczyta przekazany adres klienta. Nic nie jest zaufane, dopóki tego nie wpiszesz – nawet loopback – a zmiana tych ustawień wymaga restartu.
Wpisy to sieci CIDR, pojedyncze adresy (jeden host) lub preset: Wybieraj jedną podsieć, w której stoi Twoje proxy. private pozwala każdemu prywatnemu klientowi ustawić własny przekazany adres, co jest złym rozwiązaniem, gdy Twoi klienci również korzystają z prywatnych adresów – domowy lab, którego klienci są w 192.168.1.0/24, a klaster działa w 10.42.0.0/16, powinien wpisać wyłącznie 10.42.0.0/16. Domyślnie GoModel odczytuje X-Forwarded-For, do którego każdy hop dopisuje adres, który widział, i zapisuje najbliższy hop spoza Twoich zaufanych sieci: ostatni adres zapisany przez Twoją własną infrastrukturę i zarazem najdalszy, którego klient nie może nadpisać. Request spoza wpisanych sieci, łańcuch, którego nie da się sparsować, oraz łańcuch złożony wyłącznie z zaufanych sieci – wszystkie zachowują adres połączenia. W tym ostatnim przypadku każdy wpis to deklaracja, którą wewnętrzny klient mógłby zmyślić. Dwa ustawienia zmieniają sposób odczytu nagłówka:
  • SERVER_CLIENT_IP_HEADER wskazuje inny nagłówek. Każdy nagłówek inny niż X-Forwarded-For zawiera pojedynczy adres i jest przyjmowany dosłownie, co jest właściwym odczytem za brzegiem sieci, który sam ustala adres klienta: SERVER_CLIENT_IP_HEADER=CF-Connecting-IP za Cloudflare lub X-Real-IP za nginx, który go ustawia. Nagłówek Forwarded z RFC 7239 nie jest obsługiwany.
  • SERVER_TRUSTED_HOPS pobiera wpis z X-Forwarded-For ze stałej głębokości zamiast skanować łańcuch – 1 to wpis skrajnie prawy, 2 ten przed nim. Użyj go, gdy Twój brzeg sieci znajduje się na znanej głębokości, ale rotuje adresy, których nie możesz wyliczyć. Połączenie nadal musi pochodzić z zaufanej sieci, a łańcuch krótszy niż skonfigurowana głębokość powoduje powrót do adresu połączenia.
Oba wymagają SERVER_TRUSTED_PROXIES; ustawione samodzielnie powodują błąd przy starcie, a nie są ustawieniem, które po cichu nic nie robi. Ustaw GOMODEL_DEMO_MODE=true dla publicznej lub współdzielonej instancji demonstracyjnej. GoModel loguje ostrzeżenie przy starcie i co pięć minut, wyświetla stałe ostrzeżenie na górze dashboardu i udostępnia DEMO_MODE=on w odpowiedzi /admin/runtime/config z listy dozwolonych wartości. Tryb demo nie resetuje storage’u; zaplanuj to osobno we wdrożeniu. Tryb demo nie omija też uwierzytelniania. Tryb logowania przy starcie managed_keys oznacza, że skonfigurowany storage nadal zawiera co najmniej jeden zarządzany klucz API gatewaya, więc requesty wymagają bearer tokena nawet wtedy, gdy GOMODEL_MASTER_KEY jest pusty. Wyłączone lub wygasłe zarządzane klucze utrzymują włączone uwierzytelnianie jako zabezpieczenie typu fail closed. Usuń wszystkie zarządzane klucze, żeby wrócić do trybu bez uwierzytelniania, albo skonfiguruj master key do odzyskiwania dostępu.

Wyłączanie master key

Master key to pojedyncze, globalne dane uwierzytelniające: kto go posiada, jest jednocześnie każdym użytkownikiem gatewaya. Gdy wydasz już zarządzane klucze API gatewaya, ustaw MASTER_KEY_DISABLED=true (server.master_key_disabled w YAML), żeby go wycofać i zostawić te klucze – razem z każdym używanym rozszerzeniem uwierzytelniania, takim jak SSO – jako jedyną drogę dostępu. Ścieżki użytkownika, budżety, rate limity i ślady audytowe przypisane do kluczy obowiązują wtedy dla każdego requestu, także w Admin API.
GoModel zapomina skonfigurowany master key przy starcie, więc nic go nie akceptuje ani nic z niego nie wynika: nie działa wobec gatewaya, wobec GET /v1/auth/verify ani wobec /admin. Klucz pozostawiony w środowisku lub w config.yaml jest nieaktywny, a nie powoduje błędu – dzięki temu przełącznik można bezpiecznie włączyć jeszcze przed jego usunięciem. Wyłączenie to nie to samo co pozostawienie pustego GOMODEL_MASTER_KEY, które uruchamia gateway bez uwierzytelniania i otwiera /admin/*, żeby dashboard mógł utworzyć pierwszy zarządzany klucz. Jeśli nie skonfigurowano rozszerzenia uwierzytelniania, /admin/* pozostaje otwarte nawet po utworzeniu zarządzanych kluczy, a GoModel loguje ostrzeżenie bezpieczeństwa przy starcie, dopóki tak jest – ustaw więc master key lub go wyłącz, gdy tylko wydasz pierwszy klucz z dostępem do dashboardu. Wyłączony master key działa natomiast w trybie fail closed: każdy request wymaga danych uwierzytelniających, a Admin API pozostaje dostępne tylko z takimi, które mają dostęp do dashboardu. Wydaj je, zanim włączysz przełącznik – bez master key, bez zarządzanego klucza i bez rozszerzenia uwierzytelniania gateway odrzuca każdy request i loguje o tym ostrzeżenie przy starcie.

MCP Gateway

Pełny przewodnik po funkcji znajdziesz w MCP Gateway.

Logowanie

Wyjście loggera w czasie działania. Trwały ślad audytowy API (body requestów/odpowiedzi, nagłówki) opisuje sekcja Logowanie audytowe poniżej.

Cache

W sekcji Cache znajdziesz opis działania exact cache, nagłówki odpowiedzi, endpointy analityczne oraz uwagę, że samo user_path nie partycjonuje exact cache.
CACHE_REFRESH_INTERVAL określa też, jak często dashboard ponownie sprawdza stan providerów („Last checked”), a PROVIDER_RECHECK_INTERVAL – jak szybko provider, który uległ awarii, jest ponownie sprawdzany pod kątem powrotu do działania. Zobacz Odporność na awarie.

Storage

Storage jest współdzielony przez logowanie audytowe, śledzenie użycia i przyszłe funkcje, takie jak IAM.
Aktualizacja wdrożenia na PostgreSQL powyżej v0.1.59. Tabela workflow_versions przechowywała created_at jako TIMESTAMPTZ w PostgreSQL i jako sekundy uniksowe w SQLite. Oba backendy używają teraz sekund uniksowych, a pierwsze uruchomienie konwertuje kolumnę na miejscu. Ręczna migracja nie jest potrzebna, ale zmiana jest jednokierunkowa: starsza binarka uruchomiona na przekonwertowanej bazie nie wystartuje. Zrób backup przed aktualizacją, jeśli możesz potrzebować rollbacku, i wykonuj rollback przez przywrócenie backupu, a nie przez podmianę binarki. Wartości created_at workflowów są zaokrąglane w dół do pełnych sekund i wyświetlane w UTC. Nie dotyczy to wdrożeń na SQLite i MongoDB.

Storage mediów

Pliki multimedialne – audio i obrazy przechwytywane do logu audytowego, gdy włączone jest LOGGING_LOG_AUDIO_BODIES lub LOGGING_LOG_IMAGE_BODIES – są przechowywane poza bazą danych. Ich metadane trafiają do opisanego wyżej backendu storage’u; tutaj trafiają tylko same bajty, więc ich rozmiar nie jest ograniczany, a baza danych pozostaje mała. Zobacz ADR-0013. Ścieżka domyślna działa według tej samej reguły co SQLite: ./data/media, gdy obok procesu istnieje katalog ./data, w przeciwnym razie systemowy katalog danych użytkownika. W kontenerach zamontuj tam wolumen; przy kilku replikach użyj współdzielonego montowania (EFS, montowanie S3 przez FUSE), żeby każda instancja mogła serwować każdy plik. Pliki są przechowywane tak długo jak wpisy audytowe, które się do nich odwołują (LOGGING_RETENTION_DAYS), i usuwane przez cogodzinne czyszczenie.

Logowanie audytowe

Wpisy audytowe zapisują adres klienta ustalony przez gateway. Za reverse proxy jest to adres proxy, dopóki nie wpiszesz jego sieci do SERVER_TRUSTED_PROXIES – zobacz adresy klientów za proxy. Podgląd na żywo w dashboardzie i trwałe logi audytowe to osobne funkcje. Przy DASHBOARD_LIVE_LOGS_ENABLED=true i LOGGING_ENABLED=false requesty mogą pojawiać się na żywo, ale nie są zapisywane w storage’u i znikają po odświeżeniu strony. Gdy logowanie audytowe jest włączone, zapisy są asynchroniczne i może minąć do LOGGING_FLUSH_INTERVAL sekund, zanim pojawią się w API zapisanych logów.
W PostgreSQL wyszukiwanie pełnotekstowe w logu audytowym korzysta z indeksu trigramowego z dołączonego rozszerzenia pg_trgm. GoModel instaluje rozszerzenie i buduje indeks przy starcie, jeśli jego rola w bazie danych ma do tego uprawnienia; w przeciwnym razie wyszukiwanie nadal działa, ale skanuje każdy wpis w wybranym zakresie dat. Żeby włączyć je przy roli z ograniczonymi uprawnieniami, uruchom raz CREATE EXTENSION pg_trgm; jako superuser i zrestartuj GoModel.
Gdy LOGGING_LOG_BODIES jest włączone, body requestów i odpowiedzi są zapisywane w całości. Mogą zawierać dane wrażliwe, takie jak dane osobowe (PII) lub klucze API osadzone w promptach.
LOGGING_LOG_REVISION_BODIES doprecyzowuje LOGGING_LOG_BODIES dla łańcucha przepisywania requestów na wejściu – nie działa, jeśli logowanie body nie jest włączone. Gdy oba są włączone, każdy rewriter, który zmienił request (na przykład kompresja tokenów w GoModel Pro), i każdy guardrail promptu, który edytował prompt, zapisują request w takiej postaci, w jakiej go zostawiły, obok oryginalnego body klienta we wpisie audytowym, więc łańcuch edycji można prześledzić krok po kroku. LOGGING_LOG_GUARDRAIL_STEPS steruje tym zapisem per krok (body requestów są kodowane poza ścieżką requestu): wyłącz go, żeby zapisywać edycje łańcucha jako jedną rewizję zawierającą request w przekazanej dalej postaci, bez snapshotów poszczególnych kroków. Wyłączenie LOGGING_LOG_REVISION_BODIES zachowuje metadane rewizji (nazwę rewritera, rozmiary w bajtach, zaoszczędzone tokeny, szczegóły zmiany), ale pomija dodatkowe kopie body, mniej więcej o połowę zmniejszając rozmiar danych audytowych na każdy przepisany request.
LOGGING_LOG_AUDIO_BODIES doprecyzowuje LOGGING_LOG_BODIES dla endpointów audio – nie działa, jeśli logowanie body nie jest włączone. Gdy oba są włączone, /v1/audio/speech zapisuje swoje wejście tekstowe i wygenerowane audio (base64, maksymalnie 8 MB), żeby dashboard mógł je odtworzyć, a /v1/audio/transcriptions zapisuje przesłane audio (base64, maksymalnie 8 MB, również do odtworzenia) wraz z metadanymi uploadu. Domyślnie ma wartość false, bo payloady audio są duże i szybko powiększają magazyn audytowy. Gdy logowanie body jest włączone, a to ustawienie wyłączone, body audio (odpowiedź speech i upload do transkrypcji, który zachowuje swoje metadane) są zapisywane jako lekki placeholder {__audio__, content_type, bytes, stored: false}; gdy logowanie body jest wyłączone, body audio nie jest zapisywane wcale.
LOGGING_LOG_IMAGE_BODIES doprecyzowuje LOGGING_LOG_BODIES dla Images API – nie działa, jeśli logowanie body nie jest włączone. Gdy oba są włączone, wygenerowane obrazy (/v1/images/generations, /v1/images/edits) oraz przesłane obrazy źródłowe do edycji i maski są zapisywane jako base64 (8 MB na wpis, obrazy ponad ten budżet stają się placeholderami), żeby dashboard mógł je wyświetlić. LOGGING_LOG_IMAGE_BODIES_SCOPE zawęża to do input (tylko uploady) lub output (tylko wyniki); domyślne all zapisuje oba. Domyślnie ma wartość false, bo payloady obrazów są duże i szybko powiększają magazyn audytowy. Gdy logowanie body jest włączone, a to ustawienie wyłączone, wpisy obrazów zachowują wszystko poza pikselami: prompt i parametry, kopertę odpowiedzi (usage, size, quality), hostowane URL-e i placeholder z rozmiarem {role, content_type, bytes, stored: false} dla każdego obrazu.

Śledzenie użycia tokenów

Budżety

Budżety korzystają ze śledzonych rekordów kosztów użycia. Jeśli śledzenie użycia jest wyłączone, GoModel startuje z wyłączonym zarządzaniem budżetami i loguje ostrzeżenie. SET_BUDGET_<PATH> obsługuje standardowe okresy hourly, daily, weekly i monthly. Sufiks <PATH> jest zamieniany na małe litery; używaj podwójnych podkreślników (__) między segmentami ścieżki, a pojedyncze podkreślniki pozostają wewnątrz segmentu. Na przykład SET_BUDGET_TEAM__ALPHA__SERVICE="daily=10" konfiguruje /team/alpha/service, a SET_BUDGET_TEAM_ALPHA="daily=10" konfiguruje /team_alpha. To różni się od opisanych niżej zmiennych <SUFFIX> providerów, które zamieniają podkreślniki na myślniki w nazwach providerów; SET_PROVIDER_BUDGET_<NAME> stosuje konwencję providerów, więc SET_PROVIDER_BUDGET_OPENAI_PROD ogranicza openai-prod. SET_BUDGET_="monthly=500" oznacza zmienną środowiskową o dosłownej nazwie SET_BUDGET_, która konfiguruje ścieżkę główną /. POSIX dopuszcza taką nazwę, ale niektóre powłoki i orkiestratory, w tym niektóre walidatory Kubernetesa, mogą ją odrzucić. Jeśli Twoje środowisko nie pozwala jej ustawić, użyj YAML lub dashboardu. Uwaga dotycząca migracji: zarządzanie budżetami zależy od śledzenia użycia. Jeśli USAGE_ENABLED=false, GoModel startuje z wyłączonymi budżetami i loguje ostrzeżenie, nawet gdy BUDGETS_ENABLED=true. Ustaw zarówno USAGE_ENABLED=true, jak i BUDGETS_ENABLED=true, żeby egzekwować budżety. Przykłady YAML, okresy, dopasowywanie i egzekwowanie w workflowach opisuje strona Budżety.

Metryki

Obsługa Prometheusa jest eksperymentalna. Szczegóły znajdziesz w przewodniku po metrykach Prometheusa.

Admin

Logi na żywo w dashboardzie to kompaktowe podglądy dla stron Audit Logs i Usage. Aktualizują wiersze, zanim zakończy się asynchroniczny zapis do bazy danych. Zapisane tabele audytu i użycia pozostają źródłem prawdy; jeśli przeglądarka połączy się ponownie z kursorem spoza okna odtwarzania, dashboard przeładuje dane przez standardowe REST API.

Klient HTTP

Te ustawienia sterują timeoutami upstreamowych requestów API do providerów LLM. Stream, który milczy dłużej niż HTTP_STREAM_IDLE_TIMEOUT, jest zamykany z błędem providera 504, zamiast wisieć do HTTP_TIMEOUT. Czas oczekiwania na pierwszy token się nie liczy, więc nie dotyczy to wolnych modeli reasoningowych. Zwiększ tę wartość tylko dla providera, który w uzasadniony sposób robi kilkuminutowe przerwy w trakcie streamu.

Klucze API providerów

Ustaw je, żeby automatycznie rejestrować providerów. Konfiguracja YAML nie jest wymagana. Większość providerów może korzystać z niestandardowego bazowego URL-a przez <PROVIDER>_BASE_URL (na przykład OPENAI_BASE_URL). Chutes AI domyślnie używa https://llm.chutes.ai/v1; możesz to nadpisać przez CHUTES_BASE_URL. DeepSeek domyślnie używa https://api.deepseek.com; ustawiaj DEEPSEEK_BASE_URL tylko dla kompatybilnego proxy lub alternatywnego endpointu DeepSeek. OpenRouter domyślnie używa https://openrouter.ai/api/v1; możesz to nadpisać przez OPENROUTER_BASE_URL. Kilo AI domyślnie używa https://api.kilo.ai/api/gateway; możesz to nadpisać przez KILO_BASE_URL. Eden AI domyślnie używa https://api.edenai.run/v3; możesz to nadpisać przez EDENAI_BASE_URL. Z.ai domyślnie używa https://api.z.ai/api/paas/v4; ustaw ZAI_BASE_URL=https://api.z.ai/api/coding/paas/v4 dla endpointu GLM Coding Plan. SGLang domyślnie używa http://localhost:30000/v1, gdy ustawiono SGLANG_API_KEY, ale wdrożenia bez klucza powinny jawnie ustawić SGLANG_BASE_URL, żeby zarejestrować providera. vLLM działa tak samo, z adresem http://localhost:8000/v1. LLAMACPP_BASE_URL dla llama.cpp jest zawsze wymagany (domyślny port llama-server koliduje z portem 8080 samego GoModel, więc nie ma wartości domyślnej); LLAMACPP_API_KEY jest opcjonalny. llm-d nie ma uniwersalnego endpointu, więc LLMD_BASE_URL jest zawsze wymagany; LLMD_API_KEY jest opcjonalny. Azure używa AZURE_BASE_URL jako bazowego URL-a deploymentu i akceptuje opcjonalne nadpisanie AZURE_API_VERSION; w przeciwnym razie domyślnie używa 2024-10-21. Oracle wymaga ORACLE_BASE_URL, bo jego endpoint kompatybilny z OpenAI zależy od regionu. Każdy typ providera akceptuje też rozdzieloną przecinkami listę skonfigurowanych modeli przez <PROVIDER>_MODELS, na przykład OPENROUTER_MODELS, ORACLE_MODELS, AZURE_MODELS, SGLANG_MODELS, VLLM_MODELS lub LLMD_MODELS. Domyślnie CONFIGURED_PROVIDER_MODELS_MODE=fallback używa skonfigurowanych list tylko wtedy, gdy upstreamowe /models zwraca błąd, nil lub pustą listę. Provider kompatybilny z OpenAI bez endpointu /models (404 lub 405) jest obsługiwany na podstawie skonfigurowanej listy i raportowany jako sprawny, co pasuje do serwerów z jednym API, takich jak speech-to-text. Ustaw CONFIGURED_PROVIDER_MODELS_MODE=allowlist, żeby udostępniać tylko skonfigurowane modele providerów, które definiują listę, i pomijać ich upstreamowe wywołania /models. W YAML providers.<name>.models dostarcza tę samą listę modeli dla nazwanych bloków providerów. GET /v1/models domyślnie zwraca identyfikatory z prefiksem providera (openai/gpt-5). Ustaw UNQUALIFIED_MODEL_IDS_AT_MODELS_ENDPOINT=true (YAML: models.unqualified_model_ids_at_models_endpoint), żeby zwracać same identyfikatory modeli (gpt-5) – dla klientów, które sprawdzają żądany model względem listy i znają tylko zwykłe nazwy. Zastrzeżenie: gdy dwóch providerów udostępnia ten sam identyfikator modelu, na liście pojawia się tylko provider, do którego trafia request bez prefiksu (pierwszy zarejestrowany). Przypnij nazwę do konkretnego providera za pomocą modelu wirtualnego, na przykład source: gpt-5 z target: azure/gpt-5. Każdy model providera jest domyślnie dostępny. Ustaw MODELS_ENABLED_BY_DEFAULT=false (YAML: models.enabled_by_default), żeby wymagać jawnego wpisu zezwalającego w modelach wirtualnych: requesty o inne modele kończą się wtedy błędem 400 model_access_denied, a modele nie pojawiają się w GET /v1/models. Żeby ukryć modele providerów w GET /v1/models, zachowując możliwość routowania do nich, ustaw KEEP_ONLY_ALIASES_AT_MODELS_ENDPOINT=true (YAML: models.keep_only_aliases_at_models_endpoint); endpoint zwraca wtedy tylko włączone przekierowania modeli wirtualnych. Żeby zawęzić inwentarz providera bez wypisywania modeli jeden po drugim, użyj <PROVIDER>_MODEL_FILTER_INCLUDE, <PROVIDER>_MODEL_FILTER_EXCLUDE i <PROVIDER>_MODEL_FILTER_MAX_PRICE_PER_MTOK (YAML: providers.<name>.model_filter). Zobacz Filtrowanie modeli providera. Dla OpenRoutera GoModel wysyła też domyślne nagłówki atrybucji, chyba że request już je ustawia. Nadpisz te wartości domyślne przez OPENROUTER_SITE_URL i OPENROUTER_APP_NAME.

2. Plik .env

GoModel przy starcie automatycznie wczytuje plik .env z katalogu roboczego. To wygodne przy lokalnym developmencie.
Skopiuj .env.template do .env i odkomentuj potrzebne wartości:
Prawdziwe zmienne środowiskowe zawsze nadpisują wartości z pliku .env. Plik .env jest wczytywany tylko wtedy, gdy istnieje – jego brak nie jest błędem.

3. Plik konfiguracyjny (YAML)

Przy bardziej złożonych konfiguracjach możesz użyć opcjonalnego pliku konfiguracyjnego YAML. GoModel szuka go w dwóch lokalizacjach (w tej kolejności):
  1. config/config.yaml
  2. config.yaml
Jeśli zastanawiasz się, czy w ogóle potrzebujesz YAML, zajrzyj do config.yaml. Na początek skopiuj przykład:
Następnie odkomentuj i zmień ustawienia, które chcesz zmodyfikować:
Plik YAML obsługuje rozwijanie zmiennych środowiskowych za pomocą składni ${VAR} i ${VAR:-default}:
Żeby odczytać wartość z zamontowanego pliku albo przerwać start, gdy zmienna nie jest ustawiona, użyj referencji do sekretu: ${file:/run/secrets/openai} lub ${env:OPENAI_API_KEY}.
Plik YAML jest całkowicie opcjonalny. Każde ustawienie, które możesz umieścić w YAML, możesz też ustawić przez zmienne środowiskowe. Używaj YAML, gdy potrzebujesz nadpisań odporności na awarie per provider, generowane nazwy providerów nie wystarczają albo wolisz ustrukturyzowany plik konfiguracyjny.

Konfiguracja providerów

Automatyczne wykrywanie ze zmiennych środowiskowych

Najprostszy sposób dodawania providerów. GoModel sprawdza dobrze znane zmienne środowiskowe z kluczami API i automatycznie rejestruje providerów:
Zmienne <PROVIDER>_* bez sufiksu mają pierwszeństwo przed providerem z config.yaml nazwanym tak jak typ (openai). Provider, któremu zmieniłeś nazwę (alpha: {type: openai}), przejmuje tylko te pola, które zostawił puste; jego jawne api_key lub base_url zostaje zachowane, a zignorowane zmienne są logowane jako ostrzeżenie przy starcie. Gdy kilku providerów o zmienionych nazwach ma ten sam typ, zmienne bez sufiksu są ignorowane z tym samym ostrzeżeniem. Używaj zmiennych z sufiksem, żeby zarejestrować więcej niż jedną instancję tego samego typu providera bez YAML. GoModel zamienia sufiks na małe litery i zamienia podkreślniki na myślniki w nazwie skonfigurowanego providera:
Ten sam wzorzec działa dla każdego zarejestrowanego typu providera: <PROVIDER>_<SUFFIX>_API_KEY, <PROVIDER>_<SUFFIX>_BASE_URL i <PROVIDER>_<SUFFIX>_MODELS. Azure obsługuje też <PROVIDER>_<SUFFIX>_API_VERSION. Azure i Oracle nadal wymagają wartości BASE_URL z sufiksem, bo ich endpointy zależą od deploymentu lub regionu. Google Vertex AI używa prefiksu VERTEX_* i stosuje tę samą regułę zamiany sufiksu na nazwę co pozostali providerzy:

Bloki providerów w YAML

Gdy potrzebujesz większej kontroli (własne nazwy, odporność na awarie per provider lub większe ustrukturyzowane ustawienia), użyj pliku YAML:
models: działa w każdym bloku providera. W trybie fallback to zabezpieczenie na wypadek, gdy upstreamowe /models jest niedostępne lub puste. W trybie allowlist staje się udostępnianym inwentarzem tego providera i pomija upstreamowe /models. Wymaganą politykę OCI i przetestowaną konfigurację dla Oracle GenAI znajdziesz w przewodniku po Oracle GenAI.

Ollama (modele lokalne)

Ollama nie wymaga klucza API. Ustaw bazowy URL, żeby ją włączyć:
Albo w YAML:

vLLM

vLLM korzysta ze swojego API /v1 kompatybilnego z OpenAI. W Dockerze ustaw VLLM_BASE_URL, żeby zarejestrować serwer vLLM bez klucza:
Jeśli serwer upstreamowy został uruchomiony przez vllm serve ... --api-key token-abc123, ustaw również:
Możesz też zarejestrować więcej niż jedną instancję vLLM bez YAML:
To rejestruje providerów vllm i vllm-test. Używaj YAML tylko wtedy, gdy generowane nazwy providerów nie wystarczają lub potrzebujesz większego, ustrukturyzowanego bloku.

Uwagi o zachowaniu providerów

Domyślne max_tokens dla Anthropic

Anthropic wymaga max_tokens w każdym requeście /v1/messages. Jeśli klient go pominie, GoModel wstawia wartość zastępczą, żeby request mimo to się powiódł. OpenAI i Gemini traktują to pole jako opcjonalne i GoModel nie wstawia dla nich wartości domyślnej. Zwiększ ją dla nowszych modeli, które rutynowo generują dłuższe odpowiedzi (Sonnet 4.6, Opus 4.7). Jawne ustawienie max_tokens w requeście zawsze ma pierwszeństwo przed wartością domyślną ze zmiennej środowiskowej. Nieprawidłowe lub niedodatnie wartości powodują powrót do 4096.
Ostatnia modyfikacja 24 października 2026