ThunderPhone 2.0 đã chính thức ra mắt.Tự thiết lập, từ 2 xu/phút.Xem thông báo ra mắt

Connect tools & data

Sử dụng ThunderPhone từ LiveKit Agents

Chạy một tác nhân AI giọng nói ThunderPhone làm mô hình thời gian thực (giọng nói sang giọng nói) của một phiên LiveKit Agents, cùng với phòng LiveKit, SIP và hệ thống điện thoại xung quanh.

LiveKit Agents là một framework mã nguồn mở dành cho tác nhân AI giọng nói theo thời gian thực trên nền các phòng LiveKit. ThunderPhone tích hợp dưới dạng mô hình thời gian thực: framework gửi âm thanh của người tham gia, ThunderPhone trả về giọng nói, bản chép lời và lệnh gọi hàm của tác nhân AI, còn phòng LiveKit, trung kế SIP và hệ thống điện thoại truyền tải âm thanh. Nhận dạng giọng nói, mô hình ngôn ngữ, giọng nói, luân phiên lượt nói, 47 ngôn ngữ và công cụ đều chạy trên ThunderPhone.

Các cuộc gọi được thực hiện theo cách này xuất hiện trong lịch sử cuộc gọi và được tính phí theo mức giá mỗi phút của sản phẩm như mọi cuộc gọi thời gian thực khác. Không có gói thuê bao và không sử dụng số điện thoại ThunderPhone.

Cài đặt

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

Plugin này bao bọc mô hình OpenAI Realtime của LiveKit vì Realtime WebSocket của ThunderPhone sử dụng cùng giao thức. Plugin yêu cầu livekit-agents phiên bản 1.8 trở lên.

Chạy tác nhân đã lưu

Mọi hoạt động của tác nhân AI (prompt, giọng nói, bộ máy, ngôn ngữ, công cụ, lời chào, kiểm tra khi im lặng) đều được cấu hình trên ThunderPhone. Phiên chỉ truyền âm thanh.

from livekit.agents import Agent, AgentSession, JobContext, WorkerOptions, cli
from livekit.plugins import thunderphone
 
 
async def entrypoint(ctx: JobContext):
    session = AgentSession(llm=thunderphone.RealtimeModel(agent_id=12))
    await session.start(agent=Agent(instructions=""), room=ctx.room)
 
 
if __name__ == "__main__":
    cli.run_app(WorkerOptions(entrypoint_fnc=entrypoint))

Tác nhân đã lưu sẽ chào và chạy các công cụ riêng trên ThunderPhone; hướng dẫn và công cụ của Agent LiveKit không được gửi đi. Cuộc gọi kết thúc khi tác nhân AI ThunderPhone gác máy và phiên cũng đóng theo.

Cấu hình phiên trực tiếp trong mã

Không có agent_id, hướng dẫn và công cụ sẽ đến từ Agent LiveKit, tương tự như với OpenAI. product chọn bộ máy và voice chọn giọng nói của ThunderPhone.

from livekit.agents import Agent, AgentSession, RunContext, function_tool
from livekit.plugins import thunderphone
 
 
class Receptionist(Agent):
    def __init__(self):
        super().__init__(instructions="You are Acme Dental's receptionist. Be brief.")
 
    @function_tool
    async def check_availability(self, context: RunContext, date: str) -> dict:
        """Free appointment slots on a date."""
        return {"slots": await calendar.free_slots(date)}
 
 
async def entrypoint(ctx: JobContext):
    session = AgentSession(
        llm=thunderphone.RealtimeModel(product="bolt", voice="olivia", language="es"),
    )
    await session.start(agent=Receptionist(), room=ctx.room)
    await session.generate_reply()   # the agent speaks first

ThunderPhone khóa hướng dẫn và công cụ khi cuộc gọi bắt đầu, vì vậy update_instructions, update_tools và các lượt chuyển giao tác nhân làm thay đổi chúng không được hỗ trợ trong khi gọi. Phiên trực tiếp trong mã do máy khách điều khiển: tác nhân AI nói khi bạn gọi generate_reply() hoặc khi người tham gia kết thúc một lượt nói.

Tùy chọn

Đối sốÝ nghĩa
api_keyKhóa bí mật (sk_live_...). Mặc định là THUNDERPHONE_API_KEY.
agent_idChạy một tác nhân AI đã lưu. Loại trừ lẫn nhau với productvoice.
productCông cụ cho phiên nội tuyến: spark, bolt hoặc storm.
voiceTên giọng nói ThunderPhone cho phiên nội tuyến.
languageGợi ý ngôn ngữ chính cho phiên nội tuyến, ví dụ: es.
from_number, to_numberSố cần ghi nhận trong cuộc gọi khi phòng kết nối với một đường dây điện thoại.
live_transcriptsTruyền các đoạn bản chép lời của người gọi trong khi họ đang nói (tính phí thêm).
base_urlGhi đè điểm cuối, mặc định là wss://api.thunderphone.com/v1/realtime.

Sự kiện

ThunderPhone bổ sung các sự kiện nền tảng bên trên giao thức thời gian thực. Phiên phát ra các sự kiện này:

@session.llm.session.on("thunderphone_call_ended")  # or on the RealtimeSession you hold
def on_call_ended(event):
    print("call ended:", event["reason"])

RealtimeSession hiển thị call_id sau khi phiên hoạt động. Dùng giá trị này với GET /v1/calls/{call_id} để lấy bản ghi âm, bản chép lời và điểm đánh giá sau cuộc gọi. Mọi sự kiện call.* khác (chuyển cuộc gọi, bàn phím, lời nói bị bỏ qua) đều đến dưới dạng thunderphone_call_event.

Giới hạn

  • Phát hiện lượt nói được xử lý phía máy chủ và luôn bật; phát hiện lượt nói phía framework (turn_detection trên AgentSession) bị bỏ qua.
  • Không thể thay đổi hướng dẫn và công cụ sau khi cuộc gọi bắt đầu.
  • Âm thanh là PCM đơn kênh 16-bit ở 24 kHz theo cả hai chiều.
  • Khung hình video bị bỏ qua.