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

Connect tools & data

Використовуйте ThunderPhone у LiveKit Agents

Запускайте голосового агента ThunderPhone як модель реального часу (мовлення в мовлення) у сесії LiveKit Agents, використовуючи кімнати LiveKit, SIP і телефонію.

LiveKit Agents — це фреймворк із відкритим кодом для голосових агентів реального часу на основі кімнат LiveKit. ThunderPhone підключається як модель реального часу: фреймворк надсилає аудіо учасника, ThunderPhone повертає голос агента, транскрипти та виклики функцій, а кімната LiveKit, SIP-транки й телефонія передають аудіо. Розпізнавання мовлення, мовна модель, голос, керування чергуванням реплік, 47 мов і інструменти — усе це працює на ThunderPhone.

Дзвінки, здійснені таким способом, відображаються в історії дзвінків і оплачуються за похвилинним тарифом вашого продукту, як і будь-який інший дзвінок у реальному часі. Передплата та номер телефону ThunderPhone не потрібні.

Встановлення

pip install livekit-plugins-thunderphone
export THUNDERPHONE_API_KEY=sk_live_...   # a secret API key

Плагін обгортає модель OpenAI Realtime від LiveKit, оскільки Realtime WebSocket ThunderPhone використовує той самий протокол. Для нього потрібен livekit-agents версії 1.8 або новішої.

Запуск збереженого агента

Усе, що робить агент (промпт, голос, рушій, мови, інструменти, привітання, перевірки тиші), налаштовується в ThunderPhone. Сесія лише передає аудіо.

from livekit.agents import Agent, AgentSession, JobContext, WorkerOptions, cli
from livekit.plugins import thunderphone
 
 
async def entrypoint(ctx: JobContext):
    session = AgentSession(llm=thunderphone.RealtimeModel(agent_id=12))
    await session.start(agent=Agent(instructions=""), room=ctx.room)
 
 
if __name__ == "__main__":
    cli.run_app(WorkerOptions(entrypoint_fnc=entrypoint))

Збережений агент вітається та запускає власні інструменти в ThunderPhone; інструкції та інструменти Agent у LiveKit не надсилаються. Дзвінок завершується, коли агент ThunderPhone кладе слухавку, і разом із ним закривається сесія.

Налаштування сесії в коді

Без agent_id інструкції та інструменти надходять від Agent у LiveKit — так само, як для OpenAI. product визначає рушій, а voice вибирає голос ThunderPhone.

from livekit.agents import Agent, AgentSession, RunContext, function_tool
from livekit.plugins import thunderphone
 
 
class Receptionist(Agent):
    def __init__(self):
        super().__init__(instructions="You are Acme Dental's receptionist. Be brief.")
 
    @function_tool
    async def check_availability(self, context: RunContext, date: str) -> dict:
        """Free appointment slots on a date."""
        return {"slots": await calendar.free_slots(date)}
 
 
async def entrypoint(ctx: JobContext):
    session = AgentSession(
        llm=thunderphone.RealtimeModel(product="bolt", voice="olivia", language="es"),
    )
    await session.start(agent=Receptionist(), room=ctx.room)
    await session.generate_reply()   # the agent speaks first

ThunderPhone фіксує інструкції та інструменти на початку дзвінка, тому update_instructions, update_tools і передавання агента, що змінює їх, не підтримуються під час дзвінка. Сесіями в коді керує клієнт: агент говорить, коли ви викликаєте generate_reply() або коли учасник завершує репліку.

Параметри

АргументЗначення
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Потоково передає фрагменти транскрипту абонента під час висловлювання (оплачується додатково).
base_urlПеревизначення кінцевої точки, за замовчуванням wss://api.thunderphone.com/v1/realtime.

Події

ThunderPhone додає події платформи поверх протоколу реального часу. Сеанс надсилає їх:

@session.llm.session.on("thunderphone_call_ended")  # or on the RealtimeSession you hold
def on_call_ended(event):
    print("call ended:", event["reason"])

RealtimeSession надає call_id, щойно сеанс стає активним. Використовуйте його з GET /v1/calls/{call_id}, щоб отримати запис, транскрипт і оцінку після дзвінка. Усі інші події call.* (переадресація, клавіатура, проігнороване мовлення) надходять як thunderphone_call_event.

Обмеження

  • Виявлення чергування реплік виконується на сервері й завжди ввімкнене; виявлення чергування реплік на боці фреймворку (turn_detection у AgentSession) ігнорується.
  • Інструкції та інструменти не можна змінювати після початку дзвінка.
  • Аудіо — 16-бітний моно PCM із частотою 24 кГц в обох напрямках.
  • Відеокадри ігноруються.