{ "schema_version": "1", "agents": [ { "schema_version": "1", "id": "aider", "display_name": "Aider", "vendor": "OpenAI / Anthropic", "homepage": "https://aider.chat/docs/llms/openai-compat.html", "binary_names": [ "aider" ], "args": [], "install": "python -m pip install aider-chat", "wire_protocol": "openai-chat", "injection": { "method": "env", "env": { "OPENAI_API_BASE": "{{cave_base_url}}/openai/v1" } }, "attribution": { "header": "x-cave-agent" }, "tested_agent_version": "0.86.2", "injection_completeness": "declarative", "fallback": "generic-env", "maintainer": null }, { "schema_version": "1", "id": "claude", "display_name": "Claude Code", "vendor": "Anthropic", "homepage": "https://code.claude.com/docs", "binary_names": [ "claude" ], "args": [], "install": "npm i -g @anthropic-ai/claude-code", "wire_protocol": "anthropic-messages", "injection": { "method": "env", "env": { "ANTHROPIC_BASE_URL": "{{cave_base_url}}", "ANTHROPIC_AUTH_TOKEN": "{{cave_api_key}}" } }, "skills": { "format": "skill-md", "user_dirs": [ "~/.claude/skills" ], "project_dirs": [ ".claude/skills" ] }, "command_hook": { "method": "claude-pretooluse" }, "memory_hook": { "method": "claude-userpromptsubmit" }, "attribution": { "header": "x-cave-agent" }, "tested_agent_version": "2.1.318", "injection_completeness": "builder-assisted", "last_verified_at": "2026-11-06", "verified_by": "CI pinned-binary probe (claude 2.1.318, agent-conformance pinned-upstream-binary lane on ubuntu-latest with Node 24.16.0, agents/probe-installed.mjs: --version and --help both exit 0); route probe last run on 2.1.308, not re-run on 2.1.318, from a scratch HOME and CLAUDE_CONFIG_DIR with onboarding pre-accepted in ~/.claude.json: ANTHROPIC_BASE_URL redirection observed reaching POST /v1/messages?beta=true under the injected base URL, the injected ANTHROPIC_AUTH_TOKEN (a dummy value) arriving as Authorization: Bearer with no x-api-key, and the run completed (exit 0, stop_reason end_turn). The unauthenticated HEAD /api/hello reachability preflight first recorded on 2.1.306 is still sent to the same injected base URL before the turn, now with a Bun/1.4.4 user-agent rather than the CLI's own -- a mount that answers /v1/messages but rejects HEAD on an unknown path is worth checking against this. The turn itself is a streaming request (stream: true) carrying anthropic-beta: claude-code-20250219 and user-agent claude-cli/2.1.308 (external, sdk-cli)", "fallback": "generic-env", "maintainer": null }, { "schema_version": "1", "id": "codex", "display_name": "OpenAI Codex CLI", "vendor": "OpenAI", "homepage": "https://developers.openai.com/codex", "binary_names": [ "codex" ], "args": [], "install": "npm i -g @openai/codex", "wire_protocol": "openai-responses", "injection": { "method": "env", "env": {} }, "skills": { "format": "skill-md", "user_dirs": [ "~/.codex/skills" ], "project_dirs": [] }, "command_hook": { "method": "codex-pretooluse", "file": "~/.codex/AGENTS.md" }, "attribution": { "header": "x-cave-agent" }, "tested_agent_version": "0.166.0", "injection_completeness": "code-only", "last_verified_at": "2026-11-02", "verified_by": "Windows x64 route probes (@openai/codex 0.166.0, Node 24.16.0; --version and --help exit 0): actual caveman wrap codex exec from two scratch homes sent POST /w/codex/v1/responses with dummy bearer auth, model gpt-5.5 from config.toml (no CLI model override), stream true; scripted SSE replies consumed, both exit 0. Attribution uses /w/codex; X-Cave-Agent header absent. API-key path with proxy/MCP/shrink/browse disabled; no subscription, compression, live-provider or task-quality verification", "fallback": "generic-env", "maintainer": null }, { "schema_version": "1", "id": "gemini", "display_name": "Gemini CLI", "vendor": "Google", "homepage": "https://github.com/google-gemini/gemini-cli", "binary_names": [ "gemini" ], "args": [], "install": "npm i -g @google/gemini-cli", "wire_protocol": "gemini-generatecontent", "injection": { "method": "env", "env": { "GOOGLE_GEMINI_BASE_URL": "{{cave_base_url}}", "GOOGLE_VERTEX_BASE_URL": "{{cave_base_url}}/vertex" } }, "command_hook": { "method": "gemini-beforetool" }, "attribution": { "header": "x-cave-agent" }, "tested_agent_version": "0.67.0", "injection_completeness": "declarative", "last_verified_at": "2026-11-06", "verified_by": "CI pinned-binary probe (gemini 0.67.0, agent-conformance pinned-upstream-binary lane on ubuntu-latest with Node 24.16.0, agents/probe-installed.mjs: --version and --help both exit 0); route probe last run on 0.65.0, not re-run on 0.67.0, from a scratch HOME with GEMINI_CLI_TRUST_WORKSPACE=true and security.auth.selectedType gemini-api-key in its settings: GOOGLE_GEMINI_BASE_URL redirection observed reaching POST /v1beta/models/{model}:generateContent (model-router classifier) and POST /v1beta/models/{model}:streamGenerateContent?alt=sse (the turn) under the injected base URL, carrying the key as x-goog-api-key, and the run completed (exit 0). The classifier's own call was answered by a generic stub rather than a schema-valid classifier response, so it exhausted its retries and fell back to the default model; the route and auth header are what this probe observed, not the classifier's verdict. NOT observed: an env-only launch -- with no selectedType, 0.65.0 (like 0.64.0 and 0.63.0) derives the gateway auth type from GOOGLE_GEMINI_BASE_URL and exits 41 \"Invalid auth method selected.\" before sending any request (re-confirmed on 0.65.0: zero requests reached the recorder)", "fallback": "generic-env", "maintainer": null }, { "schema_version": "1", "id": "hermes", "display_name": "Hermes Agent", "vendor": "Nous Research", "homepage": "https://hermes-agent.nousresearch.com/docs/", "binary_names": [ "hermes" ], "args": [ "--provider", "custom" ], "install": "curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash", "wire_protocol": "openai-chat", "injection": { "method": "env", "env": { "CUSTOM_BASE_URL": "{{cave_base_url}}/v1", "CUSTOM_API_KEY": "{{cave_api_key}}" } }, "command_hook": { "method": "hermes-plugin" }, "attribution": { "header": "x-cave-agent" }, "tested_agent_version": "0.23.0", "injection_completeness": "builder-assisted", "last_verified_at": "2026-11-06", "verified_by": "CI pinned-binary probe (hermes 0.23.0 = release tag v0.23.0 at 2bd378ed, installed with uv sync --frozen from that tag's uv.lock on Python 3.14, agent-conformance pinned-upstream-binary lane on ubuntu-latest, agents/probe-installed.mjs: --version and --help both exit 0). Both install details are required, not incidental: from 0.22 hermes gates every core dependency on python_version >= '3.14', so a 3.12 install carries none of them and --help fails importing ruamel (the 0.22.7 drift report, #1236), and pip cannot resolve it at all (Pillow==13.0.0 against browser-harness's pillow==12.3.0, settled only by the project's [tool.uv] override-dependencies). Launchability only: the hermes-plugin hook, the native config write and a routed model request were not exercised on 0.23.0", "fallback": "generic-env", "maintainer": null }, { "schema_version": "1", "id": "kilo", "display_name": "Kilo Code", "vendor": "Kilo Code", "homepage": "https://kilo.ai/docs/code-with-ai/platforms/cli", "binary_names": [ "kilo", "kilocode" ], "args": [], "install": "npm install -g @kilocode/cli@7.8.27", "wire_protocol": "openai-chat", "injection": { "method": "config-env-content", "env_var": "KILO_CONFIG_CONTENT", "config_content": { "local": { "provider": { "caveman": { "npm": "@ai-sdk/openai-compatible", "name": "Caveman Local Proxy", "options": { "baseURL": "{{cave_base_url}}/v1", "apiKey": "{env:OPENAI_API_KEY}", "headers": { "X-Cave-Agent": "kilo" } }, "models": { "gpt-5.5": { "name": "GPT-5.5 (via Caveman)", "tool_call": true, "limit": { "context": 1050000, "output": 32768 } }, "gpt-5.4-mini": { "name": "GPT-5.4 mini (via Caveman)", "tool_call": true, "limit": { "context": 400000, "output": 16384 } } } } }, "model": "caveman/gpt-5.5", "enabled_providers": [ "caveman" ] }, "managed": { "provider": { "caveman": { "npm": "@ai-sdk/openai-compatible", "name": "Caveman Gateway", "options": { "baseURL": "{{cave_base_url}}/v1", "apiKey": "{env:CAVE_API_KEY}", "headers": { "x-cave-upstream-key": "{{cave_optional_openai_key_env}}", "X-Cave-Agent": "kilo" } }, "models": { "gpt-5.5": { "name": "GPT-5.5 (via Caveman)", "tool_call": true, "limit": { "context": 1050000, "output": 32768 } }, "gpt-5.4-mini": { "name": "GPT-5.4 mini (via Caveman)", "tool_call": true, "limit": { "context": 400000, "output": 16384 } } } } }, "model": "caveman/gpt-5.5", "enabled_providers": [ "caveman" ] } } }, "attribution": { "header": "X-Cave-Agent" }, "tested_agent_version": "7.8.27", "injection_completeness": "declarative", "last_verified_at": "2026-11-06", "verified_by": "CI pinned-binary probe (kilo 7.8.27, agent-conformance pinned-upstream-binary lane on ubuntu-latest with Node 24.16.0, agents/probe-installed.mjs: --version and --help both exit 0); two route probes last run on 7.8.18 (PR #1416), not re-run on 7.8.27, from separate scratch homes and different loopback ports: this profile's own KILO_CONFIG_CONTENT local overlay made `kilo run --pure --format json` send POST /v1/chat/completions at the injected baseURL carrying X-Cave-Agent: kilo and the dummy OPENAI_API_KEY as Authorization: Bearer (model gpt-5.5, stream: true), receive the scripted SSE reply, and complete (exit 0). The model came from the profile, without a CLI model override. The overlay was rendered from the profile by hand rather than through the CLI's buildWrapEnv, so its base-config merge was not exercised; external plugins were disabled with --pure. No live provider or compression was tested", "fallback": "generic-env", "maintainer": null }, { "schema_version": "1", "id": "openclaw", "display_name": "OpenClaw", "vendor": "OpenClaw", "homepage": "https://github.com/openclaw/openclaw#readme", "binary_names": [ "openclaw" ], "args": [ "chat" ], "install": "npm i -g openclaw", "wire_protocol": "openai-chat", "injection": { "method": "config-file", "env_var": "OPENCLAW_CONFIG_PATH", "base_config": { "path": "~/.openclaw/openclaw.json", "env_var": "OPENCLAW_CONFIG_PATH", "state_dir": { "env_var": "OPENCLAW_STATE_DIR", "filename": "openclaw.json" } }, "config_overlay": { "local": { "mcp": { "servers": { "caveman": { "command": "caveman-mcp", "args": [] } } } }, "managed": { "mcp": { "servers": { "caveman": { "command": "caveman-mcp", "args": [] } } } } } }, "command_hook": { "method": "openclaw-plugin" }, "attribution": { "header": "x-cave-agent" }, "tested_agent_version": "2026.11.1", "injection_completeness": "builder-assisted", "last_verified_at": "2026-11-06", "verified_by": "CI pinned-binary probe (openclaw 2026.11.1, agent-conformance pinned-upstream-binary lane on ubuntu-latest with Node 24.16.0, agents/probe-installed.mjs: --version and --help both exit 0); config check last run on 2026.10.5, not re-run on 2026.11.1: `openclaw config validate` accepts this profile's injection.config_overlay.local passed as OPENCLAW_CONFIG_PATH (exit 0, \"Config valid\"), and a malformed control file is rejected (exit 1, JSON5 parse error). 2026.10.5 and 2026.11.1 both declare engines.node \">=24.16.0 <25 || >=26.1.0\", so neither will install on Node 22 or 25 at all -- the conformance lane's pinned 24.16.0 sits exactly on that floor. NOT observed: the ~/.openclaw/workspace SOUL.md and workspace-skill bootstrap, or any model request -- both need a live credentialed session", "fallback": "generic-env", "maintainer": null }, { "schema_version": "1", "id": "opencode", "display_name": "opencode", "vendor": "sst", "homepage": "https://opencode.ai/docs/config", "binary_names": [ "opencode", "opencode2" ], "args": [], "install": "npm i -g opencode-ai", "wire_protocol": "openai-chat", "injection": { "method": "config-env-content", "env_var": "OPENCODE_CONFIG_CONTENT", "config_content": { "local": { "$schema": "https://opencode.ai/config.json", "provider": { "openai": { "options": { "baseURL": "{{cave_base_url}}/v1", "headers": { "X-Cave-Agent": "opencode" } } }, "anthropic": { "options": { "baseURL": "{{cave_base_url}}/v1", "headers": { "X-Cave-Agent": "opencode" } } }, "opencode-go": { "options": { "baseURL": "{{cave_base_url}}/compat/opencode-go/v1", "headers": { "X-Cave-Agent": "opencode" } } } } }, "managed": { "$schema": "https://opencode.ai/config.json", "provider": { "caveman": { "npm": "@ai-sdk/openai-compatible", "name": "Caveman Gateway", "options": { "baseURL": "{{cave_base_url}}/v1", "apiKey": "{env:CAVE_API_KEY}", "headers": { "x-cave-upstream-key": "{env:OPENAI_API_KEY}", "X-Cave-Agent": "opencode" } }, "models": { "gpt-5.5": { "name": "GPT-5.5 (via Caveman)", "limit": { "context": 1050000, "output": 32768 } }, "gpt-5.4-mini": { "name": "GPT-5.4 mini (via Caveman)", "limit": { "context": 400000, "output": 16384 } } } } }, "model": "caveman/gpt-5.5" } } }, "command_hook": { "method": "opencode-plugin" }, "attribution": { "header": "X-Cave-Agent" }, "tested_agent_version": "1.19.5", "injection_completeness": "declarative", "last_verified_at": "2026-11-06", "verified_by": "CI pinned-binary probe (opencode 1.19.5, agent-conformance pinned-upstream-binary lane on ubuntu-latest with Node 24.16.0, agents/probe-installed.mjs: --version and --help both exit 0); route probe last run on 1.19.4, not re-run on 1.19.5: this profile's own config_content.local overlay loaded and POST /v1/responses reached the injected baseURL twice (title model and turn), each carrying X-Cave-Agent: opencode, run completed (exit 0)", "fallback": "generic-env", "maintainer": null }, { "schema_version": "1", "id": "pi", "display_name": "Pi", "vendor": "pi.dev", "homepage": "https://pi.dev/", "binary_names": [ "pi" ], "args": [], "install": "npm install -g --ignore-scripts @earendil-works/pi-coding-agent", "wire_protocol": "openai-chat", "injection": { "method": "native-extension", "host": "pi", "asset": "caveman-pi-extension", "loader_flag": "--extension" }, "command_hook": { "method": "pi-extension" }, "tested_agent_version": "1.0.4", "injection_completeness": "builder-assisted", "last_verified_at": "2026-10-06", "verified_by": "local pinned-binary probe (pi 1.0.4, agents/probe-installed.mjs); packages/pi-extension suite against pi-coding-agent 1.0.4", "fallback": "none", "maintainer": null }, { "schema_version": "1", "id": "qwen", "display_name": "Qwen Code", "vendor": "QwenLM", "homepage": "https://github.com/QwenLM/qwen-code", "binary_names": [ "qwen" ], "args": [ "--extensions=none" ], "install": "npm i -g @qwen-code/qwen-code@0.26.8", "wire_protocol": "openai-chat", "injection": { "method": "config-file", "env_var": "QWEN_CODE_SYSTEM_SETTINGS_PATH", "base_config": { "path": "~/.qwen/system-settings.json", "env_var": "QWEN_CODE_SYSTEM_SETTINGS_PATH", "platform_default": "qwen-system-settings" }, "config_overlay": { "local": { "providerProtocol": {}, "modelProviders": { "openai": [ { "id": "gpt-5.5", "name": "GPT-5.5 (via Caveman)", "envKey": "OPENAI_API_KEY", "baseUrl": "{{cave_base_url}}/v1", "generationConfig": { "customHeaders": { "X-Cave-Agent": "qwen" } } }, { "id": "gpt-5.4-mini", "name": "GPT-5.4 mini (via Caveman)", "envKey": "OPENAI_API_KEY", "baseUrl": "{{cave_base_url}}/v1", "generationConfig": { "customHeaders": { "X-Cave-Agent": "qwen" } } } ] }, "security": { "auth": { "selectedType": "openai", "enforcedType": "openai" } }, "model": { "name": "gpt-5.5", "baseUrl": "{{cave_base_url}}/v1" }, "modelFallbacks": "", "fastModel": "", "advisorModel": "", "visionModel": "", "compactionModel": "", "imageModel": "", "voiceModel": "", "disableAllHooks": true, "tools": { "webSearch": { "enabled": false, "model": "" }, "workflowsEnabled": false, "disabled": [ "agent", "skill", "web_search", "create_sub_session", "workflow" ] }, "agents": { "builtin": { "exploreModel": "inherit" }, "allowedGrades": [] }, "permissions": { "deny": [ "Agent", "Skill", "WebSearch", "CreateSubSession", "Workflow" ] }, "skills": { "disabledLevels": [ "project", "user", "extension", "bundled" ] }, "experimental": { "liveVoice": { "enabled": false, "apiKey": "", "model": "" } }, "slashCommands": { "disabled": [ "auth", "connect", "login", "model", "arena", "agents", "workflows", "settings", "config", "permissions", "skills", "voice", "extensions", "reload-plugins", "hooks", "mcp", "resume", "continue", "import-config" ] } }, "managed": { "providerProtocol": {}, "modelProviders": { "openai": [ { "id": "gpt-5.5", "name": "GPT-5.5 (via Caveman)", "envKey": "CAVE_API_KEY", "baseUrl": "{{cave_base_url}}/v1", "generationConfig": { "customHeaders": { "x-cave-upstream-key": "{{cave_optional_openai_key_env}}", "X-Cave-Agent": "qwen" } } }, { "id": "gpt-5.4-mini", "name": "GPT-5.4 mini (via Caveman)", "envKey": "CAVE_API_KEY", "baseUrl": "{{cave_base_url}}/v1", "generationConfig": { "customHeaders": { "x-cave-upstream-key": "{{cave_optional_openai_key_env}}", "X-Cave-Agent": "qwen" } } } ] }, "security": { "auth": { "selectedType": "openai", "enforcedType": "openai" } }, "model": { "name": "gpt-5.5", "baseUrl": "{{cave_base_url}}/v1" }, "modelFallbacks": "", "fastModel": "", "advisorModel": "", "visionModel": "", "compactionModel": "", "imageModel": "", "voiceModel": "", "disableAllHooks": true, "tools": { "webSearch": { "enabled": false, "model": "" }, "workflowsEnabled": false, "disabled": [ "agent", "skill", "web_search", "create_sub_session", "workflow" ] }, "agents": { "builtin": { "exploreModel": "inherit" }, "allowedGrades": [] }, "permissions": { "deny": [ "Agent", "Skill", "WebSearch", "CreateSubSession", "Workflow" ] }, "skills": { "disabledLevels": [ "project", "user", "extension", "bundled" ] }, "experimental": { "liveVoice": { "enabled": false, "apiKey": "", "model": "" } }, "slashCommands": { "disabled": [ "auth", "connect", "login", "model", "arena", "agents", "workflows", "settings", "config", "permissions", "skills", "voice", "extensions", "reload-plugins", "hooks", "mcp", "resume", "continue", "import-config" ] } } } }, "attribution": { "header": "X-Cave-Agent" }, "tested_agent_version": "0.26.8", "injection_completeness": "declarative", "last_verified_at": "2026-11-06", "verified_by": "CI pinned-binary probe (@qwen-code/qwen-code 0.26.8, agent-conformance pinned-upstream-binary lane on ubuntu-latest with Node 24.16.0, agents/probe-installed.mjs: --version and --help both exit 0); route check last run on 0.25.3, not re-run on 0.26.8: this profile's own config_overlay.local, rendered into the file named by QWEN_CODE_SYSTEM_SETTINGS_PATH with ENABLE_WEB_SEARCH=0 and QWEN_CODE_DISABLE_WORKFLOWS=1 as buildWrapEnv sets them, made `qwen --extensions=none -p` send POST /w/qwen/v1/chat/completions (X-Cave-Agent: qwen, model gpt-5.5) to a loopback recorder, and the run completed (exit 0). The overlay was rendered from the profile by hand rather than through the CLI's buildWrapEnv, so its base-config merge was not exercised", "fallback": "generic-env", "maintainer": null } ] }