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 บิต ที่ 24 kHz ทั้งสองทิศทาง
  • ระบบจะไม่สนใจเฟรมวิดีโอ