Models
An agent doesn't name an API. It says what its model must support, and Kindgi picks a model from the providers registered for your tenant. A provider is one connection, to a vendor's API or to an endpoint you serve, with the models it offers: each model's features, context window and price.
- Connect Anthropic: Claude, from a preset.
- Connect Gemini on Vertex AI: Gemini, from a preset, with your Google Cloud credentials.
- Connect an OpenAI-compatible endpoint: Ollama or a hosted endpoint, from a spec file.
- Connect a model you serve: an open model on your own hardware or in your own network.
How a turn picks among them is on Choose the model an agent uses.
Before you register one
Section titled “Before you register one”A new pack's tenant has dev-echo, a stand-in that answers without a model
(it calls the agent's first tool and replies with what the tool returned). It's
a fallback: it answers only while no other provider fits the agent, so a
provider you register takes over at the next turn, with nothing to switch off
and no restart.
Presets
Section titled “Presets”kindgi providers presets[ { "name": "anthropic", "description": "Claude on the Anthropic API (key: ANTHROPIC_API_KEY).", "adapterId": "@kindgi/adapter-model-anthropic", "models": [ "claude-opus-5-5", "claude-sonnet-5-5", "claude-haiku-4-5" ], "secret": "ANTHROPIC_API_KEY", "pricesCheckedAt": "2026-10-01" }, { "name": "gemini", "description": "Gemini on Vertex AI (Google Application Default Credentials; --project=<gcp-project>).", "adapterId": "@kindgi/adapter-model-gemini", "models": [ "gemini-2.5-pro", "gemini-2.5-flash" ], "needs": [ "--project" ], "pricesCheckedAt": "2026-10-01" }]A preset carries its models' features, context windows and prices.
pricesCheckedAt is when the prices were last compared with the vendor's.
A provider spec
Section titled “A provider spec”Anything that isn't a preset registers from a spec: a JSON file you pass with
kindgi providers register --spec=@<file>.
{ "adapter_id": "@kindgi/adapter-model-openai-compat", "adapter_config": { "baseURL": "http://localhost:11434/v1" }, "metadata": { "id": "ollama", "region": "local", "models": [ { "name": "llama3.1", "contextWindow": 8192, "features": ["tool-use"], "cost": { "promptUsdPer1kTokens": 0, "completionUsdPer1kTokens": 0 } } ] }}adapter_idis the adapter's full package name.adapter_configholds the connection's settings, such as the endpoint's URL: flat keys with string, number or boolean values. Never a key.secret_refnames the secret that holds the key:{ "envName": "local", "name": "GROQ_API_KEY" }. Leave it out for an endpoint that takes none.metadata.idnames the connection; agents prefer it by this id.metadata.modelslists the models, by the name the endpoint knows them by, each with itscontextWindow, itsfeatures(what agents can require) and itscost.metadata.attributes(optional) are labels agents can rank by, such as"local";metadata.fallback: truemakes the provider a fallback, likedev-echo.
With kindgi dev, a provider's key is read from the pack's env files, .env
and then .env.local, when a turn calls the model. To store one without
echoing it, with kindgi dev running:
kindgi secrets set ANTHROPIC_API_KEY --env=local --scope=tenantIt prompts for the value and writes it to .env.local. In a script, pipe it
in with --from-stdin. To replace a key that's already set, add
--write-mode=add-version.
List, change and remove
Section titled “List, change and remove”kindgi providers list # every provider, with its modelskindgi providers list --feature=structured-outputkindgi providers get ollamakindgi providers unregister ollamalist and get show the metadata only, never adapter_config or the key. A
registration can't be edited: registering an id that exists is refused, so
unregister it first, then register the new spec.
Error [conflict]: Provider "ollama" is already registered