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.