How it works
Every time your SDK flushes a batch of events toPOST /v1/ingest, the response body includes a cv (config version) integer:
cv value to the last version it fetched. If the server version is higher, the SDK makes a single background request to GET /v1/sdk/config and applies the returned configuration rules immediately — without blocking any LLM call in progress.
What can be propagated
The following SDK behaviors can be updated at runtime via config propagation:
Config rules are scoped to a project. Changes you make via ZespanPilot apply to all instances of your application using that project’s API key.
Updating config from ZespanPilot
The only way to push a config change today is through ZespanPilot, the AI copilot accessible via ⌘J in the dashboard. You can ask it in plain English:- “Switch all GPT-4o calls to GPT-4o-mini”
- “Set the sample rate to 20% for the production project”
- “Add a fallback to GPT-4o-mini if the checkout-agent operation errors”
- “Enable guardrails on the support-agent project”
cv counter. Within the next flush cycle, all running SDK instances pick up the change.
Turning config propagation on or off
Config propagation is gated by two init options, and the default differs by language.- TypeScript
- Python
Config propagation is active whenever
projectId is set — enableZespanPilot defaults to true. Set it to false to opt out even with projectId present:cv field in ingest responses and never fetches remote config. All behavior is determined solely by the options passed to init(). See the TypeScript SDK reference or Python SDK reference for the full option list.
Reading config programmatically
Everything above happens automatically — the SDK applies incoming rules to your LLM calls without any code on your part.ConfigClient also exposes a direct read and subscribe API, for cases where you want to inspect the config currently in effect or react to a change yourself (for example, logging which model is active for an operation, or emitting your own metric when a fallback kicks in).
Getting the client instance
In TypeScript, the client exposesconfigClient as a public property — it’s null if config propagation is disabled (see Turning config propagation on or off above).
In Python, the wired instance is held on the client’s _config_client attribute. There’s no public property wrapping it yet, so access it directly on the object returned by get_client().
Accessor methods
All accessors read from the config already applied locally — none of them make a network call.
Subscribing to config changes
Both languages exposeon(event, callback) to run code when a specific part of the config changes. Python also exposes off(event, callback) to deregister a listener; TypeScript’s ConfigClient doesn’t currently have an off() method.
The callback receives the full updated value for that field — for example, a model_override listener receives the complete map of operation → model, not just the entry that changed.

