Integrazione con Pipecat
Questa guida mostra come usare Pipecat come pipeline LLM all’interno di un server brain di Speech Engine. Speech Engine gestisce il ciclo vocale — speech-to-text, gestione dei turni e text-to-speech — mentre Pipecat gestisce la generazione di testo tramite una pipeline componibile di processor (chiamate LLM, RAG, chiamate di funzione, guardrail, filtri dei contenuti).
Questa guida è solo per Python perché Pipecat è un framework Python lato server. Non esiste un
equivalente Node per i processor della pipeline; esiste un pacchetto pipecat-client-js, ma è un
client per browser che comunica con un server Pipecat, non un modo per creare pipeline in TypeScript.
Architettura
L’SDK di Speech Engine funge da livello esterno: il relativo callback on_transcript si attiva ogni volta che l’utente finisce di parlare. All’interno del callback, crei una pipeline Pipecat, inserisci la cronologia della conversazione come LLMContextFrame e trasmetti l’output di testo della pipeline a Speech Engine. ElevenLabs converte il testo in parlato e lo riproduce per l’utente.
La pipeline Pipecat viene eseguita solo per la durata di un turno. Quando arriva una nuova trascrizione, la pipeline precedente viene annullata prima dell’esecuzione della successiva: è così che la gestione delle interruzioni di Speech Engine si propaga nella pipeline.
Quando usare questo pattern
Pipecat dà il meglio quando il tuo brain richiede più di una singola chiamata LLM:
- Processor componibili per generazione aumentata dal recupero, chiamate di funzione o guardrail
- Middleware basato su frame che può ispezionare, trasformare o bloccare il traffico in ogni fase
- Frammenti di pipeline riutilizzabili e condivisi tra più agenti
Se il tuo brain è “trascrizione in entrata, chiamata LLM in uscita”, il quickstart di Speech Engine è più semplice. Usa Pipecat quando la parte interessante è la pipeline stessa.
Prerequisiti
- Un Speech Engine. Segui il quickstart di Speech Engine per crearne uno.
- Python 3.10+ (richiesto da
pipecat-ai). - Tunnel HTTPS pubblico per il server brain (ad es. ngrok).
Installa le dipendenze
pipecat-ai[openai] include il servizio LLM di OpenAI. Se preferisci, sostituisci l’extra con quello di un altro provider (anthropic, google ecc.).
Crea il brain Pipecat
Il brain ha due componenti: un processor TextSink che trasferisce il testo in streaming in una asyncio.Queue e una coroutine run_pipecat_brain che crea una pipeline per un singolo turno e produce chunk come iteratore asincrono.
La pipeline contiene solo il servizio LLM e il sink, senza processor STT o TTS, perché Speech Engine li gestisce. LLMContextFrame è l’input; i chunk LLMTextFrame sono l’output.
run_pipecat_brain è un generatore asincrono. Ogni chunk prodotto viene inviato direttamente a Speech Engine, quindi l’agente inizia a parlare prima che la risposta completa sia pronta.
Collegalo al server Speech Engine
send_response dell’SDK di Speech Engine accetta una stringa o qualsiasi iterabile asincrono di stringhe, quindi puoi passare direttamente run_pipecat_brain(transcript). Converti gli oggetti ConversationMessage forniti da Speech Engine in semplici dict prima di passarli al brain.
L’SDK di Speech Engine annulla l’attività del turno precedente quando arriva una nuova trascrizione, annullando il generatore asincrono e il PipelineTask sottostante tramite il blocco try/finally in run_pipecat_brain.
Avvia il server
Collegati a Speech Engine da un browser usando lo stesso endpoint token e codice client mostrati nel quickstart. La pipeline Pipecat viene eseguita lato server; il browser vede una normale conversazione di Speech Engine.
Estendi la pipeline
Una pipeline Pipecat solo testuale può includere qualsiasi frame processor che operi su LLMTextFrame o LLMContextFrame. Ecco alcune aggiunte comuni:
- Guardrail: un
FrameProcessorposizionato prima dell’LLM che ispezionaLLMContextFramee sostituisce o blocca il contesto non sicuro. - Chiamate di funzione: registra strumenti su
OpenAILLMServicee Pipecat gestisce nativamente i frame delle chiamate agli strumenti. Il testo finale dell’assistente arriva comunque comeLLMTextFrame. - Ragionamento multi-fase: concatena due istanze di
OpenAILLMService, con un processor personalizzato intermedio che riscrive il contesto per il secondo passaggio. - Filtraggio dell’output: un
FrameProcessorposizionato dopo l’LLM che ispeziona ogniLLMTextFramee rimuove o riscrive i contenuti non consentiti prima che raggiunganoTextSink.
La struttura della pipeline rimane la stessa — Pipeline([processor_a, llm, processor_b, sink]) — e run_pipecat_brain non cambia.
Considerazioni per la produzione
- Sicurezza dell’annullamento:
PipelineTask.cancel()può causare un deadlock se viene chiamato prima che la pipeline sia stata avviata completamente (pipecat-ai/pipecat#4276). Il patterntry/finallysopra è sicuro perchécancel()viene eseguito solo dopo che è stato inserito in coda almeno un frame. - Prompt injection: l’output speech-to-text è input dell’utente. Convalida o normalizza la trascrizione prima di inviarla all’LLM, soprattutto se un processor downstream usa il testo in chiamate di strumenti o query al database.
- Autenticazione del server brain: imposta un segreto condiviso su Speech Engine e verificalo nel server brain per impedire connessioni non autorizzate al tuo endpoint
/ws: - Provider LLM:
pipecat-ai[openai]includeOpenAILLMService. Per Anthropic, installapipecat-ai[anthropic]e usaAnthropicLLMService; il resto della pipeline non cambia.