تصور کنید برنامهای نوشتهاید که در محیط تست عالی کار میکند، اما به محض استقرار در سازمان، به دلیل یک تأخیر ساده در پاسخ مدل، کل سیستم شما کرش میکند. این کابوس اکنون برای هر توسعهدهندهای که تفاوت بین یک بوت ساده و یک عامل هوشمند را در معماری مایکروسافت تیمز درک نکند، به واقعیت تبدیل میشود.
طبق راهنمای فنی منتشرشده در ۱۵ جولای ۲۰۲۶، استفادهی متقابل از مفاهیم «بوت» و «عامل» در نمودارهای فنی، دلیل اصلی شکست پروژهها هنگام انتقال از دموهای محلی به محیطهای عملیاتی (Production) است. در واقع، اگر یک افزونهی تیمز بر اساس درخت تصمیم if/else کار کند، یک بوت است؛ اما اگر در زمان اجرا خودش ابزار مورد نیاز را انتخاب کند، با یک عامل (Agent) — شبیه دستیاری که نه فقط دستورات را اجرا میکند، بلکه تصمیم میگیرد برای رسیدن به هدف چه ابزاری را بردارد — طرف هستیم.
همانطور که در تحلیل قبلی ما دربارهی شتاببخشی به کشف باگها و وصلهزدن داخلی در مایکروسافت اشاره کردیم، چرخش به سمت گردشهای کاری عاملمحور (Agentic Workflows)، ریسکهای پایداری جدیدی ایجاد میکند. این تغییر رویکرد در سازمانها با تمایل تیمهای عملیات هوش مصنوعی به جایگزینی ابزارهای عمومی با صفحات کنترلی سفارشی همسو است تا کنترل دقیقتری بر جریانهای کاری پیچیده داشته باشند. در دنیایی که هوش مصنوعی اکنون میتواند اهداف چندمرحلهای را برنامهریزی کند، فاصله بین پرامپت کاربر و اقدام نهایی افزایش یافته است. این شکاف، یک مشکل همگامسازی حیاتی برای توسعهدهندگان .NET 9 و Azure ایجاد میکند.
مدل زمانبندی سه لایهای
بر اساس مستندات مایکروسافت، افزونههای مدرن تیمز بر اساس وضعیت (State) و بکاِند به سه دسته متمایز تقسیم میشوند. درک این تفاوتها، اولین گام در ساخت اپلیکیشنهای هوشمند با .NET 9 است:
- اپلیکیشنهای تیمز (Teams Apps): رابطهای کاربری ایستا و صفحهمحور (مانند تبها) که روی Azure App Service یا Static Web Apps میزبانی میشوند. اینها عمدتاً بدون وضعیت (Stateless) هستند و تمرکزشان بر نمایش محتوا است.
- بوتها (Bots): رابطهای گفتگو-محور مبتنی بر نوبت (Turn-based) که از Bot Framework SDK یا Teams AI Library استفاده میکنند. اینها گفتگوها را گامبهگام و با استفاده از دیالوگهای اسکریپتشده یا هندلرهای فعالیت (Activity Handlers) پیش میبرند و وضعیت گفتگو را به ازای هر جلسه (Session) حفظ میکنند.
- عاملها (Agents): هماهنگکنندههای هدفمحور که از Microsoft 365 Agents SDK یا Semantic Kernel بر روی Azure AI Foundry استفاده میکنند. اینها پایدار و چندمرحلهای هستند و توانایی برنامهریزی، انتخاب ابزار و اقدام برای رسیدن به یک هدف خاص دارند.

