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