A ThunderPhone használata Pipecatből
Futtasson egy ThunderPhone hangalapú AI-ügynököt beszédből beszédbe szolgáltatásként egy Pipecat-folyamatban, saját átviteli és telefonos rendszerével.
Pipecat egy nyílt forráskódú keretrendszer, amelyből összetett szolgáltatások segítségével hangalapú AI-ügynököket építhet. A ThunderPhone beszéd-beszéd LLM-szolgáltatásként csatlakozik: a Pipecat elküldi a hívó hanganyagát, a ThunderPhone pedig visszaadja az ügynök hangját, az átiratokat és a funkcióhívásokat, míg a Pipecat átviteli rétege (Daily, LiveKit, Twilio, WebRTC vagy helyi mikrofon) továbbítja a hangot. A beszédfelismerés, a nyelvi modell, a hang, a beszédváltás kezelése, 47 nyelv és az eszközök mind a ThunderPhone-on futnak.
Az így indított hívások megjelennek a híváselőzményekben, és ugyanúgy az Ön termékének percenkénti díjszabása szerint kerülnek számlázásra, mint bármely más valós idejű hívás. Nincs előfizetés, és nincs szükség ThunderPhone-telefonszámra.
Telepítés
pip install pipecat-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyA csomag a Pipecat OpenAI Realtime szolgáltatását csomagolja, mert a ThunderPhone Realtime WebSocket ugyanazt a protokollt használja. A használatához pipecat-ai 1.8-as vagy újabb verzió szükséges.
Mentett ügynök futtatása
Az ügynök minden működési beállítása (prompt, hang, motor, nyelvek, eszközök, üdvözlés, csend közbeni bejelentkezések) a ThunderPhone-on történik. A folyamat csak a hangot továbbítja.
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))Egy mentett ügynök a saját ütemezése szerint kezdi a hívást, ezért a szolgáltatás nem kér nyitó választ a Pipecattől. Ha mégis szeretne ilyet, adja át a greet_on_connect=True paramétert.
Munkamenet konfigurálása közvetlenül
agent_id nélkül az utasítások és az eszközök a Pipecat kontextusából származnak, ugyanúgy, mint az OpenAI esetében. A product választja ki a motort, a voice pedig a ThunderPhone hangját.
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"],
)
]),
)A közvetlenül konfigurált munkameneteket a kliens vezérli: az ügynök először beszél, mert a Pipecat választ kér, amikor megérkezik a kontextus, és csendben marad a csend idején, kivéve, ha hozzáad egy üzenetet vagy újabb választ kér.
Beállítások
| Argumentum | Jelentés |
|---|---|
api_key | Titkos kulcs (sk_live_...). Alapértelmezés szerint: THUNDERPHONE_API_KEY. |
agent_id | Mentett ügynök futtatása. Kölcsönösen kizárja a product és voice használatát. |
product | Motor beágyazott munkamenetekhez: spark, bolt vagy storm. |
voice | ThunderPhone hangnév beágyazott munkamenetekhez. |
language | Elsődleges nyelvi tipp beágyazott munkamenetekhez, például: es. |
from_number, to_number | A hívás során rögzítendő számok, amikor a pipeline egy telefonvonal előtt működik. |
live_transcripts | A hívó átiratának részleteit streameli még a megnyilatkozás befejezése előtt is (külön díj ellenében). |
greet_on_connect | Első válasz kérése, amint a munkamenet készen áll. |
end_task_on_call_ended | EndWorkerFrame küldése, amikor a ThunderPhone befejezi a hívást (alapértelmezés szerint bekapcsolva). |
Események
A ThunderPhone platformeseményeket ad hozzá a valós idejű protokollhoz. A szolgáltatás ezeket kezelőknek továbbítja:
@llm.event_handler("on_call_ended")
async def on_call_ended(service, event):
print("call ended:", event["reason"], "call id:", service.call_id)A service.call_id értéke akkor lesz beállítva, amikor a munkamenet élővé válik. Használja a
GET /v1/calls/{call_id} végponttal a felvétel,
az átirat és az értékelés lekéréséhez a hívás után.
Korlátok
- A fordulóészlelés szerveroldali, és mindig be van kapcsolva; a Pipecat által vezérelt fordulók
(
turn_detection=False) nem támogatottak. - A szolgáltatáson regisztrált függvények csak beágyazott munkameneteknél futnak. A mentett ügynök a saját eszközeit futtatja a ThunderPhone-on.
- A hang mindkét irányban 16 bites, monó PCM, 24 kHz-es mintavételezéssel.
- A videóképkockák figyelmen kívül maradnak.