ThunderPhone 2.0 yayında.Kendi başınıza kullanmaya başlayın; dakikada 2¢'den başlayan fiyatlarla.Duyuruyu okuyun

Connect tools & data

Pipecat

Kendi aktarım ve telefon altyapınızla, bir Pipecat işlem hattı içinde konuşmadan konuşmaya hizmet olarak bir ThunderPhone sesli AI ajanı çalıştırın.

Pipecat, birleştirilebilir hizmetlerden sesli AI ajanları oluşturmak için açık kaynaklı bir çerçevedir. ThunderPhone, bir konuşmadan konuşmaya LLM hizmeti olarak bağlanır: Pipecat arayanın sesini gönderir, ThunderPhone ajanın sesini, transkriptleri ve fonksiyon çağrılarını döndürür; Pipecat'in aktarım katmanı (Daily, LiveKit, Twilio, WebRTC, yerel mikrofon) sesi taşır. Konuşma tanıma, dil modeli, ses, sıra alma, 47 dil ve araçların tümü ThunderPhone üzerinde çalışır.

Bu şekilde yapılan aramalar arama geçmişinde görünür ve diğer tüm gerçek zamanlı aramalar gibi ürününüzün dakika başı ücreti üzerinden faturalandırılır. Abonelik veya ThunderPhone telefon numarası gerekmez.

Kurun

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

Paket, ThunderPhone'un Realtime WebSocket hizmeti aynı protokolü kullandığı için Pipecat'in OpenAI Realtime hizmetini sarmalar. pipecat-ai 1.8 veya daha yeni bir sürümü gerekir.

Kaydedilmiş bir ajanı çalıştırın

Ajanın yaptığı her şey (istem, ses, altyapı, diller, araçlar, karşılama, sessizlik yoklamaları) ThunderPhone üzerinde yapılandırılır. İşlem hattı yalnızca sesi taşır.

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))

Kaydedilmiş bir ajan aramayı kendi programına göre başlatır; bu nedenle hizmet Pipecat'ten ilk yanıt istemez. Yine de bir yanıt istiyorsanız greet_on_connect=True geçirin.

Oturumu satır içi yapılandırın

agent_id olmadan, talimatlar ve araçlar OpenAI'de olduğu gibi Pipecat bağlamından gelir. product altyapıyı, voice ise ThunderPhone sesini seçer.

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"],
        )
    ]),
)

Satır içi oturumlar istemci tarafından yönlendirilir: Pipecat, bağlam ulaştığında yanıt istediği için ajan ilk konuşan olur; siz bir mesaj eklemediğiniz veya başka bir yanıt istemediğiniz sürece sessizlik sırasında sessiz kalır.

Seçenekler

ArgümanAnlamı
api_keyGizli anahtar (sk_live_...). Varsayılan olarak THUNDERPHONE_API_KEY kullanılır.
agent_idKaydedilmiş bir ajanı çalıştırır. product ve voice ile birlikte kullanılamaz.
productSatır içi oturumlar için motor: spark, bolt veya storm.
voiceSatır içi oturumlar için ThunderPhone ses adı.
languageSatır içi oturumlar için birincil dil ipucu; örneğin es.
from_number, to_numberİşlem hattı bir telefon hattının önünde olduğunda aramada kaydedilecek numaralar.
live_transcriptsArayanın transkript parçalarını ifade tamamlanmadan aktarır (ek ücretlendirilir).
greet_on_connectOturum hazır olur olmaz ilk yanıtın verilmesini ister.
end_task_on_call_endedThunderPhone aramayı sonlandırdığında EndWorkerFrame gönderir (varsayılan olarak açık).

Olaylar

ThunderPhone, gerçek zamanlı protokolün üzerine platform olayları ekler. Hizmet, bunları işleyicilere iletir:

@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, oturum canlı olduğunda ayarlanır. Aramadan sonra kaydı, transkripti ve notu almak için bunu GET /v1/calls/{call_id} ile kullanın.

Sınırlar

  • Sıra algılama sunucu tarafında gerçekleştirilir ve her zaman açıktır; Pipecat tarafından yönetilen sıralar (turn_detection=False) desteklenmez.
  • Hizmete kaydedilen fonksiyonlar yalnızca satır içi oturumlarda çalışır. Kaydedilmiş bir ajan, kendi araçlarını ThunderPhone üzerinde yürütür.
  • Ses, her iki yönde de 24 kHz'de 16 bit mono PCM'dir.
  • Video kareleri yok sayılır.