Gateway
Uzupełnienia czatu OpenAI
Gateway OpenClaw może udostępniać mały punkt końcowy Chat Completions zgodny z OpenAI.
Ten punkt końcowy jest domyślnie wyłączony. Najpierw włącz go w konfiguracji.
POST /v1/chat/completions- Ten sam port co Gateway (multipleks WS + HTTP):
http://<gateway-host>:<port>/v1/chat/completions
Gdy zgodna z OpenAI powierzchnia HTTP Gateway jest włączona, udostępnia też:
GET /v1/modelsGET /v1/models/{id}POST /v1/embeddingsPOST /v1/responses
Pod spodem żądania są wykonywane jako zwykłe uruchomienie agenta Gateway (ta sama ścieżka kodu co openclaw agent), więc routing/uprawnienia/konfiguracja odpowiadają Twojemu Gateway.
Uwierzytelnianie
Używa konfiguracji uwierzytelniania Gateway.
Typowe ścieżki uwierzytelniania HTTP:
- uwierzytelnianie współdzielonym sekretem (
gateway.auth.mode="token"albo"password"):Authorization: Bearer <token-or-password> - zaufane uwierzytelnianie HTTP przenoszące tożsamość (
gateway.auth.mode="trusted-proxy"): kieruj przez skonfigurowany proxy świadomy tożsamości i pozwól mu wstrzyknąć wymagane nagłówki tożsamości - otwarte uwierzytelnianie dla prywatnego wejścia (
gateway.auth.mode="none"): nagłówek uwierzytelniania nie jest wymagany
Uwagi:
- Gdy
gateway.auth.mode="token", użyjgateway.auth.token(alboOPENCLAW_GATEWAY_TOKEN). - Gdy
gateway.auth.mode="password", użyjgateway.auth.password(alboOPENCLAW_GATEWAY_PASSWORD). - Gdy
gateway.auth.mode="trusted-proxy", żądanie HTTP musi pochodzić ze skonfigurowanego zaufanego źródła proxy; proxy loopback na tym samym hoście wymagają jawnegogateway.auth.trustedProxy.allowLoopback = true. - Jeśli
gateway.auth.rateLimitjest skonfigurowany i wystąpi zbyt wiele nieudanych prób uwierzytelnienia, punkt końcowy zwraca429zRetry-After.
Granica bezpieczeństwa (ważne)
Traktuj ten punkt końcowy jako powierzchnię z pełnym dostępem operatora dla instancji Gateway.
- Uwierzytelnianie HTTP bearer tutaj nie jest wąskim modelem zakresu per użytkownik.
- Prawidłowy token/hasło Gateway dla tego punktu końcowego należy traktować jak poświadczenie właściciela/operatora.
- Żądania przechodzą przez tę samą ścieżkę agenta płaszczyzny sterowania co zaufane działania operatora.
- Na tym punkcie końcowym nie ma osobnej granicy narzędzi dla nie-właściciela/per użytkownik; gdy wywołujący przejdzie tutaj uwierzytelnianie Gateway, OpenClaw traktuje go jako zaufanego operatora tego Gateway.
- W trybach uwierzytelniania współdzielonym sekretem (
tokenipassword) punkt końcowy przywraca normalne pełne domyślne uprawnienia operatora, nawet jeśli wywołujący wyśle węższy nagłówekx-openclaw-scopes. - Zaufane tryby HTTP przenoszące tożsamość (na przykład uwierzytelnianie przez zaufany proxy albo
gateway.auth.mode="none") respektująx-openclaw-scopes, gdy jest obecny, a w przeciwnym razie wracają do normalnego domyślnego zestawu zakresów operatora. - Jeśli polityka agenta docelowego dopuszcza narzędzia wrażliwe, ten punkt końcowy może ich używać.
- Utrzymuj ten punkt końcowy wyłącznie na loopback/tailnet/prywatnym wejściu; nie wystawiaj go bezpośrednio do publicznego internetu.
Macierz uwierzytelniania:
gateway.auth.mode="token"albo"password"+Authorization: Bearer ...- dowodzi posiadania współdzielonego sekretu operatora Gateway
- ignoruje węższe
x-openclaw-scopes - przywraca pełny domyślny zestaw zakresów operatora:
operator.admin,operator.approvals,operator.pairing,operator.read,operator.talk.secrets,operator.write - traktuje tury czatu na tym punkcie końcowym jako tury wysyłane przez właściciela
- zaufane tryby HTTP przenoszące tożsamość (na przykład uwierzytelnianie przez zaufany proxy albo
gateway.auth.mode="none"na prywatnym wejściu)- uwierzytelniają jakąś zewnętrzną zaufaną tożsamość lub granicę wdrożenia
- respektują
x-openclaw-scopes, gdy nagłówek jest obecny - wracają do normalnego domyślnego zestawu zakresów operatora, gdy nagłówka nie ma
- tracą semantykę właściciela tylko wtedy, gdy wywołujący jawnie zawęża zakresy i pomija
operator.admin
Zobacz Bezpieczeństwo i Dostęp zdalny.
Kontrakt modelu z agentem na pierwszym miejscu
OpenClaw traktuje pole OpenAI model jako cel agenta, a nie surowy identyfikator modelu providera.
model: "openclaw"kieruje do skonfigurowanego domyślnego agenta.model: "openclaw/default"także kieruje do skonfigurowanego domyślnego agenta.model: "openclaw/<agentId>"kieruje do konkretnego agenta.
Opcjonalne nagłówki żądania:
x-openclaw-model: <provider/model-or-bare-id>nadpisuje model backendu dla wybranego agenta.x-openclaw-agent-id: <agentId>pozostaje obsługiwane jako nadpisanie kompatybilności.x-openclaw-session-key: <sessionKey>w pełni kontroluje routing sesji.x-openclaw-message-channel: <channel>ustawia syntetyczny kontekst kanału wejściowego dla promptów i polityk świadomych kanału.
Nadal akceptowane aliasy zgodności:
model: "openclaw:<agentId>"model: "agent:<agentId>"
Włączanie punktu końcowego
Ustaw gateway.http.endpoints.chatCompletions.enabled na true:
{ gateway: { http: { endpoints: { chatCompletions: { enabled: true }, }, }, },}Wyłączanie punktu końcowego
Ustaw gateway.http.endpoints.chatCompletions.enabled na false:
{ gateway: { http: { endpoints: { chatCompletions: { enabled: false }, }, }, },}Zachowanie sesji
Domyślnie punkt końcowy jest bezstanowy dla każdego żądania (przy każdym wywołaniu generowany jest nowy klucz sesji).
Jeśli żądanie zawiera ciąg OpenAI user, Gateway wyprowadza z niego stabilny klucz sesji, dzięki czemu powtarzane wywołania mogą współdzielić sesję agenta.
Dlaczego ta powierzchnia ma znaczenie
To zestaw zgodności o najwyższej wartości dla samodzielnie hostowanych frontendów i narzędzi:
- Większość konfiguracji Open WebUI, LobeChat i LibreChat oczekuje
/v1/models. - Wiele systemów RAG oczekuje
/v1/embeddings. - Istniejące klienty czatu OpenAI mogą zwykle zacząć od
/v1/chat/completions. - Klienty bardziej natywne dla agentów coraz częściej preferują
/v1/responses.
Lista modeli i routing agentów
What does `/v1/models` return?
Listę celów agentów OpenClaw.
Zwrócone identyfikatory to wpisy openclaw, openclaw/default i openclaw/<agentId>.
Używaj ich bezpośrednio jako wartości OpenAI model.
Does `/v1/models` list agents or sub-agents?
Wyświetla cele agentów najwyższego poziomu, nie modele backendowych providerów ani podagentów.
Podagenci pozostają wewnętrzną topologią wykonania. Nie pojawiają się jako pseudomodele.
Why is `openclaw/default` included?
openclaw/default jest stabilnym aliasem dla skonfigurowanego domyślnego agenta.
Oznacza to, że klienci mogą nadal używać jednego przewidywalnego identyfikatora, nawet jeśli rzeczywisty identyfikator domyślnego agenta różni się między środowiskami.
How do I override the backend model?
Użyj x-openclaw-model.
Przykłady:
x-openclaw-model: openai/gpt-5.4
x-openclaw-model: gpt-5.5
Jeśli go pominiesz, wybrany agent działa ze swoim normalnie skonfigurowanym wyborem modelu.
How do embeddings fit this contract?
/v1/embeddings używa tych samych identyfikatorów model celów agentów.
Użyj model: "openclaw/default" albo model: "openclaw/<agentId>".
Gdy potrzebujesz konkretnego modelu embeddingów, wyślij go w x-openclaw-model.
Bez tego nagłówka żądanie przechodzi do normalnej konfiguracji embeddingów wybranego agenta.
Streaming (SSE)
Ustaw stream: true, aby odbierać Server-Sent Events (SSE):
Content-Type: text/event-stream- Każda linia zdarzenia ma postać
data: <json> - Strumień kończy się
data: [DONE]
Kontrakt narzędzi czatu
/v1/chat/completions obsługuje podzbiór narzędzi funkcyjnych zgodny z popularnymi klientami OpenAI Chat.
Obsługiwane pola żądania
tools: tablica{ "type": "function", "function": { ... } }tool_choice:"auto","none"messages[*].role: "tool"kolejne turymessages[*].tool_call_iddo wiązania wyników narzędzi z wcześniejszym wywołaniem narzędziamax_completion_tokens: liczba; limit na wywołanie dla łącznych tokenów ukończenia (w tym tokenów rozumowania). Obecna nazwa pola OpenAI Chat Completions; preferowana, gdy wysłane są zarównomax_completion_tokens, jak imax_tokens.max_tokens: liczba; starszy alias akceptowany dla zgodności wstecznej. Ignorowany, gdy obecne jest równieżmax_completion_tokens.
Gdy ustawione jest którekolwiek z tych pól, wartość jest przekazywana do providera upstream przez kanał parametrów strumienia agenta. Rzeczywista nazwa pola wysłana przewodowo do providera upstream jest wybierana przez transport providera: max_completion_tokens dla punktów końcowych rodziny OpenAI oraz max_tokens dla providerów, którzy akceptują tylko starszą nazwę (takich jak Mistral i Chutes).
Nieobsługiwane warianty
Punkt końcowy zwraca 400 invalid_request_error dla nieobsługiwanych wariantów narzędzi, w tym:
toolsniebędące tablicą- wpisy narzędzi niebędące funkcją
- brakujące
tool.function.name - warianty
tool_choice, takie jakallowed_toolsicustom tool_choice: "required"(nieegzekwowane jeszcze w czasie wykonywania; będzie obsługiwane po wdrożeniu twardego wymuszania)tool_choice: { "type": "function", "function": { "name": "..." } }(to samo uzasadnienie co przyrequired)- wartości
tool_choice.function.name, które nie pasują do podanychtools
Kształt odpowiedzi narzędzi bez streamingu
Gdy agent zdecyduje się wywołać narzędzia, odpowiedź używa:
choices[0].finish_reason = "tool_calls"- wpisów
choices[0].message.tool_calls[]z:idtype: "function"function.namefunction.arguments(ciąg JSON)
Komentarz asystenta przed wywołaniem narzędzia jest zwracany w choices[0].message.content (może być pusty).
Kształt odpowiedzi narzędzi ze streamingiem
Gdy stream: true, wywołania narzędzi są emitowane jako przyrostowe fragmenty SSE:
- początkowa delta roli asystenta
- opcjonalne delty komentarza asystenta
- jeden lub więcej fragmentów
delta.tool_callsprzenoszących tożsamość narzędzia i fragmenty argumentów - końcowy fragment z
finish_reason: "tool_calls" data: [DONE]
Jeśli stream_options.include_usage=true, końcowy fragment użycia jest emitowany przed [DONE].
Pętla kontynuacji narzędzi
Po otrzymaniu tool_calls klient powinien wykonać żądane funkcje i wysłać żądanie kontynuacji zawierające:
- wcześniejszą wiadomość asystenta z wywołaniem narzędzia
- jedną lub więcej wiadomości
role: "tool"z pasującymtool_call_id
Pozwala to uruchomieniu agenta Gateway kontynuować tę samą pętlę rozumowania i wygenerować końcową odpowiedź asystenta.
Szybka konfiguracja Open WebUI
Dla podstawowego połączenia Open WebUI:
- Bazowy URL:
http://127.0.0.1:18789/v1 - Bazowy URL Dockera na macOS:
http://host.docker.internal:18789/v1 - Klucz API: Twój token bearer Gateway
- Model:
openclaw/default
Oczekiwane zachowanie:
GET /v1/modelspowinno wyświetlićopenclaw/default- Open WebUI powinien używać
openclaw/defaultjako identyfikatora modelu czatu - Jeśli chcesz określonego providera/modelu backendu dla tego agenta, ustaw normalny domyślny model agenta albo wyślij
x-openclaw-model
Szybki smoke test:
curl -sS http://127.0.0.1:18789/v1/models \ -H 'Authorization: Bearer YOUR_TOKEN'Jeśli zwróci openclaw/default, większość konfiguracji Open WebUI może połączyć się z tym samym bazowym URL i tokenem.
Przykłady
Bez streamingu:
curl -sS http://127.0.0.1:18789/v1/chat/completions \ -H 'Authorization: Bearer YOUR_TOKEN' \ -H 'Content-Type: application/json' \ -d '{ "model": "openclaw/default", "messages": [{"role":"user","content":"hi"}] }'Streaming:
curl -N http://127.0.0.1:18789/v1/chat/completions \ -H 'Authorization: Bearer YOUR_TOKEN' \ -H 'Content-Type: application/json' \ -H 'x-openclaw-model: openai/gpt-5.4' \ -d '{ "model": "openclaw/research", "stream": true, "messages": [{"role":"user","content":"hi"}] }'Lista modeli:
curl -sS http://127.0.0.1:18789/v1/models \ -H 'Authorization: Bearer YOUR_TOKEN'Pobierz jeden model:
curl -sS http://127.0.0.1:18789/v1/models/openclaw%2Fdefault \ -H 'Authorization: Bearer YOUR_TOKEN'Utwórz embeddingi:
curl -sS http://127.0.0.1:18789/v1/embeddings \ -H 'Authorization: Bearer YOUR_TOKEN' \ -H 'Content-Type: application/json' \ -H 'x-openclaw-model: openai/text-embedding-3-small' \ -d '{ "model": "openclaw/default", "input": ["alpha", "beta"] }'Uwagi:
/v1/modelszwraca cele agentów OpenClaw, a nie surowe katalogi dostawców.openclaw/defaultjest zawsze obecny, więc jeden stabilny identyfikator działa w różnych środowiskach.- Nadpisania dostawcy/modelu backendu należy umieszczać w
x-openclaw-model, a nie w polu OpenAImodel. /v1/embeddingsobsługujeinputjako ciąg znaków lub tablicę ciągów znaków.