Използвайте 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;
инструкциите и инструментите на LiveKit Agent не се изпращат. Обаждането приключва, когато
агентът на ThunderPhone затвори, а сесията се затваря заедно с него.
Конфигуриране на сесията в кода
Без agent_id инструкциите и инструментите идват от LiveKit Agent,
както при 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 kHz в двете посоки.
- Видеокадрите се игнорират.