دوره برنامه‌ نویسی با AI: آینده همینجاست!
آماده‌ای؟ بیا با قدرت بی‌نظیر OpenAI و Cloudflare Workers یه پروژه خفن و بی‌نظیر رو از صفر تا صد با هم بسازیم!
فکر کن یه ربات تلگرام هوشمند و فوق‌العاده کاربردی رو خودت بسازی که همه رو شگفت‌زده کنه! توی این کارگاه کاملاً عملی و هیجان‌انگیز، قراره قدم به قدم جلو بریم و با هم یاد بگیریم چطور با جادوی OpenAI و زیرساخت قدرتمند Cloudflare Workers، یه ربات تلگرام مجهز به هوش مصنوعی رو طراحی کنیم، اون رو به دنیای آنلاین بیاریم و حتی بعداً خودمون به راحتی مدیریتش کنیم. این یه تجربه یادگیری بی‌نظیره که نه تنها مهارت‌هات رو متحول می‌کنه، بلکه قراره حسابی هم بهمون خوش بگذره و از ساختن یه چیز واقعی لذت ببریم! این فرصت طلایی رو از دست نده!

SharifGPT

لینک خرید دوره از سایت

SharifGPT Support

SharifGPT channel

برای کسب اطلاعات بیشتر با پشتیبانی ما در تماس باشید

مخاطبان و پیش‌نیازها
این کارگاه برای این افراد مناسبه:
  • برنامه‌نویس‌هایی که تازه می‌خوان با هوش مصنوعی کار کنن.
  • مدیرهای محصولی که دارن قابلیت‌ها و ظرفیت‌های هوش مصنوعی رو بررسی می‌کنن.
  • مهندس‌هایی که می‌خوان یه محصول بر پایه هوش مصنوعی رو سریع وارد بازار کنن.
  • هرکی که بلد باشه Copy - Paste کنه و تفکر انتقادی داشته باشه.
توی این کارگاه روی این موارد تمرکز می‌کنید:
  • چهارچوب‌بندی مشکل برای AI – نه فقط حفظ کردن سینتکس
  • ارزیابی خروجی هوش مصنوعی – کنترل کیفیتش
  • عرضه به پروداکشن – آشنایی با گردش کار کامل (از اول تا آخر)
  • همکاری با هوش مصنوعی به عنوان یه شریک توی توسعه.
خروجی‌های کلیدی کارگاه
با اتمام این کارگاه، شما موارد زیر را به دست خواهید آورد:
بات پیاده‌سازی‌شده
یک Telegram bot کاملاً عملیاتی که بر روی Cloudflare Workers مستقر شده است.
یکپارچه‌سازی OpenAI
اتصال فعال و مدیریت‌شده به GPT-5 Pro.
راه‌حل ذخیره‌سازی
ذخیره‌سازی ترجیحات کاربر در Cloudflare KV.
آمادگی Production
پیکربندی Logging، tracing، و deployment workflows برای محیط Production.
رویکرد AI-First
یک فرآیند تکرارپذیر برای ساخت و توسعه با تکیه بر AI.
برنامه دوره آموزشی Codex
جمع‌بندی و گام‌های آتی
15:35 - 15:55
پیش‌نیازهای راه‌اندازی سریع
پیش از آغاز کارگاه، لطفاً اطمینان حاصل کنید که موارد زیر را در اختیار دارید:
OpenAI API Key
با دسترسی فعال به مدل GPT-5 Pro
توکن ربات Telegram
ایجاد شده از طریق BotFather
حساب Cloudflare
با دسترسی فعال به بخش Workers
Wrangler CLI
نصب و احراز هویت شده
ویرایشگر کد
استفاده از VS Code توصیه می‌شود
Git
برای مدیریت نسخه‌ها
رویکردها و معماری هوش مصنوعی
12:00 - 12:20
رویکرد AI-First در توسعه چیست؟
توسعه سنتی
  • تمرکز بر حفظ Syntax و قواعد نگارشی
  • پیاده‌سازی دستی الگوها و ساختارها
  • حل مسائل از ابتدا و بنیان
  • چرخه‌های تکرار طولانی و زمان‌بر
  • نقش توسعه‌دهنده: صرفاً پیاده‌ساز
توسعه AI-First
  • تمرکز بر شفاف‌سازی اهداف اصلی پروژه
  • تعریف محدودیت‌ها و الزامات کلیدی
  • ارزیابی و بهینه‌سازی مداوم خروجی‌های AI
  • چرخه‌های تکرار سریع و چابک
  • نقش توسعه‌دهنده: معمار و بازبین سیستم
در این رویکرد، AI به عنوان pair-programmer شما عمل می‌کند: مسئولیت پیش‌نویس کد را بر عهده می‌گیرد، در حالی که شما به طراحی، تعریف محدودیت‌ها و پالایش نهایی می‌پردازید.
چارچوب GOCO
رهیافتی ساختاریافته برای بهره‌گیری از AI در فرآیندهای توسعه نرم‌افزار:
هدف (Goal)
عملکرد یا نتیجه نهایی مورد انتظار را به دقت مشخص کنید. توضیح دهید که code چه کاری باید انجام دهد.
محدودیت‌ها (Constraints)
محدودیت‌های platform، بودجه زمانی، ملاحظات هزینه و الزامات عملکردی را به وضوح تعریف کنید.
زمینه (Context)
فایل‌های مرتبط، logs، پیام‌های error یا code موجود را ارائه دهید تا AI بتواند وضعیت شما را به درستی درک کند.
خروجی (Output)
فرمت خروجی مورد نظر خود را مشخص کنید؛ برای مثال، runnable code، explanation، tests، documentation و غیره.
معماری پایه
ربات تلگرام ما، با بهره‌گیری از OpenAI، از این معماری استفاده خواهد کرد:
Webhook Endpoint
هنگامی که کاربران پیام ارسال می‌کنند، به‌روزرسانی‌ها را از Telegram دریافت می‌کند.
Cloudflare Worker
مسئول پردازش درخواست‌ها، مسیریابی دستورات، مدیریت وضعیت و رسیدگی به خطاها است.
OpenAI Integration
برای تولید پاسخ‌های هوشمندانه، به مدل GPT-5 Pro متصل می‌شود.
KV Storage
برای ذخیره‌سازی تنظیمات کاربر و مدیریت محدودیت نرخ (rate limiting) به کار می‌رود.
Webhook در برابر Long-polling
دلایل انتخاب Webhook برای ربات تلگرام ما به جای Long-polling:
مزایای Webhook
معماری رویدادمحور
ایده‌آل برای استقرار در Edge
عدم نیاز به اتصالات بیکار
تأخیر کمتر
بهره‌وری بالاتر از منابع
مقیاس‌پذیری خودکار
معایب Long-polling
نیازمند اتصالات پایدار
تداخل با محدودیت‌های زمانی Edge Runtime
مصرف بیشتر منابع
نیازمند مقیاس‌پذیری دستی
مدیریت خطای پیچیده‌تر
هزینه‌های عملیاتی بالاتر
اهداف و معیارهای پذیرش فاز اول
اهداف اصلی ما برای پیاده‌سازی اولیه عبارتند از:
پیاده‌سازی نقطه پایانی وب‌هوک
ایجاد و پیاده‌سازی نقطه پایانی POST /tg-webhook برای دریافت و پردازش به‌روزرسانی‌های ورودی Telegram.
مدیریت و پیکربندی اسرار
پیکربندی و اتصال ایمن API توکن‌های Telegram و OpenAI به عنوان اسرار (Secrets).
اتصال به پایگاه داده KV
راه‌اندازی فضای نام KV (Key-Value) برای ذخیره‌سازی تنظیمات کاربران و مدیریت محدودیت نرخ (Rate Limiting).
تهیه مستندات اولیه
تدوین یک فایل README جامع شامل دستورالعمل‌های راه‌اندازی پروژه و یک نمای کلی از معماری سیستم.
زمانی که بتوانید نمودار جریان (Flow Diagram) و عملکرد کلی سیستم را به طور کامل تشریح کنید، این فاز به اتمام رسیده تلقی می‌شود.
راه‌اندازی اولیه Worker و Webhook
12:20 - 12:50
از صفر تا Echo Bot
راهنمای گام‌به‌گام برای راه‌اندازی نخستین نسخه Echo Bot:
راه‌اندازی پروژه Worker
با استفاده از Wrangler یک پروژه Worker جدید با پیکربندی‌های ضروری ایجاد کنید.
افزودن Secrets و KV
متغیرهای محیطی و فضای نام KV را جهت ذخیره‌سازی داده‌ها پیکربندی کنید.
استقرار (Deploy)
Worker را در شبکه لبه Cloudflare مستقر (Deploy) کنید.
تنظیم Webhook
Telegram را برای ارسال به‌روزرسانی‌ها به نقطه پایانی Worker ما پیکربندی کنید.
پاسخ‌دهی به پیام‌ها (Echo Messages)
مدیریت اولیه پیام‌ها را پیاده‌سازی کنید تا ورودی کاربر را منعکس (Echo) کند.
گردش کار دمو زنده
برای نمایش این قابلیت، مراحل زیر را دنبال کنید:
راه‌اندازی پروژه
با استفاده از دستور wrangler init، ساختار اولیه پروژه را ایجاد کنید.
پیاده‌سازی کد
منطق هندلر webhook و قابلیت پایه بازتاب پیام (echo) را پیاده‌سازی کنید.
پیکربندی
فایل wrangler.toml را با مقادیر KV و secrets مورد نیاز تنظیم کنید.
استقرار (Deploy)
پروژه را بر روی دامنه workers.dev منتشر کنید.
ثبت Webhook
وب‌هوک را در Telegram API ثبت نمایید.
آزمایش
یک پیام ارسال کرده و پاسخ‌های دریافتی را بررسی کنید.
هر مرحله تقریباً ۱ تا ۲ دقیقه زمان می‌برد، به همراه زمان لازم برای عیب‌یابی در صورت نیاز.
مشکلات رایج و چک‌لیست عیب‌یابی

