Το ThunderPhone 2.0 είναι εδώ.Ξεκινήστε μόνοι σας, από 2¢/λεπτό.Διαβάστε την ανακοίνωση

Connect tools & data

Χρησιμοποιήστε το 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 και προς τις δύο κατευθύνσεις.
  • Τα καρέ βίντεο αγνοούνται.