Χρησιμοποιήστε το ThunderPhone από το LiveKit Agents
Εκτελέστε έναν φωνητικό πράκτορα ThunderPhone ως μοντέλο πραγματικού χρόνου (ομιλία σε ομιλία) μιας συνεδρίας LiveKit Agents, με δωμάτια LiveKit, SIP και τηλεφωνία γύρω του.
LiveKit Agents είναι ένα πλαίσιο ανοιχτού κώδικα για φωνητικούς πράκτορες πραγματικού χρόνου πάνω σε δωμάτια LiveKit. Το ThunderPhone ενσωματώνεται ως το μοντέλο πραγματικού χρόνου: το πλαίσιο στέλνει τον ήχο του συμμετέχοντα, το ThunderPhone επιστρέφει τη φωνή του πράκτορα, απομαγνητοφωνήσεις και κλήσεις συναρτήσεων, και τα δωμάτια, τα SIP trunks και η τηλεφωνία του LiveKit μεταφέρουν τον ήχο. Η αναγνώριση ομιλίας, το γλωσσικό μοντέλο, η φωνή, η εναλλαγή σειράς ομιλίας, οι 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· οι
οδηγίες και τα εργαλεία του Agent του LiveKit δεν αποστέλλονται. Η κλήση τερματίζεται όταν ο
πράκτορας ThunderPhone κλείνει τη γραμμή και η συνεδρία κλείνει μαζί του.
Ρυθμίστε τη συνεδρία ενσωματωμένα
Χωρίς agent_id, οι οδηγίες και τα εργαλεία προέρχονται από το Agent του LiveKit, με τον
ίδιο τρόπο όπως για το 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) αγνοείται. - Οι οδηγίες και τα εργαλεία δεν μπορούν να αλλάξουν μόλις ξεκινήσει η κλήση.
- Ο ήχος είναι PCM μονοφωνικός 16-bit στα 24 kHz και προς τις δύο κατευθύνσεις.
- Τα καρέ βίντεο αγνοούνται.