توی قسمتِ قبل یه ویس ایجنت ساختیم که باهاش حرف میزدیم، ولی یه تأخیرِ چندثانیهای داشت — چون صدا اول کامل ضبط میشد، میرفت متن میشد، بعد میرفت مدل، و جوابش دوباره صدا میشد. توی این مقاله همون اپ رو برمیداریم و Realtimeش میکنیم: با مدلِ gpt-realtime-2 که ورودی و خروجیش مستقیم صداست (speech-to-speech). نتیجه یه ایجنتِ صوتیه که بیتأخیر و مثلِ یه آدمِ واقعی باهات حرف میزنه. اینبار هم بهجای AI Studio، با Claude Code جلو میریم.
اول: فانکشن کالینگ واقعاً چطور کار میکنه؟
قبل از کد، کدِ ایجنتِ قسمتِ قبل رو باز میکنیم و Native Function Calling رو خطبهخط میبینیم — چون این مفهومیه که خیلیها گنگ ازش رد میشن.
دو نوع فانکشن کالینگ داریم:
- Prompt-based: خودت توی پرامپت به مدل میگی «اگه خواستی کاری کنی، یه JSON با این شکل بفرست». این روشیه که توی تمرینِ اولِ ساختِ ایجنت استفاده کردیم. سادهست ولی شکننده.
- Native: خودِ مدل بهصورتِ رسمی از ابزار پشتیبانی میکنه. تو طبقِ داکیومنتِ OpenAI یه اسکیمای JSON تعریف میکنی:
type: function، یهname(مثلاًadd_task)، یهdescriptionکه به مدل میگه در چه شرایطی این رو صدا بزنه، وparameters(مثلاً یه فیلدِ متنیِcontent). نکته اینه که شکلِ این اسکیما رو خودِ مدل تعیین میکنه، نه تو؛ تو باید دقیقاً همون قالبی که تو داکش گفته رو رعایت کنی.
توی اپمون سهتا تابع تعریف شده: add_task، complete_task، delete_task. حالا جریان اینطوریه: سؤالِ کاربر + سیستمپرامپت + لیستِ ابزارها میره به مدل (gpt-5.4-mini). مدل تصمیم میگیره مثلاً add_task رو صدا بزنه؛ اپ اون تابعو واقعاً اجرا میکنه و نتیجه رو دوباره برمیگردونه به مدل تا جوابِ نهاییِ آدمفهم رو بسازه. یعنی مدل عملاً دو بار کال میشه: یه بار برای تصمیم/اجرا، یه بار برای جمعبندیِ جواب. برای یه اپ با یه مدلِ ثابت، Native معمولاً تمیزتر و قابلاعتمادتره.
ساختش با Claude Code
روشی که همیشه میرم و فرقِ خروجیمو میسازه:
- اول مدل رو گرم میکنم: بهش میگم برو کلِ پروژه رو بخون، بعد تغییر بده. چون مدل کلمهی بعدی رو بر اساسِ کانتکستش میسازه؛ اگه کدو نخونده باشه، حدس میزنه.
- Context7 MCP برای داکِ بهروز: مدلِ Opus قبل از معرفیِ
gpt-realtime-2آموزش دیده، پس راجعبهش چیزی نمیدونه و ممکنه گیج بزنه. با Context7 (یه MCP که داکیومنتِ بهروزِ کتابخونهها/مدلها رو میگیره) داکِ تازه رو بهش میدم تا درست پیادهسازی کنه. - Plan Mode: اول پلن کنه، بعد کد.
- مدیریتِ Context Window: حواسم هست الکی کانتکستو پر نکنم. چرا؟ چون هم گرونتر میشه، هم مدل با کانتکستِ شلوغ گیج میزنه و کیفیت میاد پایین. وقتی لازمه، کانتکستِ جدید باز میکنم یا کامپکت میکنم.
Realtime زیرِ پوست
فرقِ بنیادیِ Realtime با روشِ پایپلاینی اینه: بهجای اینکه هر بار یه درخواست بفرستی و منتظرِ جواب بمونی، یه کانکشنِ دائم (WebSocket/WebRTC) با بکاند باز میشه — مثلِ یه خطِ تلفنِ همیشهباز. همونجور که داری حرف میزنی، مدل همزمان میشنوه، پردازش میکنه و حتی وسطِ حرف فانکشن کال میکنه. توی اپ یه دکمه گذاشتیم که بینِ حالتِ Realtime و حالتِ معمولی سوییچ کنی تا فرقِ تأخیرشونو با گوشِ خودت حس کنی.
واقعیتِ هزینه
این مهمترین نکتهی عملیه. Realtime جادوییه ولی گرونه: توی تست، کمتر از یک دقیقه حرفزدن حدودِ ۲۲ سنت آب خورد. چرا انقدر؟ چون توکنِ صوتیِ gpt-realtime-2 گرونه — حدودِ ۳۲ دلار ورودی و ۶۴ دلار خروجی بهازای هر ۱ میلیون توکنِ صوتی — و صدا خیلی توکن مصرف میکنه (همون یه دقیقه نزدیکِ ۱۸هزار توکن شد). در مقابل، مدلِ متنیِ gpt-5.4-mini همون کارو با ~۳۰۰ توکن و قیمتی خیلی پایینتر (حدودِ ۰.۷۵ دلار ورودی / ۴.۵ دلار خروجی بهازای ۱M) انجام میداد.
پس Realtime برای همهچیز بهصرفه نیست. ولی برای کارهای خاص فوقالعادهست: یه پشتیبانیِ ۲۴ساعته، یه منشیِ تلفنی که به تماسها جواب بده، یا وقتدهیِ آنلاینِ یه مطب که پول هم توش هست. توصیهام همیشه اینه: پروژه رو ساده و MVP شروع کن، اول همون هستهی اصلی رو بساز، بعد فیچر اضافه کن.
ویدئوی کاملش رو از پایین ببین.


دیدگاهتان را بنویسید