Agents
Agent tab
The Agent tab holds what the caller hears first and how the agent should behave: its name, welcome message and prompt, with {variables} you fill in for each call.
Fields
| Field | Type | Default | Limits | What it does |
|---|---|---|---|---|
name | string | required | 1 to 120 characters | Shown in the console, on calls (agent_name) and in the ledger. The caller never hears it unless your prompt says it. |
welcome_message | string | "" | none | Spoken as soon as the call connects, before the caller says anything. Leave it empty and the agent waits for the caller to speak first. |
system_prompt | string | "" | none | Instructions for the LLM: who the agent is, what it must do, and how. |
{
"name": "Front desk",
"welcome_message": "Namaste {customer_name}, City Clinic se baat kar rahi hoon. Main aapki kya madad kar sakti hoon?",
"system_prompt": "You are Priya, the receptionist of City Clinic in Pune.\nHelp the caller book, move or cancel a visit.\nThe clinic is open 9 am to 7 pm, Monday to Saturday.\nIf the caller asks about medicine or a diagnosis, say a doctor will call them back."
}
The model cards and presets
At the top of the Agent tab, three cards sum up the agent’s models: Transcriber (speech to text, with its provider and language), Model (the LLM) and Voice, each with its provider. The pencil on a card opens its tab.
Below them, Cost per min (approx) shows what a typical minute of a phone call with these models costs, split into Transcriber, LLM, Voice, Telephony and Platform. Hover or tap the bar for each part in ₹ per minute. It updates as you change models, before you save. When the usage comes to less than your plan’s price per minute, the plan’s price is shown with Minimum price for your plan. Calls are charged for what they really use; see Limits and billing.
Model presets set all three models at once: Balanced, High intelligence (the most capable LLM), Ultra fast (the quickest model of each kind) and Cost saver (the cheapest of each kind). They only use models and providers your workspace can use. When the agent’s models match no preset, Customized is shown. A preset changes only the models; save the agent to keep it.
The same data is in the API:
curl https://api.vaakyo.com/api/v1/catalog/models -H "X-API-Key: $VAAKYO_API_KEY"
curl https://api.vaakyo.com/api/v1/agents/$AGENT_ID/latency -H "X-API-Key: $VAAKYO_API_KEY"
{"calls": 12, "replies": 87, "llm_first_token_ms": 520, "first_audio_ms": 790, "tts_ms": 270}
/catalog/models returns profiles (per model: kind, latency_ms, cost_paise_per_minute, quality_label, quality_value), presets and your price_per_minute_paise. A model matches the profile with the longest model prefix.
Editing the prompt
The prompt is stored as Markdown text. The console’s System prompt editor has two views of the same text:
- Visual shows headings, lists, bold and italic as formatted text, and highlights
{variables}. - Code shows the raw Markdown, with heading and list markers dimmed.
Switching views never changes the prompt. Editing in Visual saves the Markdown in a normal form (for example, a blank line after each heading). Markdown the Visual view can’t show, such as a table, makes it read-only; edit those prompts in Code.
The toolbar has find (also Ctrl+F or Cmd+F), undo and redo, the block type (normal text, heading 1 to 3), bold, italic, bulleted and numbered lists, and {} to insert a variable. Typing { opens a list of the agent’s variables and {caller_phone}; keep typing to filter it, or type a new name. The footer shows roughly how many tokens the prompt is (about four characters per token). The expand button opens the editor full screen.
Markdown helps the LLM follow a long prompt. It isn’t read aloud: the voice rules Vaakyo adds tell the agent to speak without lists or symbols.
Generate a prompt
Generate writes a prompt for you. Describe the agent (who it is, what it should do, the language), or ask it to improve the current prompt. The LLM returns a structured prompt with these sections: Identity, Language, Goal, What to collect, Rules, Confirmation and Constraints. It also suggests a welcome message. Preview the result, then Replace prompt or Insert at cursor. Nothing is saved until you save the agent.
curl -X POST https://api.vaakyo.com/api/v1/agents/prompt/generate \
-H "X-API-Key: $VAAKYO_API_KEY" -H "Content-Type: application/json" \
-d '{"description": "A receptionist for Smile Dental in Pune that books appointments, in Hinglish", "variables": ["customer_name"]}'
{
"prompt": "## Identity\nYou are Asha, the receptionist at Smile Dental, Pune...",
"welcome_message": "Namaste {customer_name}, Smile Dental se Asha baat kar rahi hoon.",
"model": "gemini-3.5-flash-lite",
"tokens": {"input": 612, "output": 438}
}
| Field | Type | Default | What it does |
|---|---|---|---|
mode | string | create | create writes a new prompt from description (10 characters or more); improve rewrites current_prompt, following description if given. |
description | string | "" | What the agent should do, up to 4,000 characters. |
current_prompt | string | "" | The prompt to improve. Its {variables} are kept. |
agent_name, language | string | "" | Optional context. |
variables | array of strings | [] | Variables the prompt may use. |
It needs the agents.edit permission. A failed or empty answer from the model returns 502; try again.
Fallbacks
If the voice or the transcriber fails during a call, backups can take over for the rest of the call. Set them under Fallbacks on the Agent tab. See fallback voices and fallback transcribers.
Variables
Any {name} in the welcome message or prompt is a variable. A name starts with a letter or underscore and contains only letters, digits and underscores, for example {customer_name} or {slot_2}.
- Filled per call. For outbound calls, values come from
user_datain the place-call request. For browser calls, from the test call form. Inbound calls have nouser_data. {caller_phone}is always set. It is the number being called (outbound) or the number calling in (inbound). It is empty for browser calls.- Every variable is optional. A variable with no value becomes an empty string; the raw
{name}is never spoken. Vaakyo also tells the LLM which variables were not provided, so it can ask the caller instead of guessing. - The agent lists its variables. The agent object’s read-only
variablesfield lists every variable the welcome message and prompt use, in order.
curl -X POST https://api.vaakyo.com/api/v1/agents/$AGENT_ID/call \
-H "X-API-Key: $VAAKYO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"to": "+919812345678", "user_data": {"customer_name": "Rohan"}}'
Values are inserted as text. A number or boolean in user_data is converted as Python would print it (true becomes True), and false, 0 and null become empty. Send strings when the exact wording matters.
What the LLM actually receives
Vaakyo builds the final system prompt from your prompt plus a few fixed parts, in this order:
- Your
system_prompt, with variables filled in. - Voice rules: answer in one to three short spoken sentences; no lists, markdown or emojis; say numbers and dates as a person would; ask one question at a time; when the caller says goodbye, say a short goodbye and call
end_callin the same reply. - If the voice language is
hi: speak natural Hinglish in Roman script (never Devanagari), matching the caller’s mix of Hindi and English. - Today’s date and time in the agent’s
call.timezone, for exampleToday is Thursday, 01 October 2026, 02:30 PM (Asia/Kolkata). - If any variables are empty: a line listing them, telling the agent to ask the caller if it needs them.
- If there is a welcome message: a line saying the agent has already greeted the caller with it, so it does not greet twice.
You don’t need to repeat the voice rules in your prompt. Focus on the task, the facts the agent needs, and what to do in edge cases.
Writing a good prompt
- Say who the agent is and who it calls. “You are Priya from City Clinic, calling patients to confirm tomorrow’s appointment.”
- State the goal and when it’s done. “Confirm whether they will come. If not, offer another day. Then say goodbye and end the call.”
- Give facts as facts. Opening hours, prices, addresses. The agent cannot look up anything you don’t give it, except through tools.
- Name your tools. “Before offering a slot, call check_availability.”
- Cover the edge cases. Wrong person, not interested, asks for a human, asks something off-topic.