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

Connect tools & data

Χρησιμοποιήστε το ThunderPhone από το Pipecat

Εκτελέστε έναν φωνητικό πράκτορα ThunderPhone ως υπηρεσία ομιλία-σε-ομιλία μέσα σε μια ροή εργασίας Pipecat, με τη δική σας μεταφορά και τηλεφωνία.

Pipecat είναι ένα πλαίσιο ανοιχτού κώδικα για τη δημιουργία φωνητικών πρακτόρων από συνθέσιμες υπηρεσίες. Το ThunderPhone ενσωματώνεται ως υπηρεσία LLM ομιλίας σε ομιλία: το Pipecat στέλνει ήχο καλούντος, το ThunderPhone επιστρέφει τη φωνή του πράκτορα, απομαγνητοφωνήσεις και κλήσεις συναρτήσεων, και η μεταφορά του Pipecat (Daily, LiveKit, Twilio, WebRTC, τοπικό μικρόφωνο) μεταφέρει τον ήχο. Η αναγνώριση ομιλίας, το γλωσσικό μοντέλο, η φωνή, η εναλλαγή σειράς ομιλίας, 47 γλώσσες και τα εργαλεία εκτελούνται όλα στο ThunderPhone.

Οι κλήσεις που πραγματοποιούνται με αυτόν τον τρόπο εμφανίζονται στο ιστορικό κλήσεων και χρεώνονται με τη χρέωση ανά λεπτό του προϊόντος σας, όπως κάθε άλλη κλήση σε πραγματικό χρόνο. Δεν υπάρχει συνδρομή ούτε εμπλέκεται αριθμός τηλεφώνου ThunderPhone.

Εγκατάσταση

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

Το πακέτο περιβάλλει την υπηρεσία OpenAI Realtime του Pipecat, επειδή το Realtime WebSocket του ThunderPhone μιλά το ίδιο πρωτόκολλο. Απαιτεί pipecat-ai 1.8 ή νεότερο.

Εκτέλεση αποθηκευμένου πράκτορα

Όλα όσα κάνει ο πράκτορας (προτροπή, φωνή, μηχανή, γλώσσες, εργαλεία, χαιρετισμός, έλεγχοι σιωπής) διαμορφώνονται στο ThunderPhone. Η διοχέτευση μετακινεί μόνο ήχο.

from pipecat.pipeline.pipeline import Pipeline
from pipecat.pipeline.worker import PipelineParams, PipelineWorker
from pipecat.processors.aggregators.llm_context import LLMContext
from pipecat.processors.aggregators.llm_response_universal import LLMContextAggregatorPair
from pipecat_thunderphone import ThunderPhoneRealtimeLLMService
 
llm = ThunderPhoneRealtimeLLMService(agent_id=12)
 
context = LLMContext()
aggregators = LLMContextAggregatorPair(context)
pipeline = Pipeline([
    transport.input(),
    aggregators.user(),
    llm,
    aggregators.assistant(),
    transport.output(),
])
worker = PipelineWorker(pipeline, params=PipelineParams(allow_interruptions=True))

Ένας αποθηκευμένος πράκτορας ανοίγει την κλήση με το δικό του χρονοδιάγραμμα, επομένως η υπηρεσία δεν ζητά αρχική απάντηση από το Pipecat. Περάστε greet_on_connect=True αν θέλετε μία παρ' όλα αυτά.

Διαμόρφωση της συνεδρίας ενσωματωμένα

Χωρίς agent_id, οι οδηγίες και τα εργαλεία προέρχονται από το περιβάλλον Pipecat, με τον ίδιο τρόπο όπως για το OpenAI. Το product επιλέγει τη μηχανή και το voice επιλέγει τη φωνή ThunderPhone.

from pipecat.adapters.schemas.function_schema import FunctionSchema
from pipecat.adapters.schemas.tools_schema import ToolsSchema
from pipecat.services.llm_service import FunctionCallParams
 
llm = ThunderPhoneRealtimeLLMService(product="bolt", voice="olivia", language="es")
 
async def check_availability(params: FunctionCallParams):
    slots = await calendar.free_slots(params.arguments["date"])
    await params.result_callback({"slots": slots})
 
llm.register_function("check_availability", check_availability)
 
context = LLMContext(
    messages=[{"role": "system", "content": "You are Acme Dental's receptionist."}],
    tools=ToolsSchema(standard_tools=[
        FunctionSchema(
            name="check_availability",
            description="Free appointment slots on a date",
            properties={"date": {"type": "string"}},
            required=["date"],
        )
    ]),
)

Οι ενσωματωμένες συνεδρίες καθοδηγούνται από τον πελάτη: ο πράκτορας μιλά πρώτος επειδή το Pipecat ζητά απάντηση όταν φτάνει το περιβάλλον και παραμένει σιωπηλός κατά τη σιωπή, εκτός αν προσθέσετε μήνυμα ή ζητήσετε άλλη απάντηση.

Επιλογές

ΌρισμαΣημασία
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Μεταδώστε τμήματα απομαγνητοφώνησης του καλούντος κατά τη διάρκεια της εκφοράς (με επιπλέον χρέωση).
greet_on_connectΖητήστε μια πρώτη απόκριση μόλις η συνεδρία είναι έτοιμη.
end_task_on_call_endedΠροωθήστε EndWorkerFrame όταν το ThunderPhone τερματίζει την κλήση (ενεργό από προεπιλογή).

Συμβάντα

Το ThunderPhone προσθέτει συμβάντα πλατφόρμας πάνω από το πρωτόκολλο πραγματικού χρόνου. Η υπηρεσία τα παραδίδει στους χειριστές:

@llm.event_handler("on_call_ended")
async def on_call_ended(service, event):
    print("call ended:", event["reason"], "call id:", service.call_id)

Το service.call_id ορίζεται μόλις η συνεδρία είναι ενεργή. Χρησιμοποιήστε το με το GET /v1/calls/{call_id} για να ανακτήσετε την εγγραφή, την απομαγνητοφώνηση και την αξιολόγηση μετά την κλήση.

Περιορισμοί

  • Η ανίχνευση σειράς ομιλίας γίνεται από την πλευρά του διακομιστή και είναι πάντα ενεργή· οι σειρές ομιλίας που καθοδηγούνται από το Pipecat (turn_detection=False) δεν υποστηρίζονται.
  • Οι συναρτήσεις που καταχωρίζονται στην υπηρεσία εκτελούνται μόνο για ενσωματωμένες συνεδρίες. Ένας αποθηκευμένος πράκτορας εκτελεί τα δικά του εργαλεία στο ThunderPhone.
  • Ο ήχος είναι μονοφωνικό PCM 16-bit στα 24 kHz και στις δύο κατευθύνσεις.
  • Τα καρέ βίντεο αγνοούνται.