Upotrebljavajte ThunderPhone iz Pipecata
Pokrenite glasovnog agenta ThunderPhone kao uslugu govora u govor unutar Pipecat cjevovoda, uz vlastiti prijenos i telefoniju.
Pipecat je framework otvorenog koda za izradu glasovnih agenata od sastavljivih usluga. ThunderPhone se povezuje kao LLM usluga govor-u-govor: Pipecat šalje zvuk pozivatelja, ThunderPhone vraća glas agenta, transkripte i pozive funkcija, a Pipecatov transport (Daily, LiveKit, Twilio, WebRTC, lokalni mikrofon) prenosi zvuk. Prepoznavanje govora, jezični model, glas, izmjena redova govora, 47 jezika i alati pokreću se na ThunderPhoneu.
Ovako upućeni pozivi prikazuju se u povijesti poziva i naplaćuju se prema cijeni po minuti vašeg proizvoda, kao i svaki drugi poziv u stvarnom vremenu. Nema pretplate niti je uključen telefonski broj ThunderPhonea.
Instalacija
pip install pipecat-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyPaket omata Pipecatovu uslugu OpenAI Realtime jer ThunderPhoneov
Realtime WebSocket koristi isti protokol. Potreban
mu je pipecat-ai 1.8 ili noviji.
Pokrenite spremljenog agenta
Sve što agent radi (prompt, glas, engine, jezici, alati, pozdrav, provjere tišine) konfigurira se na ThunderPhoneu. Cjevovod samo prenosi zvuk.
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))Spremljeni agent započinje poziv prema vlastitom rasporedu, pa usluga ne
zahtijeva početni odgovor od Pipecata. Proslijedite greet_on_connect=True ako
ga ipak želite.
Konfigurirajte sesiju izravno u kodu
Bez agent_id, upute i alati dolaze iz Pipecatova konteksta, na isti način kao
za OpenAI. product odabire engine, a voice odabire ThunderPhoneov glas.
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"],
)
]),
)Sesijama u kodu upravlja klijent: agent govori prvi jer Pipecat zahtijeva odgovor kada kontekst stigne te ostaje tih tijekom tišine, osim ako dodate poruku ili zatražite drugi odgovor.
Opcije
| Argument | Značenje |
|---|---|
api_key | Tajni ključ (sk_live_...). Zadana vrijednost je THUNDERPHONE_API_KEY. |
agent_id | Pokrenite spremljenog agenta. Uzajamno se isključuje s product i voice. |
product | Pokretač za ugrađene sesije: spark, bolt ili storm. |
voice | Naziv glasa ThunderPhone za ugrađene sesije. |
language | Primarni jezični savjet za ugrađene sesije, npr. es. |
from_number, to_number | Brojevi za bilježenje u pozivu kada niz za obradu upravlja telefonskom linijom. |
live_transcripts | Strujno šaljite dijelove prijepisa pozivatelja tijekom izgovaranja (dodatno se naplaćuje). |
greet_on_connect | Zatražite prvi odgovor čim sesija bude spremna. |
end_task_on_call_ended | Pošaljite EndWorkerFrame kada ThunderPhone završi poziv (zadano uključeno). |
Događaji
ThunderPhone dodaje događaje platforme povrh protokola u stvarnom vremenu. Usluga ih šalje obrađivačima:
@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 postavlja se kada sesija postane aktivna. Upotrijebite ga s
GET /v1/calls/{call_id} za dohvaćanje snimke,
prijepisa i ocjene nakon poziva.
Ograničenja
- Prepoznavanje izmjene govornika odvija se na poslužitelju i uvijek je uključeno; izmjene kojima upravlja Pipecat
(
turn_detection=False) nisu podržane. - Funkcije registrirane u usluzi pokreću se samo za ugrađene sesije. Spremljeni agent pokreće vlastite alate na ThunderPhoneu.
- Zvuk je 16-bitni mono PCM pri 24 kHz u oba smjera.
- Videookviri se zanemaruju.