agents

The coding CLIs Ringlet runs.

Out of the box, Ringlet recognises five major coding agents. Each is wired to a wire format (Anthropic-shaped or OpenAI-shaped) so Ringlet knows which env vars to inject and which usage events to count.

Claude Code

$claude
Anthropic-shaped

Anthropic's official coding CLI. Ringlet pipes ANTHROPIC_BASE_URL + ANTHROPIC_API_KEY at run-time per profile.

Providers:
  • anthropic
  • minimax
  • openrouter

Codex CLI

$codex
OpenAI w/ tools

OpenAI's repo-aware CLI. Ringlet injects OPENAI_API_KEY and a profile-specific cache directory.

Providers:
  • openai
  • openrouter
  • groq

Grok CLI

$grok
OpenAI w/ tools

xAI's CLI. OpenAI-compatible — same provider matrix as Codex.

Providers:
  • openai
  • openrouter
  • custom

Droid CLI

$droid
Anthropic-shaped

Factory's coding agent. Claude-shaped: works wherever Claude Code works.

Providers:
  • anthropic
  • minimax

OpenCode

$opencode
Anthropic-shaped

Community-driven OSS coding agent. Same Claude-shaped wire format.

Providers:
  • anthropic
  • minimax
  • openrouter

How Ringlet binds an agent to a provider

At launch, Ringlet looks up the agent's wire format and writes the corresponding environment variables before exec'ing the binary. The agent's own config never changes.

Anthropic-shaped agents

Claude Code, Droid, OpenCode. Ringlet sets:

env
HOME=~/.ringlet/profiles/
ANTHROPIC_API_KEY=
ANTHROPIC_BASE_URL=
ANTHROPIC_MODEL=   # optional

Pointing Claude Code at MiniMax is just --provider minimax on create: Ringlet writes ANTHROPIC_BASE_URL=https://api.minimax.io/anthropic and pulls the MiniMax key from the keychain.

OpenAI-shaped agents

Codex CLI, Grok CLI. Ringlet sets:

env
HOME=~/.ringlet/profiles/
OPENAI_API_KEY=
OPENAI_BASE_URL=
OPENAI_MODEL=      # optional

Adding a custom agent

Define the agent in a TOML stanza under ~/.config/ringlet/agents/<name>.toml. The registry will pick it up on the next sync, and profiles create <name> ... just works.

~/.config/ringlet/agents/aider.toml
name        = "aider"
binary      = "aider"
shape       = "openai-tools"
providers   = ["openai", "openrouter", "custom"]
usage-path  = "~/.aider/history.json"   # for ringlet import
default-key = "openai/default"

What about agents Ringlet doesn't know about?

Use ringlet profiles create generic <name> --binary <path>. You lose usage parsing (no shape-aware event reader), but isolation and provider switching still work. File an issue on GitHub and we'll add it to the registry.

next

See the providers each agent can talk to.

Anthropic-shaped agents to MiniMax. OpenAI-shaped agents to Groq. Any agent to your own gateway.