Gateway
Lokalne usługi modeli
models.providers.<id>.localService pozwala OpenClaw uruchamiać na żądanie lokalny
serwer modelu należący do dostawcy. Jest to konfiguracja na poziomie dostawcy:
gdy wybrany model należy do tego dostawcy, OpenClaw sprawdza usługę, uruchamia
proces, jeśli punkt końcowy jest niedostępny, czeka na gotowość, a następnie
wysyła żądanie do modelu.
Używaj tego dla lokalnych serwerów, których utrzymywanie przez cały dzień jest kosztowne, albo dla ręcznych konfiguracji, w których sam wybór modelu powinien wystarczyć do uruchomienia backendu.
Jak to działa
- Żądanie modelu jest rozwiązywane do skonfigurowanego dostawcy.
- Jeśli ten dostawca ma
localService, OpenClaw sprawdzahealthUrl. - Jeśli sprawdzenie się powiedzie, OpenClaw używa istniejącego serwera.
- Jeśli sprawdzenie się nie powiedzie, OpenClaw uruchamia
commandzargs. - OpenClaw odpytuje gotowość do momentu wygaśnięcia
readyTimeoutMs. - Żądanie modelu jest wysyłane przez standardowy transport dostawcy.
- Jeśli OpenClaw uruchomił proces, a
idleStopMsjest dodatnie, proces jest zatrzymywany po tym, jak ostatnie trwające żądanie pozostanie bezczynne przez tak długi czas.
OpenClaw nie instaluje w tym celu launchd, systemd, Docker ani demona. Serwer jest procesem potomnym procesu OpenClaw, który jako pierwszy go potrzebował.
Struktura konfiguracji
{ models: { providers: { local: { baseUrl: "http://127.0.0.1:8000/v1", apiKey: "local-model", api: "openai-completions", timeoutSeconds: 300, localService: { command: "/absolute/path/to/server", args: ["--host", "127.0.0.1", "--port", "8000"], cwd: "/absolute/path/to/working-dir", env: { LOCAL_MODEL_CACHE: "/absolute/path/to/cache" }, healthUrl: "http://127.0.0.1:8000/v1/models", readyTimeoutMs: 180000, idleStopMs: 0, }, models: [ { id: "my-local-model", name: "My Local Model", reasoning: false, input: ["text"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: 131072, maxTokens: 8192, }, ], }, }, },}Pola
command: bezwzględna ścieżka do pliku wykonywalnego. Wyszukiwanie przez powłokę nie jest używane.args: argumenty procesu. Nie są stosowane rozwijanie powłoki, potoki, globowanie ani reguły cytowania.cwd: opcjonalny katalog roboczy procesu.env: opcjonalne zmienne środowiskowe scalane ze środowiskiem procesu OpenClaw.healthUrl: URL gotowości. Jeśli zostanie pominięty, OpenClaw dopisuje/modelsdobaseUrl, więchttp://127.0.0.1:8000/v1staje sięhttp://127.0.0.1:8000/v1/models.readyTimeoutMs: limit czasu oczekiwania na gotowość podczas uruchamiania. Domyślnie:120000.idleStopMs: opóźnienie wyłączenia po bezczynności dla procesów uruchomionych przez OpenClaw.0albo pominięcie utrzymuje proces przy życiu do czasu zakończenia OpenClaw.
Przykład Inferrs
Inferrs jest niestandardowym backendem /v1 zgodnym z OpenAI, więc to samo API
usługi lokalnej działa z wpisem dostawcy inferrs.
{ agents: { defaults: { model: { primary: "inferrs/google/gemma-4-E2B-it" }, }, }, models: { mode: "merge", providers: { inferrs: { baseUrl: "http://127.0.0.1:8080/v1", apiKey: "inferrs-local", api: "openai-completions", timeoutSeconds: 300, localService: { command: "/opt/homebrew/bin/inferrs", args: [ "serve", "google/gemma-4-E2B-it", "--host", "127.0.0.1", "--port", "8080", "--device", "metal", ], healthUrl: "http://127.0.0.1:8080/v1/models", readyTimeoutMs: 180000, idleStopMs: 0, }, models: [ { id: "google/gemma-4-E2B-it", name: "Gemma 4 E2B (inferrs)", reasoning: false, input: ["text"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: 131072, maxTokens: 4096, compat: { requiresStringContent: true, }, }, ], }, }, },}Zastąp command wynikiem which inferrs na maszynie uruchamiającej
OpenClaw.
Przykład ds4
{ models: { providers: { ds4: { baseUrl: "http://127.0.0.1:18000/v1", apiKey: "ds4-local", api: "openai-completions", timeoutSeconds: 300, localService: { command: "/Users/you/Projects/oss/ds4/ds4-server", args: [ "--model", "/Users/you/Projects/oss/ds4/ds4flash.gguf", "--host", "127.0.0.1", "--port", "18000", "--ctx", "393216", ], cwd: "/Users/you/Projects/oss/ds4", healthUrl: "http://127.0.0.1:18000/v1/models", readyTimeoutMs: 300000, idleStopMs: 0, }, models: [], }, }, },}Uwagi operacyjne
- Jeden proces OpenClaw zarządza uruchomionym przez siebie procesem potomnym. Inny proces OpenClaw, który zobaczy, że ten sam URL sprawdzania kondycji już działa, użyje go ponownie bez przejmowania nad nim kontroli.
- Uruchamianie jest serializowane dla każdego zestawu polecenia i argumentów dostawcy, więc równoczesne żądania nie tworzą zduplikowanych serwerów dla tej samej konfiguracji.
- Aktywne odpowiedzi strumieniowe utrzymują dzierżawę; wyłączenie po bezczynności czeka do zakończenia obsługi treści odpowiedzi.
- Użyj
timeoutSecondsdla wolnych dostawców lokalnych, aby zimne starty i długie generowania nie trafiały w domyślny limit czasu żądania modelu. - Użyj jawnego
healthUrl, jeśli Twój serwer udostępnia gotowość w miejscu innym niż/v1/models.