The three suppliers
openrouter is a gateway to other suppliers.
A fresh installation with no config.toml runs on the default model of the provider you signed in to. Override the wire family, the base URL and the default model per provider under [providers.<name>] in config.toml. Your file wins on any collision with the catalog in the binary.
Run narya providers to list the providers, and narya models to list the models.
Where your key comes from
Narya spends your organization’s key first, when one is stored, and this machine’s own key otherwise. A key typed into a client is your organization’s: Narya stores it encrypted, and every member’s turns spend it. Storing one needs the
keys:manage permission. narya auth login stores this machine’s own key.
Narya derives the environment variable name from the provider name, uppercased, plus _API_KEY. So anthropic reads ANTHROPIC_API_KEY, openai reads OPENAI_API_KEY, and openrouter reads OPENROUTER_API_KEY.
Narya reads this machine’s key from three tiers, in order:
- The environment variable, which wins on every read.
- The operating system keychain: macOS Keychain or Linux Secret Service.
- A per-provider file with
0600permissions undercredentialsin your Narya home. Narya uses this tier only on a machine with no keychain backend at all.
Sign in
Run
narya auth login <provider> to store a key, and narya auth logout <provider> to remove it. Narya probes a typed key against the provider before it stores anything.
Add --method key to type a key, or --method subscription for a browser sign-in. Browser sign-in works for anthropic only, against claude.ai and platform.claude.com.
What leaves your machine
Narya sends your prompts, the files it reads, and tool results to the model supplier you configure, with the key it spends. Lerian operates no endpoint in that path. Narya also reaches these hosts:
models.dev, for a model catalog refresh every 12 hours, and each provider you configured, for aGET /v1/modelslisting. SetNARYA_MODELS_URL=offto stop both. The refresh never blocks a turn, and a failure goes to the host log alone.- The two browser sign-in hosts above, during a sign-in.
- The identity provider in your
[identity]settings. - The address in
[identity] plane_url, when you set one. The host reads your organization’s settings there every 15 minutes, and a share finds your organization’s home there. A session you share goes to that home. - A release host, on an explicit upgrade command.
- Any host the model names through its
fetchtool. That call runs under the network rule, which asks first. Narya reads at most 5 MiB and waits at most 30 seconds. - The supplier’s own web search, which runs on the supplier’s side under the same key. Narya offers it to the
anthropicandopenaiproviders, and only against the supplier’s own endpoint. The network ask does not reach it.deny network **turns it off, and a per-host rule narrowsfetch, never the search. An unattended run searches only where the rules allow every host. - The tool servers, OpenAPI tool trees and PDF converter you declare. See Extending Narya.
- Registered extensions and packages. The host sends every registered extension the prompts, tool arguments and tool results of the sessions it covers.
narya ext adddownloads the package’s Go module from the module source. - The OpenTelemetry collector you name under
[telemetry]or inOTEL_EXPORTER_OTLP_ENDPOINT. Telemetry is off until you name one.
Cost
Prices come from a
models.dev snapshot inside the binary, in US dollars per million tokens. A model with no published price reports no cost. It never reports a zero.
Run narya records usage --from <time> --to <time> for tokens and cost per group. An incomplete total prints with a >= marker.
Narya sets two spending ceilings by default:
$5.00per scheduled fire, as[schedules] ceiling_usd.$20.00per owner per UTC day, as[schedules] daily_ceiling_usd.

