Model providers
Tares agents and Ask reason with a model. Which model, and whose, is a provider the instance holds under Settings → Model providers. An instance can hold several: one agent on Claude, another on GPT, a third on a model your own router serves. One provider is the default, what Ask and the guided setup run on and what an agent without a choice of its own uses.
Kinds
| Kind | What it is | You supply |
|---|---|---|
| Anthropic | Claude models through the Anthropic API, or a gateway that speaks its format | an API key; a base URL only for a gateway |
| OpenAI | GPT models through the OpenAI API | an API key; a base URL only for Azure or a proxy |
| OpenAI-compatible endpoint | anything that speaks OpenAI chat completions: LiteLLM, OpenRouter, Ollama, vLLM, Azure | a name, the base URL (ending in /v1), and a key if the endpoint wants one |
The add form has presets for LiteLLM, OpenRouter and Ollama that fill in the URL; Other takes any URL. Ollama and a local vLLM need no key: a base URL is enough.
What the picker offers
Saving a provider asks the endpoint which models it serves and stores the list, so the agent form offers exactly what your key can use. For a LiteLLM that is the aliases the key is allowed; for OpenRouter, Ollama and vLLM, everything they hold; for Anthropic and OpenAI, their current model lists, so a model newer than this release shows up without an upgrade. Refresh models on a provider’s row re-reads it after the admin adds an alias or the key’s allowance changes.
When the endpoint cannot be read the row says why (the key was rejected, the endpoint did not answer, no models endpoint at that URL), the last list is kept, and the built-in list stands in for Anthropic and OpenAI. An agent can always name a model by hand: when a provider lists nothing, the model field on the agent form is free text.
Per agent
The agent form has a provider picker next to the model picker. Leave the provider on the
cell default and the agent follows whatever the default is; pick one and the agent is pinned to
it. Leave the model empty and the agent runs on that provider’s default model: TARES_AGENT_MODEL
on Anthropic, else the first model the provider lists.
Every run records the provider and model it ran on, on the agent page and in the runs table, so the history stays readable after a provider is removed.
An agent that names a provider this instance does not hold, because it came from a template or a
catalog import, is not an error: it runs on the default, and the agent page says so until you
pick a provider that exists here. In catalog YAML the fields are provider (the id from Settings:
anthropic, openai, or the slug of an endpoint’s name) and model.
Cost
The spend meter on the Overview prices each run from the model that answered:
- Anthropic and OpenAI models from Tares’s own price table, by model family. Cached input is counted the way each API reports it.
- A router that reports its own cost wins over the table: OpenRouter in the reply, LiteLLM through its cost header when its cost tracking is on. Behind a router, the router’s bill is the truth.
- A model with no price (a local Ollama model, an alias Tares cannot read) records its tokens with no dollar figure, and the meter says how many calls were unpriced rather than showing zero.
Spend is split by provider on the Overview once more than one has run.
The environment
The console values win over the environment. A deployment can still seed providers:
ANTHROPIC_API_KEY=... # the Anthropic entry (ANTHROPIC_AUTH_TOKEN, ANTHROPIC_BASE_URL as before)
OPENAI_API_KEY=... # an OpenAI entry
OPENAI_BASE_URL=... # its base URL, for Azure or a proxy
TARES_MODEL_PROVIDER=openai # the default, when none is chosen in the console
TARES_AGENT_MODEL=... # the default model on the default providerThe Anthropic entry is the same key and gateway settings as before this release, under a new
door: an instance configured through ANTHROPIC_API_KEY or the older Model access tab shows up
as a configured Anthropic provider with nothing to redo.
Small and local models
Connecting a small open model is one provider entry. Whether it does the job is another matter. The agent loop hands the model tools over several rounds; a small model will sometimes write its tool call as JSON text instead of making a real call, mis-case a tool name, or answer with nothing. Tares runs a call written as text, matches a mis-cased name, and marks a run that ends with no conclusion and no tool call with a note to check that the model supports tool calling.
An 8B-class model on a laptop (llama3.1:8b on Ollama) produces a correct finding on a simple incident in about twelve seconds, and on an empty result it will invent events. Treat that size as a way to try things out. For root-cause work on real data, use a hosted model or a 30B-class one and above.
LiteLLM, two ways
A LiteLLM can sit in front of Tares in either of its formats:
- As an LLM gateway in the Anthropic format: the
base URL on the Anthropic entry, or
ANTHROPIC_BASE_URL. Tares sends Claude model ids; the gateway maps them. This is unchanged from earlier releases. - As an OpenAI-compatible provider: LiteLLM’s native format. The picker offers exactly the aliases the key may use, whatever sits behind them, and LiteLLM’s cost figure lands on each run.
The second is the natural one once an instance mixes models.