LiveKit Agents থেকে ThunderPhone ব্যবহার করুন
LiveKit রুম, SIP এবং টেলিফোনির সঙ্গে একটি LiveKit Agents সেশনের রিয়েলটাইম (স্পিচ-টু-স্পিচ) মডেল হিসেবে একটি ThunderPhone ভয়েস এজেন্ট চালান।
LiveKit Agents হলো LiveKit রুমের ওপর নির্মিত রিয়েলটাইম ভয়েস এজেন্টের জন্য একটি ওপেন-সোর্স ফ্রেমওয়ার্ক। ThunderPhone রিয়েলটাইম মডেল হিসেবে যুক্ত হয়: ফ্রেমওয়ার্ক অংশগ্রহণকারীর অডিও পাঠায়, ThunderPhone এজেন্টের কণ্ঠ, ট্রান্সক্রিপ্ট এবং ফাংশন কল ফিরিয়ে দেয়, আর LiveKit-এর রুম, SIP ট্রাঙ্ক ও টেলিফোনি অডিও বহন করে। স্পিচ রিকগনিশন, ভাষা মডেল, কণ্ঠ, টার্ন-টেকিং, 47টি ভাষা এবং টুল—সবই ThunderPhone-এ চলে।
এভাবে করা কল কল ইতিহাসে দেখা যায় এবং অন্য যেকোনো রিয়েলটাইম কলের মতো আপনার পণ্যের প্রতি-মিনিট হারে বিল করা হয়। কোনো সাবস্ক্রিপশন বা ThunderPhone ফোন নম্বর জড়িত নেই।
ইনস্টল করুন
pip install livekit-plugins-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyপ্লাগইনটি LiveKit-এর OpenAI Realtime মডেল র্যাপ করে, কারণ ThunderPhone-এর
Realtime WebSocket একই প্রোটোকলে কাজ করে। এর জন্য livekit-agents 1.8 বা পরবর্তী সংস্করণ প্রয়োজন।
একটি সংরক্ষিত এজেন্ট চালান
এজেন্ট যা কিছু করে (prompt, কণ্ঠ, ইঞ্জিন, ভাষা, টুল, অভিবাদন, নীরবতা চেক-ইন) সবকিছু ThunderPhone-এ কনফিগার করা হয়। সেশন শুধু অডিও স্থানান্তর করে।
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))একটি সংরক্ষিত এজেন্ট ThunderPhone-এ অভিবাদন জানায় এবং নিজস্ব টুল চালায়; LiveKit Agent-এর নির্দেশনা ও টুল পাঠানো হয় না। ThunderPhone এজেন্ট কল কেটে দিলে কল শেষ হয় এবং এর সঙ্গে সেশনও বন্ধ হয়।
সেশন ইনলাইনে কনফিগার করুন
agent_id ছাড়া, নির্দেশনা ও টুল LiveKit Agent থেকে আসে, OpenAI-এর ক্ষেত্রেও যেমন হয়। product ইঞ্জিন নির্বাচন করে এবং voice 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 firstThunderPhone কল শুরু হলে নির্দেশনা ও টুল স্থির করে দেয়, তাই সেগুলো পরিবর্তন করে এমন update_instructions, update_tools এবং এজেন্ট হ্যান্ড-অফ কল চলাকালে সমর্থিত নয়। ইনলাইন সেশন ক্লায়েন্ট-নিয়ন্ত্রিত: আপনি generate_reply() কল করলে বা অংশগ্রহণকারী একটি টার্ন শেষ করলে এজেন্ট কথা বলে।
বিকল্পসমূহ
| আর্গুমেন্ট | অর্থ |
|---|---|
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 | কথনের মাঝপথে কলারের ট্রান্সক্রিপ্ট অংশ স্ট্রিম করুন (অতিরিক্ত বিলযোগ্য)। |
base_url | এন্ডপয়েন্ট ওভাররাইড, ডিফল্ট wss://api.thunderphone.com/v1/realtime। |
ইভেন্ট
ThunderPhone রিয়েলটাইম প্রোটোকলের ওপর প্ল্যাটফর্ম ইভেন্ট যোগ করে। সেশন এগুলো এমিট করে:
@session.llm.session.on("thunderphone_call_ended") # or on the RealtimeSession you hold
def on_call_ended(event):
print("call ended:", event["reason"])সেশন লাইভ হলে RealtimeSession call_id প্রকাশ করে। কলের পরে রেকর্ডিং,
ট্রান্সক্রিপ্ট এবং গ্রেড আনতে এটি
GET /v1/calls/{call_id}-এর সঙ্গে ব্যবহার করুন। অন্য সব call.* ইভেন্ট
(ট্রান্সফার, কীপ্যাড, বক্তব্য উপেক্ষা করা) thunderphone_call_event হিসেবে আসে।
সীমাবদ্ধতা
- টার্ন শনাক্তকরণ সার্ভার-সাইডে হয় এবং সবসময় চালু থাকে; ফ্রেমওয়ার্ক-সাইড টার্ন শনাক্তকরণ
(
AgentSession-এturn_detection) উপেক্ষা করা হয়। - কল শুরু হলে নির্দেশনা এবং টুল পরিবর্তন করা যায় না।
- উভয় দিকেই অডিও হলো 24 kHz-এ 16-বিট মোনো PCM।
- ভিডিও ফ্রেম উপেক্ষা করা হয়।