- Setup wizard with auto-detection of OpenClaw paths and Claude CLI - Token sync watcher (inotifywait) for real-time credential updates - Auto-refresh trigger timer that runs Claude CLI every 30 min - Supports Claude CLI in Docker container or on host - Temporary ANTHROPIC_BASE_URL override for container environments - Anthropic model configuration for OpenClaw - Auth profile management (fixes key vs access field) - Systemd services and timers for both sync and trigger - Comprehensive documentation and troubleshooting guides - Re-authentication notification system Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
3.5 KiB
Configuring Anthropic Models in OpenClaw
CRITICAL: Do NOT add an "anthropic" provider to models.providers
OpenClaw has a built-in Anthropic provider. You do NOT need to (and must NOT) add a custom anthropic entry to models.providers in openclaw.json.
Adding one causes the Anthropic SDK to append /v1 to your baseUrl, which already has /v1, resulting in:
https://api.anthropic.com/v1/v1/messages -> 404 Not Found
Correct Configuration
1. Set the primary model
In openclaw.json, under agents.defaults.model:
{
"agents": {
"defaults": {
"model": {
"primary": "anthropic/claude-opus-4-6",
"fallbacks": [
"anthropic/claude-sonnet-4-6",
"google/gemini-3.1-pro-preview"
]
}
}
}
}
The anthropic/ prefix tells OpenClaw to use the built-in Anthropic provider. No extra configuration needed.
2. Add model aliases (optional)
Under agents.defaults.models:
{
"agents": {
"defaults": {
"models": {
"anthropic/claude-opus-4-6": {
"alias": "Claude Opus 4.6 (Max)"
},
"anthropic/claude-sonnet-4-6": {
"alias": "Claude Sonnet 4.6 (Max)"
}
}
}
}
}
3. Set ANTHROPIC_OAUTH_TOKEN in .env
In your OpenClaw .env file (e.g., /root/openclaw/.env):
ANTHROPIC_OAUTH_TOKEN="sk-ant-oat01-YOUR_TOKEN_HERE"
This is the fallback auth method. The gateway reads it as a container environment variable.
4. Create auth profiles for agents
Each agent needs an anthropic:default profile in its auth-profiles.json:
{
"profiles": {
"anthropic:default": {
"type": "oauth",
"provider": "anthropic",
"access": "sk-ant-oat01-YOUR_TOKEN_HERE"
}
},
"lastGood": {
"anthropic": "anthropic:default"
}
}
Important: The field must be access, NOT key. Using key with type: "oauth" causes the profile to be silently skipped.
5. Create oauth.json
At /root/.openclaw/credentials/oauth.json (maps to /home/node/.openclaw/credentials/oauth.json in the gateway container):
{
"anthropic": {
"access": "sk-ant-oat01-YOUR_TOKEN_HERE",
"refresh": "sk-ant-ort01-YOUR_REFRESH_TOKEN",
"expires": 1772120060006,
"scopes": ["user:inference", "user:mcp_servers", "user:profile", "user:sessions:claude_code"],
"subscriptionType": "max",
"rateLimitTier": "default_claude_max_5x"
}
}
Available Built-in Models
When using the built-in Anthropic provider:
anthropic/claude-opus-4-6anthropic/claude-sonnet-4-6- Other models listed in the Anthropic API
Per-Agent Model Override
You can set a specific model per agent:
{
"agents": {
"list": [
{
"id": "my-agent",
"model": "anthropic/claude-opus-4-6"
}
]
}
}
Authentication Flow
- Gateway checks
auth-profiles.jsonfor a validanthropic:defaultprofile - For
type: "oauth", it requires theaccessfield (notkey) - If no valid profile: falls back to
ANTHROPIC_OAUTH_TOKENenv var - On startup,
mergeOAuthFileIntoStore()readsoauth.jsonand merges credentials isOAuthToken()detects thesk-ant-oatprefix- Uses Bearer auth + Claude Code identity headers to call
api.anthropic.com
OAuth Token Lifecycle
Tokens from Claude Max subscriptions expire every ~8 hours. Use the sync service from this project to keep them fresh automatically. See the main README for setup instructions.