مشکلات رایج
  • مسیر webhook URL در فراخوانی setWebhook نادرست است.
  • API tokens گم شده یا نامعتبر هستند.
  • فراموش کردن استقرار مجدد (deploy) پس از اعمال تغییرات.
  • عدم بررسی logs برای یافتن خطاها.
  • ناتوانی در مدیریت صحیح Telegram's message format.

چک‌لیست پیش از عملیات
  • Telegram token با استفاده از getMe تایید شده است.
  • دامنه Workers قابل دسترسی و دارای HTTPS است.
  • الگوی Route با webhook path مطابقت دارد.
  • KV namespace به درستی پیکربندی شده است.
  • Secrets به درستی تنظیم شده‌اند.

اگر با مشکلی مواجه شدید، پروژه را re-deploy کرده و webhook را دوباره تنظیم کنید. Logs بهترین ابزار شما برای troubleshooting و یافتن راه حل هستند.
اتصال به OpenAI (GPT-5 Pro)
از ساعت ۱۲:۵۰ تا ۱۳:۲۵
استراتژی پاسخ‌دهی: Stream → Aggregate
ما داده‌ها را از OpenAI به صورت Stream دریافت می‌کنیم، اما پیش از ارسال به Telegram، آن‌ها را Aggregate خواهیم کرد. این رویکرد تعادلی بهینه میان عملکرد سریع و تجربه کاربری مطلوب ایجاد می‌کند.
چرا Stream کنیم؟
  • دریافت سریع‌تر اولین Token: پاسخ اولیه کاربر زودتر نمایش داده می‌شود.
  • تجربه کاربری واکنش‌گراتر: تعامل با کاربر بهبود یافته و پاسخ‌ها به صورت تدریجی ظاهر می‌شوند.
  • مدیریت بهینه پاسخ‌های طولانی: جریان داده به مدیریت بهتر پاسخ‌های حجیم کمک می‌کند.
  • سهولت در پیاده‌سازی Timeouts: کنترل زمان‌بندی و جلوگیری از وقفه در ارتباط ساده‌تر است.
چرا Aggregate کنیم؟
  • انتظار یک پیام واحد در Telegram: پلتفرم Telegram نیاز به ارسال یک پیام نهایی و کامل دارد.
  • جلوگیری از "Edit Spam" در چت: از ارسال ویرایش‌های متعدد و آزاردهنده در چت جلوگیری می‌کند.
  • پرهیز از محدودیت‌های Rate Limit: تجمیع پاسخ‌ها به کاهش تعداد درخواست‌ها و جلوگیری از رسیدن به rate limits کمک می‌کند.
  • تاریخچه مکالمه منظم‌تر: چت‌ها خواناتر و بدون پیام‌های قطعه‌قطعه شده باقی می‌مانند.
طراحی و پیاده‌سازی فراخوانی مدل
بهینه‌سازی یکپارچه‌سازی OpenAI برای دستیابی به کیفیت، کارایی هزینه و قابلیت اطمینان مطلوب:
پیام سیستمی (System Prompt)
این پیام سبک، لحن و قابلیت‌های دستیار را تعیین می‌کند. آن را مختصر اما در عین حال واضح و گویا تنظیم کنید.
You are a helpful assistant in a Telegram bot. Keep responses under 4000 characters.
تنظیم دما (Temperature Setting)
مقدار Temperature میزان خلاقیت و تصادفی بودن پاسخ‌ها را کنترل می‌کند. مقادیر پایین‌تر (0.2-0.4) برای پاسخ‌های دقیق و واقع‌گرا مناسب است، در حالی که مقادیر بالاتر (0.7-0.9) به تولید محتوای خلاقانه کمک می‌کند.
محدودیت‌های توکن (Token Limits)
پارامتر max_tokens را برای مدیریت هزینه‌ها و اطمینان از قرار گرفتن پاسخ‌ها در محدودیت‌های اندازه پیام Telegram تنظیم کنید.
الگوهای تاب‌آوری (Resilience Patterns)
برای مقابله با خطاهای موقت، پیاده‌سازی مکانیزم‌هایی مانند timeouts، retries (همراه با exponential backoff) و circuit breakers ضروری است.
پیاده‌سازی و کدنویسی کلاینت OpenAI
// OpenAI client with retries and streaming async function callOpenAI(message, options = {}) { const { model = "gpt-5-pro", temperature = 0.7, max_tokens = 1000, timeout_ms = 15000, max_retries = 3 } = options; let retries = 0; while (retries <= max_retries) { try { const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), timeout_ms); const response = await fetch("https://api.openai.com/v1/chat/completions", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${OPENAI_API_KEY}` }, body: JSON.stringify({ model, messages: [ { role: "system", content: "You are a helpful assistant in a Telegram bot. Keep responses concise." }, { role: "user", content: message } ], temperature, max_tokens, stream: true }), signal: controller.signal }); clearTimeout(timeoutId); // Handle streaming response and aggregate let fullResponse = ""; const reader = response.body.getReader(); const decoder = new TextDecoder(); while (true) { const { done, value } = await reader.read(); if (done) break; const chunk = decoder.decode(value); // Parse SSE format and extract content const lines = chunk.split("\n"); for (const line of lines) { if (line.startsWith("data: ") && line !== "data: [DONE]") { try { const data = JSON.parse(line.substring(6)); const content = data.choices[0]?.delta?.content || ""; fullResponse += content; } catch (e) { // Skip invalid JSON } } } } return fullResponse; } catch (error) { retries++; if (retries > max_retries) throw error; // Exponential backoff const delay = Math.pow(2, retries) * 100; await new Promise(resolve => setTimeout(resolve, delay)); } } }
OpenAI Integration: معیارهای پذیرش
برای اینکه این ماژول به عنوان کامل در نظر گرفته شود، باید موارد زیر را احراز کنیم:
ارسال به gpt-5-pro با پارامترهای model, temperature, max_tokens و system prompt ثابت: "You are a helpful assistant in a Telegram bot. Keep responses concise." استریمینگ: دریافت تدریجی، تجمیع صحیح؛ نادیده‌گرفتن خطوط data: [DONE] و JSON نامعتبر. قابلیت اطمینان: Retry با exponential backoff (شروع از 100ms) تا max_retries + ثبت در لاگ. Timeout هر درخواست (مثلاً 15000ms) و لغو در صورت عبور از مهلت. خروجی: برگرداندن متن نهایی به‌صورت string. هدف کارایی: ترجیحاً پاسخ < ۵ ثانیه. امضای پیشنهادی تابع (نمونه): async function chat({ input, model='gpt-5-pro', temperature=0.7, maxTokens=512, timeoutMs=15000, maxRetries=3 }): Promise<string>
1
ارسال پیام‌ها به GPT-5 Pro و دریافت پاسخ‌های هوشمندانه و مرتبط
2
مختصر و متناسب بودن پاسخ‌ها با system prompt تعیین‌شده
3
عملکرد صحیح Streaming با قابلیت aggregation مناسب
4
نمایش رفتار صحیح retry/backoff در Logs هنگام مواجهه با خطاهای گذرا
5
دریافت پاسخ‌ها در یک بازه زمانی قابل قبول (معمولاً کمتر از 5 ثانیه)
دستورات و تنظیمات کاربر
۱۳:۳۵ - ۱۴:۱۰
اصول طراحی تجربه کاربری (UX) ربات
ساختار دستورات
  • از الگوهای دستوری قابل پیش‌بینی و استاندارد استفاده کنید: /start, /help, /settings
  • دستورات را با حروف کوچک و بدون فاصله (یک‌تکه) بنویسید.
  • دستورات مرتبط را گروه‌بندی کنید (مثال: /settings_tone).
  • در صورت لزوم، از دستورات استاندارد Telegram پیروی کنید.
