Using this page. Everything below is written for a coding agent. Paste this
into Claude Code, Cursor or Codex CLI and it will fetch the rest itself:The raw Markdown for this page is at
/agent-setup/prompt.md.TeleQuick does not run your agent. It carries the media. The platform owns the phone number, the carrier trunk and the call; your process owns the speech-to-text, the model and the voice. Your agent opens one outbound QUIC connection to the platform and waits. When a call arrives, audio flows both ways over that connection.Because the connection is outbound, the developer’s machine needs no public URL, no inbound port and no tunnel. If you were about to reach for one, don’t. Confirm with the developer which path applies before you write any code:
- They already have a LiveKit Agents worker — keep it. Swap only the media transport. Path B.
- They have no agent yet, or a custom one — use the framework-free agents SDK, which is a register-and-wait worker where they bring their own STT/LLM/TTS. Path A.
Setup
1. Get credentials — the developer does this, not you
An external agent needs an app key and secret, minted per agent in the console: Agents → New → External, or the External agents screen athttps://portal.telequick.dev/admin/external-agents.
The reveal panel shows four things: the connect URL, the agent handle, the app
key (ck_…) and the secret. The secret is shown once. Ask the developer to
copy it into their shell or .env themselves — never ask them to paste it into
the chat, and never write it into a tracked file.
The agent handle matters: it is the name the platform routes calls to. Keep
it stable and use the same value everywhere below.
2. Install and wire the agent
Path A — framework-free agents SDK These packages are not on the public npm or PyPI registries. Point the scope at the artifact registry first, or the install will 404:github.com/telequick/agents, Rust from the sparse registry at
sparse+https://artifacts.clutchcall.dev/cargo/. The exact per-language
commands live in the recipe; use them rather than improvising a version.
The worker shape is serve(handler): it registers, waits, and reconnects with
backoff. Handle onReady and onDisconnected. Full walkthrough:
TypeScript agent recipe.
Path B — existing LiveKit Agents worker
cli.run_app(...) / the worker bootstrap with
run_agent_worker(...) / runAgentWorker(...), passing engine_url,
app_key, app_secret, agent_name and sample_rate=8000. Your prompts,
tools, STT, LLM and TTS are untouched. Full walkthrough:
LiveKit transport recipe.
Telephony is narrowband. If the developer’s agent hardcodes 16 kHz or 24 kHz
anywhere, fix it to 8 kHz now rather than debugging robotic audio later.
3. Run it — in the background
Environment, with the secret coming from the developer’s own shell. Take the host from the connect URL the console showed in step 1 — it is authoritative for their tenant;engine.telequick.dev is only the default:
4. Prove it takes a call
Two ways, in order of preference:- Test Drive — talk to the agent from the browser with your microphone, no phone number and no carrier involved. It’s on the agent’s row in the console. Use this first: it isolates the agent from telephony entirely, so a failure here is unambiguously the agent. Note it runs at 8 kHz like a real call, so a pipeline pinned to 16 or 24 kHz sounds wrong here too — that is the point.
- A real phone call — assign a number to the agent under Numbers, then dial it.
- The call appears in call records with the expected duration.
- The transcript is populated. If the developer’s agent does its own
speech-to-text, it must call
sendTranscript(role, text)per turn — otherwise the call is real but the platform-side transcript, the analytics timeline and thevoice.transcript.readywebhook all stay empty. This is the single most common “it works but nothing shows up” report.
Offer to harden it — only with the developer’s OK
A connected agent is a production path to a phone number. Offer these; apply nothing without agreement:- Rotate the app secret on a schedule; revoke keys for agents you retire.
- Scope any MCP or admin key to
readunless a write is genuinely needed. - Put the agent behind a dispatch rule so only intended numbers reach it.
Give yourself the docs
Two machine-readable surfaces exist. Wire one up if the developer wants you to keep working on this codebase:- Docs MCP server (read-only, no auth) at
https://docs.telequick.dev/api/mcp— toolssearch_docs,get_page,list_pages. - Control-plane MCP server at
https://portal.telequick.dev/mcp— reads and writes the developer’s own tenant with anmpk_…key minted under Admin → API keys → MCP access keys. Scopedmcp:<domain>:<action>.
<url>.md, with an index at
/llms.txt.
Notes for agents
- Never print, echo or commit the app secret or an
mpk_key. Never ask for one in chat. - Don’t buy a phone number, change billing, or add a dispatch rule without explicit agreement — these cost money or divert live traffic.
- Keep the worker process running while the agent is in use, and tell the developer how to stop it.
- Prefer Test Drive over a real call while iterating. It costs nothing and removes the carrier from the picture.