ThunderPhone 2.0 este acum disponibil.Îl configurați singur, de la 2 ¢/min.Citiți anunțul

Connect tools & data

Utilizați ThunderPhone din LiveKit Agents

Rulați un agent vocal ThunderPhone ca model în timp real (vorbire-la-vorbire) într-o sesiune LiveKit Agents, cu camere LiveKit, SIP și telefonie în jurul acestuia.

LiveKit Agents este un cadru open-source pentru agenți vocali în timp real bazat pe camere LiveKit. ThunderPhone se integrează ca model în timp real: cadrul trimite sunetul participantului, ThunderPhone returnează vocea agentului, transcrierile și apelurile de funcții, iar camerele LiveKit, trunchiurile SIP și telefonia transportă sunetul. Recunoașterea vorbirii, modelul de limbaj, vocea, gestionarea schimburilor de replici, 47 de limbi și instrumentele rulează toate pe ThunderPhone.

Apelurile efectuate astfel apar în istoricul apelurilor și sunt facturate la tariful pe minut al produsului dumneavoastră, la fel ca orice alt apel în timp real. Nu există abonament și nu este implicat niciun număr de telefon ThunderPhone.

Instalare

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

Pluginul încorporează modelul OpenAI Realtime al LiveKit, deoarece Realtime WebSocket de la ThunderPhone utilizează același protocol. Acesta necesită livekit-agents 1.8 sau o versiune mai nouă.

Rulați un agent salvat

Tot ce face agentul (prompt, voce, motor, limbi, instrumente, salut, verificări în perioadele de tăcere) este configurat în ThunderPhone. Sesiunea doar transportă sunetul.

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))

Un agent salvat salută și își rulează propriile instrumente în ThunderPhone; instrucțiunile și instrumentele Agent-ului LiveKit nu sunt trimise. Apelul se încheie când agentul ThunderPhone închide apelul, iar sesiunea se închide odată cu acesta.

Configurați sesiunea inline

Fără agent_id, instrucțiunile și instrumentele provin de la Agent-ul LiveKit, la fel ca pentru OpenAI. product selectează motorul, iar voice selectează vocea 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 fixează instrucțiunile și instrumentele când începe apelul, astfel încât update_instructions, update_tools și transferurile către alți agenți care le modifică nu sunt acceptate în timpul apelului. Sesiunile inline sunt controlate de client: agentul vorbește când apelați generate_reply() sau când participantul termină un schimb de replici.

Opțiuni

ArgumentSemnificație
api_keyCheie secretă (sk_live_...). Valoarea implicită este THUNDERPHONE_API_KEY.
agent_idRulați un agent salvat. Se exclude reciproc cu product și voice.
productMotor pentru sesiuni inline: spark, bolt sau storm.
voiceNumele vocii ThunderPhone pentru sesiuni inline.
languageIndiciu privind limba principală pentru sesiuni inline, de exemplu es.
from_number, to_numberNumere de înregistrat pentru apel atunci când camera deservește o linie telefonică.
live_transcriptsTransmiteți fragmente din transcrierea apelantului în timpul enunțului (facturate suplimentar).
base_urlSuprascriere pentru endpoint; valoarea implicită este wss://api.thunderphone.com/v1/realtime.

Evenimente

ThunderPhone adaugă evenimente de platformă peste protocolul în timp real. Sesiunea le emite:

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

RealtimeSession expune call_id după ce sesiunea devine activă. Utilizați-l cu GET /v1/calls/{call_id} pentru a prelua înregistrarea, transcrierea și evaluarea după apel. Orice alt eveniment call.* (transfer, tastatură, vorbire ignorată) sosește ca thunderphone_call_event.

Limite

  • Detectarea schimbării rândului de vorbire este pe server și este mereu activă; detectarea schimbării rândului de vorbire din framework (turn_detection pe AgentSession) este ignorată.
  • Instrucțiunile și instrumentele nu se pot modifica după începerea apelului.
  • Sunetul este PCM mono pe 16 biți la 24 kHz în ambele direcții.
  • Cadrele video sunt ignorate.