Skip to content

Choose the coding agent

You'll learn which coding agents a conductor can launch, how to pick one per project and per ticket, and what each agent needs installed on the conductor's machine.

The agent is a surface, filled by an addon. A conductor's engine config lists one or several agent addons; at dispatch the conductor scores them for the ticket at hand and launches the winner. Nothing else in the loop knows which agent it is talking to.

The agent addons

AddonLaunchesFootprint
@gaia-ai/addon-claudeClaude Codeparsed from the real transcript
@gaia-ai/addon-codexOpenAI Codex CLIparsed
@gaia-ai/addon-pipiparsed
@gaia-ai/addon-kimiKimistubbed — an empty footprint until the parser lands
@gaia-ai/addon-opencodeOpenCodestubbed
@gaia-ai/addon-grokGrok Buildships as a conductor agent addon

The footprint is what a run reports for billing — tokens, duration, turns, tool calls, model. An agent whose footprint is stubbed still works; its runs just report zeroes.

Every agent addon launches that vendor's own CLI inside the run's tab. The CLI must be installed and authenticated on the conductor's machine — the addon starts it, it does not ship it. A conductor that can only run Claude Code lists only the Claude addon.

One agent for the project

The simplest engine config names one agent:

js
// .gaia/conductor.config.js
agent: { plugin: '@gaia-ai/addon-claude' },

Every run of every ticket this conductor claims uses Claude Code.

Several agents, chosen per ticket

agent may also be an array of candidates. A candidate is either a bare descriptor or a { agent, priority } wrapper, where agent is the descriptor and priority(ticket) a function. At dispatch the conductor calls every candidate's function with the ticket — enriched with its labels as a list of label names and its environments — sorts highest score first and launches the top one. Ties go to the earlier entry.

js
agent: [
  { agent: { plugin: '@gaia-ai/addon-claude', with: { model: 'claude-opus-4-8' } },
    priority: () => 0 },
  { agent: { plugin: '@gaia-ai/addon-codex' },
    priority: (ticket) => ticket.labels.includes('codex') ? 100 : -Infinity },
],

With that config a ticket labelled codex runs on Codex; everything else runs on Claude Code.

Only the wrapper carries a priority

A priority written beside plugin in a bare descriptor is ignored — the loader reads it only from the { agent, priority } wrapper. A candidate without a priority scores -Infinity; it wins only when every candidate scores that low, and then the first in the list wins. Give your default agent an explicit baseline such as () => 0, and let conditional candidates return a higher score when they apply.

The labels GAIA ships for this — codex, kimi, kimi-opencode, pi, grok — are just terms on the control plane; which of them your conductor honours is decided entirely by the priority functions in its engine config. See Labels & work types.

The ticket-create agent

The agent that gaia ui starts when you hand a new ticket to it is not a run and does not go through the engine config. The cockpit launches a command from your machine context, ~/.gaia/machine.config.js: the agent_command key names the binary, and it defaults to claude. Set it to another agent's CLI to create tickets with that agent instead:

js
// ~/.gaia/machine.config.js
export default { /* … */ agent_command: 'codex' };

Next