When to use a tool
- Look up a CRM record, calendar slot, or knowledge-base entry mid-call
- Place an order, book a meeting, or write back to your system
- Branch the dialogue on real-world state (account tier, inventory, eligibility)
- Surface UI in the participant’s browser (open a doc, prefill a form)
The Tool object
Example tool object
Execution modes
Conversational modes
A tool call can take 1–8 seconds. Two extra fields control what the persona does during and after the call so the conversation doesn’t go dead.on_call — what the persona does while the tool runs
static_filler is required when on_call = "static_filler" and forbidden otherwise.
on_resolve — what happens with the result
How it works at runtime
1. Create a tool
201 Created:
webhook_secret is never returned — only has_webhook_secret: true. Rotate
it any time by PATCHing the tool with a new value; every attached scenario
picks up the change instantly.
2. Attach to a scenario
201 Created (or 200 OK if already attached):
Per-scenario fields
3. Handle the webhook
When the LLM calls the tool, CoreBackend POSTs this payload to yourwebhook_url:
Request headers
Respond with the result
Return any JSON withintimeout_ms. Your response body IS the tool result
the LLM sees on its next turn.
- Non-JSON body → wrapped as
{ "result": "<your-text>" } - Responses larger than 256 KB are truncated
- Non-2xx response → LLM sees
{ status: "error", error_code: "http_error", http_status: 500 }and recovers gracefully
Verify the signature
Client-mode tools
For actions that should happen in the participant’s browser (open a doc, prefill a form), setexecution_mode: "client" and omit webhook_url.
The backend short-circuits the tool call with:
webhook mode for production.)
Errors
Limits
API surface
Tools (account-scoped):
Scenario attachments:
Worked example — booking a meeting
Two tools (list_slots, book_slot) defined once, attached to both a sales
and a support scenario.
- User: “Can we set up a follow-up sometime this week?”
- LLM calls
list_slots(timezone="Asia/Kolkata"). - Your webhook returns
[{slot:"2026-06-20T10:00:00+05:30"}, …]. - LLM proposes the slots verbally.
- User: “Friday at 10 works.”
- LLM calls
book_slot(slot_iso="2026-06-20T10:00:00+05:30", title="Follow-up"). - Your webhook books it and returns
{ "ok": true, "booking_id": "bk_…" }. - LLM confirms: “Booked — you’ll get a calendar invite shortly.”

