ThunderPhone 2.0 este acum disponibil.Îl configurați singur, de la 2 ¢/min.Citiți anunțul

Connect tools & data

Utilizați ThunderPhone din Pipecat

Rulați un agent vocal ThunderPhone ca serviciu de vorbire-la-vorbire într-un flux Pipecat, cu propriul transport și propria telefonie.

Pipecat este un cadru open-source pentru crearea de agenți vocali din servicii componibile. ThunderPhone se integrează ca un serviciu LLM de la vorbire la vorbire: Pipecat trimite sunetul apelantului, ThunderPhone returnează vocea agentului, transcrierile și apelurile de funcții, iar transportul Pipecat (Daily, LiveKit, Twilio, WebRTC, un microfon local) transmite sunetul. Recunoașterea vocală, modelul lingvistic, vocea, gestionarea tururilor, 47 de limbi și instrumentele rulează toate pe ThunderPhone.

Apelurile efectuate astfel apar în istoricul apelurilor și sunt facturate la tariful pe minut al produsului dumneavoastră, la fel ca orice alt apel în timp real. Nu există abonament și nu este implicat niciun număr de telefon ThunderPhone.

Instalare

pip install pipecat-thunderphone
export THUNDERPHONE_API_KEY=sk_live_...   # a secret API key

Pachetul împachetează serviciul OpenAI Realtime din Pipecat, deoarece Realtime WebSocket de la ThunderPhone utilizează același protocol. Acesta necesită pipecat-ai 1.8 sau o versiune mai nouă.

Rulați un agent salvat

Tot ceea ce face agentul (promptul, vocea, motorul, limbile, instrumentele, mesajul de întâmpinare, verificările în timpul tăcerii) este configurat în ThunderPhone. Fluxul doar transferă sunetul.

from pipecat.pipeline.pipeline import Pipeline
from pipecat.pipeline.worker import PipelineParams, PipelineWorker
from pipecat.processors.aggregators.llm_context import LLMContext
from pipecat.processors.aggregators.llm_response_universal import LLMContextAggregatorPair
from pipecat_thunderphone import ThunderPhoneRealtimeLLMService
 
llm = ThunderPhoneRealtimeLLMService(agent_id=12)
 
context = LLMContext()
aggregators = LLMContextAggregatorPair(context)
pipeline = Pipeline([
    transport.input(),
    aggregators.user(),
    llm,
    aggregators.assistant(),
    transport.output(),
])
worker = PipelineWorker(pipeline, params=PipelineParams(allow_interruptions=True))

Un agent salvat inițiază apelul conform propriului program, astfel încât serviciul nu solicită un răspuns de deschidere de la Pipecat. Transmiteți greet_on_connect=True dacă doriți totuși unul.

Configurați sesiunea inline

Fără agent_id, instrucțiunile și instrumentele provin din contextul Pipecat, la fel ca pentru OpenAI. product selectează motorul, iar voice selectează vocea ThunderPhone.

from pipecat.adapters.schemas.function_schema import FunctionSchema
from pipecat.adapters.schemas.tools_schema import ToolsSchema
from pipecat.services.llm_service import FunctionCallParams
 
llm = ThunderPhoneRealtimeLLMService(product="bolt", voice="olivia", language="es")
 
async def check_availability(params: FunctionCallParams):
    slots = await calendar.free_slots(params.arguments["date"])
    await params.result_callback({"slots": slots})
 
llm.register_function("check_availability", check_availability)
 
context = LLMContext(
    messages=[{"role": "system", "content": "You are Acme Dental's receptionist."}],
    tools=ToolsSchema(standard_tools=[
        FunctionSchema(
            name="check_availability",
            description="Free appointment slots on a date",
            properties={"date": {"type": "string"}},
            required=["date"],
        )
    ]),
)

Sesiunile inline sunt controlate de client: agentul vorbește primul deoarece Pipecat solicită un răspuns când contextul ajunge și rămâne silențios în timpul tăcerii, cu excepția cazului în care adăugați un mesaj sau solicitați un alt răspuns.

Opțiuni

ArgumentSemnificație
api_keyCheie secretă (sk_live_...). Valoarea implicită este THUNDERPHONE_API_KEY.
agent_idRulează un agent salvat. Se exclude reciproc cu product și voice.
productMotor pentru sesiuni inline: spark, bolt sau storm.
voiceNumele vocii ThunderPhone pentru sesiuni inline.
languageIndiciu privind limba principală pentru sesiuni inline, de exemplu es.
from_number, to_numberNumere de înregistrat în apel atunci când pipeline-ul este conectat la o linie telefonică.
live_transcriptsTransmite fragmente din transcrierea apelantului în timpul enunțului (facturat suplimentar).
greet_on_connectSolicită un prim răspuns imediat ce sesiunea este pregătită.
end_task_on_call_endedTrimite EndWorkerFrame când ThunderPhone încheie apelul (activat implicit).

Evenimente

ThunderPhone adaugă evenimente de platformă peste protocolul în timp real. Serviciul le transmite către handlere:

@llm.event_handler("on_call_ended")
async def on_call_ended(service, event):
    print("call ended:", event["reason"], "call id:", service.call_id)

service.call_id este setat după ce sesiunea devine activă. Folosiți-l cu GET /v1/calls/{call_id} pentru a obține înregistrarea, transcrierea și evaluarea după apel.

Limitări

  • Detectarea tururilor este realizată pe server și este mereu activă; tururile controlate de Pipecat (turn_detection=False) nu sunt acceptate.
  • Funcțiile înregistrate în serviciu rulează numai pentru sesiuni inline. Un agent salvat își execută propriile instrumente în ThunderPhone.
  • Sunetul este PCM mono pe 16 biți la 24 kHz în ambele direcții.
  • Cadrele video sunt ignorate.