Ollama API Timeout auf 60 Sekunden begrenzt trotz timeoutSeconds-Konfiguration
Anfragen an lokale Ollama-Modelle führen zu einem Timeout nach 60 Sekunden, selbst wenn timeoutSeconds in der OpenClaw Agents-Konfiguration auf 1800 gesetzt ist. Dies deutet darauf hin, dass der Timeout auf HTTP-Client-Ebene die applikationsseitige Konfiguration nicht respektiert.
🔍 Symptome
Der Benutzer meldet, dass Anfragen an sein lokales Ollama-Modell (ollama/gemma4:e4b) konsistent nach genau 60 Sekunden timeouten, unabhängig von der timeoutSeconds-Einstellung in der OpenClaw-Konfiguration.
Angewendete Konfiguration
"agents": {
"defaults": {
"model": {
"primary": "ollama/gemma4:e4b"
},
"models": {
"ollama/gemma4:e4b": {},
"ollama/gemma4:26b": {}
},
"workspace": "/Users/xxxxxx/.openclaw/workspace",
"compaction": {
"mode": "safeguard"
},
"timeoutSeconds": 1800
}
}Fehleräußerung
Wenn der Timeout auftritt, wird folgendes Verhalten beobachtet:
Error: Request to Ollama API timed out after 60000ms
at async OllamaProvider.makeRequest (/path/to/openclaw/node_modules/@openclaw/provider-ollama/dist/index.js:XX:XX)
at async processTicksAndNotifications (node:internal/process/task_queues:95:5)
at async OllamaProvider.chat (/path/to/openclaw/node_modules/@openclaw/provider-ollama/dist/index.js:XX:XX)
[AXIOS_ERROR]: ECONNABORTED - Timeout of 60000ms exceededWichtige Indikatoren
- Der Timeout-Wert von 60000ms (60 Sekunden) ist in der HTTP-Client-Schicht fest codiert
- Die
timeoutSeconds: 1800-Einstellung der Anwendung wird nicht an die zugrunde liegende HTTP-Anfrage weitergegeben - Tritt nur bei langlebigen Ollama-Inferenzoperationen auf (z.B. große Modellantworten, komplexe Prompts)
- Das Problem ist zu 100% reproduzierbar bei Anfragen, die 60 Sekunden überschreiten
🧠 Ursache
Das Timeout-Problem stammt aus einem Schicht-Mismatch zwischen der Anwendungsebene-Konfiguration und dem HTTP-Client-Ebene-Timeout. Das OpenClaw-Konfigurationsfeld timeoutSeconds: 1800 ist als Anwendungsebene-Timeout gedacht, wird aber nicht an den zugrunde liegenden HTTP-Client (typischerweise Axios) weitergeleitet, der mit der Ollama REST-API kommuniziert.
Technische Fehlersequenz
- Konfigurationsladen: OpenClaw lädt das
agents.defaults.timeoutSeconds: 1800aus der Konfigurationsdatei in den Agent-Kontext. - Modellanfrage-Initialisierung: Wenn eine Chat-Anfrage initiiert wird, ruft das System die Modellkonfiguration für
ollama/gemma4:e4bab. - Provider-Instanziierung: Die
OllamaProvider-Klasse wird instanziiert, um die HTTP-Kommunikation mit dem lokalen Ollama-Server zu behandeln. - HTTP-Client-Standardwert angewendet: Die Axios-Instanz (oder Node.js
fetch) innerhalb des Ollama-Providers verwendet ihren Standard-Timeout von60000ms, weil dietimeoutSeconds-Konfiguration nicht an den HTTP-Client-Konstruktor weitergegeben wird. - Anfrage-Abbruch: Nach genau 60 Sekunden bricht Axios die Anfrage mit
ECONNABORTEDab, unabhängig von der Anwendungsabsicht.
Code-Pfad-Analyse
Der problematische Code existiert in der HTTP-Client-Initialisierung des Ollama-Providers:
// In node_modules/@openclaw/provider-ollama/dist/index.js (vereinfacht)
class OllamaProvider {
constructor(config) {
// BUG: timeout ist auf 60000ms fest codiert
this.httpClient = axios.create({
baseURL: config.baseUrl || 'http://localhost:11434',
timeout: 60000 // <<< FEST CODIERT - ignoriert config.timeoutSeconds
});
}
async chat(messages, options) {
// options.timeoutSeconds (1800) wird hier nie weitergegeben
const response = await this.httpClient.post('/api/chat', {
model: this.model,
messages: messages
});
}
}Architektonische Inkonsistenz
OpenClaws Konfigurationssystem verwendet timeoutSeconds für Agent-Ebene-Timeout-Kontrolle, aber die Provider-Implementierungen haben fest codierte HTTP-Timeouts, die diese Einstellung umgehen. Die Konfigurationskette ist unterbrochen zwischen:
agents.defaults.timeoutSeconds(Anwendungsschicht)- →
ModelConfig(Modell-Routingschicht) - →
OllamaProvider(HTTP-Transportschicht) ❌ NICHT VERBUNDEN
🛠️ Schritt-für-Schritt-Lösung
Lösung 1: Provider-Timeout über Umgebungsvariable überschreiben
Wenn der OpenClaw Ollama-Provider eine umgebungsbasierte Timeout-Konfiguration unterstützt:
# Zu Ihrer Shell-Konfigurationsdatei oder .env-Datei hinzufügen
export OLLAMA_HTTP_TIMEOUT=1800000
# Oder für den spezifischen Provider
export OPENCLAW_PROVIDER_TIMEOUT=1800000Lösung 2: Konfiguration über anbieterspezifische Modelleinstellungen
Timeout-Konfiguration direkt zur Modelldefinition hinzufügen:
"agents": {
"defaults": {
"model": {
"primary": "ollama/gemma4:e4b"
},
"models": {
"ollama/gemma4:e4b": {
"provider": "ollama",
"options": {
"timeout": 1800000
}
},
"ollama/gemma4:26b": {
"provider": "ollama",
"options": {
"timeout": 1800000
}
}
},
"workspace": "/Users/xxxxxx/.openclaw/workspace",
"compaction": {
"mode": "safeguard"
},
"timeoutSeconds": 1800
}
}Lösung 3: Direkte Axios-Timeout-Überschreibung (Workaround)
Wenn Sie Zugriff auf die Provider-Quelle haben, erstellen Sie eine lokale Überschreibung. Erstellen Sie eine Patch-Datei unter:
~/.openclaw/providers/ollama-patch.jsMit Inhalt:
const axios = require('axios');
// Client mit konfigurierbarem Timeout erstellen
const createOllamaClient = (baseUrl, timeoutMs = 60000) => {
return axios.create({
baseURL: baseUrl || 'http://localhost:11434',
timeout: timeoutMs,
// Längere Timeouts für Streaming sicherstellen
httpAgent: new (require('http').Agent)({
timeout: timeoutMs,
keepAlive: true
})
});
};
module.exports = { createOllamaClient };Lösung 4: Ollama-Server-Timeout konfigurieren (serverseitig)
Konfigurieren Sie den Ollama-Server selbst, um längere Anfragebearbeitung zu ermöglichen:
# In Ihrem Ollama-Startskript oder systemd-Dienst
OLLAMA_KEEP_ALIVE=0 \
OLLAMA_CONTEXT_SIZE=32768 \
ollama serve
# Oder Umgebung vor dem Start setzen
export OLLAMA_KEEP_ALIVE=0Lösung 5: OpenClaws Provider-Konfigurationsdatei verwenden
Erstellen Sie eine dedizierte Provider-Konfiguration:
# Datei: ~/.openclaw/config/providers.yaml
providers:
ollama:
baseUrl: http://localhost:11434
timeout: 1800000 # 30 Minuten in Millisekunden
keepAlive: true
modelDefaults:
temperature: 0.7
numCtx: 32768Vorher vs. Nachher Konfiguration
Vorher (Standard 60-Sekunden-Timeout):
"models": {
"ollama/gemma4:e4b": {}
}Nachher (1800-Sekunden-Timeout):
"models": {
"ollama/gemma4:e4b": {
"providerOptions": {
"timeout": 1800000
}
}
}🧪 Verifizierung
Schritt 1: Ollama-Server-Status überprüfen
# Prüfen ob Ollama läuft und antwortet
curl http://localhost:11434/api/tags
# Erwartete Ausgabe:
# {
# "models": [
# {
# "name": "gemma4:e4b",
# "size": 4800000000,
# "digest": "sha256:..."
# }
# ]
# }Schritt 2: Direkte Ollama-API-Latenz testen
# Einfache Chat-Anfrage direkt an Ollama testen
curl http://localhost:11434/api/chat -d '{
"model": "gemma4:e4b",
"messages": [{"role": "user", "content": "Hallo"}],
"stream": false
}'
# Überprüfen dass die Antwort ohne Timeout auf Ollama-Ebene abgeschlossen wirdSchritt 3: OpenClaw-Konfigurationsladen verifizieren
# OpenClaw mit Debug-Logging ausführen um Konfigurationsparsing zu verifizieren
OPENCLAW_LOG_LEVEL=debug openclaw chat --model ollama/gemma4:e4b --prompt "test"
# Achten Sie auf diese Zeilen in der Ausgabe:
# [DEBUG] Config loaded: timeoutSeconds=1800
# [DEBUG] Provider ollama initialized with timeout=1800000Schritt 4: Mit erweitertem Timeout-Szenario testen
Erstellen Sie einen Test, der mehr als 60 Sekunden benötigt:
# Testskript zur Überprüfung dass der Timeout eingehalten wird
node -e "
const { OllamaProvider } = require('@openclaw/provider-ollama');
async function testTimeout() {
const provider = new OllamaProvider({
model: 'ollama/gemma4:e4b',
timeout: 1800000
});
const startTime = Date.now();
try {
const response = await provider.chat([
{ role: 'user', content: 'Generate a very long story about...' }
]);
const duration = Date.now() - startTime;
console.log('SUCCESS: Request completed in', duration, 'ms');
console.log('Response:', response.message.content.substring(0, 100) + '...');
} catch (error) {
console.error('FAILED after', Date.now() - startTime, 'ms');
console.error('Error:', error.message);
}
}
testTimeout();
"Schritt 5: HTTP-Client-Timeout-Wert bestätigen
# Dies temporär zu Ihrem Provider-Code hinzufügen zum Debuggen:
console.log('HTTP Client timeout:', provider.httpClient.defaults.timeout);
// Sollte ausgeben: 1800000 (nicht 60000)Erwartete erfolgreiche Ausgabe
# Nach der Korrektur sollten Sie sehen:
[INFO] Starting request to ollama/gemma4:e4b
[DEBUG] Using timeout: 1800000ms
[INFO] Response received in 125000ms
[SUCCESS] Token count: 5421, Time: 125.0s⚠️ Häufige Fehler
1. Konfigurationspfad-Mismatch
Das Feld timeoutSeconds in der OpenClaw-Konfiguration ordnet möglicherweise nicht dem HTTP-Client-Timeout-Parameter zu.
Fallstrick: Verwendung von timeoutSeconds, wenn der Provider timeoutMs oder requestTimeout erwartet.
Lösung: Anbieterdokumentation für den genauen Feldnamen prüfen.
# Falsch – wird ignoriert
"timeoutSeconds": 1800
# Richtig – mit Provider-Implementierung verifizieren
"timeoutMs": 1800000
# oder
"requestTimeout": 18000002. Docker-Container-Netzwerk-Timeout
Wenn Ollama in einem Docker-Container läuft, kann Docker’s Standard-Netzwerk-Timeout Anwendungseinstellungen überschreiben.
Fallstrick: Die Netzwerkschicht von Docker hat ihre eigenen Timeout-Einstellungen.
Lösung:
# docker-compose.yml
services:
ollama:
image: ollama/ollama
network_mode: host # Docker-Netzwerk umgehen
# Oder erweiterte Timeouts konfigurieren:
# networks:
# default:
# driver: bridge
# driver_opts:
# com.docker.network.foundation.timeout: 18003. macOS HTTP Keep-Alive-Timeout
macOS hat aggressive TCP-Keepalive-Einstellungen, die vorzeitige Verbindungsbeendigungen verursachen können.
Fallstrick: macOS ipfw/pf-Firewall-Regeln können inaktive Verbindungen nach 60 Sekunden zurücksetzen.
Lösung:
# Aktuelle Einstellungen prüfen
sysctl net.inet.tcp.keepidle
sysctl net.inet.tcp.keepintvl
# Keepalive-Intervalle erhöhen (erfordert sudo)
sudo sysctl -w net.inet.tcp.keepidle=1800
sudo sysctl -w net.inet.tcp.keepintvl=18004. Reverse-Proxy- oder Gateway-Timeout
Wenn auf Ollama über nginx, Caddy oder einen anderen Reverse-Proxy zugegriffen wird, haben die Timeout-Einstellungen des Proxys Vorrang.
Fallstrick: Anwendungstimeout korrekt konfiguriert, aber Proxy hat kürzeren Timeout.
Lösung (nginx-Beispiel):
# /etc/nginx/conf.d/ollama.conf
location /api/ {
proxy_pass http://127.0.0.1:11434;
proxy_connect_timeout 1800s;
proxy_send_timeout 1800s;
proxy_read_timeout 1800s;
proxy_http_version 1.1;
proxy_set_header Connection "";
}5. Node.js Standard-Fetch-Timeout
Moderne Node.js-Versionen verwenden eingebautes fetch mit eigenem Timeout-Verhalten.
Fallstrick: fetch() hat keinen nativen Timeout-Parameter; man braucht expliziten AbortController mit setTimeout.
Lösung:
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 1800000);
const response = await fetch(url, {
signal: controller.signal,
method: 'POST',
body: JSON.stringify(payload)
});
clearTimeout(timeoutId);6. Umgebungsvariablen-Priorität
Manche OpenClaw-Versionen verwenden möglicherweise Umgebungsvariablen, die Konfigurationsdatei-Einstellungen überschreiben.
Fallstrick: OLLAMA_TIMEOUT oder ähnliche Umgebungsvariablen sind gesetzt, werden aber ignoriert.
Lösung: Auf widersprüchliche Umgebungsvariablen prüfen:
# Alle Ollama/OpenClaw-bezogenen Umgebungsvariablen auflisten
env | grep -iE '(OLLAMA|OPENCLAW|TIMEOUT)'
# Sicherstellen, dass keine hartcodierten Timeout-Werte vorhanden sind
echo $OLLAMA_HTTP_TIMEOUT # Sollte nicht gesetzt sein oder 1800000 sein🔗 Zugehörige Fehler
Die folgenden Fehler sind häufig mit dem Ollama-Timeout-Problem assoziiert:
ECONNABORTED— Axios-Fehlercode, der anzeigt, dass die Anfrage wegen Timeout abgebrochen wurde. Tritt auf, wenn der HTTP-Client einen Timeout hat, bevor eine Antwort empfangen wird.ETIMEDOUT— TCP-Ebene Timeout-Fehler. Zeigt einen netzwerkebenen Verbindungs-Timeout an, oft auf Betriebssystem- oder Firewall-Ebene anstatt auf Anwendungsebene.