ThunderPhone 2.0 is live.Direct zelf aan de slag, vanaf 2 cent/min.Lees de aankondiging

Connect tools & data

Gebruik ThunderPhone vanuit LiveKit Agents

Gebruik een ThunderPhone-spraakagent als realtime (spraak-naar-spraak)model van een LiveKit Agents-sessie, met LiveKit-ruimtes, SIP en telefonie eromheen.

LiveKit Agents is een opensourceframework voor realtime spraakagenten boven op LiveKit-ruimtes. ThunderPhone sluit aan als het realtimemodel: het framework stuurt de audio van de deelnemer, ThunderPhone retourneert de stem, transcripties en functieaanroepen van de agent, en de ruimte, SIP-trunks en telefonie van LiveKit vervoeren de audio. Spraakherkenning, het taalmodel, de stem, beurtwisseling, 47 talen en tools draaien allemaal op ThunderPhone.

Oproepen die op deze manier worden gedaan, verschijnen in de Oproepgeschiedenis en worden gefactureerd tegen het per-minuuttarief van je product, net als elke andere realtime oproep. Er is geen abonnement en geen ThunderPhone-telefoonnummer betrokken.

Installeren

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

De plugin verpakt het OpenAI Realtime-model van LiveKit, omdat de Realtime WebSocket van ThunderPhone hetzelfde protocol gebruikt. Hiervoor is livekit-agents 1.8 of nieuwer vereist.

Een opgeslagen agent uitvoeren

Alles wat de agent doet (prompt, stem, engine, talen, tools, begroeting, stiltecontroles) wordt geconfigureerd in ThunderPhone. De sessie verplaatst alleen audio.

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

Een opgeslagen agent begroet en voert zijn eigen tools uit op ThunderPhone; de instructies en tools van de LiveKit-Agent worden niet verzonden. De oproep eindigt wanneer de ThunderPhone-agent ophangt, en de sessie wordt daarmee gesloten.

De sessie inline configureren

Zonder agent_id komen instructies en tools van de LiveKit-Agent, net als bij OpenAI. product kiest de engine en voice kiest de ThunderPhone-stem.

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 bevriest instructies en tools wanneer de oproep begint, dus update_instructions, update_tools en overdrachten van agents die deze wijzigen worden tijdens een oproep niet ondersteund. Inline sessies worden door de client aangestuurd: de agent spreekt wanneer je generate_reply() aanroept of wanneer de deelnemer een spreekbeurt afrondt.

Opties

ArgumentBetekenis
api_keyGeheime sleutel (sk_live_...). Standaard ingesteld op THUNDERPHONE_API_KEY.
agent_idVoer een opgeslagen agent uit. Niet te combineren met product en voice.
productEngine voor inline sessies: spark, bolt of storm.
voiceThunderPhone-stemnaam voor inline sessies.
languageHint voor de primaire taal van inline sessies, bijvoorbeeld es.
from_number, to_numberNummers die tijdens het gesprek moeten worden vastgelegd wanneer de room een telefoonlijn bedient.
live_transcriptsStream transcriptfragmenten van de beller tijdens het spreken (tegen extra kosten).
base_urlEndpoint-overschrijving, standaard wss://api.thunderphone.com/v1/realtime.

Gebeurtenissen

ThunderPhone voegt platformgebeurtenissen toe boven op het realtimeprotocol. De sessie zendt deze uit:

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

De RealtimeSession stelt call_id beschikbaar zodra de sessie actief is. Gebruik dit met GET /v1/calls/{call_id} om na het gesprek de opname, het transcript en de beoordeling op te halen. Elke andere call.*-gebeurtenis (doorverbinden, toetsenblok, genegeerde spraak) komt binnen als thunderphone_call_event.

Limieten

  • Beurtdetectie gebeurt server-side en staat altijd aan; beurtdetectie aan frameworkzijde (turn_detection op de AgentSession) wordt genegeerd.
  • Instructies en tools kunnen niet meer worden gewijzigd zodra het gesprek begint.
  • Audio is 16-bits mono-PCM op 24 kHz in beide richtingen.
  • Videoframes worden genegeerd.