PatterTool
PatterTool exposes a live Patter instance as a single make_phone_call tool that any text-based agent framework can register and dispatch. The agent picks up the phone, Patter runs a short conversation against the caller, and the tool returns a JSON envelope with the call ID, status, transcript, cost, and metrics.
This complements the bring-your-own-agent pattern (serve(on_message=...)) with the inverse pattern — phone-as-tool — covering the two realistic migration paths from LiveKit / ElevenLabs ConvAI / Pipecat customers.
| Pattern | Where the brain lives | Where Patter sits | Use this when… |
|---|---|---|---|
| A — Bring-your-own agent (HTTP/WS endpoint) | Customer’s existing service | Patter is STT + LLM proxy + TTS | Customer already runs a voice agent and wants to swap the voice transport but keep their conversation logic. Use serve(on_message='https://...'). |
| B — Phone as a tool (this page) | Customer’s text-based agent | Patter is a tool the agent calls | Customer’s agent is text-driven but needs to make phone calls during a conversation. |
Quickstart
Schema exporters
PatterTool ships three schema exporters with identical wire shape (parameter JSON-schema + result envelope), so a customer can switch frameworks without re-mapping fields.
Tool arguments (JSON-schema)
Identical across all three exporters:| Field | Type | Required | Notes |
|---|---|---|---|
to | string | ✓ | E.164 phone number |
goal | string | — | Becomes the in-call agent’s system prompt |
first_message | string | — | First thing the agent speaks on answer |
max_duration_sec | integer | — | Hard timeout, default 180, max 1800 |
Result envelope
tool.hermes_handler() — it returns exactly that and wraps errors as {"error": "..."}.
Concurrency & timeouts
start()is idempotent — call it from your bootstrap, or letexecute()boot it lazily.- Concurrent
execute()calls are serialised through anasyncio.Lockso the per-call_idFuture never races. max_duration_secis enforced byasyncio.wait_for; on timeout the tool hangs up the call and returnsstatus="timeout".
Production deployment
PatterTool boots phone.serve() once. Make sure the Patter instance was constructed with a stable webhook hostname in webhook_url — never a tunnel — because Twilio/Telnyx need a long-lived HTTPS URL.
For local development, use tunnel=True on the Patter constructor and let it spawn a cloudflared. For production deploys (Fly.io / Cloud Run / Fargate behind ALB), set webhook_url to your public hostname and disable the tunnel.
Examples
Seeexamples/integrations/ in the repo:
hermes_phone_tool.py— drop-intools/patter.pyfor Hermes Agent.openai_assistant_phone_tool.ts— minimal OpenAI Assistants run dispatching the tool.README.md— Pattern A vs Pattern B decision matrix.
What’s next
Tools
In-call tool calling (function calling within a Patter agent).
Agents
Configure the in-call agent that PatterTool wraps.

