Використовуйте 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 кГц в обох напрямках.
- Відеокадри ігноруються.