~/.xynthis/config.toml; the active one is a single line you can change from the CLI, the app, or the file itself.
The config file
[models] active takes "<provider>" (uses that provider’s default_model) or "<provider>/<model>" for an explicit model. An optional [models] fast names a cheaper target the agent can use for low-effort follow-up turns; unset, every turn goes to active.
Each [providers.<name>] table supports:
| Field | Applies to | Meaning |
|---|---|---|
kind | all | How Xynthis calls the provider (see below) |
base_url | HTTP kinds | For openai-chat, the API root without /chat/completions; for anthropic-messages, the full /messages endpoint |
default_model | all | Model id used when the target doesn’t name one |
command, args, model_arg | subprocess | CLI to spawn, its fixed args, and the flag used to pass a model name |
lite | local models | Plain-chat mode for small models; see Local models |
launch_command | local models | Shell command that starts the provider’s local server; see Local models |
kind is one of:
anthropic-messages: Anthropic’s/v1/messagesAPI with an API key.openai-chat: any OpenAI-compatible/v1/chat/completionsendpoint: OpenAI, Ollama, llama.cpp, Groq, DeepSeek, Gemini, xAI, LM Studio, and self-hosted servers.subprocess: spawn an installed CLI such asclaudeorcodexand pipe the message through it. Uses the CLI’s own auth. Plain text only: no tool use, so the agent can’t act, only answer.claude-oauth: call Anthropic directly with the OAuth token the Claude Code CLI stores in the macOS Keychain. Billed against your Claude subscription, with full tool use; it is the working alternative tosubprocessfor agent work. Theclaude-fablepreset uses the same credential pinned to the Claude Fable model, so it appears as its own choice in the picker.codex-oauth: the equivalent for a ChatGPT subscription via thecodexCLI’s stored token. This targets a private, undocumented endpoint and may break without notice. The model set is what the ChatGPT account allows; unsupported model names are rejected with a 400.xynthis-llm: the on-device Xynthis model server on127.0.0.1:8080. See On-device model.echo: a deterministic, network-free fallback used when nothing else is configured.
Switching models
From the CLI:config.toml and restarts the daemon: the chat model is constructed at daemon startup, so the restart is what makes the switch take effect. Local providers that aren’t running are shown with a start action and are launched via their launch_command.
If you edit config.toml by hand, one-shot CLI commands pick the change up on their next run, but a running daemon does not. Restart it (or switch once from the app’s picker, which restarts it for you).
For a single invocation, override without touching config: xynthis --llm ollama/llama3.3 chat "...", or set XYNTHIS_LLM_OVERRIDE.
API keys
Three places a key can live, checked in this order:- macOS Keychain. The app’s Settings → Models tab stores keys under the
com.xynthis.appservice, one entry per provider (account<provider>-api-key). The CLI reads these too, so a key entered in the app works everywhere. macOS only. ~/.xynthis/auth.json.xynthis login <provider>prompts for a key interactively and stores it here.xynthis models add <provider> --api-key <key>does the same non-interactively.- Environment variables, via discovery:
xynthis auth scanfindsANTHROPIC_API_KEY,OPENAI_API_KEY,GROQ_API_KEY,XAI_API_KEY,DEEPSEEK_API_KEY, andGEMINI_API_KEY/GOOGLE_API_KEY, plus Claude/Codex OAuth tokens and running local servers (Ollama, LM Studio), and offers to wire what it finds into your config.
xynthis doctor diagnoses config, auth, and binary problems when a provider won’t respond.