Relay

No ar

Projeto pessoal explorando IA de voz em tempo real. O caso de uso é uma recepcionista de clínica; o objetivo real era atingir um budget de latência percebida pelo usuário abaixo de um segundo, com instrumentação completa por trecho.

Função
Solo — arquitetura, pipeline de voz, frontend, deploy
Período
nov. de 2025 – Atual
Stack
  • Next.js 16
  • TypeScript
  • LiveKit Cloud
  • Twilio
  • Deepgram
  • Claude Haiku 4.5
  • Cartesia Sonic-3
  • Cal.com
  • Inngest
  • Supabase
  • PostgreSQL
  • Prisma
  • Tailwind v4

O que faz

Um admin de clínica se cadastra, cria uma organização e configura um agente — prompt de persona, voz, horário de funcionamento, base de conhecimento de FAQ. Aponta um número do Twilio para o SIP trunk e pronto.

Um chamador liga. Cerca de meio segundo depois de terminar de falar, o agente responde com uma voz natural. Enquanto a chamada está em andamento:

  1. Uma forma de onda ao vivo pulsa com o áudio recebido.
  2. A transcrição vai aparecendo token a token com labels de falante por turno.
  3. Um medidor de latência mostra STT, LLM TTFT, TTS TTFA e p95 end-to-end em tempo real, com cada trecho ficando vermelho quando ultrapassa o budget.
  4. Cada tool que o agente invoca — check_availability, lookup_kb, book_appointment, transfer_to_human — aparece em uma timeline inline com input, output e duração.
Visualização de chamada ao vivo do Relay: forma de onda pulsando, transcrição em streaming com labels de falante e sentimento, medidor de latência com seis trechos e timeline inline de tools.
Uma chamada em andamento: forma de onda, transcrição em streaming, medidor de latência por trecho e as tool calls do agente, tudo ao vivo.

O operador pode assumir a chamada pelo dashboard a qualquer momento.

Quando a chamada encerra, um job do Inngest puxa a gravação, pede ao Claude Sonnet 4.6 para gerar um resumo estruturado, classifica o resultado (SCHEDULED, QUALIFIED, TRANSFERRED, NOT_QUALIFIED, NO_ANSWER), pontua o sentimento e extrai tópicos. A página de detalhe exibe a gravação em um player com scrubbing, com a transcrição destacando o trecho sendo falado.

Dashboard do operador do Relay: tiles de chamadas-hoje, agentes-ativos, números-conectados e conversão acima de uma lista de chamadas em andamento, uma lista de chamadas recentes e gráficos de resultados-do-dia e volume-de-chamadas.
O dashboard do operador: chamadas ao vivo, resultados recentes e as métricas que uma clínica realmente usa.

O mesmo dashboard inclui campanhas de saída (upload de CSV, respeito ao horário comercial, retentativas com cooldown), uma página de analytics (volume, conversão, latência p95, heatmap por hora e dia da semana) e integração com Cal.com para agendamento durante a chamada.

Tela de campanhas de saída do Relay mostrando uma campanha em execução com progresso das chamadas, janelas de horário comercial e configurações de retentativa.
Campanhas de saída: upload de CSV, janelas de horário comercial e retentativas com cooldown.

Por que construí

Não é um produto — é um projeto pessoal. Queria construir a experiência de IA voltada ao usuário final mais difícil que conseguia imaginar (voz) em uma stack onde o budget de latência é a restrição principal. O caso de uso de recepcionista de clínica é o exemplo canônico porque tem volume real e consequências reais para chamadas perdidas, o que torna a meta de latência significativa em vez de acadêmica.

Como funciona

Pipeline de voz em tempo real

  • O Twilio termina a chamada PSTN e a conecta ao LiveKit Cloud via SIP.
  • Um worker Node de longa duração entra na sala do LiveKit e executa o loop de conversa. O worker é deployado separadamente da aplicação Next.js — funções do Vercel não conseguem manter um websocket aberto por uma chamada de 10 minutos.
  • O Deepgram cuida de STT, VAD e detecção de turno em uma única API de streaming. Eventos de fim de turno disparam o LLM, eliminando a variância de 150–300ms de pipelines separados de VAD + silence-timer.
  • Claude Haiku 4.5 conduz a conversa. Os tokens em streaming são divididos frase a frase e enviados ao Cartesia Sonic-3, então o áudio começa a tocar antes de o LLM terminar de gerar.
  • O uso de tools é nativo à chamada do Anthropic SDK. Quatro tools estão disponíveis durante a chamada: check_availability, book_appointment, lookup_kb, transfer_to_human. Cada tool é validada com Zod, registrada com input/output/duração, e o LLM continua com o resultado da tool como um turno normal.
  • Interrupção adaptativa cancela a geração em andamento do LLM e limpa a fila de áudio do TTS no momento em que o usuário começa a falar.
  • A latência é instrumentada por trecho e gravada no banco de dados para o medidor ao vivo e o dashboard de analytics.

Multi-tenant B2B

Três camadas de isolamento de tenant — escopo por linha no Postgres, guards na camada de aplicação em toda server action, e credenciais de sub-conta do Twilio por organização. O worker do LiveKit lê a org nos headers SIP, então uma rota mal configurada nunca consegue entrar na sala de outro tenant.

Status

No ar em relay.picoral.me. Walkthrough no Loom e case study completo são os próximos passos.

Perguntas

O que é o Relay?

Relay é uma recepcionista de IA de voz multi-tenant para negócios de serviço como clínicas. Atende chamadas 24/7, qualifica leads, agenda consultas via Cal.com e transfere para um humano quando necessário. Os operadores acompanham cada chamada ao vivo no dashboard com forma de onda, transcrição em streaming e medidor de latência por trecho.

Qual é o budget de latência do Relay?

A meta é p95 ≤ 900ms de resposta percebida pelo usuário, medida do fim da fala do usuário até o início do áudio do agente. Cada trecho é instrumentado separadamente — STT finalize, LLM TTFT, LLM total, TTS TTFA, tool total, end-to-end — e exibido como um medidor ao vivo que fica vermelho quando algum trecho ultrapassa o budget.

Por que LiveKit + Deepgram + Cartesia em vez de um único provedor?

Cada trecho é o melhor da categoria e pode ser substituído individualmente. LiveKit cuida da terminação SIP vinda do Twilio e da sala de áudio. O STT em streaming do Deepgram embute VAD e detecção de turno em uma única API, eliminando a variância de 150–300ms de pipelines separados de VAD + silence-timer. O Sonic-3 da Cartesia é um TTS genuinamente mais rápido que o tempo real, o que viabiliza o budget abaixo de um segundo.

Como funciona o isolamento multi-tenant no Relay?

Três camadas — escopo por linha no Postgres via organizationId, guards na camada de aplicação em toda server action, e credenciais de sub-conta do Twilio por organização. O worker do LiveKit lê a organização nos headers SIP, então uma rota mal configurada nunca consegue entrar na sala de outro tenant.

Publicado 25 de mai. de 2026, 9:59 GMT-3 · Atualizado 5 de jul. de 2026, 0:36 GMT-3

← Todos os projetos