Bring your own AI
ToneCommand does not ship a model or require any particular vendor. The planner runs on whichever AI you already have, and every plan reports which backend and model answered it.
The quickest route is the gear icon in the app: pick a service by name (ChatGPT API, ChatGPT subscription, Gemini, Grok, DeepSeek, Kimi, a local model, OpenRouter), and the address fills itself in, the model box lists what your key can actually reach, and the panel says whether a key is needed at all. Everything below is the same configuration by hand, plus what each route honestly is.
Backend order
Natural-language planning tries, in order of preference:
- An OpenAI-compatible endpoint, if
PLANNER_BASE_URLis set (see below). A configured endpoint wins: choosing one is deliberate, while aclaudebinary onPATHis an accident of the machine. - The Claude Code CLI, if installed and signed in (usage bills to your existing Claude subscription). The default when nothing is configured - a fresh checkout needs no key.
- The Claude API: put
ANTHROPIC_API_KEY=sk-ant-...in a.envfile at the repo root.
A failed backend falls through to the next with its reason recorded.
Settings go in the environment or in .env at the repo root, the same file
the store whitelist uses:
| Variable | Default | Meaning |
|---|---|---|
PLANNER_BACKEND |
none | Pin one of openai, cli, grok, api and disable fallthrough. Required to reach the Grok CLI directly. |
PLANNER_BASE_URL |
none | OpenAI-compatible endpoint, including /v1. Setting it makes that backend first. |
PLANNER_MODEL |
local |
Model for the OpenAI-compatible path. |
PLANNER_API_KEY |
none | Only if your endpoint wants one. Often nothing is needed. |
PLANNER_MAX_TOKENS |
8192 |
Reply cap on the OpenAI-compatible path. Reasoning models need headroom. |
PLANNER_TIMEOUT |
180 |
Seconds allowed per backend attempt. |
GROK_CLI_MODEL |
none | Model passed to the grok CLI. Unset uses its own default. |
Using ChatGPT
Open the gear, choose ChatGPT, Gemini, or another service you choose, and click the ChatGPT API chip. That fills in the address. Paste a key from platform.openai.com and save, and the model box fills itself in with one your key can actually reach, picked from the service's own list. Change it from the dropdown if you want a different one.
A key is genuinely required on this route, and so is a model: with the box
blank the planner sends local, which a hosted service answers with a 404 for
a model nobody asked for.
Note that an OpenAI API key is a separate, pay-per-request account from a ChatGPT Plus subscription.
Using Gemini
Same panel, click the Gemini chip. The address it fills is Google's ChatGPT-compatible endpoint for the Gemini API. Get a key from Google AI Studio (aistudio.google.com), which takes about a minute, and its free tier covers tone planning. Save the key and pick a model from the list that appears.
Using Grok, DeepSeek or Kimi by key
Each has a chip that fills in its address; each needs its own per-request API
key (console.x.ai, platform.deepseek.com, platform.moonshot.ai). If you
already pay for Grok itself, the Grok CLI backend in the dropdown runs on
that subscription instead: install xAI's Grok CLI as its own documentation
directs (curl -fsSL https://x.ai/cli/install.sh | bash at the time of
writing), sign in, then set PLANNER_BACKEND=grok. Its replies are
constrained to the planner's JSON schema, which the Claude CLI path cannot
do. Verified against grok 1.0.5.
Using the ChatGPT subscription you already pay for
Choose ChatGPT subscription and click SHOW ME HOW. Each step has a DO IT FOR ME button; the only one you have to do yourself is signing in to your own ChatGPT account, which opens in your browser. The terminal command for every step is still there under or run it yourself, for anyone who would rather see what runs on their machine, or who is not on Homebrew.
It checks your machine after every step and will not advance on your say-so, so a step that silently failed is caught where it happened rather than at the next prompt.
It installs CLIProxyAPI, a
separate MIT-licensed service (brew install cliproxyapi), signs it into your
ChatGPT account over the normal OAuth flow, replaces the placeholder passwords
it ships with, and starts it as a background service. The app never runs any of
that itself: it shows you the command and verifies the result. The password is
derived from your machine and filled into the panel for you.
Proven end to end on a ChatGPT Plus account: a plan came back in 8.5s through
gpt-5.5 with three valid actions and no validation errors.
Two things worth knowing. OpenAI sells Codex for use through their own clients, and routing it into another app is not something they bless, so it could change without notice. And the same setup also covers Gemini, Grok and Kimi on their own logins.
A router, or a local model
Anything else goes through CLIProxyAPI run by hand. It is a separate MIT-licensed service, not bundled here and not a Python dependency. Log it into whichever upstream you want (Claude Code, Codex, Grok, Gemini, Kimi all authenticate over their own OAuth), then point this tool at it:
PLANNER_BASE_URL=http://127.0.0.1:8317/v1
The same setting reaches a local model instead: LM Studio defaults to
http://127.0.0.1:1234/v1, Ollama to http://127.0.0.1:11434/v1. An API key
is usually unnecessary: an OAuth router authenticates upstream on its own.
Two honest caveats
Only the Claude API and Grok CLI paths constrain output to the plan schema; the Claude CLI and OpenAI-compatible paths ask for JSON and are believed, which is why validation against the device reference is load-bearing rather than a safety net. And a weaker model proposes worse tones. It cannot hurt the rig, since nothing transmits without your confirmation, but it wastes your time.
Source: docs/AI-BACKENDS.md in the repository.