تمایزهای معماری
تفاوت بنیادی در نحوهی پاسخ به درخواست است. یک بوت از منطق قطعی (Deterministic) — که اساساً یک ماشین وضعیت (State Machine) است — برای تصمیمگیری دربارهی جملهی بعدی استفاده میکند. اما به یک عامل، یک فهرست ابزار (Tool Registry) داده میشود و او بهصورت پویا ترتیب فراخوانیهای Graph، نوشتن در پایگاهداده یا تریگرهای تأیید را در لحظهی اجرا انتخاب میکند.
این تغییر در منطق، زیرساخت مورد نیاز را بهشدت تغییر میدهد. معماریهای عاملمحور به حفاظهای (Safeguards) خاصی نیاز دارند که بوتها به آنها بینیازند، از جمله:
- محدودیتهای تلاش مجدد (Retry limits) برای مدیریت ناپایداری مدلهای زبانی بزرگ (LLM).
- اعتبارسنجی ابزار (Tool validation) برای اطمینان از اینکه مدل پارامترهای درست را ارائه میدهد.
- محافظهای حلقه (Loop guards) برای جلوگیری از چرخش بیانتها و بیهدف عامل.
- نقاط بازرسی «انسان در حلقه» (Human-in-the-loop) برای تأیید اقدامات حساس و بحرانی.
در این راستا، رقابت بین ابزارهایی نظیر OpenClaw و Hermes برای تسلط بر لایهی کنترلی عاملها نشان میدهد که مدیریت دقیق این لایهها، اولویت اصلی توسعهدهندگان در سال ۲۰۲۶ است.
تلهی تایم-اوت در محیط عملیاتی
هر درخواست مسیری لایهبندیشده را طی میکند: کلاینت تیمز $ \rightleftharpoons $ وبهوک Microsoft Graph $ \rightleftharpoons $ لایهی ورود/ارکستریشن (Azure App Service یا Azure Functions) $ \rightleftharpoons $ لایهی هوش مصنوعی (Azure AI Foundry/OpenAI) $ \rightleftharpoons $ وابستگیهای پاییندستی (مانند پایگاهدادههای SQL، شیرپوینت یا APIهای خط کسبوکار یا LOB).
یک شکست بحرانی زمانی رخ میدهد که توسعهدهندگان منطق سنگین استدلال و استنتاج (Reasoning logic) را مستقیماً داخل یک هندلر پیام قرار دهند. این روش در دموهای محلی (Local Dev Tunnel) جواب میدهد، اما در محیط عملیاتی سقوط میکند.
مایکروسافت انتظار دارد پاسخ HTTP 200 OK را تقریباً در بازهی ۱۰ تا ۱۵ ثانیه دریافت کند. اگر حلقهی استدلال یک LLM از این پنجره فراتر رود، تیمز تلاشهای مجدد ناشی از تایم-اوت (Timeout retries) را فعال میکند. این اتفاق منجر به ایجاد حلقهای از درخواستهای تکراری و زائد میشود که میتواند کل سرویس را کرش دهد. علاوه بر این، نقاط انتهایی خام (Raw endpoints) هیچ پایداری (Durability) ندارند؛ اگر یک نمونهی میزبانی (Hosting instance) در میانه انجام کار ریاستارت شود، تمام پیشرفتها از بین میرود، زیرا هیچ تفکیک پاکی بین برنامهی مدل و اجرای آن وجود ندارد.
برای بقا در این شرایط، معماری باید غیرهمزمان (Asynchronous) باشد. هندلر باید صرفاً وبهوک را بپذیرد و رویداد را در یک صف قابل اطمینان مانند Azure Service Bus منتشر کند تا یک Worker یا Azure Durable Function بتواند حلقهی استدلال را مستقل از اتصال کلاینت اجرا کند.
انتخاب SDK: Bot Framework یا Agents SDK
انتخاب بین این دو بستهی توسعه به میزان نیاز به پیشبینیپذیری و ماهیت مدل تعاملی بستگی دارد:
- Bot Framework SDK: از گفتگوهای صریح و دیالوگهای نویسنده-محور استفاده میکند. این گزینه برای گردشهای کاری قطعی مانند بوتهای FAQ، فرمهای ساختاریافته و مسیریابی تیکتها ایدهآل است و برای فرآیندهای نظارتی (Regulated) که هر گام باید قابل پیشبینی و حسابرسی باشد، ضروری باقی میماند.
- Microsoft 365 Agents SDK: از برنامهریزی مبتنی بر قصد (Intent-driven planning) استفاده میکند که در آن مدل مسیر را تعیین میکند. این ابزار برای وظایف باز (Open-ended)، پژوهشهای چندمرحلهای و هماهنگیهای پیچیده بین سیستمی که مسیر آنها به دادههای دریافتی از اولین فراخوانی ابزار بستگی دارد، بهترین گزینه است.

