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; инструкциите и инструментите на 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 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 kHz в двете посоки.
  • Видеокадрите се игнорират.