ThunderPhone 2.0 متاح الآن.خدمة ذاتية، ابتداءً من 2 سنت/دقيقة.اقرأ الإعلان

Connect tools & data

استخدم ThunderPhone من Pipecat

شغّل وكيلاً صوتياً من ThunderPhone كخدمة تحويل الكلام إلى كلام داخل مسار Pipecat، باستخدام النقل والهاتفية الخاصين بك.

Pipecat هو إطار عمل مفتوح المصدر لبناء وكلاء صوتيين من خدمات قابلة للتركيب. يتكامل ThunderPhone كـ خدمة نموذج لغوي كبير من الكلام إلى الكلام: يرسل 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 بت وتردد 24 كيلوهرتز في كلا الاتجاهين.
  • يتم تجاهل إطارات الفيديو.