Skip to content

Multi-Provider Architecture

Agents run on Claude, OpenAI (Codex), or Gemini. Provider selection is per-agent in the registry.

Provider Distribution

  • Claude (51 agents): Primary. CLI: @anthropic-ai/claude-code
  • OpenAI/Codex (4): margot, benjamin, jouke, dinand. CLI: @openai/codex
  • Gemini (1): felice. CLI: @google/gemini-cli

Source of truth for agent→provider mapping: ge-ops/master/AGENT-REGISTRY.json (provider + providerModel fields)

Config Files

File Controls Read By
config/providers/claude.yaml Claude CLI execution profile Executor (provider_config.py)
config/providers/openai.yaml Codex CLI execution profile Executor (provider_config.py)
config/providers/gemini.yaml Gemini CLI execution profile Executor (provider_config.py)
config/provider-instructions/AGENTS.md Codex native instructions Injected into Codex sessions
config/provider-instructions/GEMINI.md Gemini native instructions Injected into Gemini sessions
config/provider-settings/codex-config.toml Codex CLI config Codex CLI reads at startup
config/provider-settings/gemini-settings.json Gemini CLI config Gemini CLI reads at startup

How It Works

  1. Executor receives trigger for agent
  2. Fetches agent config from admin-ui API (includes provider + model)
  3. provider_config.py loads the provider YAML profile
  4. Profile defines: CLI command template, native config paths, constitution handling
  5. Prompt builder adapts: Claude gets full constitution; OpenAI/Gemini get universal principles only (quality gate in native instructions file)
  6. CLI invoked via PTY with provider-specific flags

Constitution Handling

  • Claude: Full constitution in prompt (constitution_handling: full)
  • OpenAI/Gemini: Universal principles (1-5) in prompt; quality gate + turn budget in native instructions file (constitution_handling: universal_only)

Changing an Agent's Provider

  1. Update provider and providerModel in AGENT-REGISTRY.json
  2. Update via admin-ui: PATCH /api/agents/{id}/provider
  3. Executor picks up the change on next trigger (no restart needed)