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 keyDe 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 firstThunderPhone 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
| Argument | Betekenis |
|---|---|
api_key | Geheime sleutel (sk_live_...). Standaard ingesteld op THUNDERPHONE_API_KEY. |
agent_id | Voer een opgeslagen agent uit. Niet te combineren met product en voice. |
product | Engine voor inline sessies: spark, bolt of storm. |
voice | ThunderPhone-stemnaam voor inline sessies. |
language | Hint voor de primaire taal van inline sessies, bijvoorbeeld es. |
from_number, to_number | Nummers die tijdens het gesprek moeten worden vastgelegd wanneer de room een telefoonlijn bedient. |
live_transcripts | Stream transcriptfragmenten van de beller tijdens het spreken (tegen extra kosten). |
base_url | Endpoint-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_detectionop deAgentSession) 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.