---
title: "OpenAI Realtime ক্লায়েন্টের সঙ্গে ThunderPhone ব্যবহার করুন"
description: "সংরক্ষিত এজেন্ট বা ইনলাইন সেশন কনফিগারেশন ব্যবহার করে একটি OpenAI Realtime-সামঞ্জস্যপূর্ণ সার্ভার ক্লায়েন্টকে ThunderPhone-এর দিকে নির্দেশ করুন।"
---

ThunderPhone, OpenAI Realtime ইভেন্ট মডেলের একটি লক্ষ্যভিত্তিক উপসেট বাস্তবায়ন করে।
একটি বিদ্যমান সার্ভার-সাইড ক্লায়েন্ট ThunderPhone ভয়েস এজেন্ট ব্যবহার করার সময় তার WebSocket, অডিও, সেশন এবং
রেসপন্স ইভেন্ট ফ্লো বজায় রাখতে পারে।

## সংযোগ করার আগে

আপনার একটি ThunderPhone অর্গানাইজেশন সিক্রেট API কী এবং WebSocket খুলতে পারে এমন একটি সার্ভার রানটাইম
প্রয়োজন। ব্রাউজার কোড থেকে সংযোগ করবেন না বা ব্রাউজারে কী প্রকাশ করবেন না। সংরক্ষিত এজেন্ট ব্যবহার করতে হলে,
প্রথমে সেটি ডিপ্লয় করুন এবং এর সংখ্যাসূচক এজেন্ট ID কপি করুন।

এতে সংযোগ করুন:

```text
wss://api.thunderphone.com/v1/realtime
```

আপনার সার্ভার থেকে WebSocket আপগ্রেড প্রমাণীকরণ করুন:

```http
Authorization: Bearer sk_live_YOUR_API_KEY
```

যেসব ক্লায়েন্ট হ্যান্ডশেক হেডার সেট করতে পারে না, তাদের জন্য কোয়েরি-স্ট্রিং প্রমাণীকরণ রয়েছে,
তবে URLs লগে ফাঁস হওয়ার ঝুঁকি বেশি।

## কনফিগারেশনের নিয়ন্ত্রণ কার হাতে থাকবে তা বেছে নিন

| মোড | যে দিয়ে সংযোগ করবেন | কনফিগারেশনের উৎস |
| --- | --- | --- |
| সংরক্ষিত এজেন্ট | `?agent_id=12` | ডিপ্লয় করা prompt, ভয়েস, পণ্য, ভাষা, জ্ঞান এবং সামঞ্জস্যপূর্ণ সার্ভার-চালিত টুল |
| ইনলাইন | কোনো `agent_id` নেই | আপনার ক্লায়েন্ট থেকে প্রথম গৃহীত `session.update` |

### সংরক্ষিত এজেন্ট

ডিপ্লয় করা এজেন্ট ID দিয়ে সংযোগ করুন:

```text
wss://api.thunderphone.com/v1/realtime?agent_id=12
```

সকেট সংযোগের সময় এজেন্ট চালু হয়। এর অভিবাদন উপলভ্য থাকে,
তবে Realtime এর কথ্য নীরবতা যাচাই নিষ্ক্রিয় করে এবং `transfer_call`
ও `send_keypad_input` বাদ দেয়। অন্যান্য সামঞ্জস্যপূর্ণ টুল ThunderPhone-এ চলে। এই মোডের জন্য
ইনলাইন নির্দেশনা বা ক্লায়েন্ট-নির্বাহিত টুল পাঠাবেন না।

এজেন্ট চালু হওয়ার আগে `input_audio_format`,
`output_audio_format`, `input_rate` এবং `output_rate` কোয়েরি প্যারামিটার দিয়ে ওয়্যার অডিও সেট করুন। সংযোগের পরে
আপনি সংরক্ষিত কনফিগারেশন বা অডিও ফরম্যাট পরিবর্তন করতে পারবেন না।

### ইনলাইন সেশন

`agent_id` ছাড়া, `session.created`-এর জন্য অপেক্ষা করুন, তারপর `session.update` পাঠান:

```json
{
  "type": "session.update",
  "session": {
    "type": "realtime",
    "instructions": "Answer questions clearly and keep responses brief.",
    "audio": {
      "input": {
        "format": { "type": "audio/pcm", "rate": 24000 }
      },
      "output": {
        "format": { "type": "audio/pcm", "rate": 24000 },
        "voice": "olivia"
      }
    },
    "config": {
      "product": "bolt"
    }
  }
}
```

প্রথম গৃহীত আপডেট কল প্রভিশন করে। `session.updated` অর্থ
সেশন সক্রিয়। এর পরে নির্দেশনা, ভয়েস, পণ্য, টুল এবং অডিও ফরম্যাট পরিবর্তন করা যাবে না।

ইনলাইন সেশনে স্বয়ংক্রিয় অভিবাদন বা কথ্য নীরবতা যাচাই নেই। এজেন্টকে আগে কথা বলাতে, একটি সিস্টেম বা ব্যবহারকারী বার্তা যোগ করুন এবং
`response.create` পাঠান। সম্পূর্ণ নিষ্ক্রিয় সেশনও প্ল্যাটফর্মের নীরব-কল সীমায় শেষ হয়, যা ডিফল্টভাবে 600 সেকেন্ড।

## অফিসিয়াল OpenAI SDK ব্যবহার করুন

`/v1` দিয়ে শেষ হওয়া একটি WebSocket বেস URL দিন; SDK `/realtime` যোগ করে। `model` মানটি একটি সামঞ্জস্যপূর্ণ নাম এবং ThunderPhone পণ্য নির্বাচন করে না। সেশন কনফিগারেশন বা সংরক্ষিত এজেন্টে পণ্য নির্বাচন করুন।

