Reference
Configuration
panto reads layered config.toml files for providers, auth, defaults, TUI settings, and extension policy. Model aliases and pricing live beside them in a separate layered models.toml.
Files & layers
Four config.toml layers are merged, lowest precedence first. Missing files are skipped.
| Layer | Path | Role |
|---|---|---|
| base | $XDG_DATA_HOME/panto/config.toml · else ~/.local/share/panto/config.toml | Auto-generated defaults. |
| user | $XDG_CONFIG_HOME/panto/config.toml · else ~/.config/panto/config.toml | Machine-wide personal settings. |
| project | ./.panto/config.toml | Checked-in project defaults. |
| local | ./.panto/config.local.toml | Personal per-project overrides. |
Merge rule of thumb: tables merge recursively; scalars and arrays from a higher layer replace lower-layer values. One important exception is [extensions]: its allow/deny rules and source lists accumulate across layers so policy and extra extension sources can be refined instead of erased.
[defaults]
model = "anthropic:sonnet"
reasoning = "high"
[tui]
editor = "code -w"
tools_collapsed = false
[providers.anthropic]
style = "anthropic_messages"
base_url = "https://api.anthropic.com"
auth = "anthropic_api"
[auth.anthropic_api]
key = "${env:ANTHROPIC_API_KEY}"[providers.<name>]
A provider describes transport only: API shape, base URL, auth session, and a few request-level knobs. The provider name is the left half of a provider:alias model reference.
anthropic_messages, openai_chat, or openai_responses.openai_responses, the only current dialect is "codex".[auth.<name>] session used for this provider.cache_control breakpoint.panto models sync.[providers.copilot]
style = "openai_chat"
base_url = "https://api.individual.githubcopilot.com"
auth = "github_copilot"
[providers.copilot.extra_headers]
Copilot-Integration-Id = "vscode-chat"
X-Initiator = "user"[auth.<name>]
Auth sessions are named, reusable credential sources. If type is omitted, panto infers it from the fields present: key implies api_key; client_id implies oauth_device.
Substitution
Every auth value supports ${...} substitution. ${env:VAR} reads the environment; ${name} reads another key in the same auth block. Unresolved substitutions become the empty string.
API-key sessions
"${env:VAR}". Resolved eagerly at load time.OAuth device sessions
codex additionally requires device_poll_url.[defaults]
"<provider>:<alias>".Model selection falls through in this order: --model, then [defaults] model, then the single-provider/single-alias convenience case. Reasoning falls through similarly: --effort beats a per-alias setting in models.toml, which beats [defaults] reasoning.
[tui]
$VISUAL / $EDITOR for Ctrl+G.Extensions policy & sources
[extensions] governs every Lua-authored capability, including the shipped standard tools. The names you match are extension entry names such as std.read, std.write, std.edit, and std.shell.
deny wins an exact tie.panto update installs or refreshes them.[extensions]
deny = ["std.shell"]
paths = ["./dev/panto-ext"]
rocks = ["panto-agent 1.4.2-1"][compaction]
provider:alias override for the compaction model.models.toml
models.toml is layered just like config.toml: base at $XDG_DATA_HOME/panto/models.toml, then user, project, and ./.panto/models.local.toml. Each entry is keyed [<provider>.<alias>]. If an alias is missing entirely, panto simply uses the alias itself as the wire model name.
Common keys
OpenAI-style knobs
openai_chat and openai_responses: default, off, minimal, low, medium, or high.Anthropic-style knobs
disabled, enabled, or adaptive.low, medium, high, xhigh, or max.System prompt
Prompt files are layered beside the extension tree: base under $XDG_DATA_HOME/panto/agent/, then user, then project. The conventional files are SYSTEM.md, APPEND_SYSTEM.md, and COMPACTION.md.