Gunakan ThunderPhone dari Pipecat
Jalankan agen suara ThunderPhone sebagai layanan suara-ke-suara di dalam pipeline Pipecat, dengan transportasi dan teleponi Anda sendiri.
Pipecat adalah framework sumber terbuka untuk membangun agen suara dari layanan yang dapat dikomposisikan. ThunderPhone terintegrasi sebagai layanan LLM ucapan-ke-ucapan: Pipecat mengirim audio penelepon, ThunderPhone mengembalikan suara agen, transkrip, dan pemanggilan fungsi, sementara transport Pipecat (Daily, LiveKit, Twilio, WebRTC, mikrofon lokal) membawa audio. Pengenalan ucapan, model bahasa, suara, pengaturan giliran, 47 bahasa, dan alat semuanya berjalan di ThunderPhone.
Panggilan yang dilakukan dengan cara ini muncul di riwayat panggilan dan ditagihkan dengan tarif per menit produk Anda seperti panggilan realtime lainnya. Tidak ada langganan dan tidak ada nomor telepon ThunderPhone yang terlibat.
Instal
pip install pipecat-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyPaket ini membungkus layanan OpenAI Realtime milik Pipecat, karena
Realtime WebSocket ThunderPhone menggunakan protokol yang sama. Paket ini
memerlukan pipecat-ai 1.8 atau yang lebih baru.
Jalankan agen tersimpan
Semua yang dilakukan agen (Prompt, suara, engine, bahasa, alat, salam, pemeriksaan saat hening) dikonfigurasikan di ThunderPhone. Pipeline hanya memindahkan audio.
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))Agen tersimpan membuka panggilan sesuai jadwalnya sendiri, sehingga layanan tidak
meminta respons pembuka dari Pipecat. Berikan greet_on_connect=True jika Anda
tetap menginginkannya.
Konfigurasikan sesi secara inline
Tanpa agent_id, instruksi dan alat berasal dari konteks Pipecat, dengan
cara yang sama seperti pada OpenAI. product memilih engine dan voice memilih
suara 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"],
)
]),
)Sesi inline dikendalikan oleh klien: agen berbicara lebih dahulu karena Pipecat meminta respons saat konteks tiba, dan tetap diam selama hening kecuali Anda menambahkan pesan atau meminta respons lain.
Opsi
| Argumen | Arti |
|---|---|
api_key | Kunci rahasia (sk_live_...). Secara default menggunakan THUNDERPHONE_API_KEY. |
agent_id | Jalankan agen tersimpan. Tidak dapat digunakan bersama product dan voice. |
product | Mesin untuk sesi inline: spark, bolt, atau storm. |
voice | Nama suara ThunderPhone untuk sesi inline. |
language | Petunjuk bahasa utama untuk sesi inline, misalnya es. |
from_number, to_number | Nomor yang dicatat pada panggilan saat pipeline berada di depan saluran telepon. |
live_transcripts | Streaming fragmen transkrip penelepon di tengah ujaran (dikenai biaya tambahan). |
greet_on_connect | Minta respons pertama segera setelah sesi siap. |
end_task_on_call_ended | Kirim EndWorkerFrame saat ThunderPhone mengakhiri panggilan (aktif secara default). |
Peristiwa
ThunderPhone menambahkan peristiwa Platform di atas protokol realtime. Layanan mengirimkannya ke handler:
@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 ditetapkan setelah sesi aktif. Gunakan bersama
GET /v1/calls/{call_id} untuk mengambil rekaman,
transkrip, dan penilaian setelah panggilan.
Batasan
- Deteksi giliran dilakukan di sisi server dan selalu aktif; giliran yang
dikendalikan Pipecat (
turn_detection=False) tidak didukung. - Fungsi yang didaftarkan pada layanan hanya berjalan untuk sesi inline. Agen tersimpan menjalankan alatnya sendiri di ThunderPhone.
- Audio menggunakan PCM mono 16-bit pada 24 kHz di kedua arah.
- Frame video diabaikan.