এই সংযোগ পরীক্ষা একটি ইনলাইন Bolt সেশন তৈরি করে, প্রথম `session.updated` পর্যন্ত ইভেন্ট প্রিন্ট করে এবং বন্ধ হয়। অডিও স্ট্রিম করতে [ন্যূনতম Python ক্লায়েন্ট](/api-reference/realtime#minimal-python-client) ব্যবহার করুন।

```python
import asyncio
import os

from openai import AsyncOpenAI


async def main():
    client = AsyncOpenAI(
        api_key=os.environ["THUNDERPHONE_API_KEY"],
        websocket_base_url="wss://api.thunderphone.com/v1",
    )

    async with client.realtime.connect(
        model="thunderphone-realtime"
    ) as connection:
        await connection.session.update(session={
            "type": "realtime",
            "instructions": "Listen to the caller and help them complete the call.",
            "config": {"product": "bolt"},
        })
        async for event in connection:
            print(event.type)
            if event.type == "session.updated":
                break


if __name__ == "__main__":
    asyncio.run(main())
```

ইনপুট অডিও অ্যাপেন্ড, রেসপন্স অডিও ডেল্টা, বাধা, ফাংশন কল, ত্রুটি এবং পরিষ্কার সকেট বন্ধ করার জন্য আপনার বিদ্যমান হ্যান্ডলিং বজায় রাখুন। ইনলাইন কাস্টম ফাংশন আপনার ক্লায়েন্টে কার্যকর হয়; Realtime প্রোটোকলের মাধ্যমে তাদের ফলাফল ফেরত দিন। সংরক্ষিত-এজেন্ট টুল ThunderPhone-এ কার্যকর হয়।

## সেশন লাইফসাইকেল এবং ব্যর্থতা

একটি WebSocket একটি কলকে উপস্থাপন করে। অবৈধ এজেন্ট ID বা প্রত্যাখ্যাত ইনলাইন কনফিগারেশন একটি `error` ইভেন্ট তৈরি করে। সেশনকে সক্রিয় হিসেবে বিবেচনা করার আগে `session.updated`-এর জন্য অপেক্ষা করুন। প্রকৃত ইনপুট ও আউটপুট ফরম্যাট এবং স্যাম্পল রেট ঘোষণা করুন: PCM রেটের অমিল যাচাইকরণ ত্রুটি তৈরি করার পরিবর্তে অডিও খুব দ্রুত বা খুব ধীরে চালায়।

সেশন শুরু হওয়ার পরে, আপনার অ্যাপ্লিকেশনের কাজ শেষ হলে সকেটটি পরিষ্কারভাবে বন্ধ করুন। ইনলাইন সেশন ক্লায়েন্টে কার্যকর হওয়া ফাংশন ব্যবহার করতে পারে। সংরক্ষিত-এজেন্ট সেশন সামঞ্জস্যপূর্ণ ThunderPhone-চালিত টুল ব্যবহার করে এবং ট্রান্সফার বা কীপ্যাড ইনপুট প্রদান করে না।

## ইন্টিগ্রেশন পরীক্ষা করুন

[ন্যূনতম Python WAV ক্লায়েন্ট](/api-reference/realtime#minimal-python-client) এবং ঘোষিত রেটে একটি মোনো PCM16 WAV দিয়ে শুরু করুন। যাচাই করুন:

1. সার্ভার কনফিগারেশন গ্রহণ করে এবং `session.updated` পাঠায়।
2. ইনপুট প্রত্যাশিত গতিতে ট্রান্সক্রিপ্ট ও রেসপন্স-অডিও ইভেন্ট তৈরি করে।
3. বাধা ও রেসপন্স বাতিলকরণ অবশিষ্ট আউটপুট অডিও বন্ধ করে।
4. ইনলাইন ফাংশনের ফলাফল বা সংরক্ষিত-এজেন্ট টুলের ফলাফল মডেলে ফেরত যায়।
5. অবৈধ ইনপুট একটি `error` ইভেন্ট তৈরি করে, যা আপনার ক্লায়েন্ট হ্যান্ডেল করে।
6. আপনার ক্লায়েন্ট সকেট বন্ধ করে এবং কলটি [কলের ইতিহাসে](/bn/guides/review-calls) দেখা যায়।

[Realtime WebSocket রেফারেন্স](/api-reference/realtime) গৃহীত ইভেন্ট, অডিও ফরম্যাট, সেশন ফিল্ড এবং সম্পূর্ণ উদাহরণ তালিকাভুক্ত করে।

## খরচ

Realtime কল নির্বাচিত পণ্যের স্বাভাবিক প্রতি-মিনিট রেট ব্যবহার করে। লাইভ ট্রান্সক্রিপ্ট ডেল্টা সক্রিয় করলে সম্পূর্ণ সেশনের জন্য প্রতি-মিনিট অতিরিক্ত চার্জ যোগ হয়; রেটের জন্য [লাইভ ট্রান্সক্রিপ্ট](/api-reference/realtime#live-transcripts) এবং পণ্যের রেটের জন্য [মূল্য নির্ধারণ](/bn/guides/pricing) দেখুন।

`POST /v1/realtime/sessions` একটি পৃথক পরিচালিত LiveKit পাথ। এটি একটি রুম এবং সীমাবদ্ধ পার্টিসিপ্যান্ট টোকেন তৈরি করে; সরাসরি WebSocket সংযোগের জন্য এটির প্রয়োজন নেই।

ফ্রেমওয়ার্ক ইন্টিগ্রেশনের জন্য [Pipecat থেকে ThunderPhone ব্যবহার করুন](/bn/guides/use-with-pipecat) এবং [LiveKit Agents থেকে ThunderPhone ব্যবহার করুন](/bn/guides/use-with-livekit) দেখুন।
