Aplicacao web para automatizar reservas telefonicas em restaurantes.
O utilizador preenche um numero a chamar e um prompt no frontend, o backend faz a chamada por SIP e o sistema trata a conversa em tempo real com RTP, transcricao e TTS.
- Backend: Node.js, TypeScript, Express, WebSocket, SIP e RTP/UDP
- Frontend: React, TypeScript, Vite e Tailwind CSS
- IA: AssemblyAI para transcricao em streaming, Groq para chat e sintese de voz
backend/: API, WebSocket, SIP, RTP e pipeline de audiofrontend/: interface React para iniciar e acompanhar chamadasCLAUDE.md: contexto tecnico para agentesAGENTS.md: regras de trabalho no projecto
- O frontend envia
POST /api/callscomphoneeprompt. - O backend cria um
CallRecordem memoria. - O
SipClientfazREGISTEReINVITE. - O
RtpHandlerrecebe audio e converte para PCM. - O
AudioPipelinetranscreve, pede resposta ao LLM e sintetiza audio. - O backend envia eventos por WebSocket.
- O frontend mostra estado, transcricao e resultado.
- Node.js 18+ recomendado
- npm
- Acesso a um servidor SIP/PBX
- Credenciais Groq
Cria backend/.env com base em backend/.env.example.
SIP_HOSTSIP_USERNAMESIP_PASSWORDSIP_LOCAL_IPGROQ_API_KEYASSEMBLYAI_API_KEY
SIP_PORT- default5060SIP_LOCAL_PORT- default5080GROQ_TTS_MODEL- defaultcanopylabs/orpheus-v1-englishGROQ_TTS_VOICE- defaultdianaPORT- default3000
Em desenvolvimento, o Vite faz proxy de /api e /ws para o backend.
Se necessario, define frontend/.env.development com:
VITE_WS_URL=ws://localhost:3000/ws
npm run install:allnpm run devIsto arranca o backend em http://localhost:3000 e o frontend via Vite.
npm run buildnpm run devnpm run install:allnpm run build
npm run dev --prefix backendnpm run build --prefix backendnpm run start --prefix backend
npm run dev --prefix frontendnpm run build --prefix frontendnpm run preview --prefix frontend
Cria uma chamada.
Body exemplo:
{
"phone": "+351912345678",
"prompt": "Liga ao restaurante x, para reservar uma mesa com x pessoas, e deixa a reserva em nome de x."
}Lista chamadas em memoria.
Devolve uma chamada especifica.
Encerra a chamada activa.
Health check do servidor.
Endpoint:
ws://localhost:3000/ws
Eventos JSON:
call.statustranscriptcall.result
Audio em tempo real:
- frames binarios com PCM bruto em 16-bit LE, 8 kHz
- O estado das chamadas e guardado em memoria
- O sistema foi desenhado para um fluxo simples de uma chamada activa na interface
- O modelo de chat e o modelo de STT estao fixos no codigo
- A interface principal usa apenas o numero a chamar e um prompt editavel
- O fim da chamada depende dos marcadores:
[RESERVA_CONFIRMADA][RESERVA_REJEITADA]
backend/src/server.tsbackend/src/routes/calls.tsbackend/src/sip/SipClient.tsbackend/src/sip/RtpHandler.tsbackend/src/audio/AudioPipeline.tsbackend/src/ai/agent.tsbackend/src/ai/stt.tsbackend/src/ai/tts.tsfrontend/src/App.tsxfrontend/src/components/CallForm.tsxfrontend/src/components/LiveMonitor.tsxfrontend/src/hooks/useCallStream.ts