One file. One SDK.
Define an agent end-to-end in a single TypeScript file — prompt, process, triggers, handoff, memory. No glue services, no orchestrator to wire up.
Define an agent in one TypeScript file — prompt, process, memory, handoff. VoiceLayer runs the governed STT → LLM → TTS pipeline, structured workflows, and post-call processing so you ship voice operations, not glue code.
Work emails preferred. No spam. We'll reach out when access opens.
import { defineAgent } from '@voicelayer/sdk';
export default await defineAgent({
name: 'intake',
prompt: 'Calm, accurate first-notice-of-loss agent.',
process: { /* declarative field capture */ },
triggers: { /* deterministic routing */ },
handoff: { fallback: '+15555550100' },
memory: { scope: 'caller', retentionDays: 90 },
}).start(import.meta.url);Why VoiceLayer
Other tools wire a chatbot to a phone number. VoiceLayer treats process, memory, and human escalation as first-class primitives — the things that decide whether an AI agent actually runs a business call or just performs one.
Define an agent end-to-end in a single TypeScript file — prompt, process, triggers, handoff, memory. No glue services, no orchestrator to wire up.
Structured field capture, deterministic branching, and policy-aware tool actions live in the agent definition — not buried in prompts.
Per-caller and per-tenant memory with explicit retention. Context is loaded before the first response, not bolted on after the call.
Governed STT → LLM → TTS pipeline with hot-path latency budgets, safe human handoff, and async post-call processing off the audio path.
Every external provider — STT, LLM, TTS, carrier — sits behind a contract. Swap Deepgram for Whisper, OpenAI for Anthropic, in one line.
Voice infra, audio, speech, memory, process schema, intent, transcript, handoff, event routing, security — unified, not stitched.
The SDK
No orchestrator service, no Python worker, no separate memory store to provision. defineAgent() declares the workflow; the SDK absorbs telephony, runtime wiring, observability, and the cold path.
import { defineAgent } from '@voicelayer/sdk';
export default await defineAgent({
name: 'intake',
prompt: 'Calm, accurate first-notice-of-loss agent.',
process: { /* declarative field capture */ },
triggers: { /* deterministic routing */ },
handoff: { fallback: '+15555550100' },
memory: { scope: 'caller', retentionDays: 90 },
}).start(import.meta.url);How it works
Inbound call hits VoiceLayer, resolves the tenant, picks the right agent definition, and spins up a runtime.
Caller history, account state, and prior memory load before the agent speaks — not mid-conversation.
Speech, reasoning, structured process steps, and tool actions run inside the governed runtime with safety controls always on.
Complete the task end-to-end, or transfer to a human with full transcript, intent, and workflow state preserved.
The difference
VoiceLayer is in private beta. Join the waitlist and we'll reach out as access opens for design partners.