Gateway
Uzupełnienia czatu OpenAI
Gateway może udostępniać niewielki interfejs Chat Completions zgodny z OpenAI. Jest on domyślnie wyłączony.
Po włączeniu udostępnia wszystkie poniższe punkty końcowe na tym samym porcie co Gateway (multipleksowanie WS + HTTP):
| Metoda | Ścieżka |
|---|---|
| POST | /v1/chat/completions |
| GET | /v1/models |
| GET | /v1/models/{id} |
| POST | /v1/embeddings |
| POST | /v1/responses |
Żądania są wykonywane jako zwykłe uruchomienia agenta Gateway (tą samą ścieżką kodu co openclaw agent), dlatego routing, uprawnienia i konfiguracja odpowiadają ustawieniom Gateway.
Włączanie punktu końcowego
{ gateway: { http: { endpoints: { chatCompletions: { enabled: true }, }, }, },}Aby wyłączyć, ustaw enabled: false (lub pomiń tę opcję).
Granica bezpieczeństwa (ważne)
Traktuj ten punkt końcowy jako zapewniający pełny dostęp operatora do instancji Gateway:
- Prawidłowy token lub hasło Gateway dla tego punktu końcowego jest równoważne poświadczeniu właściciela/operatora, a nie wąskiemu zakresowi przypisanemu do użytkownika.
- Żądania przechodzą tą samą ścieżką agenta warstwy sterowania co zaufane działania operatora, więc jeśli zasady agenta docelowego zezwalają na użycie wrażliwych narzędzi, ten punkt końcowy również może z nich korzystać.
- Udostępniaj go wyłącznie przez local loopback, tailnet lub prywatny punkt wejścia. Nie udostępniaj go w publicznym Internecie.
Macierz uwierzytelniania:
| Ścieżka uwierzytelniania | Zachowanie |
|---|---|
gateway.auth.mode="token" lub "password" + Authorization: Bearer ... |
Potwierdza posiadanie współdzielonego sekretu Gateway. Ignoruje każdy nagłówek x-openclaw-scopes i 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 jako tury nadawcy będącego właścicielem. |
Zaufane żądanie HTTP z tożsamością (uwierzytelnianie przez zaufane proxy lub gateway.auth.mode="none" w prywatnym punkcie wejścia) |
Uwzględnia x-openclaw-scopes, jeśli jest obecny; w przeciwnym razie używa domyślnego zestawu zakresów operatora. Traci semantykę właściciela tylko wtedy, gdy wywołujący jawnie zawęzi zakresy i pominie operator.admin. Wymaga operator.admin do mechanizmów sterowania na poziomie właściciela, takich jak x-openclaw-model. |
Zobacz Zakresy operatora, Bezpieczeństwo i Dostęp zdalny.
Uwierzytelnianie
Używa konfiguracji uwierzytelniania Gateway (szczegóły tego trybu znajdziesz w sekcji Uwierzytelnianie przez zaufane proxy):
| Tryb | Sposób uwierzytelniania |
|---|---|
gateway.auth.mode="token" |
Authorization: Bearer <token>. Ustawiane przez gateway.auth.token lub OPENCLAW_GATEWAY_TOKEN. |
gateway.auth.mode="password" |
Authorization: Bearer <password>. Ustawiane przez gateway.auth.password lub OPENCLAW_GATEWAY_PASSWORD. |
gateway.auth.mode="trusted-proxy" |
Kieruj ruch przez skonfigurowane proxy uwzględniające tożsamość, które wstrzykuje wymagane nagłówki tożsamości. Proxy local loopback na tym samym hoście wymaga jawnego ustawienia gateway.auth.trustedProxy.allowLoopback = true. |
gateway.auth.mode="none" |
Nagłówek uwierzytelniania nie jest wymagany (wyłącznie prywatny punkt wejścia). |
Uwagi:
- Wywołujący z tego samego hosta, którzy omijają proxy w Gateway działającym w trybie
trusted-proxy, mogą użyć bezpośredniogateway.auth.password/OPENCLAW_GATEWAY_PASSWORD. Obecność w nagłówkach jakichkolwiek danychForwarded,X-Forwarded-*lubX-Real-IPpowoduje jednak, że żądanie pozostaje na ścieżce zaufanego proxy. - Jeśli skonfigurowano
gateway.auth.rateLimiti zbyt wiele prób uwierzytelnienia zakończy się niepowodzeniem, punkt końcowy zwraca429z nagłówkiemRetry-After.
Kiedy używać tego punktu końcowego
- Preferuj go zamiast dodawania nowego wbudowanego kanału, jeśli integracja jest tylko kolejnym interfejsem operatora/klienta dla tego samego Gateway.
- W przypadku natywnych klientów mobilnych łączących się bezpośrednio ze zdalnym Gateway preferuj WebChat lub protokół Gateway z przepływem inicjalizacji sparowanego urządzenia i tokenu urządzenia, aby urządzenie nie potrzebowało współdzielonego tokenu ani hasła HTTP.
- Zamiast tego utwórz Plugin kanału, jeśli integrujesz zewnętrzną sieć komunikacyjną mającą własnych użytkowników, pokoje, dostarczanie przez Webhook lub transport wychodzący. Zobacz Tworzenie pluginów.
Kontrakt modelu zorientowany na agenta
OpenClaw traktuje pole OpenAI model jako cel agenta, a nie surowy identyfikator modelu dostawcy.
Wartość model |
Kieruje do |
|---|---|
openclaw |
Skonfigurowanego domyślnego agenta |
openclaw/default |
Skonfigurowanego domyślnego agenta (stabilny alias; można go bezpiecznie zapisać na stałe, nawet jeśli rzeczywisty identyfikator domyślnego agenta różni się między środowiskami) |
openclaw/<agentId> lub openclaw:<agentId> |
Określonego agenta |
agent:<agentId> |
Określonego agenta (alias zgodności) |
Opcjonalne nagłówki żądania:
| Nagłówek | Działanie |
|---|---|
x-openclaw-model: <provider/model-or-bare-id> |
Zastępuje model zaplecza wybranego agenta. Wywołujący używający współdzielonego sekretu typu bearer mogą korzystać z tego bezpośrednio; wywołujący z tożsamością (trusted-proxy lub prywatny punkt wejścia bez uwierzytelniania z x-openclaw-scopes) potrzebują operator.admin, w przeciwnym razie otrzymają 403 missing scope: operator.admin. |
x-openclaw-agent-id: <agentId> |
Zastąpienie wyboru agenta na potrzeby zgodności. |
x-openclaw-session-key: <sessionKey> |
Jawny routing sesji. Odrzucany z błędem 400 invalid_request_error, jeśli używa zarezerwowanej wewnętrznej przestrzeni nazw (subagent:, cron:, acp:). |
x-openclaw-message-channel: <channel> |
Ustawia syntetyczny kontekst kanału punktu wejścia dla monitów i zasad uwzględniających kanał. |
/v1/models wyświetla cele agentów najwyższego poziomu (openclaw, openclaw/default, openclaw/<agentId>), a nie modele dostawców zaplecza ani podagentów; podagenci pozostają wewnętrzną topologią wykonywania. Jeśli pominiesz x-openclaw-model, wybrany agent będzie działać ze swoim zwykłym skonfigurowanym modelem.
/v1/embeddings używa tych samych identyfikatorów model wskazujących cele agentów. Wyślij x-openclaw-model (jako wywołujący używający współdzielonego sekretu lub wywołujący z tożsamością i zakresem operator.admin), aby wybrać określony model osadzania; w przeciwnym razie żądanie użyje zwykłej konfiguracji osadzania wybranego agenta.
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 kolejne wywołania mogą współdzielić sesję agenta. W aplikacjach niestandardowych używaj ponownie tej samej wartości user w ramach jednego wątku konwersacji; unikaj identyfikatorów na poziomie konta, chyba że chcesz, aby wiele konwersacji lub urządzeń współdzieliło jedną sesję OpenClaw. Używaj x-openclaw-session-key tylko wtedy, gdy potrzebujesz jawnej kontroli routingu między wieloma klientami lub wątkami, korzystając z kluczy należących do aplikacji i unikających wymienionych powyżej zarezerwowanych przestrzeni nazw.
Limity żądań (konfiguracja)
Wartości domyślne można dostosować w gateway.http.endpoints.chatCompletions:
{ gateway: { http: { endpoints: { chatCompletions: { enabled: true, maxBodyBytes: 20000000, maxImageParts: 8, maxTotalImageBytes: 20000000, images: { allowUrl: false, urlAllowlist: ["cdn.example.com", "*.assets.example.com"], allowedMimes: [ "image/jpeg", "image/png", "image/gif", "image/webp", "image/heic", "image/heif", ], maxBytes: 10485760, maxRedirects: 3, timeoutMs: 10000, }, }, }, }, },}Wartości domyślne w przypadku pominięcia:
| Klucz | Wartość domyślna |
|---|---|
maxBodyBytes |
20 MB |
maxImageParts |
8 (maksymalna liczba części image_url odczytywanych z najnowszej wiadomości użytkownika) |
maxTotalImageBytes |
20 MB (łączna liczba zdekodowanych bajtów ze wszystkich części image_url w jednym żądaniu) |
images.allowUrl |
false (części image_url pochodzące z adresu URL są odrzucane, jeśli ta opcja nie jest włączona) |
images.maxBytes |
10 MB na obraz |
images.maxRedirects |
3 |
images.timeoutMs |
10 s |
Źródła image_url w formacie HEIC/HEIF są akceptowane i normalizowane do JPEG przed przekazaniem dostawcy przez współdzielony procesor obrazów OpenClaw (Rastermill), który w przypadku formatów wymagających obsługi zewnętrznego kodeka korzysta awaryjnie z konwertera systemowego (sips, ImageMagick, GraphicsMagick lub ffmpeg).
Uwaga dotycząca bezpieczeństwa: dodanie nazwy hosta do listy dozwolonych nie omija blokowania prywatnych/wewnętrznych adresów IP. W przypadku Gateway wystawionych na internet oprócz zabezpieczeń na poziomie aplikacji zastosuj kontrolę wychodzącego ruchu sieciowego. Zobacz Bezpieczeństwo.
Kontrakt narzędzi czatu
/v1/chat/completions obsługuje podzbiór narzędzi funkcyjnych zgodny z popularnymi klientami OpenAI Chat.
Obsługiwane pola żądania
| Pole | Uwagi |
|---|---|
tools |
Tablica elementów { "type": "function", "function": { ... } } |
tool_choice |
"auto", "none", "required" lub { "type": "function", "function": { "name": "..." } } |
messages[*].role: "tool" |
Kolejne tury |
messages[*].tool_call_id |
Wiąże wynik narzędzia z wcześniejszym wywołaniem narzędzia |
max_completion_tokens |
Liczba; limit łącznej liczby tokenów ukończenia na wywołanie (w tym tokenów rozumowania). Obecna nazwa pola; używana, gdy przesłano zarówno to pole, jak i max_tokens. |
max_tokens |
Liczba; starszy alias, ignorowany, gdy obecne jest również max_completion_tokens. |
temperature |
Liczba 0–2; obsługa w miarę możliwości, przekazywana do dostawcy nadrzędnego. 400 invalid_request_error, jeśli wartość jest poza zakresem. |
top_p |
Liczba 0–1; obsługa w miarę możliwości. 400 invalid_request_error, jeśli wartość jest poza zakresem. |
frequency_penalty |
Liczba od -2.0 do 2.0; obsługa w miarę możliwości. 400 invalid_request_error, jeśli wartość jest poza zakresem. |
presence_penalty |
Liczba od -2.0 do 2.0; obsługa w miarę możliwości. 400 invalid_request_error, jeśli wartość jest poza zakresem. |
seed |
Liczba całkowita; obsługa w miarę możliwości. 400 invalid_request_error dla wartości niebędących liczbami całkowitymi. |
stop |
Ciąg znaków lub tablica maksymalnie 4 ciągów; obsługa w miarę możliwości. 400 invalid_request_error dla ponad 4 sekwencji albo elementów niebędących ciągami lub pustych. |
Wszystkie pola próbkowania i limitów tokenów korzystają z tego samego kanału parametrów strumienia agenta i są przekazywane w miarę możliwości:
- Limit tokenów: nazwę pola przesyłanego protokołem wybiera warstwa transportowa dostawcy:
max_completion_tokensdla punktów końcowych z rodziny OpenAI, amax_tokensdla dostawców akceptujących wyłącznie starszą nazwę (Mistral, Chutes). stopjest mapowane na pole zatrzymania warstwy transportowej:stopdla backendów Chat Completions,stop_sequencesdla Anthropic. Interfejs OpenAI Responses API nie ma parametru zatrzymania, więcstopnie jest stosowane w modelach opartych na Responses.- Backend Codex Responses oparty na ChatGPT używa stałego próbkowania po stronie serwera i usuwa
temperature/top_p(wraz zmax_output_tokens,metadata,prompt_cache_retention,service_tier), zanim żądanie dotrze do tego backendu.
Nieobsługiwane warianty
Zwraca 400 invalid_request_error w przypadku:
tools, które nie jest tablicą, elementów narzędzi niebędących funkcjami lub brakutool.function.name- wariantów
tool_choice, takich jakallowed_toolsicustom - wartości
tool_choice.function.name, które nie odpowiadają żadnemu dostarczonemu narzędziu
W przypadku tool_choice: "required" i tool_choice przypiętego do funkcji punkt końcowy zawęża udostępniony zestaw narzędzi funkcyjnych klienta, nakazuje środowisku wykonawczemu wywołać narzędzie klienta przed udzieleniem odpowiedzi i zgłasza błąd, jeśli odpowiedź agenta nie zawiera pasującego ustrukturyzowanego wywołania narzędzia klienta. Dotyczy to dostarczonej przez wywołującego listy HTTP tools, a nie wszystkich wewnętrznych narzędzi agenta OpenClaw.
Format odpowiedzi narzędzia bez strumieniowania
Gdy agent wywołuje narzędzia, odpowiedź zawiera:
choices[0].finish_reason = "tool_calls"- elementy
choices[0].message.tool_calls[]z polamiid,type: "function",function.name,function.arguments(ciąg JSON) - Komentarz asystenta przed wywołaniem narzędzia w
choices[0].message.content(może być pusty)
Format strumieniowej odpowiedzi narzędzia
Gdy stream: true, wywołania narzędzi napływają jako przyrostowe fragmenty SSE: początkowa różnica z rolą asystenta, opcjonalne różnice komentarza asystenta, co najmniej jeden fragment delta.tool_calls zawierający identyfikację narzędzia i fragmenty argumentów, a następnie końcowy fragment z finish_reason: "tool_calls" i data: [DONE].
Jeśli stream_options.include_usage=true, przed [DONE] emitowany jest końcowy fragment ze statystykami użycia.
Pętla kontynuacji po wywołaniu narzędzia
Po otrzymaniu tool_calls wykonaj żądane funkcje i wyślij kolejne żądanie zawierające wcześniejszą wiadomość asystenta z wywołaniem narzędzia oraz co najmniej jedną wiadomość role: "tool" z pasującym tool_call_id. Kontynuuje to tę samą pętlę rozumowania agenta w celu utworzenia odpowiedzi końcowej.
Strumieniowanie (SSE)
Ustaw stream: true, aby otrzymywać zdarzenia wysyłane przez serwer:
Content-Type: text/event-stream- Każdy wiersz zdarzenia ma postać
data: <json> - Strumień kończy się wpisem
data: [DONE]
Szybka konfiguracja Open WebUI
- Bazowy adres URL:
http://127.0.0.1:18789/v1 - Bazowy adres URL Dockera w systemie macOS:
http://host.docker.internal:18789/v1 - Klucz API: token okaziciela Gateway
- Model:
openclaw/default
Oczekiwane działanie: GET /v1/models wyświetla openclaw/default, a Open WebUI używa go jako identyfikatora modelu czatu. Aby użyć konkretnego dostawcy/modelu backendu, ustaw zwykły domyślny model agenta albo wyślij x-openclaw-model (wywołujący ze współdzielonym sekretem lub wywołujący z tożsamością i uprawnieniem operator.admin).
Szybki test podstawowy:
curl -sS http://127.0.0.1:18789/v1/models \ -H 'Authorization: Bearer YOUR_TOKEN'Jeśli odpowiedź zawiera openclaw/default, większość konfiguracji Open WebUI może połączyć się przy użyciu tego samego bazowego adresu URL i tokenu.
Przykłady
Stabilna sesja dla jednej konwersacji aplikacji:
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", "user": "conv:YOUR_CONVERSATION_ID", "messages": [{"role":"user","content":"Summarize my tasks for today"}] }'W kolejnych wywołaniach dla tej konwersacji używaj ponownie tej samej wartości user, aby kontynuować tę samą sesję agenta.
Bez strumieniowania:
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"}] }'Strumieniowanie:
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"}] }'Wyświetlenie listy modeli:
curl -sS http://127.0.0.1:18789/v1/models \ -H 'Authorization: Bearer YOUR_TOKEN'Pobranie jednego modelu:
curl -sS http://127.0.0.1:18789/v1/models/openclaw%2Fdefault \ -H 'Authorization: Bearer YOUR_TOKEN'Utworzenie reprezentacji wektorowych:
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"] }'/v1/embeddings obsługuje input jako ciąg znaków lub tablicę ciągów znaków.