ThunderPhone 2.0 kini resmi hadir.Layanan mandiri, mulai dari 2¢/menit.Baca pengumumannya

Connect tools & data

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 key

Paket 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

ArgumenArti
api_keyKunci rahasia (sk_live_...). Secara default menggunakan THUNDERPHONE_API_KEY.
agent_idJalankan agen tersimpan. Tidak dapat digunakan bersama product dan voice.
productMesin untuk sesi inline: spark, bolt, atau storm.
voiceNama suara ThunderPhone untuk sesi inline.
languagePetunjuk bahasa utama untuk sesi inline, misalnya es.
from_number, to_numberNomor yang dicatat pada panggilan saat pipeline berada di depan saluran telepon.
live_transcriptsStreaming fragmen transkrip penelepon di tengah ujaran (dikenai biaya tambahan).
greet_on_connectMinta respons pertama segera setelah sesi siap.
end_task_on_call_endedKirim 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.