سبک ارتباطی
  • از پاسخ‌های مختصر و دوستانه استفاده کنید.
  • مثال‌های کاربردی را در متن راهنما ارائه دهید.
  • یک شخصیت ثابت و منسجم برای ربات حفظ کنید.
  • ورودی‌های کاربر را به‌طور واضح تأیید کنید.
  • بازخورد مناسب برای خطاها ارائه دهید.
دستورات کلیدی ربات
/start
پیام خوش‌آمدگویی و راهنمای مختصر برای شروع کار با ربات
Welcome! I'm your AI assistant powered by GPT-5 Pro. Ask me anything or try /help for more information.
/help
فهرستی از دستورات موجود به همراه مثال‌های کاربردی
Available commands: /help - Show this message /settings - View current settings /settings_tone [formal|friendly|technical] - Change response style
/settings
نمایش تنظیمات فعلی کاربر
Current settings: Tone: Friendly Model: GPT-5 Pro Messages today: 15/50
/settings_tone
تغییر سبک مکالمه و لحن پاسخ‌گویی ربات
Tone changed to technical. Responses will now use precise terminology and provide detailed explanations.
بهترین شیوه‌ها برای ذخیره‌سازی Key-Value (KV)
مواردی که برای ذخیره‌سازی در KV مناسب هستند
مناسب برای KV
  • تنظیمات کاربر (user preferences) (مانند tone, model)
  • شمارنده‌های محدودیت نرخ (Rate limiting counters)
  • پرچم‌های ویژگی (Feature flags)
  • توکن‌های کوتاه‌مدت (Short-lived tokens)
  • مقادیر پیکربندی کوچک (Small configuration values)
نامناسب برای KV
  • تاریخچه کامل مکالمات (Full conversation histories)
  • داده‌های حجیم (Large data blobs) (>25MB)
  • کلیدهای محرمانه یا اطلاعات احراز هویت (Secrets or credentials)
  • اطلاعات شناسایی شخصی (PII) یا اطلاعات حساس (sensitive information)
  • داده‌هایی که مکرراً تغییر می‌کنند (Frequently changing data)
به یاد داشته باشید: KV برای مقادیر کوچک و نسبتاً ثابت که به توزیع جهانی (global distribution) نیاز دارند، بهترین انتخاب است.
پیاده‌سازی تنظیمات کاربران
// User settings handler async function handleSettings(chatId, command, param) { // Get current settings or initialize defaults let settings = await getUserSettings(chatId); if (!settings) { settings = { tone: "friendly", model: "gpt-5-pro", messageCount: 0, lastReset: Date.now() }; } // Handle different settings commands if (command === "/settings") { return `Current settings: Tone: ${settings.tone} Model: ${settings.model} Messages today: ${settings.messageCount}/50`; } else if (command === "/settings_tone") { const validTones = ["friendly", "formal", "technical"]; if (!param || !validTones.includes(param)) { return `Please specify a valid tone: /settings_tone [${validTones.join('|')}]`; } settings.tone = param; await storeUserSettings(chatId, settings); return `Tone updated to ${param}. Future responses will reflect this style.`; } return "Unknown settings command. Try /help for available options."; } // KV helper functions async function getUserSettings(chatId) { return await USER_SETTINGS.get(`user:${chatId}`, "json"); } async function storeUserSettings(chatId, settings) { await USER_SETTINGS.put(`user:${chatId}`, JSON.stringify(settings)); }
پیاده‌سازی محدودیت نرخ (Rate Limiting)
با پیاده‌سازی محدودیت نرخ (Rate Limiting) مؤثر، سرویس و هزینه‌های API خود را بهینه و محافظت کنید:
عناصر کلیدی
  • محدودیت کاربر محور (User-Centric Limiting): ردیابی دقیق میزان استفاده هر کاربر بر اساس Chat ID.
  • بازنشانی دوره‌ای (Time-Based Reset): پاکسازی خودکار شمارنده‌ها به صورت روزانه.
  • پیام‌رسانی شفاف (Clear Messaging): اطلاع‌رسانی دوستانه به کاربران در زمان رسیدن به محدودیت‌ها.
  • محدودیت‌های لایه‌ای (Tiered Limits): تعیین سقف‌های متفاوت برای ویژگی‌ها و سطوح دسترسی گوناگون.
