An agent is the voice that speaks after your route returns answer. The live session uses OpenAI only. The connection is a live WebSocket session. A model name has to be a gpt-live- model. The family value realtime is refused and the call does not start.
Create an agent
- Open Agents.
- Set an ID, for example agent-main. That string is what the route result puts in agent.
- Attach the tools this agent is allowed to call. The list is comma-separated tool IDs from the Tools page.
- Save.
The Prompt field is what makes the voice model hand work to a tool. How to write it, and what belongs in the router prompt instead, is on Agent prompt.
The live call uses the live model selected on the agent. The OpenAI name and the API key come from that model row. agents.token is not the key. Voice and language are on the voice page described below.
Voice, language, and limits
Open this address in the same browser session, after the host and port from admin.url:
/agent
That page is not in the left menu. It sets the agent name, the voice (the default voice is marin), the language, how many calls may run at once, the gain, and the maximum assistant length in seconds. The language selector on that form lists Slovak. Save, then restart if a field says it applies on the next start.
API key and model
Open Models and save the API key on the live row the agent uses. A call whose model has no key does not open the voice session. Trunks still register. Two live rows may share one OpenAI name and keep different keys.
The agent stores the integer id of that row. The OpenAI name is the row’s alias, for example gpt-live-1. A tool router stores a responses row the same way. The websocket key stays the live model’s key.
Rights
Open Rights. A new database contains right-1 through right-5. The route result is the only place that sets the right for a call. A tool may be offered only when it is on the agent and that right is allowed for the tool. An empty right means the call gets no tools. A tool result cannot replace the right. It stays for the whole call.
Tool routers
Each agent has one tool router. The built-in router tool-router-builtin does not call a URL. The live model stays a voice model. At session start the router prompt and the allowed tool schemas go to the text model (Responses). That model picks a tool and fills the arguments from the schema. It does not look for a tool name in the caller’s words. No token in the router prompt is replaced. {{ENABLED_TOOLS}} stays as you wrote it. Which tokens are filled, and in which field, is on Agent prompt.
An external router is a row you create. DotSIP calls it only when the scheme is https or wss and a URL is set. It POSTs dotsip.tool-router with the call id, the router id, the router prompt, the latest utterance, the caller, and the tools already filtered by the agent and the call right. Endpoint URLs are not included. The reply is tool and arguments. A name that was not offered, a timeout, or a non-object body means no tool is called.