Използвайте ThunderPhone от Pipecat
Изпълнявайте гласов агент на ThunderPhone като услуга за реч към реч в конвейер на Pipecat, със собствен транспорт и телефония.
Pipecat е рамка с отворен код за изграждане на гласови агенти от компонуеми услуги. ThunderPhone се включва като LLM услуга за говор към говор: Pipecat изпраща аудиото на обаждащия се, ThunderPhone връща гласа на агента, транскрипциите и извикванията на функции, а транспортът на Pipecat (Daily, LiveKit, Twilio, WebRTC, локален микрофон) пренася аудиото. Разпознаването на реч, езиковият модел, гласът, управлението на редуването в разговора, 47 езика и инструментите работят изцяло в ThunderPhone.
Обажданията, осъществени по този начин, се показват в историята на обажданията и се таксуват според тарифата на минута за вашия продукт, както всяко друго обаждане в реално време. Няма абонамент и не е необходим телефонен номер на ThunderPhone.
Инсталиране
pip install pipecat-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyПакетът обвива услугата OpenAI Realtime на Pipecat, защото
Realtime WebSocket на ThunderPhone използва същия протокол. Необходим е
pipecat-ai 1.8 или по-нова версия.
Стартиране на запазен агент
Всичко, което агентът прави (подкана, глас, механизъм, езици, инструменти, поздрав, проверки при тишина), се конфигурира в ThunderPhone. Конвейерът само пренася аудио.
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))Запазеният агент започва обаждането по собствен график, затова услугата не
заявява начална реплика от Pipecat. Подайте greet_on_connect=True, ако все пак
искате такава.
Конфигуриране на сесията директно
Без agent_id инструкциите и инструментите идват от контекста на Pipecat,
по същия начин както при OpenAI. product избира механизма, а voice избира
гласа на 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"],
)
]),
)Директните сесии се управляват от клиента: агентът говори първи, защото Pipecat заявява отговор, когато пристигне контекстът, и остава тих при тишина, освен ако не добавите съобщение или не заявите друг отговор.
Опции
| Аргумент | Значение |
|---|---|
api_key | Таен ключ (sk_live_...). По подразбиране е THUNDERPHONE_API_KEY. |
agent_id | Стартиране на запазен агент. Взаимно изключващ се с product и voice. |
product | Механизъм за вградени сесии: spark, bolt или storm. |
voice | Име на глас в ThunderPhone за вградени сесии. |
language | Подсказка за основния език при вградени сесии, например es. |
from_number, to_number | Номера, които да се записват в разговора, когато конвейерът е пред телефонна линия. |
live_transcripts | Поточно предаване на фрагменти от транскрипцията на обаждащия се по време на изказването му (таксува се допълнително). |
greet_on_connect | Заявяване на първи отговор веднага щом сесията е готова. |
end_task_on_call_ended | Изпращане на EndWorkerFrame, когато ThunderPhone приключи разговора (включено по подразбиране). |
Събития
ThunderPhone добавя събития на платформата към протокола в реално време. Услугата ги предава на обработчиците:
@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 се задава, след като сесията е активна. Използвайте го с
GET /v1/calls/{call_id}, за да изтеглите записа,
транскрипцията и оценката след разговора.
Ограничения
- Разпознаването на реда за говорене се извършва от сървъра и винаги е включено; не се поддържат
редове, управлявани от Pipecat (
turn_detection=False). - Функциите, регистрирани в услугата, се изпълняват само за вградени сесии. Запазен агент изпълнява собствените си инструменти в ThunderPhone.
- Аудиото е 16-битов моно PCM с 24 kHz и в двете посоки.
- Видео кадрите се игнорират.