agent_id; calls that
land on the trunk inherit it.
DAG shape
A DAG is a JSON document. The gateway treats the body as opaque on the wire (it’s astring); validation happens server-side after decode.
The shape is:
type values the gateway recognises today: tts, stt, llm,
tool, transfer, playback, dtmf, hangup, webhook. New types
are additive and ignored by older gateways (forward-compat).
Tools available to LLM nodes
Anllm node’s args.tools is a list of tool names. Names resolve
through the runtime’s ToolRegistry — the LLM sees the tool’s name,
description, and JSON schema; the runtime executes it and feeds the
result back as a tool_result.
Built-in implicit telephony toolset
Every session running through TeleQuick’s agent runtime automatically advertises these to the LLM:| Name | Args | What it does |
|---|---|---|
transfer_call | destination (E.164 / SIP URI), caller_id? | RFC 3515 SIP REFER. Subject to per-trunk realm policy. |
hold_call | none | sendrecv → sendonly re-INVITE. |
unhold_call | none | Lifts a previous hold_call. |
disconnect_call | none | Wire-level BYE — distinct from the model saying “goodbye”. |
send_dtmf | digit, mode (rfc2833|info), duration_ms | DTMF for IVR navigation post-transfer. |
request_supervisor | none | Records an escalation-requested signal. Pair with transfer_call to actually route. |
get_current_time | none | ISO-8601 timestamp. |
telequick:tenant:<tenant_id>:telephony_disabled_tools as a
JSON array. Disabled tools are filtered out before the toolset reaches
the model.
Custom tools
Custom tools are added by subclassinghost::core::Tool in the
runtime build (no SDK-level registration path today). See the
telequick-tool-calling skill for the C++ shape and the
register_tool call site.
Client-side tool calling
When you bridge the call yourself (default_app=ANSWER), you handle
tool calling directly via the LLM provider’s wire format — for OpenAI
Realtime that’s a tools array in session.update, with
response.function_call_arguments.done events flowing back. The
telequick-tool-calling skill walks through the round-trip.
PublishAgentDag
Request (PublishAgentDagRequest):
| Field | Type | Notes |
|---|---|---|
admin_token | string | |
tenant_id | string | |
agent_id | string | Stable id; matches AddTrunkRequest.agent_id. |
dag_json | string | The DAG document above. Validated server-side. |
comment | string | Free-form changelog; surfaces in ListAgentDags. |
PublishAgentDagResponse):
| Field | Type | Notes |
|---|---|---|
status | string | "ok" or "error". |
error_message | string | |
version | int32 | Auto-incremented; version=1 for the first publish. |
published_at_ms | int64 |
dial.
GetAgentDag
| Field | Type | Notes |
|---|---|---|
admin_token | string | |
tenant_id | string | |
agent_id | string | |
version | int32 | 0 = latest. >0 = specific historical version. |
GetAgentDagResponse):
| Field | Type | Notes |
|---|---|---|
found | bool | |
agent_id | string | |
version | int32 | Resolved version (in case you asked for 0). |
dag_json | string | The DAG document. |
published_at_ms | int64 | |
comment | string |
ListAgentDags
| Field | Type |
|---|---|
admin_token | string |
tenant_id | string |
ListAgentDagsResponse):
| Field | Type | Notes |
|---|---|---|
agents | vector<AgentSummary> | Latest version per agent_id. |
AgentSummary:
| Field | Type |
|---|---|
agent_id | string |
latest_version | int32 |
published_at_ms | int64 |
comment | string |
DeleteAgentDag
| Field | Type | Notes |
|---|---|---|
admin_token | string | |
tenant_id | string | |
agent_id | string | |
purge_history | bool | true = also drop version history; false = keep it. |
Empty. Trunks pointing at the deleted agent_id will start
failing inbound HANDLE_AI routing with ERR_INVALID_DESTINATION until
you either rebind them to another agent or republish.