A ThunderPhone használata LiveKit Agentsből
Futtasson egy ThunderPhone hangalapú AI-ügynököt egy LiveKit Agents-munkamenet valós idejű (beszéd–beszéd) modelljeként, LiveKit-szobákkal, SIP-pel és telefonos integrációval körülvéve.
LiveKit Agents egy nyílt forráskódú keretrendszer valós idejű hangalapú AI-ügynökökhöz, LiveKit-szobákra építve. A ThunderPhone valós idejű modellként csatlakozik: a keretrendszer elküldi a résztvevő hangját, a ThunderPhone visszaadja az ügynök hangját, az átiratokat és a függvényhívásokat, a LiveKit szobája, SIP-trönkjei és telefonos rendszere pedig továbbítja a hangot. A beszédfelismerés, a nyelvi modell, a hang, a beszédváltás-kezelés, a 47 nyelv és az eszközök mind a ThunderPhone-on futnak.
Az így indított hívások megjelennek a híváselőzményekben, és ugyanúgy az Ön termékének percdíja szerint kerülnek számlázásra, mint bármely más valós idejű hívás. Nincs előfizetés, és nincs szükség ThunderPhone-telefonszámra.
Telepítés
pip install livekit-plugins-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyA beépülő modul a LiveKit OpenAI Realtime modelljét burkolja, mivel a ThunderPhone
Realtime WebSocket ugyanazt a protokollt használja. A
működéshez livekit-agents 1.8-as vagy újabb verzió szükséges.
Mentett ügynök futtatása
Az ügynök minden működése (utasítás, hang, motor, nyelvek, eszközök, üdvözlés, csendellenőrzések) a ThunderPhone-on van konfigurálva. A munkamenet csak a hangot továbbítja.
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))A mentett ügynök a ThunderPhone-on üdvözöl és futtatja saját eszközeit; a LiveKit
Agent utasításai és eszközei nem kerülnek elküldésre. A hívás akkor ér véget,
amikor a ThunderPhone-ügynök bontja a hívást, és a munkamenet vele együtt zárul.
A munkamenet közvetlen konfigurálása
agent_id nélkül az utasítások és az eszközök a LiveKit Agent-től származnak,
ugyanúgy, mint az OpenAI esetében. A product választja ki a motort, a voice
pedig a ThunderPhone hangját.
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 firstA ThunderPhone a hívás kezdetekor rögzíti az utasításokat és az eszközöket, ezért
a update_instructions, a update_tools és az ezeket módosító ügynökátadások
nem támogatottak hívás közben. A közvetlenül konfigurált munkamenetek kliens által
vezéreltek: az ügynök akkor beszél, amikor meghívja a generate_reply() függvényt,
vagy amikor a résztvevő befejez egy beszédfordulót.
Beállítások
| Argumentum | Jelentés |
|---|---|
api_key | Titkos kulcs (sk_live_...). Alapértelmezett értéke: THUNDERPHONE_API_KEY. |
agent_id | Mentett AI-ügynök futtatása. Kölcsönösen kizárja a product és a voice használatát. |
product | Motor beágyazott munkamenetekhez: spark, bolt vagy storm. |
voice | ThunderPhone-hang neve beágyazott munkamenetekhez. |
language | Elsődleges nyelvi utalás beágyazott munkamenetekhez, például es. |
from_number, to_number | A hívásban rögzítendő számok, amikor a szoba telefonvonalhoz kapcsolódik. |
live_transcripts | A hívó átiratának töredékeit streameli a megszólalás közben (külön díj ellenében). |
base_url | Végpont felülbírálása, alapértelmezett értéke: wss://api.thunderphone.com/v1/realtime. |
Események
A ThunderPhone platformeseményeket ad hozzá a valós idejű protokollhoz. A munkamenet ezeket bocsátja ki:
@session.llm.session.on("thunderphone_call_ended") # or on the RealtimeSession you hold
def on_call_ended(event):
print("call ended:", event["reason"])A RealtimeSession a munkamenet aktiválódása után teszi elérhetővé a call_id értéket. Használja ezt a
GET /v1/calls/{call_id} végponttal a felvétel,
az átirat és az értékelés lekéréséhez a hívás után. Minden más call.* esemény (átirányítás,
billentyűzet, figyelmen kívül hagyott beszéd) thunderphone_call_event eseményként érkezik.
Korlátozások
- A beszédforduló-felismerés szerveroldali és mindig be van kapcsolva; a keretrendszeroldali
beszédforduló-felismerés (
turn_detectionazAgentSessionobjektumon) figyelmen kívül marad. - Az utasítások és az eszközök a hívás megkezdése után nem módosíthatók.
- A hang mindkét irányban 16 bites, monó PCM 24 kHz-en.
- A videoképkockák figyelmen kívül maradnak.