جریانهای رویداد-محور و نمایش
Adaptive Cards لایهی نمایش جهانی برای هر دو گروه هستند. تفاوت در مکانیسم مقداردهی (Population) است؛ یک بوت اسکریپتشده، کارت را از یک قالب ثابت و با استفاده از مقادیر شناختهشده رندر میکند. اما یک عامل، کارت را بهعنوان گام پایانی یک حلقهی استدلال رندر میکند، آن هم تنها پس از اینکه تصمیم بگیرد کدام دادهها مرتبط هستند و آنها را از یک فراخوانی ابزار استخراج کند. برای حفظ معماری پاک، تولید شمای کارتها باید از منطق مرکزی برنامهریزی جدا شود.
علاوه بر گفتگو، تیمز در حال تبدیل شدن به یک «کاکپیت عملیاتی» است. تعاملات همیشه از یک پیام کاربر شروع نمیشوند. سیگنالهای خارجی میتوانند از طریق Azure Event Grid، Service Bus یا Event Hub وارد یک Azure Function شوند تا بهصورت پیشدستانه (Proactive) آپدیتهایی را در یک کانال ارسال کنند. برای کاهش فشار ذهنی ناشی از این حجم از دادهها، استفاده از مدل Team Topologies در پلتفرمهای عاملمحور کمک میکند تا بار شناختی از دوش کاربران برداشته شود و سازماندهی بهتری در توزیع وظایف صورت گیرد. نمونههایی از این جریانها عبارتند از:
- باز شدن یک Pull Request در Azure DevOps.
- تشخیص یک ناهنجاری امنیتی توسط یک خط لولهی مانیتورینگ.
- علامتگذاری یک معامله در CRM بهعنوان «بسته شده».
نقشهی راه پیادهسازی .NET 9
توسعه در این اکوسیستم نیازمند رویکردی مرحلهبندیشده است. این سری مقالات این موضوعات را به ترتیب زیر بررسی خواهد کرد: ابتدا معماری، سپس ساخت بوتها با Teams AI Library و در نهایت یک مقایسهی در سطح کد بین Agents و Bot Framework. ماژولهای بعدی به موضوعات زیر خواهند پرداخت:
- کش توزیعشده با Redis در مقابل Cosmos DB.
- پیادهسازی تکمیل چت (Chat Completion) با Semantic Kernel.
- تأمین امنیت کانال از طریق Entra ID و جریان On-Behalf-Of (OBO).
- پیادهسازی پیامرسانی پیشدستانه رویداد-محور و مدیریت وظایف طولانیمدت LLM با استفاده از Durable Agents.
این چرخش معماری، فرضهای بنیادی توسعه در تیمز را تغییر میدهد. توسعهدهندگان دیگر نمیتوانند به الگوهای همزمان Request-Response تکیه کنند. معرفی نقاط بازرسی «انسان در حلقه» و محافظهای حلقه اکنون برای هر سیستم عاملمحور در محیطهای سازمانی اجباری است تا از رفتارهای خودسرانه و خارج از کنترل (Autonomous runaway behavior) جلوگیری شود.
برای تیمهایی که در انتخاب مسیر تردید دارند، «تست تختهسفید» معیار طلایی است: اگر میتوانید کل درخت تصمیم مطلق را قبل از نوشتن کد رسم کنید، بوت بسازید. اگر فقط یک هدف کلی (High-level goal statement) و مجموعهای از ابزارها دارید، باید یک عامل با یک بدنه غیرهمزمانِ مستحکم طراحی کنید.
گام بعدی شما
- بررسی مستندات Azure Service Bus برای پیادهسازی لایهی صف در عاملهای خود
- تست محدودیت ۱۵ ثانیهای در محیط Staging برای شناسایی گلوگاههای استنتاج
- بازنگری در مدلهای موجود و شناسایی مواردی که از «بوت» به «عامل» تبدیل شدهاند اما هنوز معماری همزمان دارند
اما چالشهای مدیریت حافظه در این عاملها حتی پیچیدهتر است — در تحلیل ما دربارهی پنجرههای متنی و حافظه بلندمدت مدلها بخوانید.




گفتگو