Naudokite ThunderPhone su Pipecat
Paleiskite ThunderPhone balso agentą kaip kalba į kalbą paslaugą Pipecat sraute, naudodami savo perdavimo ir telefonijos sprendimus.
Pipecat yra atvirojo kodo sistema, skirta balso agentams kurti iš komponuojamų paslaugų. ThunderPhone integruojasi kaip kalbos į kalbą LLM paslauga: Pipecat siunčia skambinančiojo garsą, ThunderPhone grąžina agento balsą, transkripcijas ir funkcijų iškvietimus, o Pipecat perdavimo mechanizmas („Daily“, „LiveKit“, „Twilio“, „WebRTC“, vietinis mikrofonas) perduoda garsą. Kalbos atpažinimas, kalbos modelis, balsas, pokalbio eiliškumo valdymas, 47 kalbos ir įrankiai veikia ThunderPhone.
Tokiu būdu atlikti skambučiai rodomi skambučių istorijoje ir apmokestinami pagal jūsų produkto minutės įkainį, kaip ir bet kuris kitas realaus laiko skambutis. Nereikia prenumeratos ar ThunderPhone telefono numerio.
Įdiegimas
pip install pipecat-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyPaketas apgaubia Pipecat „OpenAI Realtime“ paslaugą, nes ThunderPhone
Realtime WebSocket naudoja tą patį protokolą. Jam
reikia pipecat-ai 1.8 arba naujesnės versijos.
Paleiskite išsaugotą agentą
Viskas, ką atlieka agentas (nurodymai, balsas, variklis, kalbos, įrankiai, pasisveikinimas, tylos patikrinimai), konfigūruojama ThunderPhone. Konvejeris tik perduoda garsą.
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))Išsaugotas agentas pradeda skambutį pagal savo tvarkaraštį, todėl paslauga
neprašo Pipecat pradinio atsakymo. Perduokite greet_on_connect=True, jei vis
tiek jo norite.
Konfigūruokite sesiją įterptuoju būdu
Nenaudojant agent_id, nurodymai ir įrankiai gaunami iš Pipecat konteksto,
taip pat kaip ir naudojant OpenAI. product parenka variklį, o voice parenka
ThunderPhone balsą.
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"],
)
]),
)Įterptosios sesijos valdomos kliento: agentas kalba pirmas, nes Pipecat prašo atsakymo, kai gaunamas kontekstas, ir tyli tylos metu, nebent pridėtumėte pranešimą arba paprašytumėte kito atsakymo.
Parinktys
| Argumentas | Reikšmė |
|---|---|
api_key | Slaptasis raktas (sk_live_...). Numatytoji reikšmė – THUNDERPHONE_API_KEY. |
agent_id | Paleisti išsaugotą agentą. Negalima naudoti kartu su product ir voice. |
product | Įterptinių sesijų variklis: spark, bolt arba storm. |
voice | ThunderPhone balso pavadinimas įterptinėms sesijoms. |
language | Pagrindinės kalbos nuoroda įterptinėms sesijoms, pvz., es. |
from_number, to_number | Numeriai, kuriuos reikia įrašyti į skambučio duomenis, kai apdorojimo seka aptarnauja telefono liniją. |
live_transcripts | Transliuoti skambinančiojo transkripcijos fragmentus nebaigus pasisakymo (taikomas papildomas mokestis). |
greet_on_connect | Paprašyti pirmojo atsakymo, kai tik sesija bus paruošta. |
end_task_on_call_ended | Siųsti EndWorkerFrame, kai ThunderPhone baigia skambutį (įjungta pagal numatytuosius nustatymus). |
Įvykiai
ThunderPhone prie realaus laiko protokolo prideda platformos įvykius. Paslauga perduoda juos tvarkyklėms:
@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 nustatomas, kai sesija tampa aktyvi. Naudokite jį su
GET /v1/calls/{call_id}, kad po skambučio gautumėte
įrašą, transkripciją ir įvertinimą.
Apribojimai
- Pasisakymų aptikimas vykdomas serveryje ir visada įjungtas; Pipecat valdomi
pasisakymai (
turn_detection=False) nepalaikomi. - Paslaugoje užregistruotos funkcijos vykdomos tik įterptinėse sesijose. Išsaugotas agentas ThunderPhone vykdo savo įrankius.
- Garsas abiem kryptimis yra 16 bitų vieno kanalo PCM, 24 kHz.
- Vaizdo kadrai ignoruojami.