OpenClaw + Claude Max: Anthropic OAuth-Tokens automatisch erneuern – nie wieder stille Agents
Der Tweet, der alles ausgelöst hat
Heute Morgen teilte jemand genau das, was die halbe OpenClaw-Community still leidet:
> *"Heute Morgen sind alle 6 meiner AI-Agents perfekt gelaufen — zum ersten Mal ohne dass ich etwas anfassen musste. Das ist neu. Ich betreibe OpenClaw mit Claude Max auf dem Mac Mini, und Anthropics OAuth Access-Tokens laufen alle 8 Stunden ab. Wenn das passiert, werden alle Agents still."*
Wenn du OpenClaw mit Claude Max (Anthropics Abo-Plan) betreibst, verwendest du keinen API-Key — sondern eine OAuth-Session, die Anthropic über einen Browser-Login ausstellt. Anders als ein API-Key, der nie abläuft, haben diese OAuth Access-Tokens eine harte TTL von 8 Stunden.
Alle 8 Stunden: Stille. Jeden Morgen: manuell fixen. Das ist der Standard — außer du löst es.
Dieser Beitrag zeigt, wie du die Erneuerung vollständig automatisierst, damit du es nie mehr anfassen musst.
---
Warum das passiert: OAuth vs. API-Key
Wenn du OpenClaw über Claude Max (nicht die API-Stufe) mit Anthropic verbindest, läuft die Auth so ab:
1. Du loggst dich via Browser ein — Anthropic stellt ein Access Token (kurzlebig, ~8h) und ein Refresh Token (langlebig) aus
2. OpenClaw verwendet das Access Token für jede Anfrage
3. Nach 8 Stunden läuft das Access Token ab — Anfragen geben 401 zurück
4. OpenClaw markiert das Konto als nicht authentifiziert — Agents hören auf zu antworten
Das Refresh Token kann ohne erneutes Login ein neues Access Token holen. Das Problem: Standardmäßig ruft nichts in deinem Setup diesen Refresh-Endpunkt automatisch auf.
---
Schritt 1: Tokens finden
OpenClaw speichert Auth-Credentials hier:
```bash
cat ~/.openclaw/config.json | grep -A 10 '"anthropic"'
```
Du suchst eine Struktur wie diese:
```json
{
"anthropic": {
"authType": "oauth",
"accessToken": "sk-ant-oaXXX...",
"refreshToken": "rt-XXXXX...",
"expiresAt": 1743091200000
}
}
```
Das `refreshToken` ist das, was du brauchst. Es ist langlebig (typischerweise 30–90 Tage) und kann ohne Benutzerinteraktion neue Access Tokens holen.
---
Schritt 2: Das Refresh-Skript
Erstelle dieses Skript unter `~/scripts/refresh-anthropic-token.sh`:
```bash
#!/bin/bash
set -e
CONFIG="$HOME/.openclaw/config.json"
BACKUP="$HOME/.openclaw/config.json.bak"
# Aktuelles Refresh Token auslesen
REFRESH_TOKEN=$(cat "$CONFIG" | python3 -c "
import json, sys
cfg = json.load(sys.stdin)
print(cfg.get('anthropic', {}).get('refreshToken', ''))
")
if [ -z "$REFRESH_TOKEN" ]; then
echo "FEHLER: Kein Refresh Token in config.json gefunden"
exit 1
fi
# Anthropics Token-Endpunkt aufrufen
RESPONSE=$(curl -s -X POST "https://console.anthropic.com/v1/oauth/token" \
-H "Content-Type: application/json" \
-d "{
\"grant_type\": \"refresh_token\",
\"refresh_token\": \"$REFRESH_TOKEN\"
}")
NEW_ACCESS_TOKEN=$(echo "$RESPONSE" | python3 -c "
import json, sys
data = json.load(sys.stdin)
if 'access_token' not in data:
print('FEHLER: ' + str(data), file=sys.stderr)
sys.exit(1)
print(data['access_token'])
")
NEW_EXPIRES=$(echo "$RESPONSE" | python3 -c "
import json, sys, time
data = json.load(sys.stdin)
expires_in = data.get('expires_in', 28800)
print(int((time.time() + expires_in) * 1000))
")
# Backup und Update
cp "$CONFIG" "$BACKUP"
python3 -c "
import json, sys
with open('$CONFIG') as f:
cfg = json.load(f)
cfg['anthropic']['accessToken'] = '$NEW_ACCESS_TOKEN'
cfg['anthropic']['expiresAt'] = $NEW_EXPIRES
with open('$CONFIG', 'w') as f:
json.dump(cfg, f, indent=2)
print('Token aktualisiert. Läuft ab:', $NEW_EXPIRES)
"
# OpenClaw Gateway neu laden, damit es das neue Token erkennt
openclaw gateway restart --quiet 2>/dev/null || true
echo "Fertig. Neues Token aktiv."
```
Ausführbar machen:
```bash
chmod +x ~/scripts/refresh-anthropic-token.sh
```
---
Schritt 3: Testen
Einmal manuell ausführen, um sicherzustellen, dass alles funktioniert:
```bash
~/scripts/refresh-anthropic-token.sh
```
Du solltest sehen:
```
Token aktualisiert. Läuft ab: 1743120000000
Fertig. Neues Token aktiv.
```
Dann verifizieren, dass deine Agents noch antworten.
---
Schritt 4: Mit Cron automatisieren
Alle 6 Stunden erneuern — sicher vor dem 8-Stunden-Ablauf, mit 2 Stunden Puffer.
Zu Crontab hinzufügen:
```bash
crontab -e
```
```cron
0 */6 * * * /bin/bash $HOME/scripts/refresh-anthropic-token.sh >> $HOME/.openclaw/logs/token-refresh.log 2>&1
```
Oder mit OpenClaws eingebautem Cron-System (empfohlen):
```json
{
"cron": {
"jobs": [
{
"name": "Anthropic Token Refresh",
"schedule": { "kind": "every", "everyMs": 21600000 },
"payload": {
"kind": "systemEvent",
"text": "Führe aus: bash $HOME/scripts/refresh-anthropic-token.sh"
}
}
]
}
}
```
---
Schritt 5: Health Check hinzufügen
Das Skript ist still, wenn es funktioniert — aber du willst wissen, wenn es *scheitert*. Füge eine Benachrichtigung hinzu:
```bash
# Am Anfang des Skripts, alles in Error-Handling einwickeln:
trap 'echo "TOKEN REFRESH FEHLGESCHLAGEN am $(date)" | openclaw notify --channel telegram' ERR
```
---
Alternative: API-Stufe verwenden
Wenn das zu viel Aufwand ist, ist der sauberste Weg der Wechsel von Claude Max (Abo) zur Anthropic API (Pay-per-Token):
| | Claude Max | Anthropic API |
|---|---|---|
| Auth | OAuth (8h TTL) | API-Key (kein Ablauf) |
| Kosten | Monatliche Flatrate | Pay-per-Token |
| Am besten für | Intensiver persönlicher Einsatz | Vorhersehbare Workloads |
| Token-Management | Manuell oder per Skript | Nicht nötig |
Für die meisten OpenClaw-Setups mit 3–6 Agents, die 24/7 laufen, ist die API-Stufe oft günstiger als Claude Max — besonders wenn `claude-haiku-3-5` für Routineaufgaben und `claude-sonnet` nur für komplexe Fälle verwendet wird.
---
Debugging: Wenn das Refresh fehlschlägt
401 am Refresh-Endpunkt:
Dein Refresh Token selbst könnte abgelaufen sein. Du musst dich manuell neu authentifizieren: `openclaw auth login --provider anthropic`.
Config-Update erfolgreich, aber Agents geben weiter 401:
Das Gateway hat das neue Token nicht übernommen. Neustart erzwingen: `openclaw gateway restart`.
Refresh Token nicht in config.json:
Ältere OpenClaw-Versionen speichern Tokens anders. Prüfe: `~/.openclaw/auth/` — dort könnten Provider-spezifische Token-Dateien sein.
curl: command not found in Cron:
Cron läuft mit minimalem PATH. Verwende den vollen Pfad (`/usr/bin/curl`) oder source dein Profil am Anfang des Skripts: `source $HOME/.profile`.
---
Der OpenClaw-native Ansatz
Ab OpenClaw 0.9+ gibt es einen saubereren Weg: Das Gateway hat einen eingebauten Auth Refresh Hook. Direkt in der Konfiguration:
```json
{
"providers": {
"anthropic": {
"authType": "oauth",
"autoRefresh": true,
"refreshIntervalMs": 21600000
}
}
}
```
Mit `autoRefresh: true` übernimmt das Gateway die Token-Rotation intern — kein Skript, kein Cron-Job. Das ist der empfohlene Ansatz für 0.9+. Version prüfen: `openclaw --version`.
Bei älteren Versionen ist der Skript-Ansatz die zuverlässige Alternative.
---
Zusammenfassung
| Problem | Anthropic OAuth-Tokens laufen alle 8 Stunden ab |
|---|---|
| Symptom | Alle Agents werden über Nacht still |
| Fix (per Skript) | refresh-anthropic-token.sh + Cron alle 6h |
| Fix (nativ) | `autoRefresh: true` in der Config (OpenClaw 0.9+) |
| Radikale Option | Wechsel zur Anthropic API (API-Keys laufen nicht ab) |
Das erste Mal, wenn dich das um 3 Uhr morgens trifft — alle 6 Agents tot, Kundenansichten aufgestapelt — reparierst du es in 20 Minuten und denkst nie wieder daran. Dafür ist dieser Beitrag da.
Die vollständige Konfiguration, alle Skripte und das Monitoring-Setup findest du im OpenClaw Setup Playbook.
Also available in English. 🇬🇧