روش پیاده‌سازی
async function checkRateLimit(chatId) { const settings = await getUserSettings(chatId); // Reset counter if needed const dayInMs = 24 * 60 * 60 * 1000; if (Date.now() - settings.lastReset > dayInMs) { settings.messageCount = 0; settings.lastReset = Date.now(); } // Check if over limit if (settings.messageCount >= 50) { return false; } // Increment counter settings.messageCount++; await storeUserSettings(chatId, settings); return true; }
پیاده‌سازی مسیریاب دستورات
// Main message handler with command routing async function handleUpdate(update) { try { // Extract message details const message = update.message; if (!message || !message.text) { return { ok: true, text: "متن پیام یافت نشد" }; } const chatId = message.chat.id; const text = message.text.trim(); // Check if it's a command if (text.startsWith('/')) { const [command, ...params] = text.split(' '); const param = params.join(' '); // Route to appropriate handler switch (command) { case '/start': return { method: 'sendMessage', chat_id: chatId, text: "به ربات هوش مصنوعی خود خوش آمدید! من با قدرت GPT-5 Pro هر پرسشی را پاسخ می‌دهم. برای آشنایی بیشتر، دستور /help را امتحان کنید." }; case '/help': return { method: 'sendMessage', chat_id: chatId, text: `دستورات موجود: /help - نمایش این راهنما /settings - مشاهده تنظیمات فعلی /settings_tone [formal|friendly|technical] - تغییر لحن پاسخگویی` }; case '/settings': case '/settings_tone': const response = await handleSettings(chatId, command, param); return { method: 'sendMessage', chat_id: chatId, text: response }; default: return { method: 'sendMessage', chat_id: chatId, text: "دستور وارد شده نامعتبر است. برای مشاهده گزینه‌ها، از /help استفاده کنید." }; } } // Check rate limit for AI responses const withinLimit = await checkRateLimit(chatId); if (!withinLimit) { return { method: 'sendMessage', chat_id: chatId, text: "شما به سقف مجاز پیام‌های روزانه خود رسیده‌اید. لطفاً فردا دوباره تلاش کنید." }; } // Handle as normal message to AI const settings = await getUserSettings(chatId); const aiResponse = await callOpenAI(text, { temperature: settings.tone === 'technical' ? 0.3 : 0.7 }); return { method: 'sendMessage', chat_id: chatId, text: aiResponse }; } catch (error) { console.error('Error handling update:', error); return { method: 'sendMessage', chat_id: update.message?.chat.id, text: "با عرض پوزش، مشکلی رخ داده است. لطفاً کمی بعد مجدداً امتحان کنید." }; } }
معیارهای پذیرش: دستورات و تنظیمات
جهت اطمینان از تکمیل موفقیت‌آمیز این ماژول، معیارهای زیر باید برآورده شوند:
پاسخ Command
همه دستورات استاندارد مانند `/start`، `/help`، و `/settings`، پاسخ‌های مورد انتظار را به‌درستی ارائه می‌دهند.
ذخیره‌سازی Preferences
تنظیمات کاربر به‌صورت صحیح در KV ذخیره شده و در تعاملات بعدی به‌درستی بازیابی می‌شوند.
محدودیت نرخ (Rate Limiting)
شمارنده‌های پیام به‌درستی افزایش یافته و از مصرف بیش از حد مجاز جلوگیری می‌کنند.
اعمال تنظیمات AI
تغییرات اعمال شده بر `Tone`، سبک پاسخ‌های AI را طبق انتظار تحت تأثیر قرار می‌دهند.
راهنمای هوش مصنوعی (Codex): پیاده‌سازی دستورات و تنظیمات
# راهنمای پیاده‌سازی ربات تلگرام: دستورات و تنظیمات **هدف:** پیاده‌سازی کامل بخش مدیریت دستورات و تنظیمات کاربران برای یک ربات تلگرام مبتنی بر API. این شامل مدیریت ورودی‌های کاربر، ذخیره‌سازی ترجیحات، محدودیت نرخ و ادغام با مدل AI است. --- **۱. ساختار اصلی کد:** * `handleUpdate(update)`: تابع اصلی برای پردازش هر به‌روزرسانی دریافتی از تلگرام. * باید `chatId` و `text` پیام را استخراج کند. * دستورات (که با `/` شروع می‌شوند) را از پیام‌های عادی تشخیص دهد. * ورودی‌های خالی یا نامعتبر را مدیریت کند. * همه پاسخ‌ها باید در قالب `{"method": "sendMessage", "chat_id": chatId, "text": "..."}` برگردانده شوند. * مدیریت خطا (try-catch) برای جلوگیری از کرش شدن ربات در صورت بروز مشکل. --- **۲. پیاده‌سازی دستورات (Commands):** * `/start`: * پاسخ خوش‌آمدگویی: "به ربات هوش مصنوعی خود خوش آمدید! من با قدرت GPT-5 Pro هر پرسشی را پاسخ می‌دهم. برای آشنایی بیشتر، دستور /help را امتحان کنید." * `/help`: * پاسخ راهنما: `دستورات موجود:\n/help - نمایش این راهنما\n/settings - مشاهده تنظیمات فعلی\n/settings_tone [formal|friendly|technical] - تغییر لحن پاسخگویی` * `/settings`: * باید تنظیمات فعلی کاربر (لحن (tone)، مدل (model)، تعداد پیام‌های امروز/محدودیت) را از KV بازیابی کرده و نمایش دهد. * قالب نمایش: `Current settings:\nTone: [tone]\nModel: [model]\nMessages today: [count]/50` * `/settings_tone [param]`: * پارامتر `param` باید یکی از "friendly", "formal", "technical" باشد. در غیر این صورت، پیام خطا نمایش داده شود: `Please specify a valid tone: /settings_tone [friendly|formal|technical]` * اگر پارامتر معتبر بود، لحن کاربر را در KV به‌روزرسانی کند. * پاسخ تأیید: `Tone updated to [param]. Future responses will reflect this style.` * دستورات نامعتبر: * اگر دستوری شناخته نشد، پیام `دستور وارد شده نامعتبر است. برای مشاهده گزینه‌ها، از /help استفاده کنید.` نمایش داده شود. --- **۳. مدیریت تنظیمات کاربر (User Settings) با KV:** * **فضای نام (Namespace):** `USER_SETTINGS` (فرض می‌شود از قبل تعریف شده است). * **کلید (Key) در KV:** `user:{chatId}`. * **ساختار داده‌ها در KV:** یک شی JSON شامل: * `tone`: (پیش‌فرض: "friendly") - "friendly", "formal", "technical" * `model`: (پیش‌فرض: "gpt-5-pro") - مدل AI مورد استفاده * `messageCount`: (پیش‌فرض: 0) - تعداد پیام‌های AI کاربر در روز جاری * `lastReset`: (پیش‌فرض: `Date.now()`) - زمان آخرین بازنشانی شمارنده پیام‌ها * **توابع کمکی:** * `async function getUserSettings(chatId)`: تنظیمات کاربر را از KV بازیابی می‌کند. اگر وجود نداشت، تنظیمات پیش‌فرض را برمی‌گرداند. * `async function storeUserSettings(chatId, settings)`: تنظیمات به‌روز شده کاربر را در KV ذخیره می‌کند. --- **۴. پیاده‌سازی محدودیت نرخ (Rate Limiting):** * **تابع:** `async function checkRateLimit(chatId)` * **منطق:** * تنظیمات کاربر را بازیابی کند. * اگر `lastReset` مربوط به روز قبل بود، `messageCount` را به 0 و `lastReset` را به `Date.now()` بازنشانی کند (هر 24 ساعت). * سقف پیام‌ها: 50 پیام در روز. * اگر `messageCount` کمتر از 50 بود، `messageCount` را یکی افزایش داده و تنظیمات را ذخیره کند، سپس `true` برگرداند. * اگر `messageCount` به 50 یا بیشتر رسیده بود، `false` برگرداند و `messageCount` را افزایش ندهد. * **ادغام با `handleUpdate`:** * قبل از هر فراخوانی به `callOpenAI`، `checkRateLimit` را اجرا کند. * اگر `checkRateLimit` مقدار `false` برگرداند، پیامی به کاربر نمایش دهد: "شما به سقف مجاز پیام‌های روزانه خود رسیده‌اید. لطفاً فردا دوباره تلاش کنید." و `callOpenAI` را فراخوانی نکند. --- **۵. ادغام با AI (OpenAI):** * **تابع:** `async function callOpenAI(prompt, options)` (فرض می‌شود از قبل تعریف شده است). * **تنظیم لحن (Tone):** * مقدار `temperature` برای `callOpenAI` باید بر اساس `settings.tone` تنظیم شود. * اگر `tone` برابر با "technical" بود، `temperature` باید `0.3` باشد. * برای سایر لحن‌ها، `temperature` باید `0.7` باشد. --- **۶. معیارهای تست و اعتبارسنجی:** * تمام دستورات (`/start`, `/help`, `/settings`, `/settings_tone`) باید پاسخ‌های صحیح و مورد انتظار را ارائه دهند. * تغییر لحن از طریق `/settings_tone` باید به‌درستی در KV ذخیره شود و پس از راه‌اندازی مجدد ربات نیز پایدار بماند. * شمارنده پیام‌ها برای محدودیت نرخ باید با هر پیام AI افزایش یابد و پس از رسیدن به 50، از ارسال پیام‌های بیشتر جلوگیری کند. * شمارنده پیام‌ها باید به صورت خودکار هر 24 ساعت بازنشانی شود. * تغییر لحن (`tone`) باید به وضوح بر سبک پاسخ‌های تولید شده توسط `callOpenAI` تأثیر بگذارد (مثلاً لحن "technical" پاسخ‌های فنی‌تری تولید کند). * مدیریت خطا باید از کرش شدن ربات در مواجهه با ورودی‌های غیرمنتظره یا خطاهای داخلی جلوگیری کند.
کدنویسی به کمک هوش مصنوعی: قابلیت‌های خلاصه‌سازی
14:10 - 14:40
قابلیت: خلاصه‌سازی متن
معیارهای عملکرد
  • Auto-summarize: فعال‌سازی خودکار برای پیام‌های با طول بیش از ۸۰۰ کاراکتر
  • دستور: /summarize [text] برای درخواست صریح خلاصه
  • فرمت خروجی: ۳ تا ۵ نکته کلیدی (بولت) یا حداکثر ۱۲۰ کلمه
  • سبک: تطابق با لحن و سبک مورد نظر کاربر
  • عملکرد: تکمیل فرایند در مدت ۲۰ ثانیه
نمونه ورودی و خروجی
ورودی: [پیام طولانی در مورد روندهای رایانش ابری، شامل اشاره به serverless، edge computing، استراتژی‌های multi-cloud و تکنیک‌های بهینه‌سازی هزینه...]
خروجی:
  • پذیرش serverless با شتاب فزاینده‌ای در حال افزایش است، به ویژه برای معماری‌های مبتنی بر رویداد.
  • رایانش لبه (edge computing) برای کاربردهای حساس به تأخیر رو به رشد است.
  • استراتژی‌های multi-cloud برای کاهش ریسک به یک استاندارد تبدیل شده‌اند.
  • بهینه‌سازی هزینه اکنون یک اولویت معماری اصلی محسوب می‌شود.
قابلیت خلاصه‌سازی در GOCO
1
هدف
توسعه یک قابلیت خلاصه‌سازی که در دو حالت عملکردی قابل دسترسی باشد: ۱. خلاصه‌سازی خودکار پیام‌های طولانی (بیش از ۸۰۰ کاراکتر) ۲. خلاصه‌سازی صریح با استفاده از دستور `/summarize [text]`. خلاصه تولیدشده باید موجز باشد (۳ تا ۵ نکته کلیدی یا حداکثر ۱۲۰ کلمه) و با ترجیح لحن کاربر مطابقت داشته باشد.
2
محدودیت‌ها
اجرای خلاصه‌سازی باید در مدت ۲۰ ثانیه تکمیل شود. رعایت محدودیت‌های اندازه پیام Telegram، به حداقل رساندن مصرف توکن، مدیریت صحیح متن‌های UTF-8 و ارائه راهکار بازگشتی در صورت عدم موفقیت خلاصه‌سازی ضروری است.
3
پیش‌نیازها و بستر
ما به یک `client OpenAI` با قابلیت `streaming`، سیستم `KV` برای ذخیره تنظیمات برگزیده کاربر، و زیرساخت مسیریابی دستورات مجهز هستیم. ربات از پیش تنظیمات و پشتیبانی از لحن‌های مختلف را دارا است.
4
خروجی مورد انتظار
ارائه یک `minimal patch` شامل قابلیت خلاصه‌سازی و دو تست مربوطه: یکی برای خلاصه‌سازی خودکار (`auto-summarize`) و دیگری برای دستور `/summarize`. راهکارهای مدیریت خطا برای مواقعی که هوش مصنوعی قادر به تولید یک خلاصه مفید نیست، نیز باید لحاظ شود.
متن آموزشی برای هوش مصنوعی
در نظر دارم قابلیتی برای خلاصه‌سازی به ربات تلگرام خود، که از OpenAI استفاده می‌کند، اضافه کنم. دو ویژگی کلیدی باید به آن افزوده شود: 1. خلاصه‌سازی خودکار: هر پیامی که بیش از 800 characters طول دارد، به صورت خودکار خلاصه شود. 2. دستور /summarize: افزودن یک دستور /summarize که متن ورودی را دریافت کرده و خلاصه‌ای از آن ارائه دهد. خلاصه تولید شده باید: - مختصر باشد (در قالب 3 تا 5 bullet points یا حداکثر 120 words). - با تنظیمات لحن کاربر (ذخیره شده در settings.tone) مطابقت داشته باشد. - ظرف 20 seconds تکمیل شود. - در صورت عدم موفقیت در خلاصه‌سازی، با نمایش یک پیام جایگزین، به درستی خطا را مدیریت کند. لطفاً یک minimal patch ارائه دهید که این ویژگی‌ها را با رعایت ساختار کد موجود ما پیاده‌سازی کند. این patch باید حداقل شامل دو تست باشد: یکی برای خلاصه‌سازی خودکار و دیگری برای دستور /summarize. در اینجا بخش‌های کلیدی از پایگاه کد موجود ما آورده شده است: - تابع `callOpenAI(message, options)` برای ارتباط با OpenAI وجود دارد. - تنظیمات کاربر در `KV` ذخیره شده و از طریق `getUserSettings(chatId)` قابل دسترسی است. - مسیریابی دستورات در تابع `handleUpdate()` انجام می‌شود که `update.message` را تجزیه و تحلیل می‌کند. patch باید حداقل و متمرکز بر ویژگی خلاصه‌سازی باشد.
پیاده‌سازی کد هوش مصنوعی
// افزودن توابع خلاصه‌سازی async function summarizeText(text, tone = "friendly") { const systemPrompt = `You are a summarization assistant. Summarize the following text in ${tone} tone. Use 3-5 bullet points or keep it under 120 words. Focus on key points only.`; try { const summary = await callOpenAI(text, { model: "gpt-5-pro", temperature: tone === "technical" ? 0.3 : 0.5, max_tokens: 250, timeout_ms: 18000, // 18 seconds to allow for network overhead system_prompt: systemPrompt }); return summary; } catch (error) { console.error("Summarization failed:", error); return "قادر به تولید خلاصه نبودم. ممکن است متن بیش از حد پیچیده باشد یا در پردازش آن خطایی رخ داده باشد."; // I couldn't generate a summary. The text might be too complex or there was a processing error. } } // بررسی نیاز به خلاصه‌سازی خودکار متن function needsSummarization(text) { return text.length > 800; } // به‌روزرسانی تابع handleUpdate برای مدیریت خلاصه‌سازی async function handleUpdate(update) { try { // استخراج جزئیات پیام (کد موجود) const message = update.message; if (!message || !message.text) { return { ok: true, text: "متنی در پیام یافت نشد." }; } const chatId = message.chat.id; const text = message.text.trim(); // بررسی اینکه آیا پیام یک دستور است if (text.startsWith('/')) { const [command, ...params] = text.split(' '); const param = params.join(' '); // مدیریت دستور summarize if (command === '/summarize') { if (!param) { return { method: 'sendMessage', chat_id: chatId, text: "لطفاً متنی برای خلاصه‌سازی ارائه دهید: /summarize [متن شما در اینجا]" // Please provide text to summarize: /summarize [your text here] }; } // بررسی محدودیت نرخ const withinLimit = await checkRateLimit(chatId); if (!withinLimit) { return { method: 'sendMessage', chat_id: chatId, text: "شما به سقف پیام‌های روزانه خود رسیده‌اید. لطفاً فردا دوباره امتحان کنید." // You've reached your daily message limit. Please try again tomorrow. }; } // دریافت ترجیحات لحن کاربر const settings = await getUserSettings(chatId); // تولید خلاصه const summary = await summarizeText(param, settings.tone); return { method: 'sendMessage', chat_id: chatId, text: `خلاصه:\n${summary}` // Summary: }; } // مدیریت سایر دستورات (کد موجود) // ... } // خلاصه‌سازی خودکار برای پیام‌های طولانی if (needsSummarization(text)) { // بررسی محدودیت نرخ const withinLimit = await checkRateLimit(chatId); if (!withinLimit) { return { method: 'sendMessage', chat_id: chatId, text: "شما به سقف پیام‌های روزانه خود رسیده‌اید. لطفاً فردا دوباره امتحان کنید." // You've reached your daily message limit. Please try again tomorrow. }; } // دریافت تنظیمات کاربر const settings = await getUserSettings(chatId); // تولید خلاصه const summary = await summarizeText(text, settings.tone); // ابتدا پاسخ هوش مصنوعی را به پیام اصلی ارسال کنید const aiResponse = await callOpenAI(text, { temperature: settings.tone === 'technical' ? 0.3 : 0.7 }); // سپس خلاصه را به عنوان یک پیام پیگیری ارسال کنید await sendTelegramMessage(chatId, aiResponse); return { method: 'sendMessage', chat_id: chatId, text: `خلاصه پیام شما:\n${summary}` // Summary of your message: }; } // مدیریت پیام‌های عادی به هوش مصنوعی (کد موجود) // ... } catch (error) { console.error('Error handling update:', error); return { method: 'sendMessage', chat_id: update.message?.chat.id, text: "متأسفم، مشکلی پیش آمد. لطفاً بعداً دوباره تلاش کنید." // Sorry, something went wrong. Please try again later. }; } } // توابع تست function testAutoSummarize() { const longText = "Lorem ipsum ".repeat(100); // ایجاد متنی طولانی‌تر از 800 کاراکتر console.log("تست خلاصه‌سازی خودکار"); // Testing auto-summarization console.log(`طول ورودی: ${longText.length}`); // Input length: console.log(`نیاز به خلاصه‌سازی: ${needsSummarization(longText)}`); // Needs summarization: // شیء `update` ساختگی const update = { message: { chat: { id: "test-chat-123" }, text: longText } }; // فراخوانی هندلر و بررسی نتایج handleUpdate(update).then(result => { console.log("نتیجه خلاصه‌سازی خودکار:", result); // Auto-summarize result: console.assert( result.text.includes("خلاصه پیام شما:"), // باید شامل پیشوند خلاصه باشد "باید شامل پیشوند خلاصه باشد" // Should include summary prefix ); }); } function testSummarizeCommand() { const textToSummarize = "This is a test message that should be summarized when using the command."; console.log("تست دستور /summarize"); // Testing /summarize command // شیء `update` ساختگی const update = { message: { chat: { id: "test-chat-123" }, text: `/summarize ${textToSummarize}` } }; // فراخوانی هندلر و بررسی نتایج handleUpdate(update).then(result => { console.log("نتیجه خلاصه‌سازی دستور:", result); // Command summarize result: console.assert( result.text.includes("خلاصه:"), // باید شامل پیشوند خلاصه باشد "باید شامل پیشوند خلاصه باشد" // Should include summary prefix ); }); }
قابلیت خلاصه سازی: معیارهای پذیرش
این قابلیت با رعایت معیارهای زیر، به کمال خواهد رسید:
1
Auto-summarization باید برای messages با طول بیش از 800 characters به درستی فعال شود.
2
/summarize command متن ورودی را پردازش کرده و یک خلاصه مختصر و مفید ارائه دهد.
3
خلاصه‌های تولید شده باید با tone ترجیحی کاربر مطابقت داشته باشند.
4
عملیات خلاصه سازی باید در عرض 20 seconds تکمیل گردد.
5
Error handling باید پاسخ‌های جایگزین و کاربردی ارائه دهد.
6
همه tests باید با موفقیت پشت سر گذاشته شوند.

دستورالعمل‌های تست و اعتبارسنجی

برای اطمینان از صحت پیاده‌سازی قابلیت خلاصه‌سازی، مراحل تست زیر را دنبال کنید: تست خلاصه‌سازی خودکار: یک پیام با بیش از 800 کاراکتر ارسال کنید. اعتبارسنجی: بررسی کنید که آیا یک پیام خلاصه‌سازی جداگانه (با پیشوند "خلاصه پیام شما:") به صورت خودکار بازگردانده می‌شود و محتوای آن واقعاً خلاصه‌ای از متن اصلی است. تست دستور /summarize: دستور /summarize را با یک متن طولانی (مثلاً 500 کاراکتر) ارسال کنید: /summarize [متن شما در اینجا]. اعتبارسنجی: بررسی کنید که آیا پاسخی با پیشوند "خلاصه:" دریافت می‌کنید و متن بازگردانده شده، خلاصه‌ای مختصر و مفید از ورودی شماست. تست مورد خطا: دستور /summarize را بدون هیچ متنی ارسال کنید. اعتبارسنجی: بررسی کنید که پیام خطای "لطفاً متنی برای خلاصه‌سازی ارائه دهید..." دریافت شود. تست تطابق لحن: اگر رابط کاربری برای تنظیم لحن (tone) وجود دارد، لحن را به "technical" و سپس به "friendly" تغییر دهید. متن‌های طولانی را برای خلاصه‌سازی ارسال کنید (چه از طریق خلاصه‌سازی خودکار و چه با دستور /summarize). اعتبارسنجی: لحن خلاصه‌های تولید شده را ارزیابی کنید تا مطمئن شوید با لحن انتخابی شما (فنی یا دوستانه) مطابقت دارد. تست عملکرد زمانی: یک پیام طولانی (بیش از 800 کاراکتر) یا یک دستور /summarize با متن پیچیده ارسال کنید. اعتبارسنجی: زمان پاسخ‌دهی را اندازه‌گیری کنید. مطمئن شوید که خلاصه در عرض 20 ثانیه بازگردانده می‌شود. تست مدیریت خطا: تلاش کنید یک متن بسیار طولانی و/یا پیچیده که ممکن است باعث مشکل در پردازش شود را برای خلاصه‌سازی ارسال کنید (مثلاً متنی شامل کاراکترهای نامتعارف یا ساختار پیچیده). اعتبارسنجی: بررسی کنید که در صورت بروز خطا، پیام کاربرپسند "قادر به تولید خلاصه نبودم..." یا "متأسفم، مشکلی پیش آمد..." دریافت شود و برنامه از کار نیفتد. تست‌های داخلی کد: تابع‌های تست داخلی testAutoSummarize() و testSummarizeCommand() را اجرا کنید. اعتبارسنجی: خروجی کنسول را بررسی کنید و مطمئن شوید که هر دو تست با موفقیت ("باید شامل پیشوند خلاصه باشد") به پایان می‌رسند و هیچ خطایی گزارش نمی‌شود.

قابلیت مشاهده و انعطاف‌پذیری
14:40 - 15:10
دسته‌بندی رویدادها برای ثبت گزارش
برای نظارت و عیب‌یابی مؤثر، رویدادها را به شکل ساختاریافته ثبت کنید:
رویدادهای درخواست (Request)
  • req.begin
  • req.end
  • req.error
رویدادهای تلگرام (Telegram)
  • tg.webhook.received
  • tg.command.executed
  • tg.send.success
  • tg.send.error
رویدادهای هوش مصنوعی (AI)
  • ai.call.begin
  • ai.call.end
  • ai.call.error
  • ai.call.retry
رویدادهای ذخیره‌سازی (Storage)
  • kv.get
  • kv.put
  • kv.error
  • rate.limit.exceeded
همیشه requestId را در هر رویداد برای همبستگی (correlation) در میان سرویس‌ها لحاظ کنید.
اهمیت لاگ‌گیری در ربات‌های تلگرام و برنامه‌های هوش مصنوعی
لاگ‌گیری (Logging) یک جزء حیاتی در توسعه و نگهداری سیستم‌های نرم‌افزاری مدرن، به ویژه در ربات‌های تلگرام و برنامه‌های هوش مصنوعی است. در ادامه به دلایل اصلی اهمیت لاگ‌گیری موثر می‌پردازیم:
۱. سیستم‌های تولید (Production)
در محیط‌های عملیاتی، لاگ‌ها به عنوان چشم و گوش سیستم عمل می‌کنند. آن‌ها بینشی عمیق از رفتار برنامه، ردیابی خطاها، و شناسایی bottlenecks را فراهم می‌کنند. بدون لاگ‌های مناسب، عیب‌یابی مشکلات در سیستم‌های زنده تقریبا غیرممکن است.
۲. مزایای لاگ‌گیری ساختاریافته
لاگ‌های ساختاریافته (Structured Logging) (مانند JSON) خوانایی و قابلیت جستجوی بالاتری دارند. آن‌ها امکان تحلیل و فیلتر کردن آسان‌تر داده‌ها را با ابزارهای تحلیل لاگ فراهم می‌کنند و به تیم‌ها کمک می‌کنند تا الگوها و روندهای پنهان را سریع‌تر کشف کنند.
۳. رفع اشکال یکپارچه‌سازی‌های هوش مصنوعی
یکپارچه‌سازی مدل‌های هوش مصنوعی می‌تواند پیچیده باشد. لاگ‌گیری جزئیات ورودی/خروجی مدل، زمان پاسخ‌دهی، و خطاهای احتمالی، برای تشخیص و رفع اشکال مشکلات مربوط به دقت، عملکرد، یا اتصال مدل ضروری است.
۴. نظارت و بهینه‌سازی عملکرد
با ثبت زمان‌بندی عملیات کلیدی (مانند پردازش پیام تلگرام یا فراخوانی API هوش مصنوعی)، لاگ‌ها امکان نظارت بر عملکرد و شناسایی گلوگاه‌ها را فراهم می‌کنند. این داده‌ها برای بهینه‌سازی منابع، بهبود سرعت و افزایش مقیاس‌پذیری سیستم حیاتی هستند.
۵. جنبه‌های امنیتی و انطباق
لاگ‌گیری رویدادهای امنیتی (مانند تلاش برای دسترسی غیرمجاز یا تغییرات پیکربندی) برای شناسایی و پاسخ به تهدیدات امنیتی بسیار مهم است. همچنین، بسیاری از استانداردها و مقررات انطباق (Compliance) نیازمند حفظ سوابق فعالیت‌های سیستم هستند.
۶. بهینه‌سازی هزینه‌ها
با تحلیل لاگ‌ها، می‌توان مصرف منابع (مانند CPU، حافظه، یا فراخوانی‌های API) را پایش کرد و نقاطی را که می‌توان با بهینه‌سازی کد یا تنظیمات، هزینه‌ها را کاهش داد، شناسایی کرد. لاگ‌های دقیق از خطاهای پرهزینه جلوگیری می‌کنند.
۷. سناریوهای واقعی و صرفه‌جویی در زمان
در موارد بحرانی مانند از کار افتادن ربات یا پاسخ‌های نادرست AI، لاگ‌ها به تیم‌ها کمک می‌کنند تا به سرعت ریشه مشکل را پیدا کنند. بدون آن‌ها، ساعت‌ها یا روزها زمان برای بازسازی و تشخیص مشکل از دست می‌رود که در نهایت منجر به نارضایتی کاربر می‌شود.
پیاده‌سازی لاگ‌نویسی ساختاریافته
// Structured logger with request ID tracking class Logger { constructor(requestId = null) { this.requestId = requestId || crypto.randomUUID(); this.startTime = Date.now(); } log(event, data = {}) { const timestamp = new Date().toISOString(); const duration = Date.now() - this.startTime; const logEntry = JSON.stringify({ timestamp, requestId: this.requestId, event, duration_ms: duration, ...data }); console.log(logEntry); } error(event, error, data = {}) { const errorData = { error_message: error.message, error_stack: error.stack, ...data }; this.log(`${event}.error`, errorData); } } // Usage in request handler async function handleRequest(request) { const logger = new Logger(); logger.log('req.begin', { url: request.url }); try { const result = await processRequest(request, logger); logger.log('req.end', { status: 'success' }); return result; } catch (error) { logger.error('req.error', error); return new Response( JSON.stringify({ ok: false, error: "Internal server error" }), { status: 200, headers: { 'Content-Type': 'application/json' } } ); } } // Example OpenAI call with logging async function callOpenAIWithLogging(message, options = {}, logger) { logger.log('ai.call.begin', { model: options.model || "gpt-5-pro", message_length: message.length }); let retries = 0; const maxRetries = options.max_retries || 3; while (retries <= maxRetries) { try { const response = await callOpenAI(message, options); logger.log('ai.call.end', { success: true, tokens: response.length / 4, // Approximate token count retries }); return response; } catch (error) { retries++; logger.log('ai.call.retry', { attempt: retries, max_retries: maxRetries, error: error.message }); if (retries > maxRetries) { logger.error('ai.call.error', error, { final: true, after_retries: retries - 1 }); throw error; } // Exponential backoff const delay = Math.pow(2, retries) * 100; await new Promise(resolve => setTimeout(resolve, delay)); } } }
الگوهای مدیریت خطای منعطف
اصول
  • همیشه پاسخ HTTP 200 را به Telegram برگردانید.
  • پیام‌های خطا را به گونه‌ای نمایش دهید که برای کاربر قابل فهم باشد.
  • جزئیات خطا را جهت اشکال‌زدایی ثبت کنید.
  • برای عملکردهای حساس و حیاتی، از مکانیزم‌های جایگزین استفاده کنید.
  • برای سرویس‌های خارجی، Circuit Breaker (قطع‌کننده مدار) را پیاده‌سازی کنید.
پیاده‌سازی
// Graceful error handling try { // Normal processing } catch (error) { // Log detailed error logger.error('process.error', error); // Always return 200 to Telegram return new Response( JSON.stringify({ ok: true }), { status: 200 } ); // Send friendly message to user await sendTelegramMessage( chatId, "Sorry, I couldn't process that request. " + "Please try again in a moment." ); }
امنیت و مدیریت هزینه
مدیریت محرمانه‌ها (Secrets)
کلیدهای API و توکن‌ها را منحصراً در Workers Secrets نگهداری کنید؛ از قرار دادن آن‌ها در کد یا logs خودداری نمایید.
محدودیت تعداد توکن
پارامتر max_tokens را تنظیم کنید تا اندازه پاسخ‌ها را محدود کرده و هزینه‌ها را بهینه سازید.
اعتبارسنجی ورودی
ورودی‌ها را بررسی و اعتبارسنجی کنید تا از پردازش محتوای بی‌فایده جلوگیری شده و مصرف توکن به نحو مؤثری کنترل شود.
حفاظت از PII
از ذخیره اطلاعات شناسایی شخصی (PII) در logs یا KV جداً خودداری کنید.
محدودیت نرخ (Rate Limiting)
برای جلوگیری از سوءاستفاده و مدیریت مؤثر هزینه‌ها، پیاده‌سازی rate limiting تهاجمی ضروری است.
رباتی که امنیت آن به خطر افتاده باشد، می‌تواند منجر به تحمیل هزینه‌های غیرمنتظره و نقض‌های امنیتی جدی شود. همیشه تدابیر حفاظتی لازم را به کار گیرید.
راهنمای عیب‌یابی
برای تشخیص و رفع مشکلات، رویکرد گام‌به‌گام زیر را دنبال کنید:
۱. بررسی وضعیت سلامت (Health Check)
برای اطمینان از عملکرد صحیح و پایه Worker، نقطه پایانی `/health` را بررسی کنید:
curl https://your-worker.workers.dev/health
۲. بررسی گزارش‌ها (Logs)
با استفاده از `wrangler tail`، درخواست‌ها را پایش کرده و خطاها را شناسایی کنید:
wrangler tail --format=json
۳. تحلیل الگوهای خطا
به دنبال پاسخ‌های تکراری `429/5xx` یا رفتارهای `backoff` باشید تا الگوهای مشکل را کشف کنید.
۴. بازگردانی (Rollback) در صورت لزوم
اگر مشکلات ادامه داشتند، یک نسخه پایدار و قبلی را مجدداً مستقر کنید:
wrangler publish --env=prod
به خاطر داشته باشید: در شرایط ابهام، ابتدا `rollback` کرده و سپس به بررسی دقیق مشکل بپردازید. پایداری سیستم (Uptime) همواره بر رفع سریع و در لحظه مشکل ارجحیت دارد.
قابلیت مشاهده‌پذیری و تاب‌آوری: معیارهای پذیرش
این ماژول زمانی تکمیل‌شده تلقی می‌شود که:
ثبت وقایع ساختاریافته
تمام رویدادها در قالب JSON و با یک consistent requestId قابل همبستگی ثبت شده باشند.
مدیریت خطا
تمامی نقاط شکست احتمالی، با بلوک‌های مناسب try/catch و استراتژی‌های fallback پوشش داده شده باشند.
محدودیت نرخ (Rate Limiting)
محدودیت استفاده از هر چت به‌درستی اعمال شده و از سوءاستفاده جلوگیری کند.
حفاظت از داده‌های حساس
هیچ‌گونه اطلاعات محرمانه یا حساسی در logs و پاسخ‌های عمومی نمایش داده نشود.
استقرار در محیط عملیاتی
۱۵:۱۰ - ۱۵:55
محیط‌ها و تنظیمات
محیط توسعه
  • مستقر بر روی workers.dev subdomain
  • استفاده از KV namespace مخصوص development
  • ممکن است از مدل‌های آزمایشی یا رده پایین‌تر OpenAI استفاده کند
  • سطح گزارش‌دهی (logging) با جزئیات بیشتر
  • محدودیت‌های نرخ (rate limits) کمتر سخت‌گیرانه
محیط تولید
  • مستقر بر روی custom domain
  • استفاده از KV namespace مخصوص production
  • استفاده از مدل‌های سطح production شرکت OpenAI
  • گزارش‌دهی (logging) متمرکز بر رویدادهای حیاتی
  • محدودیت‌های نرخ (rate limits) و محافظت‌های امنیتی (guardrails) سخت‌گیرانه
// wrangler.toml configuration for multiple environments name = "telegram-bot" main = "src/index.js" compatibility_date = "2023-12-01" [env.dev] kv_namespaces = [ { binding = "USER_SETTINGS", id = "dev-kv-id" } ] vars = { ENVIRONMENT = "dev", LOG_LEVEL = "debug" } [env.prod] kv_namespaces = [ { binding = "USER_SETTINGS", id = "prod-kv-id" } ] vars = { ENVIRONMENT = "prod", LOG_LEVEL = "info" } route = { pattern = "bot.example.com/*", custom_domain = true }
گردش کار انتشار
فرآیندی ساختارمند برای استقرار قابل اعتماد در محیط عملیاتی:
برچسب‌گذاری انتشار
یک برچسب گیت با استفاده از نسخه‌بندی معنایی ایجاد کنید.
git tag v1.0.0 git push origin v1.0.0
استقرار در محیط تولید
از Wrangler برای استقرار نسخه برچسب‌گذاری شده استفاده نمایید.
wrangler publish --env=prod
تست سلامت (Smoke Test)
عملکرد اصلی را در محیط تولید بررسی و تأیید کنید.
curl https://bot.example.com/health # Test /start command via Telegram
به‌روزرسانی Webhook
Webhook تلگرام را به نشانی اینترنتی (URL) محیط تولید هدایت کنید.
curl "https://api.telegram.org/bot${BOT_TOKEN}/setWebhook?url=https://bot.example.com/tg-webhook"
فعال‌سازی نظارت
هشدارها و داشبوردها را مطابق نیاز پیکربندی کنید.
گزینه‌های بازگردانی
در صورت بروز مشکل، بازگردانی سریع و کارآمد حیاتی است:
بازگردانی مبتنی بر Git
# Revert to previous tag git checkout v0.9.0 # Deploy the previous version wrangler publish --env=prod
روشی ساده اما نیازمند استقرار مجدد است.
استقرار آبی/سبز (Blue/Green Deployment)
# Deploy to alternate route wrangler publish --env=blue # Switch traffic via Cloudflare dashboard # or with API/CLI commands to update routes
تغییر ترافیک فوری و بدون هیچ‌گونه وقفه.
همواره پس از بازگردانی، وضعیت سلامت سیستم و پیکربندی Webhook را بررسی کنید.
چک لیست استقرار در محیط پروداکشن
کیفیت کد
تمامی تست‌ها با موفقیت اجرا شده‌اند، خطاهای linting برطرف گشته‌اند و درخواست ادغام (PR) بازبینی نهایی شده است.
پیکربندی
متغیرهای محیطی (environment variables) به درستی و متناسب با محیط پروداکشن تنظیم شده‌اند.
کلیدهای محرمانه (Secrets)
کلیدهای API و توکن‌های مربوط به محیط پروداکشن به صورت امن در Workers Secrets ذخیره شده‌اند.
فضای نام KV (KV Namespace)
فضای نام KV (KV Namespace) مخصوص محیط پروداکشن ایجاد و به درستی متصل شده است.
وب‌هوک (Webhook)
اطمینان حاصل شود که Telegram webhook به production URL صحیح اشاره دارد.
بررسی سلامت (Health Check)
نقطه پایانی /health می‌بایست کد وضعیت 200 OK را بازگرداند.
لاگ‌برداری (Logging)
سیستم لاگ‌برداری (logging) محیط پروداکشن با جزئیات و سطح مناسب پیکربندی شده است.
محدودیت نرخ (Rate Limiting)
محدودیت‌های نرخ (rate limits) برای محیط پروداکشن جهت محافظت از منابع و جلوگیری از سوءاستفاده، تنظیم و فعال شده‌اند.
برنامه بازگشت (Rollback Plan)
یک روش مستند و آزمایش‌شده برای بازگشت اضطراری به نسخه قبلی وجود دارد.
مستندات
README و کلیه اسناد مربوط به فرآیند استقرار به‌روزرسانی شده‌اند.