model is required. Alongside it an agent names exactly one of two things, and
neither is optional:
Naming both is refused rather than resolved: an agent that names a provider while
running on somebody else’s credential lies to whoever reads it, and there is no
reading of it that bills the right account. Naming neither is refused too, in a
sentence saying which of the two to write. Both are checked when the run starts,
not at the moment
agent() runs.
”Harness decides” in the composer
The chip at the bottom right of the composer is the model for the messages you send in this chat.
The composer menu: Model, Effort, and Advanced
"selection": null.
Open Model and you get the catalogue this account may use, with Harness
decides checked at the top:

The model list. Picking one overrides the harness for this chat.
Effort
Effort is the reasoning ladder, and it only has rungs once a model is chosen: with Harness decides the menu offersDefault alone, because the ladder is a
property of the model and no model has been named yet.

With a model chosen, the effort ladder is that model's own
off, low, medium, high, max, and each model advertises
which of them it has and which is its default. A model whose catalogue row has no
such rung refuses the turn rather than quietly running at another one. In a
harness the same idea is the agent’s reasoning= field; both starter agents write
reasoning="max".
Choosing a model per turn
The declaration is the answer to “which model”, asked once when the run starts.hooks/model.py is the same question asked again on every turn:
programs/splox/hooks/model.py
model.choose
runs after context.build, so it overrides a model a context named, and it is
only consulted when the hook actually returns a name. See Hooks.
Endpoints, and your own keys
An endpoint is a credential plus the base URL it talks to. Every account sees the platform’s own four:
Writing
provider="anthropic" on an agent is how you ask for the platform’s
Anthropic credential; you never handle its key.
To run on your own, add it under Connections in the sidebar — “Connect a
provider API key, ChatGPT account, or custom OpenAI-compatible endpoint” — and
then name the endpoint on the agent by its id:
/v2/llm-endpoints.
The voice leg has its own two fields —
voice_llm_model and
voice_llm_endpoint_id — used when an agent is invoked with a destination number.
Most authors leave them out and reuse one endpoint for both legs.Agents
Every generation field: reasoning, output cap, temperature, caching, modalities.
LLM endpoints API
Discovering the endpoints and models available to a key.

