site/docs/providers/openclaw.md
OpenClaw is a personal AI assistant framework that enables agentic evaluations with configurable reasoning and session management.
npm install -g openclaw@latest
openclaw onboard
~/.openclaw/openclaw.json if you want Chat or Responses.
These HTTP endpoints are disabled by default upstream:{
"gateway": {
"http": {
"endpoints": {
"chatCompletions": {
"enabled": true
},
"responses": {
"enabled": true
}
}
}
}
}
openclaw gateway
Or restart if already running:
openclaw gateway restart
OpenClaw exposes five provider types, each targeting a different gateway API surface:
| Provider | Format | API | Use Case |
|---|---|---|---|
| Chat | openclaw:main | /v1/chat/completions | Standard chat completions (default) |
| Responses | openclaw:responses:main | /v1/responses | OpenResponses-compatible API with item-based inputs |
| Embeddings | openclaw:embedding:main | /v1/embeddings | OpenAI-compatible embeddings through an agent target |
| Agent | openclaw:agent:main | WebSocket RPC | Full agent streaming via native WS protocol |
| Tool Invoke | openclaw:tools:sessions_list | /tools/invoke | Direct tool invocation for stable built-in tools |
Uses the OpenAI-compatible chat completions endpoint. This is the default when no keyword is specified.
Requires gateway.http.endpoints.chatCompletions.enabled=true.
openclaw - Uses the default agentopenclaw:main - Explicitly targets the main agentopenclaw:<agent-id> - Targets a specific agent by IDPromptfoo sends OpenClaw's current slash-style model id (openclaw/<agent-id>) to the gateway
while keeping the openclaw:<agent-id> promptfoo provider syntax for compatibility.
Uses the OpenResponses-compatible /v1/responses endpoint. This endpoint is also disabled by
default and requires enabling in gateway config:
{
"gateway": {
"http": {
"endpoints": {
"responses": { "enabled": true }
}
}
}
}
openclaw:responses - Default agent via Responses APIopenclaw:responses:main - Explicit agent IDopenclaw:responses:<agent-id> - Custom agentUses the OpenAI-compatible /v1/embeddings endpoint. The model field selects the OpenClaw agent
target, and config.backend_model can override the backend embedding model with the
x-openclaw-model header.
openclaw:embedding - Default agent via Embeddings APIopenclaw:embedding:<agent-id> - Custom agent by IDopenclaw:embeddings:<agent-id> - Plural alias (same behavior)Uses the native OpenClaw WebSocket RPC protocol for full agent streaming. Connects directly to the gateway's WS port without requiring HTTP endpoint enablement.
Promptfoo includes a stable device identity, signs the gateway connect.challenge nonce, persists
issued hello-ok.auth.deviceToken values, and retries once with a cached device token when the
gateway reports an AUTH_TOKEN_MISMATCH.
openclaw:agent - Default agent via WSopenclaw:agent:main - Explicit agent IDopenclaw:agent:<agent-id> - Custom agentInvokes a specific tool directly via POST /tools/invoke. Useful for testing stable built-in tools
in isolation. The prompt is parsed as JSON for tool arguments.
:::note
If the tool isn't allowlisted by OpenClaw policy, the gateway returns a 404 error. Start with a
stable built-in tool such as sessions_list or session_status. Tools like bash may be renamed,
aliased, or blocked by policy depending on your OpenClaw setup.
:::
:::tip
POST /tools/invoke also has an upstream HTTP deny list by default. Expect 404s for tools such as
sessions_spawn, sessions_send, cron, gateway, and whatsapp_login unless your OpenClaw
policy explicitly changes that behavior.
:::
openclaw:tools:sessions_list - Invoke the sessions_list toolopenclaw:tools:session_status - Invoke the session_status toolThe provider automatically detects the gateway URL and bearer auth secret from the active
OpenClaw config (OPENCLAW_CONFIG_PATH when set, otherwise ~/.openclaw/openclaw.json). This
includes:
OPENCLAW_GATEWAY_PORT as a local port overridegateway.tls.enabled for https:// / wss://gateway.mode=remote via gateway.remote.urlproviders:
- openclaw:main
Override auto-detection with explicit config:
providers:
- id: openclaw:main
config:
gateway_url: http://127.0.0.1:18789
auth_token: your-token-here
# Use auth_password instead when gateway.auth.mode=password
session_key: custom-session
# Optional backend model override, sent as x-openclaw-model:
backend_model: openai/gpt-5.4
Set configuration via environment variables:
export OPENCLAW_CONFIG_PATH=~/.openclaw/openclaw.json # optional
export OPENCLAW_GATEWAY_URL=http://127.0.0.1:18789
# Or override only the local auto-detected port:
# export OPENCLAW_GATEWAY_PORT=18789
export OPENCLAW_GATEWAY_TOKEN=your-token-here
# Or, if your gateway uses password auth:
# export OPENCLAW_GATEWAY_PASSWORD=your-password-here
providers:
- openclaw:main
| Config Property | Environment Variable | Description |
|---|---|---|
| gateway_url | OPENCLAW_GATEWAY_URL | Gateway URL (default: auto-detected) |
| - | OPENCLAW_GATEWAY_PORT | Local gateway port override used when gateway_url is unset |
| auth_token | OPENCLAW_GATEWAY_TOKEN | Gateway bearer secret for token auth mode |
| auth_password | OPENCLAW_GATEWAY_PASSWORD | Gateway bearer secret for password auth mode |
| backend_model | - | Backend model override sent as x-openclaw-model |
| model_override | - | Alias for backend_model |
| message_channel | - | Channel context sent as x-openclaw-message-channel and WS channel |
| account_id | - | Account context sent as x-openclaw-account-id and WS accountId |
| scopes | - | WS operator scopes and optional HTTP x-openclaw-scopes context |
| session_key | - | Session identifier for continuity; otherwise WS uses an isolated per-call session |
| thinking_level | - | WS Agent reasoning level: off, minimal, low, medium, high, xhigh, adaptive |
| extra_system_prompt | - | WS Agent-only extra system prompt injected as extraSystemPrompt |
| device_identity_path | - | WS Agent device keypair path (default: promptfoo config directory) |
| device_auth_path | - | WS Agent issued-device-token cache path (default: promptfoo config directory) |
| device_token | - | Explicit WS device token for paired-device auth |
| device_family | - | Optional device metadata included in the signed WS device payload |
| disable_device_auth | - | WS Agent break-glass option to omit device identity |
| ws_headers | - | Additional headers for WebSocket connects |
| headers | - | Additional HTTP headers, also used by WS unless overridden by ws_headers |
| action | - | Tool Invoke-only sub-action forwarded as body.action |
| dry_run | - | Tool Invoke-only dry-run hint forwarded as body.dryRun |
| timeoutMs | - | Client timeout in milliseconds for WS Agent waits and Tool Invoke HTTP requests |
prompts:
- 'What is the capital of {{country}}?'
providers:
- openclaw:main
tests:
- vars:
country: France
assert:
- type: contains
value: Paris
thinking_level is only supported by the WebSocket Agent provider. Valid values are off,
minimal, low, medium, high, xhigh, and adaptive, though model support still depends on
the upstream provider/model combination.
prompts:
- 'Analyze the pros and cons of {{topic}}'
providers:
- id: openclaw:agent:main
config:
session_key: promptfoo-eval
thinking_level: adaptive
timeoutMs: 60000
tests:
- vars:
topic: renewable energy
prompts:
- 'Summarize: {{text}}'
providers:
- openclaw:responses:main
tests:
- vars:
text: The quick brown fox jumps over the lazy dog.
prompts:
- '{{text}}'
providers:
- id: openclaw:embedding:main
config:
backend_model: openai/text-embedding-3-small
tests:
- vars:
text: Promptfoo routes this through OpenClaw.
Use backend_model when you want the selected OpenClaw agent to run a specific provider/model for
this eval without changing the agent's normal default model.
providers:
- id: openclaw:main
config:
backend_model: openai/gpt-5.4
For billing, OpenClaw's visible model remains the agent target (openclaw/<agent-id>). Promptfoo
can estimate OpenAI token spend only when backend_model or model_override names the actual
OpenAI backend model, such as openai/gpt-5.4 or gpt-5.4. If the backend model is selected only
inside OpenClaw's own agent config, Promptfoo leaves cost unset because the gateway response does
not expose enough information to price that request safely.
Promptfoo uses an isolated session key per call unless you set session_key explicitly.
prompts:
- '{{task}}'
providers:
- id: openclaw:agent:main
config:
session_key: promptfoo-eval
timeoutMs: 60000
tests:
- vars:
task: What files are in the current directory?
prompts:
- '{}'
providers:
- openclaw:tools:sessions_list
tests:
- assert:
- type: contains
value: sessions
If a tool exposes sub-actions, add config.action:
prompts:
- '{}'
providers:
- id: openclaw:tools:sessions_list
config:
action: json
404 from openclaw:main or openclaw:responses:*: the HTTP endpoints are disabled by
default. Enable gateway.http.endpoints.chatCompletions.enabled=true and, for Responses,
gateway.http.endpoints.responses.enabled=true.404 from openclaw:tools:*: the tool may be blocked by gateway.tools, the default HTTP deny
list, or your selected tools.profile. Start with sessions_list or session_status.auth_password or
OPENCLAW_GATEWAY_PASSWORD, not auth_token.DEVICE_AUTH_* errors usually mean an old or incompatible device identity/signature. Remove
only the promptfoo OpenClaw device identity/cache files you configured, then pair again.gateway_url explicitly instead of
relying on auto-detection.For a complete example, see examples/provider-openclaw.