Skip to main content
Cynative routes every LLM call through the embedded Bifrost SDK, which provides a uniform chat interface over all supported backends. This means you bring your own model (BYOM): point Cynative at any provider you already have access to — a cloud API, a managed inference endpoint, or a GPU on your desk — and Cynative adapts to it. No provider is hard-wired; the model selection is entirely yours.

Quick start

Three environment variables are all you need for the most common case:
No ~/.cynative/config.yaml file is needed for the simple path. Write YAML only when you need fields the env-var surface does not cover (e.g. extra_headers, multi-key load balancing, or advanced provider configs).

Provider catalog

Shared YAML reference

Every provider uses the same flat llm: block in ~/.cynative/config.yaml. Fields marked optional may be omitted; Cynative and Bifrost supply sensible defaults.
Reasoning fields are provider-portable: providers without reasoning support silently ignore them, though a model that doesn’t support reasoning may still reject the parameter upstream on providers that forward it for every model (e.g. OpenAI-style APIs). reasoning_effort maps to the provider’s native effort knob; reasoning_max_tokens sets an explicit thinking budget (Anthropic-style providers use it directly; OpenAI-style providers convert it to an estimated effort level). Gemini additionally validates an explicit budget against a per-model range at request time. Setting reasoning_effort: none together with reasoning_max_tokens is rejected at config validation.

Common environment variables

Every YAML config field is settable via a CYNATIVE_* environment variable. Maps and slices require YAML (e.g. network_config.extra_headers, keys[]). Everything else — including all identity selectors — is env-bindable.

Core selectors

Network and timeout

Reasoning

Provider-specific identity fields

Any nested Bifrost field is reachable by upper-snake-casing its JSON path: CYNATIVE_LLM_<PATH> — for example, CYNATIVE_LLM_NETWORK_CONFIG_MAX_CONNS_PER_HOST or CYNATIVE_LLM_OPENAI_CONFIG_DISABLE_STORE.

Prompt caching

Cynative always marks the stable prefix of every request with ephemeral cache breakpoints — the tool schemas, the system prompt, and the last two conversation turns. Anthropic-family providers (anthropic, bedrock, vertex with Claude) cache that prefix and bill cached reads at a large discount. The cache window is Anthropic’s default five-minute ephemeral TTL, so back-to-back calls (e.g. --auto-approve runs) benefit most; long human-approval pauses between tool calls may let the cache expire and re-pay the write cost. All other providers: Bifrost’s converters strip or ignore the cache markers. Providers that auto-cache server-side (OpenAI, Gemini) continue to do so regardless — Cynative’s markers don’t interfere. There is nothing to configure. Prompt caching is on for all providers and inert where unsupported.
Bifrost exposes two additional knobs — CYNATIVE_LLM_PROMPT_CACHE_AUTO_INJECT and CYNATIVE_LLM_PROMPT_CACHE_TTL — which synthesize breakpoints for clients that emit none. Both are off by default and do nothing for Cynative, because Bifrost skips auto-injection once the caller has already marked the request, which Cynative always does.

Troubleshooting

Request timeouts

Non-streaming LLM calls default to a 300-second per-request timeout — Cynative’s default, replacing Bifrost’s 30-second default, which is too short for the long, reasoning-heavy completions a research run produces. Override the timeout with the YAML field:
Or via environment variable:
On a timeout, the underlying error message comes from Bifrost and references default_request_timeout_in_seconds, network_config, and a “Providers > Provider Name > Network Config” UI. That wording is Bifrost’s internal copy (it even hard-codes “30 seconds” regardless of the effective timeout). Cynative has no such UI — the knob you want is network_config.default_request_timeout_in_seconds as shown above.

Rate limits and retries

LLM calls automatically retry retryable failures — HTTP 429/500/502/503/504, provider-level rate-limit errors, and transient network errors — up to 3 times with exponential backoff (500 ms initial delay, 5 s maximum). This is Cynative’s default, replacing Bifrost’s 0-retry default, under which a single rate-limit blip fails the whole turn. Request timeouts are not retried. Override the retry count:
Or via environment variable:
If a run still ends with a “rate limited / out of quota (HTTP 429)” error after retries, the provider account’s quota or billing limit was reached. Check your provider dashboard, or wait and retry later.