pcm16 audio directly. The
external-agent recipe covers
that path end to end.
What maps to what
Port the assistant
The runnable starter is a port of Vapi’s server-example (Flask). It contains the webhook route, the two custom functions, and a provisioning script. It ships in the provider starters repo next to thetelequick-agents SDK.
1
Recreate the assistant as a voice agent
In the console (
agent.clutchcall.dev), create a voice agent. Copy over
the assistant’s system prompt and STT/LLM/TTS choices. Provider keys are
per-tenant. The control plane seals them at rest and resolves them at call
setup. See
BYO ASR / LLM / TTS for the
provider matrix.2
Register your server URL as a webhook
Management operations use an The API returns the signing secret (
mpk_ API key (console → Settings → API
keys) against POST /mcp. The SDK wraps the endpoint:provision.py
whsec_…) only one time, on
creation.3
Verify deliveries where Vapi sent messages
Deliveries are signed Stripe-style.
X-Clutchcall-Signature carries
t=<epoch>,v1=<hmac_sha256(secret, "t.body")>. Your route changes from
“switch on message.type” to “verify, then switch on the event header”:webhook.py
4
Turn custom functions into agent tools
Vapi POSTs Your Flask/Express handlers for the functions do not change. Only the
registration moves. See
Tool Calling for the full spec.
function-call messages to your server URL. Here, each
function is an HTTP agent tool attached to the agent. The runtime’s
LLM calls the tool mid-call. The platform POSTs the arguments to your
route. The agent speaks the returned result:5
Replace the phone-call API
Vapi’s
POST /call with an assistantId becomes one operation with an
agent name. On answer, the engine connects the callee to that agent:Troubleshooting
Webhook deliveries are rejected with 401
Webhook deliveries are rejected with 401
Check the signature against the exact raw request body. A re-parsed
and re-serialized JSON body computes a different HMAC. Also check clock
skew:
verify_signature enforces a freshness window on the t=
timestamp.The agent never calls a tool
The agent never calls a tool
The tool’s
description and parameter schema drive tool selection,
exactly as with Vapi’s function definitions. Check that the tool upserted
onto the correct agentId. Check that your endpoint returns quickly. A
slow tool stalls the turn.You need the raw audio, not the managed pipeline
You need the raw audio, not the managed pipeline
That is the external-agent seam, not a console agent. Your worker
registers under an agent handle. The engine routes calls through
VENDOR_BRIDGE. You read 20 ms pcm16 frames in-process. Start from the
external-agent recipe.Related
LiveKit integration
The external-agent seam in depth, for code-first runtimes.
Tool Calling
HTTP agent tools: schemas, silent tools, and mid-call behavior.
SIP Trunking
Bring the numbers that your Vapi assistant answers today.
Run a LiveKit Agent on the Transport
The end-to-end external-agent recipe.

