Case study

An AI that answers your phone before a spam call wastes your time.

FutureRouter is a call-screening agent that picks up unknown numbers, has a short live conversation with the caller, and decides in real time whether to pass the call through, send it to voicemail, or block it outright, running on real telephony infrastructure, not a mockup.

LangGraph Claude API Telnyx Call Control Flask · Railway
3
routing outcomes
8/8
offline eval cases
≤2
questions per call
1
live phone number

Most "AI call screening" demos stop at a chatbot transcript. This one actually rings.

It's easy to prototype an agent against a wall of text. It's a different problem entirely to have that same agent answer a real inbound call, hold a live conversation over an audio channel with no do-overs, and make an irreversible routing decision before the caller hangs up. FutureRouter was built to prove out that second, harder problem: a LangGraph agent wired to a real telephony provider, carrying real calls to a real phone number, with an evaluation harness behind it instead of vibes.

The build

A graph, not a script: short-circuits, a confidence gate, and a hard stop.

01

Call answered, reputation checked first

Telnyx Call Control answers the inbound call and starts live transcription. Before the agent says a word, the caller's number is checked against that user's personal allowlist, then a global demo reputation list. A known contact short-circuits straight to pass-through, no interview needed.

02

Live interview (LangGraph + Claude)

For an unknown number, the agent greets the caller and asks what the call is about. Claude classifies the response turn by turn, with a classify_gate node that keeps asking follow-up questions until confidence passes 0.6, or two turns are used, whichever comes first.

03

Asymmetric routing decision

Blocking a caller outright requires ≥0.75 confidence, deliberately higher than the 0.6 bar to stop asking questions. The agent would rather pass an ambiguous call through to voicemail than wrongly block someone real, a bias built into the thresholds on purpose.

04

Live execution over Call Control

The decision becomes a real Telnyx command: transfer the call to the real number, speak a decline and hang up, or route to voicemail, including a silence timeout that sends an unresponsive caller to voicemail automatically rather than holding the line open forever.

Live demo

Three real call shapes, three different endings.

These transcripts are drawn from real test calls placed to the live FutureRouter number, replayed here so this loads instantly. The decision JSON next to each one is what the agent actually produced for that call.

Transcripts are condensed from real calls to +1 (346) 640-9044. The routing logic and confidence thresholds shown run exactly as they do on a live call.
Correctness

Offline eval before a single live call was placed.

Letting an LLM make an irreversible call-routing decision without first checking its judgment against known-good cases is how you end up blocking your own mother. Two layers exist specifically to catch that, run before the agent ever touched a real phone number.

Layer 1: Scripted offline eval set

8 hand-written call scenarios covering clear solicitors, clear real contacts, ambiguous callers, and multi-turn back-and-forths, run against the graph with no telephony involved: pure text in, routing decision out, scored against an expected label.

✓ 8/8 passing before any live integration work began

Layer 2: Live-call debugging discipline

Moving to real audio surfaced failure modes no offline test could: the agent briefly transcribed its own greeting as caller speech, and solicitor-call outcomes were inconsistent run to run. Both were root-caused with structured decision logging rather than patched by guesswork, and the asymmetric confidence gate exists precisely because of what that logging showed.

Guards against: self-transcription loops, silent callers holding the line forever, a single bad turn tipping a real contact into "block"
Glossary

The terms this project is actually about.

LangGraph

A graph-based orchestration framework for LLM agents. Instead of one long prompt, the call-screening logic is a set of nodes (reputation check, classify, decide route) connected by conditional edges, so each decision point is inspectable and testable on its own.

Call Control

Telnyx's programmable voice API: webhooks fire on call events (answered, speech transcribed, hung up), and the app responds with commands (speak, transfer, hang up). This is the layer that turns an LLM's output into something that actually happens to a live phone call.

Confidence gate

The threshold that decides whether the agent asks another question or moves to a final decision. Set deliberately lower than the threshold required to block a caller, so an ambiguous call gets one more chance before anything irreversible happens.

Reputation short-circuit

A lookup against a per-user allowlist that happens before the LLM is ever invoked. A known contact skips the interview entirely, which also keeps the agent from spending a model call on calls that don't need one.

Conditional vs. unconditional forwarding

Two carrier-level forwarding modes offered at signup: conditional only routes a call to FutureRouter if it goes unanswered (the phone still rings first); unconditional sends every call to FutureRouter immediately, screening before the phone ever rings once.

Built to show what shipping an agentic system actually involves: a real orchestration graph, a real evaluation harness, and the unglamorous work of making it hold up against a live phone line instead of a clean demo script.