Executors
agenix agents shows the up-to-date list. The matrix:
| Agent | Native configs | Local models | Auth |
|---|---|---|---|
| claude-code | CLAUDE.md, .claude/skills/, .mcp.json | via gateway | subscription / key |
| codex | AGENTS.md, .codex/config.toml | --oss / providers | subscription / key |
| cline | .clinerules/ | Ollama, LM Studio, … | key |
| openhands | .openhands/microagents/repo.md | litellm | key |
| aider | CONVENTIONS.md, .aider.conf.yml | litellm | key |
| goose | .goosehints | Ollama and others | key |
| opencode | AGENTS.md, opencode.json | many providers | key |
| qwen-code | QWEN.md, .qwen/settings.json | local Qwen | subscription / key |
| mini-swe-agent | KNOWLEDGE.md (+prompt) | litellm | key |
| gemini-cli | GEMINI.md, .gemini/settings.json | none | subscription / key |
How an adapter works
Four operations (src/adapters/base.ts):
materialize(profile, kb, workspace)— write the native configs;buildCommand(profile, prompt)— non-interactive single-task run;buildEnv(profile, apiKey)— model/gateway connection variables;run(...)— the shared loop: materialization → process → RunResult.
Adding a new executor = one file with these methods + registration in registry.ts.
Live testing status
The full smoke (2/2) has passed for seven executors: claude-code (subscription, no gateway), codex (ChatGPT subscription, model.id: builtin, no gateway), cline, openhands, goose (via the LiteLLM gateway on open-source models), mini-swe-agent and qwen-code (OpenRouter directly, key from the agenix store).
Special cases:
- aider — applies edits flawlessly (hello-file PASS on all models), but does not execute proposed shell commands in headless mode without a TTY — that is by design; don't give it "run a command" tasks;
- opencode — config/models/permissions compile correctly, the model returns tool calls, but headless
opencode run(v1.16–1.17) doesn't execute them — an upstream bug, track via opencode releases; - swe-agent — deferred (the PyPI package is broken, official install is from git); gemini-cli — not exercised (requires a Google login).
Notes
- codex: in subscription mode
CODEX_HOMEis not overridden (the OAuth token lives there), the model is passed via-m; in key modeCODEX_HOMEpoints at the workspace and the profile fully controls the provider and MCP viaconfig.toml. - cline (verified live on CLI 3.x): the adapter configures the provider via
cline authinto an isolated--data-dirinside the workspace — global state is untouched. Cline sendsstream_options, which strict providers reject — go through a LiteLLM proxy withadditional_drop_params: ["stream_options"](example:examples/gateway/litellm-ghmodels.yaml); the proxy'sbaseUrlmust include/v1. - openhands (verified on CLI SDK v1.21): install the
openhandspackage (notopenhands-ai— that one has no CLI binary). The key flag is--override-with-envs: without itLLM_MODEL/LLM_API_KEY/LLM_BASE_URLare silently ignored. Mind the size of the OpenHands system prompt (>8k tokens) — models with a small request limit (e.g. the GitHub Models free tier) won't work. - aider: install on Python ≤ 3.12 (
uv tool install --python 3.12 aider-chat) — on 3.13 it crashes due to theaudioopmodule removed from the stdlib. - free cloud open-source models: GitHub Models (
baseUrl: https://models.github.ai/inference, the key is a regular GitHub token, see profiles/aider-ghmodels.yaml). Mind the strict rate limits of the free tier: single runs pass, a series of back-to-back evals hits 429. - mini-swe-agent: intentionally minimal (no rule files or MCP) — knowledge is supplied as
KNOWLEDGE.mdreferenced in the prompt; an ideal cheap "test subject" for evolve experiments.