ThunderPhone 2.0 уже доступний.Самостійне підключення — від 2 центів за хвилину.Прочитати анонс

Connect tools & data

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