ThunderPhone 2.0 এখন লাইভ।নিজেই শুরু করুন, খরচ মিনিটে 2¢ থেকে।ঘোষণাটি পড়ুন

Connect tools & data

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 first

ThunderPhone কল শুরু হলে নির্দেশনা ও টুল স্থির করে দেয়, তাই সেগুলো পরিবর্তন করে এমন 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।
  • ভিডিও ফ্রেম উপেক্ষা করা হয়।