<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Dotnet | The .NET Blog</title><link>https://thedotnetblog.com/ar/tags/dotnet/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>ar</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Thu, 23 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/ar/tags/dotnet/index.xml" rel="self" type="application/rss+xml"/><item><title>Windows App Dev CLI v0.3: تشغيل F5 من الطرفية وأتمتة واجهة المستخدم للوكلاء الذكيين</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</guid><description>يُقدّم Windows App Development CLI v0.3 أمر winapp run لتشغيل التطبيقات وتنقيحها من الطرفية، وأمر winapp ui لأتمتة الواجهة، وحزمة NuGet جديدة تتيح dotnet run مع التطبيقات المُحزَّمة.</description><content:encoded>&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المنشور تلقائيًا. للاطلاع على النص الأصلي، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;تجربة F5 في Visual Studio رائعة. لكن فتح VS لمجرد تشغيل تطبيق Windows مُحزَّم وتنقيحه — سواء في خط أنابيب CI، أو سير عمل آلي، أو عندما يُجري وكيل ذكاء اصطناعي الاختبارات — يُشكّل عبئًا زائدًا.&lt;/p&gt;
&lt;p&gt;صدر الإصدار v0.3 من Windows App Development CLI &lt;a href="https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/"&gt;للتو&lt;/a&gt;، ويعالج هذا الأمر مباشرةً بميزتين رئيسيتين: &lt;code&gt;winapp run&lt;/code&gt; و&lt;code&gt;winapp ui&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="winapp-run-f5-من-أي-مكان"&gt;winapp run: F5 من أي مكان&lt;/h2&gt;
&lt;p&gt;يستقبل &lt;code&gt;winapp run&lt;/code&gt; مجلد تطبيق غير مُحزَّم وملف manifest، وينفّذ كل ما يفعله VS عند تشغيل التنقيح: تسجيل حزمة loose، وتشغيل التطبيق، والحفاظ على &lt;code&gt;LocalState&lt;/code&gt; بين عمليات إعادة النشر.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# قم ببناء التطبيق، ثم شغّله كتطبيق مُحزَّم&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp run ./bin/Debug
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;يعمل مع WinUI وWPF وWinForms وConsole وAvalonia والمزيد. صُمِّمت الأوضاع للمطورين وسير العمل الآلي على حد سواء:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--detach&lt;/code&gt;&lt;/strong&gt;: يُشغَّل التطبيق ويُعاد التحكم فورًا إلى الطرفية. مثالي لـ CI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--unregister-on-exit&lt;/code&gt;&lt;/strong&gt;: يُزيل الحزمة المُسجَّلة عند إغلاق التطبيق.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--debug-output&lt;/code&gt;&lt;/strong&gt;: يلتقط رسائل &lt;code&gt;OutputDebugString&lt;/code&gt; والاستثناءات في الوقت الفعلي.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="حزمة-nuget-جديدة-dotnet-run-للتطبيقات-المحزمة"&gt;حزمة NuGet جديدة: dotnet run للتطبيقات المُحزَّمة&lt;/h2&gt;
&lt;p&gt;يتوفر للمطورين العاملين بـ .NET حزمة NuGet جديدة: &lt;code&gt;Microsoft.Windows.SDK.BuildTools.WinApp&lt;/code&gt;. بعد التثبيت، يتولى &lt;code&gt;dotnet run&lt;/code&gt; إدارة الحلقة الداخلية بأكملها: البناء، وتحضير حزمة loose-layout، والتسجيل في Windows، والتشغيل — كل ذلك في خطوة واحدة.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# أو&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Windows.SDK.BuildTools.WinApp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="winapp-ui-أتمتة-واجهة-المستخدم-من-سطر-الأوامر"&gt;winapp ui: أتمتة واجهة المستخدم من سطر الأوامر&lt;/h2&gt;
&lt;p&gt;هذه هي الميزة التي تفتح سيناريوهات الوكلاء الذكيين. يوفر &lt;code&gt;winapp ui&lt;/code&gt; وصولًا كاملًا عبر UI Automation لأي تطبيق Windows قيد التشغيل — WPF وWinForms وWin32 وElectron وWinUI3 — مباشرةً من الطرفية.&lt;/p&gt;
&lt;p&gt;ما يمكن تحقيقه:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;سرد جميع النوافذ على المستوى الأعلى&lt;/li&gt;
&lt;li&gt;التنقل في شجرة UI Automation الكاملة لأي نافذة&lt;/li&gt;
&lt;li&gt;البحث عن عناصر بالاسم أو النوع أو معرّف الأتمتة&lt;/li&gt;
&lt;li&gt;النقر والاستدعاء وتعيين القيم&lt;/li&gt;
&lt;li&gt;التقاط لقطات الشاشة&lt;/li&gt;
&lt;li&gt;انتظار ظهور العناصر — مثالي لمزامنة الاختبارات&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;يُتيح الجمع بين &lt;code&gt;winapp ui&lt;/code&gt; و&lt;code&gt;winapp run&lt;/code&gt; سير عملًا كاملًا من الطرفية: بناء ← تشغيل ← تحقق. يمكن للوكيل تشغيل التطبيق، وفحص حالة الواجهة، والتفاعل برمجيًا، والتحقق من النتيجة.&lt;/p&gt;
&lt;h2 id="مستجدات-أخرى"&gt;مستجدات أخرى&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp unregister&lt;/code&gt;&lt;/strong&gt;: يحذف حزمة sideloaded عند الانتهاء.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp manifest add-alias&lt;/code&gt;&lt;/strong&gt;: يُضيف اسمًا مستعارًا لتشغيل التطبيق بالاسم من الطرفية.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;إكمال تلقائي بـ Tab&lt;/strong&gt;: تهيئة إكمال PowerShell بأمر واحد.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="كيفية-التثبيت"&gt;كيفية التثبيت&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winget install Microsoft.WinAppCli
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# أو&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g @microsoft/winappcli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;الأداة في معاينة عامة. راجع &lt;a href="https://github.com/microsoft/WinAppCli"&gt;مستودع GitHub&lt;/a&gt; للتوثيق الكامل، و&lt;a href="https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/"&gt;الإعلان الأصلي&lt;/a&gt; لجميع التفاصيل.&lt;/p&gt;</content:encoded></item><item><title>كتابة Hooks في azd بـ Python وTypeScript و.NET: وداعًا لسكريبتات Shell</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</guid><description>تدعم Azure Developer CLI الآن كتابة hooks بـ Python وJavaScript وTypeScript و.NET. لا مزيد من التبديل إلى Bash من أجل سكريبت migration واحد.</description><content:encoded>&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المنشور تلقائيًا. للاطلاع على النسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;إن كنت قد امتلكت مشروعًا بالكامل بـ .NET واضطررت رغم ذلك إلى كتابة سكريبتات Bash لـ hooks في azd، فأنت تعرف هذا الألم. لماذا التبديل إلى صياخة shell في خطوة pre-provisioning بينما كل شيء آخر في المشروع مكتوب بـ C#؟&lt;/p&gt;
&lt;p&gt;هذا الإحباط لديه الآن حل رسمي. أطلقت Azure Developer CLI &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;دعم متعدد اللغات لـ hooks&lt;/a&gt;، وهو بالضبط بقدر ما يبدو جيدًا.&lt;/p&gt;
&lt;h2 id="ما-هي-الـ-hooks"&gt;ما هي الـ Hooks&lt;/h2&gt;
&lt;p&gt;الـ Hooks هي سكريبتات تعمل في نقاط حيوية من دورة حياة &lt;code&gt;azd&lt;/code&gt; — قبل provisioning، وبعد deployment، والمزيد. تُعرَّف في &lt;code&gt;azure.yaml&lt;/code&gt; وتتيح حقن منطق مخصص دون تعديل الـ CLI.&lt;/p&gt;
&lt;p&gt;في السابق، دُعم فقط Bash وPowerShell. الآن يمكن استخدام &lt;strong&gt;Python أو JavaScript أو TypeScript أو .NET&lt;/strong&gt; — ويتولى &lt;code&gt;azd&lt;/code&gt; الباقي تلقائيًا.&lt;/p&gt;
&lt;h2 id="كيف-يعمل-الاستدلال"&gt;كيف يعمل الاستدلال&lt;/h2&gt;
&lt;p&gt;ما عليك سوى الإشارة إلى ملف وسيستنتج &lt;code&gt;azd&lt;/code&gt; اللغة من الامتداد:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;preprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/setup.py&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postdeploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/seed.ts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/migrate.cs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;لا إعداد إضافي. إذا كان الامتداد غامضًا، يمكنك إضافة &lt;code&gt;kind: python&lt;/code&gt; (أو اللغة المناسبة) صراحةً.&lt;/p&gt;
&lt;h2 id="تفاصيل-مهمة-حسب-اللغة"&gt;تفاصيل مهمة حسب اللغة&lt;/h2&gt;
&lt;h3 id="python"&gt;Python&lt;/h3&gt;
&lt;p&gt;ضع &lt;code&gt;requirements.txt&lt;/code&gt; أو &lt;code&gt;pyproject.toml&lt;/code&gt; بجانب السكريبت (أو في أي دليل أعلى). سينشئ &lt;code&gt;azd&lt;/code&gt; بيئة افتراضية تلقائيًا، ويثبت التبعيات، ويشغل السكريبت.&lt;/p&gt;
&lt;h3 id="javascript-وtypescript"&gt;JavaScript وTypeScript&lt;/h3&gt;
&lt;p&gt;نفس النمط — ضع &lt;code&gt;package.json&lt;/code&gt; بالقرب من السكريبت وسيشغل &lt;code&gt;azd&lt;/code&gt; أولاً &lt;code&gt;npm install&lt;/code&gt;. بالنسبة لـ TypeScript يستخدم &lt;code&gt;npx tsx&lt;/code&gt; دون خطوة تجميع ودون &lt;code&gt;tsconfig.json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="net"&gt;.NET&lt;/h3&gt;
&lt;p&gt;وضعان متاحان:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;وضع المشروع&lt;/strong&gt;: إذا كان هناك &lt;code&gt;.csproj&lt;/code&gt; بجانب السكريبت، سيشغل &lt;code&gt;azd&lt;/code&gt; تلقائيًا &lt;code&gt;dotnet restore&lt;/code&gt; و&lt;code&gt;dotnet build&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;وضع الملف الواحد&lt;/strong&gt;: في .NET 10+ يمكن تشغيل ملفات &lt;code&gt;.cs&lt;/code&gt; المستقلة مباشرةً عبر &lt;code&gt;dotnet run script.cs&lt;/code&gt;. لا حاجة لملف مشروع.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="إعداد-خاص-بكل-منفذ"&gt;إعداد خاص بكل منفذ&lt;/h2&gt;
&lt;p&gt;تدعم كل لغة كتلة &lt;code&gt;config&lt;/code&gt; اختيارية:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;preprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/setup.ts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;packageManager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pnpm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/migrate.cs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Release&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;framework&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;net10.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="لماذا-يهم-هذا-لمطوري-net"&gt;لماذا يهم هذا لمطوري .NET&lt;/h2&gt;
&lt;p&gt;كانت الـ hooks آخر مكان في مشروع قائم على azd يجبر على تغيير اللغة. الآن يمكن لكامل pipeline النشر — من كود التطبيق إلى lifecycle hooks — أن يعيش في لغة واحدة. يمكنك إعادة استخدام أدوات .NET الموجودة في hooks، والإشارة إلى مكتبات مشتركة، والتخلص من صيانة سكريبتات shell.&lt;/p&gt;
&lt;h2 id="خلاصة"&gt;خلاصة&lt;/h2&gt;
&lt;p&gt;أحد تلك التغييرات التي تبدو صغيرة لكنها تزيل الكثير من الاحتكاك اليومي مع azd. دعم متعدد اللغات لـ hooks متاح الآن — تحقق من &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;المنشور الرسمي&lt;/a&gt; للحصول على التوثيق الكامل.&lt;/p&gt;</content:encoded></item><item><title>توقف عن حراسة طرفيتك: الوضع المنفصل في Aspire يغير سير العمل</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</guid><description>يتيح لك Aspire 13.2 تشغيل AppHost في الخلفية واسترداد طرفيتك. مقرون بأوامر CLI الجديدة ودعم الوكلاء، هذا أمر أكبر مما يبدو.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;في كل مرة تشغّل فيها Aspire AppHost، تختفي طرفيتك. مقفلة. مشغولة حتى Ctrl+C. تريد تشغيل أمر سريع؟ افتح تبويبًا جديدًا. تريد التحقق من السجلات؟ تبويب آخر. هذا الاحتكاك الصغير يتراكم بسرعة.&lt;/p&gt;
&lt;p&gt;يحل Aspire 13.2 هذا. كتب James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;تفاصيل كاملة&lt;/a&gt;، وبصراحة، هذه إحدى تلك الميزات التي تُغيّر طريقة عملك فوراً.&lt;/p&gt;
&lt;h2 id="الوضع-المنفصل-أمر-واحد-الطرفية-تعود"&gt;الوضع المنفصل: أمر واحد، الطرفية تعود&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;هذا اختصار لـ &lt;code&gt;aspire run --detach&lt;/code&gt;. يعمل AppHost الخاص بك في الخلفية وتستعيد طرفيتك فوراً.&lt;/p&gt;
&lt;h2 id="إدارة-ما-يعمل"&gt;إدارة ما يعمل&lt;/h2&gt;
&lt;p&gt;التشغيل في الخلفية مفيد فقط إذا كنت تستطيع إدارة ما هو جارٍ. يأتي Aspire 13.2 بمجموعة كاملة من أوامر CLI:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# قائمة جميع AppHost العاملة&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire ps
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# فحص حالة AppHost محدد&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire describe
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# بث السجلات من AppHost العامل&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire logs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# إيقاف AppHost محدد&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="دمجه-مع-الوضع-المعزول"&gt;دمجه مع الوضع المعزول&lt;/h2&gt;
&lt;p&gt;الوضع المنفصل يتزاوج طبيعياً مع الوضع المعزول:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start --isolated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;كل مثيل يحصل على منافذ عشوائية وأسرار منفصلة ودورة حياة خاصة به.&lt;/p&gt;
&lt;h2 id="لماذا-هذا-ضخم-لوكلاء-البرمجة"&gt;لماذا هذا ضخم لوكلاء البرمجة&lt;/h2&gt;
&lt;p&gt;وكيل البرمجة الذي يعمل في طرفيتك يمكنه الآن:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;تشغيل التطبيق بـ &lt;code&gt;aspire start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;الاستعلام عن حالته بـ &lt;code&gt;aspire describe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;التحقق من السجلات بـ &lt;code&gt;aspire logs&lt;/code&gt; لتشخيص المشكلات&lt;/li&gt;
&lt;li&gt;إيقافه بـ &lt;code&gt;aspire stop&lt;/code&gt; عند الانتهاء&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;تشغيل &lt;code&gt;aspire agent init&lt;/code&gt; يهيّئ ملف مهارات Aspire الذي يعلّم الوكلاء هذه الأوامر.&lt;/p&gt;
&lt;h2 id="خلاصة"&gt;خلاصة&lt;/h2&gt;
&lt;p&gt;الوضع المنفصل هو ترقية لسير العمل متنكرة كعلامة بسيطة. اقرأ &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;المقال كاملاً&lt;/a&gt; واحصل على Aspire 13.2 مع &lt;code&gt;aspire update --self&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title>تجميع الدبابيس يصل أخيراً إلى خرائط .NET MAUI — خاصية واحدة، لا ألم</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/</guid><description>.NET MAUI 11 Preview 3 يضيف تجميع الدبابيس الأصيلي إلى عنصر التحكم Map. خاصية واحدة، ومجموعات تجميع منفصلة، ومعالجة النقر — كل ذلك مدمج.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;تعرف تلك اللحظة حين تحمّل خريطة بمئة دبوس ويتحول كل شيء إلى كتلة غير قابلة للقراءة؟ نعم، هذا كان تجربة .NET MAUI Maps — حتى الآن. لا مزيد من ذلك.&lt;/p&gt;
&lt;p&gt;David Ortinau &lt;a href="https://devblogs.microsoft.com/dotnet/pin-clustering-in-dotnet-maui-maps/"&gt;أعلن للتو&lt;/a&gt; أن .NET MAUI 11 Preview 3 يشحن تجميع الدبابيس جاهزاً للاستخدام على Android وiOS/Mac Catalyst. والجزء الأفضل — تفعيله سهل بشكل مدهش.&lt;/p&gt;
&lt;h2 id="خاصية-واحدة-لحكمهم-جميعا"&gt;خاصية واحدة لحكمهم جميعاً&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;maps:Map&lt;/span&gt; &lt;span class="na"&gt;IsClusteringEnabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;هذا كل شيء. تُجمَّع الدبابيس القريبة في مجموعات مع شارة العدد. قرّب الخريطة وتتمدد. ابتعد وتنضمّ. هذا النوع من السلوك الذي يتوقعه المستخدمون من أي خريطة حديثة — والآن تحصل عليه بخاصية واحدة.&lt;/p&gt;
&lt;h2 id="مجموعات-تجميع-مستقلة"&gt;مجموعات تجميع مستقلة&lt;/h2&gt;
&lt;p&gt;هنا تصبح الأمور مثيرة للاهتمام. ليس كل الدبابيس يجب أن تتجمع معاً. المقاهي والحدائق أشياء مختلفة، ويجب أن تعرف خريطتك ذلك.&lt;/p&gt;
&lt;p&gt;خاصية &lt;code&gt;ClusteringIdentifier&lt;/code&gt; تتيح لك فصل الدبابيس إلى مجموعات مستقلة:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Pike Place Coffee&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;47.6097&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;122.3331&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ClusteringIdentifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;coffee&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Occidental Square&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;47.6064&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;122.3325&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ClusteringIdentifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;parks&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;الدبابيس ذات المعرّف نفسه تتجمع معاً. المعرّفات المختلفة تُشكّل مجموعات مستقلة حتى عند التقارب الجغرافي. لا معرّف؟ المجموعة الافتراضية. واضح ومتوقع.&lt;/p&gt;
&lt;h2 id="معالجة-النقر-على-المجموعة"&gt;معالجة النقر على المجموعة&lt;/h2&gt;
&lt;p&gt;حين ينقر مستخدم على مجموعة، تحصل على حدث &lt;code&gt;ClusterClicked&lt;/code&gt; بكل ما تحتاجه:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClusterClicked&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;DisplayAlert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;$&amp;#34;Cluster ({e.Pins.Count} pins)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Suppress default zoom-to-cluster behavior:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// e.Handled = true;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;تمنحك وسيطات الحدث &lt;code&gt;Pins&lt;/code&gt; (الدبابيس في المجموعة)، و&lt;code&gt;Location&lt;/code&gt; (المركز الجغرافي)، و&lt;code&gt;Handled&lt;/code&gt; (اضبطها على &lt;code&gt;true&lt;/code&gt; إذا أردت تجاوز التكبير الافتراضي). بسيط، عملي، تماماً ما تتوقعه.&lt;/p&gt;
&lt;h2 id="تفاصيل-المنصة-تستحق-المعرفة"&gt;تفاصيل المنصة تستحق المعرفة&lt;/h2&gt;
&lt;p&gt;على Android، يستخدم التجميع خوارزمية شبكية مخصصة تُعيد الحساب عند تغيّر مستوى التكبير — دون تبعيات خارجية. على iOS وMac Catalyst، يستفيد من دعم &lt;code&gt;MKClusterAnnotation&lt;/code&gt; الأصيل في MapKit، مما يعني حركات انتقال سلسة وأصيلة للمنصة.&lt;/p&gt;
&lt;p&gt;هذه إحدى الحالات التي اتخذ فيها فريق MAUI القرار الصحيح — الاتكاء على المنصة حيث يكون ذلك منطقياً.&lt;/p&gt;
&lt;h2 id="لماذا-يهم-هذا"&gt;لماذا يهمّ هذا&lt;/h2&gt;
&lt;p&gt;تجميع الدبابيس كان أحد أكثر الميزات المطلوبة في .NET MAUI (&lt;a href="https://github.com/dotnet/maui/issues/11811"&gt;المشكلة #11811&lt;/a&gt;)، ولسبب وجيه. كل تطبيق يعرض مواقع على خريطة — تتبع التوصيل، ومحدّدات المتاجر، والعقارات — يحتاج إلى هذا. سابقاً كان عليك بناؤه بنفسك أو استيراد مكتبة من جهة خارجية. الآن هو مدمج.&lt;/p&gt;
&lt;p&gt;لنا نحن مطوّري .NET الذين نبني تطبيقات جوالة متعددة المنصات، هذا هو نوع تحسينات جودة الحياة الذي يجعل MAUI خياراً عملياً حقيقياً للسيناريوهات المكثفة باستخدام الخرائط.&lt;/p&gt;
&lt;h2 id="ابدأ-الآن"&gt;ابدأ الآن&lt;/h2&gt;
&lt;p&gt;ثبّت &lt;a href="https://dotnet.microsoft.com/download/dotnet/11.0"&gt;.NET 11 Preview 3&lt;/a&gt; وحدّث حمل عمل .NET MAUI. &lt;a href="https://github.com/dotnet/maui-samples/tree/main/10.0/UserInterface/Views/Map/MapDemo/WorkingWithMaps"&gt;نموذج Maps&lt;/a&gt; يتضمن صفحة Clustering جديدة يمكنك تجربتها مباشرةً.&lt;/p&gt;
&lt;p&gt;ابنِ شيئاً به — واترح خرائطك أخيراً.&lt;/p&gt;</content:encoded></item><item><title>.NET أبريل 2026 — تحديثات الأمان التي يجب تطبيقها اليوم</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/</guid><description>تُصلح تحديثات خدمة أبريل 2026 ست ثغرات أمنية عبر .NET 10 و.NET 9 و.NET 8 و.NET Framework — بما في ذلك ثغرتان للتنفيذ عن بُعد.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;صدرت &lt;a href="https://devblogs.microsoft.com/dotnet/dotnet-and-dotnet-framework-april-2026-servicing-updates/"&gt;تحديثات الخدمة لأبريل 2026&lt;/a&gt; لـ .NET و.NET Framework، وتتضمن هذه الدفعة إصلاحات أمنية تريد تطبيقها في أقرب وقت. ست ثغرات CVE مُصلَحة، بما في ذلك ثغرتان للتنفيذ عن بُعد (RCE).&lt;/p&gt;
&lt;h2 id="ما-الذي-تمت-معالجته"&gt;ما الذي تمت معالجته&lt;/h2&gt;
&lt;p&gt;إليك الملخص السريع:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;النوع&lt;/th&gt;
&lt;th&gt;يؤثر على&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-26171&lt;/td&gt;
&lt;td&gt;تجاوز ميزة الأمان&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8 + .NET Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32178&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;تنفيذ عن بُعد&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8 + .NET Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-33116&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;تنفيذ عن بُعد&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32203&lt;/td&gt;
&lt;td&gt;حجب الخدمة&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8 + .NET Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-23666&lt;/td&gt;
&lt;td&gt;حجب الخدمة&lt;/td&gt;
&lt;td&gt;.NET Framework 3.0–4.8.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32226&lt;/td&gt;
&lt;td&gt;حجب الخدمة&lt;/td&gt;
&lt;td&gt;.NET Framework 2.0–4.8.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;تؤثر ثغرتا RCE (CVE-2026-32178 وCVE-2026-33116) على أوسع نطاق من إصدارات .NET وينبغي إعطاؤهما الأولوية.&lt;/p&gt;
&lt;h2 id="الإصدارات-المحدثة"&gt;الإصدارات المحدَّثة&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;.NET 10&lt;/strong&gt;: 10.0.6&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET 9&lt;/strong&gt;: 9.0.15&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET 8&lt;/strong&gt;: 8.0.26&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;جميعها متاحة عبر القنوات المعتادة — &lt;a href="https://dotnet.microsoft.com/download/dotnet/10.0"&gt;dotnet.microsoft.com&lt;/a&gt;، وصور الحاويات على MCR، ومديري حزم Linux.&lt;/p&gt;
&lt;h2 id="ماذا-تفعل"&gt;ماذا تفعل&lt;/h2&gt;
&lt;p&gt;حدّث مشاريعك وخطوط CI/CD إلى أحدث إصدارات التصحيح. إذا كنت تشغّل حاويات، اسحب أحدث الصور. إذا كنت على .NET Framework، تحقق من &lt;a href="https://learn.microsoft.com/dotnet/framework/release-notes/release-notes"&gt;ملاحظات إصدار .NET Framework&lt;/a&gt; للتصحيحات المقابلة.&lt;/p&gt;
&lt;p&gt;بالنسبة لمن يشغّل .NET 10 في الإنتاج (وهو الإصدار الحالي)، فإن 10.0.6 تحديث إلزامي. ينطبق الأمر ذاته على .NET 9.0.15 و.NET 8.0.26 إذا كنت على تلك المسارات طويلة الأمد للدعم (LTS). ثغرتا تنفيذ عن بُعد ليستا مما يمكن تأجيله.&lt;/p&gt;</content:encoded></item><item><title>إطلاق Azure MCP Server 2.0 — أتمتة السحابة الوكيلية المستضافة ذاتياً أصبحت حقيقة</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</link><pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</guid><description>يصل Azure MCP Server 2.0 إلى مرحلة الاستقرار مع نشر عن بُعد مستضاف ذاتياً، و276 أداة عبر 57 خدمة Azure، وأمان على مستوى المؤسسات — إليك ما يهم مطوري .NET الذين يبنون سير عمل وكيلية.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;إذا كنت تبني أي شيء باستخدام MCP وAzure مؤخراً، فمن المحتمل أنك تعرف بالفعل أن التجربة المحلية تعمل بشكل جيد. توصّل بخادم MCP، دع وكيل الذكاء الاصطناعي يتحدث مع موارد Azure، وانتهيت. لكن في اللحظة التي تحتاج فيها إلى مشاركة هذا الإعداد عبر فريق؟ هنا تصبح الأمور معقدة.&lt;/p&gt;
&lt;p&gt;لم يعد الأمر كذلك. لقد &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;وصل Azure MCP Server للإصدار 2.0 المستقر&lt;/a&gt;، والميزة الرئيسية هي بالضبط ما طالبت به فرق المؤسسات: &lt;strong&gt;دعم خادم MCP البعيد المستضاف ذاتياً&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="ما-هو-azure-mcp-server"&gt;ما هو Azure MCP Server؟&lt;/h2&gt;
&lt;p&gt;مراجعة سريعة. ينفّذ Azure MCP Server مواصفة &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;بروتوكول سياق النموذج&lt;/a&gt; ويعرض قدرات Azure كأدوات منظمة وقابلة للاكتشاف يمكن لوكلاء الذكاء الاصطناعي استدعاؤها. فكر فيه كجسر موحد بين وكيلك وAzure — التزويد والنشر والمراقبة والتشخيص، كل ذلك من خلال واجهة واحدة متسقة.&lt;/p&gt;
&lt;p&gt;الأرقام تتحدث عن نفسها: &lt;strong&gt;276 أداة MCP عبر 57 خدمة Azure&lt;/strong&gt;. هذا تغطية جدية.&lt;/p&gt;
&lt;h2 id="الأمر-الكبير-نشر-عن-بعد-مستضاف-ذاتيا"&gt;الأمر الكبير: نشر عن بُعد مستضاف ذاتياً&lt;/h2&gt;
&lt;p&gt;إليك المسألة. تشغيل MCP محلياً على جهازك مناسب للتطوير والتجارب. لكن في سيناريو فريق حقيقي، تحتاج إلى:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;وصول مشترك للمطورين والأنظمة الوكيلية الداخلية&lt;/li&gt;
&lt;li&gt;تكوين مركزي (سياق المستأجر، افتراضيات الاشتراك، بيانات القياس)&lt;/li&gt;
&lt;li&gt;حدود شبكة المؤسسة وسياساتها&lt;/li&gt;
&lt;li&gt;التكامل في مسارات CI/CD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;يعالج Azure MCP Server 2.0 كل ذلك. يمكنك نشره كخدمة داخلية مُدارة مركزياً مع نقل بيانات يعتمد على HTTP، ومصادقة مناسبة، وحوكمة متسقة.&lt;/p&gt;
&lt;p&gt;للمصادقة، لديك خياران متينان:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Managed Identity&lt;/strong&gt; — عند التشغيل جنباً إلى جنب مع &lt;a href="https://aka.ms/azmcp/self-host/foundry"&gt;Microsoft Foundry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;تدفق On-Behalf-Of (OBO)&lt;/strong&gt; — تفويض OpenID Connect يستدعي واجهات برمجية Azure باستخدام سياق المستخدم الذي سجّل الدخول&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;تدفق OBO هذا مثير للاهتمام بشكل خاص لنا كمطوري .NET. يعني أن سير العمل الوكيلية يمكن أن تعمل بالأذونات الفعلية للمستخدم، وليس ببعض حسابات الخدمة المفرطة الصلاحيات. مبدأ الصلاحية الأدنى، مدمج مباشرةً.&lt;/p&gt;
&lt;h2 id="تحصين-الأمان"&gt;تحصين الأمان&lt;/h2&gt;
&lt;p&gt;هذا ليس مجرد إصدار ميزات — إنه إصدار أمني أيضاً. يضيف إصدار 2.0:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;التحقق المعزز من نقاط النهاية&lt;/li&gt;
&lt;li&gt;الحماية من أنماط الحقن في الأدوات الموجهة بالاستعلامات&lt;/li&gt;
&lt;li&gt;ضوابط عزل أكثر إحكاماً لبيئات التطوير&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;إذا كنت ستعرض MCP كخدمة مشتركة، فهذه الضمانات مهمة. بشكل كبير.&lt;/p&gt;
&lt;h2 id="أين-يمكنك-استخدامه"&gt;أين يمكنك استخدامه؟&lt;/h2&gt;
&lt;p&gt;قصة توافق العملاء واسعة. يعمل Azure MCP Server 2.0 مع:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;بيئات التطوير المتكاملة&lt;/strong&gt;: VS Code، Visual Studio، IntelliJ، Eclipse، Cursor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;وكلاء سطر الأوامر&lt;/strong&gt;: GitHub Copilot CLI، Claude Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;مستقل&lt;/strong&gt;: خادم محلي للإعدادات البسيطة&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;بعيد مستضاف ذاتياً&lt;/strong&gt;: النجم الجديد في إصدار 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;بالإضافة إلى ذلك، هناك دعم للسحابة السيادية لـ Azure US Government وAzure التي تشغّلها 21Vianet، وهو أمر حيوي للنشرات الخاضعة للتنظيم.&lt;/p&gt;
&lt;h2 id="لماذا-هذا-مهم-لمطوري-net"&gt;لماذا هذا مهم لمطوري .NET&lt;/h2&gt;
&lt;p&gt;إذا كنت تبني تطبيقات وكيلية باستخدام .NET — سواء كان ذلك Semantic Kernel أو Microsoft Agent Framework أو تنسيقك الخاص — يمنحك Azure MCP Server 2.0 طريقة جاهزة للإنتاج للسماح لوكلائك بالتفاعل مع بنية Azure التحتية. بدون أغلفة REST مخصصة. بدون أنماط تكامل خاصة بالخدمة. فقط MCP.&lt;/p&gt;
&lt;p&gt;بالاقتران مع &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;واجهة برمجية Fluent لتطبيقات MCP&lt;/a&gt; التي أُطلقت قبل أيام، تنضج منظومة .NET MCP بسرعة.&lt;/p&gt;
&lt;h2 id="البدء"&gt;البدء&lt;/h2&gt;
&lt;p&gt;اختر مسارك:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp"&gt;مستودع GitHub&lt;/a&gt;&lt;/strong&gt; — الكود المصدري والوثائق وكل شيء&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/docker"&gt;صورة Docker&lt;/a&gt;&lt;/strong&gt; — نشر في حاوية&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/vscode"&gt;امتداد VS Code&lt;/a&gt;&lt;/strong&gt; — تكامل مع بيئة التطوير المتكاملة&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/self-host"&gt;دليل الاستضافة الذاتية&lt;/a&gt;&lt;/strong&gt; — الميزة الرئيسية في إصدار 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="خلاصة-القول"&gt;خلاصة القول&lt;/h2&gt;
&lt;p&gt;Azure MCP Server 2.0 هو بالضبط نوع الترقية التحتية التي لا تبدو لامعة في العرض التوضيحي لكنها تغير كل شيء عملياً. خادم MCP البعيد المستضاف ذاتياً مع مصادقة مناسبة وتحصين أمني ودعم سحابة سيادية يعني أن MCP جاهز للفرق الحقيقية التي تبني سير عمل وكيلية حقيقية على Azure. إذا كنت تنتظر إشارة &amp;ldquo;جاهز للمؤسسات&amp;rdquo; — هذه هي.&lt;/p&gt;</content:encoded></item><item><title>.NET Aspire 13.2 يريد أن يكون أفضل صديق لوكيل الذكاء الاصطناعي</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</guid><description>يُركّز Aspire 13.2 كلياً على التطوير الوكيلي — مخرجات CLI منظّمة، وتشغيل معزول، وبيئات ذاتية الإصلاح، وبيانات OpenTelemetry كاملة حتى تتمكن وكلاء الذكاء الاصطناعي من بناء تطبيقاتك وتشغيلها ومراقبتها فعلاً.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;هل تعرف تلك اللحظة التي يكتب فيها وكيل البرمجة بالذكاء الاصطناعي كوداً رائعاً فتشعر بالحماس، ثم ينهار كل شيء عند محاولة &lt;em&gt;تشغيله&lt;/em&gt; فعلياً؟ تعارضات في المنافذ، وعمليات وهمية، ومتغيرات بيئة خاطئة — وفجأة يُنفق الوكيل رصيده من التوكن في استكشاف مشكلات الإطلاق عوضاً عن بناء الميزات.&lt;/p&gt;
&lt;p&gt;نشر فريق Aspire للتو &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;منشوراً متأنياً للغاية&lt;/a&gt; حول هذه المشكلة بالضبط، وإجابتهم مقنعة: صُمِّم Aspire 13.2 ليس للبشر وحدهم، بل لوكلاء الذكاء الاصطناعي أيضاً.&lt;/p&gt;
&lt;h2 id="المشكلة-حقيقية"&gt;المشكلة حقيقية&lt;/h2&gt;
&lt;p&gt;وكلاء الذكاء الاصطناعي بارعون بشكل لافت في كتابة الكود. لكن شحن تطبيق متكامل يعمل بشكل صحيح يتطلب أكثر بكثير من مجرد توليد ملفات. تحتاج إلى تشغيل الخدمات بالترتيب الصحيح، وإدارة المنافذ، وضبط متغيرات البيئة، وتوصيل قواعد البيانات، والحصول على تغذية راجعة حين تسوء الأمور. في الوقت الراهن، تتعامل معظم الوكلاء مع كل هذا بأسلوب التجربة والخطأ — تشغيل الأوامر، وقراءة مخرجات الأخطاء، والمحاولة مجدداً.&lt;/p&gt;
&lt;p&gt;نضيف تعليمات Markdown ومهارات مخصصة وإرشادات محددة لتوجيهها، غير أن كل ذلك غير موثوق، ولا يمكن تصريفه، ويكلف رصيداً من التوكن لمجرد تحليله. أصاب فريق Aspire جوهر المسألة: تحتاج الوكلاء إلى &lt;strong&gt;مصرِّفات وواجهات برمجية منظّمة&lt;/strong&gt;، لا إلى مزيد من Markdown.&lt;/p&gt;
&lt;h2 id="aspire-بوصفه-بنية-تحتية-للوكلاء"&gt;Aspire بوصفه بنية تحتية للوكلاء&lt;/h2&gt;
&lt;p&gt;إليك ما يُقدّمه Aspire 13.2 في مجال التطوير الوكيلي:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;مكدّسك البرمجي بالكامل في كود موجَّه بالأنواع.&lt;/strong&gt; يُعرِّف AppHost طوبولوجيا تطبيقك الكاملة — واجهة برمجية، وواجهة أمامية، وقاعدة بيانات، وذاكرة تخزين مؤقت — في TypeScript أو C# قابل للتصريف:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./.modules/aspire.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postgres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addPostgres&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;addDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;catalog&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addRedis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cache&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addNodeApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;src/index.ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PORT&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;postgres&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;waitFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;يستطيع الوكيل قراءة هذا الكود لفهم طوبولوجيا التطبيق، وإضافة موارد، وتوصيل الاتصالات، ثم &lt;em&gt;التصريف للتحقق&lt;/em&gt;. يخبره المصرِّف على الفور إن كان ثمة خطأ. لا تخمين، ولا تجربة وخطأ مع ملفات الإعداد.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;أمر واحد يتحكم في الجميع.&lt;/strong&gt; بدلاً من إدارة الوكيل لـ &lt;code&gt;docker compose up&lt;/code&gt; و&lt;code&gt;npm run dev&lt;/code&gt; وسكريبتات تشغيل قاعدة البيانات بشكل منفصل، كل شيء يكون ببساطة &lt;code&gt;aspire start&lt;/code&gt;. تنطلق جميع الموارد بالترتيب الصحيح، على المنافذ الصحيحة، بالإعداد الصحيح. العمليات طويلة الأمد لن تعلّق الوكيل أيضاً — Aspire يتولى إدارتها.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;الوضع المعزول للوكلاء المتوازية.&lt;/strong&gt; مع &lt;code&gt;--isolated&lt;/code&gt;، تحصل كل عملية تشغيل في Aspire على منافذ عشوائية خاصة بها وأسرار مستخدم منفصلة. هل لديك عدة وكلاء تعمل عبر worktrees مختلفة في Git؟ لن تتعارض. هذا أمر بالغ الأهمية لأدوات مثل وكلاء الخلفية في VS Code التي تُطلق بيئات متوازية.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;عيون الوكيل من خلال التتبع التشخيصي.&lt;/strong&gt; هنا يصبح الأمر قوياً حقاً. تكشف واجهة Aspire CLI عن بيانات OpenTelemetry كاملة أثناء التطوير — التتبعات، والمقاييس، والسجلات المنظّمة. لا يقتصر الوكيل على قراءة مخرجات وحدة التحكم وتأمّل الخير. يستطيع تتبّع طلب فاشل عبر الخدمات، وتحديد نقاط الاختناق في النقاط الطرفية البطيئة، وتحديد موضع الخلل بدقة. هذه إمكانية مراقبة بجودة الإنتاج في حلقة التطوير.&lt;/p&gt;
&lt;h2 id="تشبيه-حواجز-مضمار-البولينغ"&gt;تشبيه حواجز مضمار البولينغ&lt;/h2&gt;
&lt;p&gt;يستخدم فريق Aspire تشبيهاً رائعاً: فكّر في Aspire بوصفه حواجز مضمار البولينغ لوكلاء الذكاء الاصطناعي. إن لم يكن الوكيل مثالياً — وهو لن يكون — فالحواجز تمنعه من الانحراف نحو الحواف. تعريف المكدّس يمنع سوء الإعداد، والمصرِّف يلتقط الأخطاء، وواجهة CLI تتولى إدارة العمليات، والتتبع التشخيصي يُوفّر حلقة التغذية الراجعة.&lt;/p&gt;
&lt;p&gt;اقرن هذا بشيء مثل Playwright CLI، وسيتمكن وكيلك من &lt;em&gt;استخدام&lt;/em&gt; تطبيقك فعلاً — النقر خلال مسارات التدفق، وفحص DOM، ورؤية المشكلات في بيانات التتبع، وإصلاح الكود، وإعادة التشغيل، والاختبار مجدداً. بناء، تشغيل، مراقبة، إصلاح. هذه هي حلقة التطوير الذاتي التي كنا نسعى إليها.&lt;/p&gt;
&lt;h2 id="البدء"&gt;البدء&lt;/h2&gt;
&lt;p&gt;جديد على Aspire؟ ثبِّت واجهة CLI من &lt;a href="https://get.aspire.dev"&gt;get.aspire.dev&lt;/a&gt; واتبع &lt;a href="https://aspire.dev/get-started/first-app"&gt;دليل البدء السريع&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;تستخدم Aspire بالفعل؟ شغِّل &lt;code&gt;aspire update --self&lt;/code&gt; للحصول على الإصدار 13.2، ثم وجِّه وكيل البرمجة المفضّل لديك نحو مستودعك. قد تتفاجأ بمدى تقدّمه مع الحواجز الواقية التي يُوفّرها Aspire.&lt;/p&gt;
&lt;h2 id="خلاصة-القول"&gt;خلاصة القول&lt;/h2&gt;
&lt;p&gt;لم يعد Aspire 13.2 مجرد إطار للتطبيقات الموزّعة — إنه يتحوّل إلى بنية تحتية أساسية للوكلاء. تعريفات المكدّس المنظّمة، والإطلاق بأمر واحد، والتشغيل المتوازي المعزول، وبيانات التتبع التشخيصي في الوقت الفعلي، كل ذلك يمنح وكلاء الذكاء الاصطناعي تحديداً ما يحتاجونه للانتقال من كتابة الكود إلى شحن التطبيقات.&lt;/p&gt;
&lt;p&gt;اقرأ &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;المنشور الكامل&lt;/a&gt; من فريق Aspire للاطلاع على كل التفاصيل ومقاطع الفيديو التوضيحية.&lt;/p&gt;</content:encoded></item><item><title>الوضع المعزول في Aspire يحلّ كابوس تعارض المنافذ في التطوير المتوازي</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</guid><description>يُقدّم Aspire 13.2 وضع --isolated: منافذ عشوائية، وأسرار منفصلة، وانعدام كامل للتعارضات عند تشغيل نسخ متعددة من AppHost. مثالي للوكلاء والـ worktrees والسير المتوازية.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;إن سبق لك أن حاولت تشغيل نسختين من المشروع ذاته في الوقت نفسه، فأنت تعرف معاناة ذلك. المنفذ 8080 مشغول بالفعل. المنفذ 17370 محجوز. أوقف شيئاً، وأعد التشغيل، وتعامل مع متغيرات البيئة — إنه مُدمِّر للإنتاجية.&lt;/p&gt;
&lt;p&gt;هذه المشكلة تزداد سوءاً لا تحسّناً. وكلاء الذكاء الاصطناعي تُنشئ worktrees في Git للعمل بشكل مستقل. وكلاء الخلفية تُطلق بيئات منفصلة. المطورون يستنسخون المستودع ذاته مرتين لفروع الميزات. كل هذه السيناريوهات تصطدم بالحائط نفسه: نسختان من التطبيق ذاته تتصارعان على المنافذ ذاتها.&lt;/p&gt;
&lt;p&gt;يُعالج Aspire 13.2 هذا بخيار واحد. كتب James Newton-King من فريق Aspire &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;التفاصيل الكاملة&lt;/a&gt;، وهي إحدى تلك الميزات التي تجعلك تتساءل &amp;ldquo;لماذا لم يكن هذا موجوداً من قبل؟&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="الحل---isolated"&gt;الحل: &lt;code&gt;--isolated&lt;/code&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;هذا كل شيء. تحصل كل عملية تشغيل على:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;منافذ عشوائية&lt;/strong&gt; — لا مزيد من التعارضات بين النسخ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;أسرار مستخدم معزولة&lt;/strong&gt; — سلاسل الاتصال ومفاتيح API تبقى منفصلة لكل نسخة&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;لا إعادة تعيين يدوية للمنافذ. لا تعامل مع متغيرات البيئة. تحصل كل عملية تشغيل على بيئة نظيفة خالية من التعارضات تلقائياً.&lt;/p&gt;
&lt;h2 id="سيناريوهات-حقيقية-تبرز-فيها-هذه-الميزة"&gt;سيناريوهات حقيقية تبرز فيها هذه الميزة&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;نسخ متعددة.&lt;/strong&gt; لديك فرع ميزة في دليل ما وإصلاح خطأ في آخر:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# الطرفية 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-app-feature
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# الطرفية 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-app-bugfix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;يعمل كلاهما دون تعارضات. تُظهر لوحة التحكم ما يعمل وأين.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;وكلاء الخلفية في VS Code.&lt;/strong&gt; حين ينشئ وكيل الخلفية في Copilot Chat worktree في Git للعمل على كودك بشكل مستقل، قد يحتاج إلى تشغيل AppHost في Aspire. دون &lt;code&gt;--isolated&lt;/code&gt;، سيحدث تعارض في المنافذ مع worktree الرئيسية. معه، تعمل كلتا النسختين ببساطة.&lt;/p&gt;
&lt;p&gt;مهارة Aspire التي تشحن مع &lt;code&gt;aspire agent init&lt;/code&gt; تُوجّه الوكلاء تلقائياً لاستخدام &lt;code&gt;--isolated&lt;/code&gt; عند العمل في worktrees. لذا يجب أن يتعامل وكيل الخلفية في Copilot مع هذا مباشرةً.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;اختبارات التكامل جنباً إلى جنب مع التطوير.&lt;/strong&gt; تحتاج إلى تشغيل الاختبارات مقابل AppHost حيّ أثناء مواصلة بناء الميزات؟ الوضع المعزول يمنح كل سياق منافذه وإعداداته الخاصة.&lt;/p&gt;
&lt;h2 id="كيف-يعمل-داخليا"&gt;كيف يعمل داخلياً&lt;/h2&gt;
&lt;p&gt;حين تُمرّر &lt;code&gt;--isolated&lt;/code&gt;، تُولّد واجهة CLI مُعرِّفاً فريداً للنسخة. يُشغّل هذا سلوكين:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;عشوائية المنافذ&lt;/strong&gt; — بدلاً من الارتباط بمنافذ محددة مسبقاً في إعداد AppHost، يختار الوضع المعزول منافذ عشوائية متاحة لكل شيء — لوحة التحكم، ونقاط نهاية الخدمة، وكل ذلك. يتكيّف اكتشاف الخدمات تلقائياً، فتجد الخدمات بعضها بصرف النظر عن المنافذ المخصصة.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;عزل الأسرار&lt;/strong&gt; — تحصل كل نسخة معزولة على مخزن أسرار مستخدم خاص بها، مُفهرس بالمُعرِّف الفريد للنسخة. سلاسل الاتصال ومفاتيح API من نسخة ما لا تتسرّب إلى أخرى.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;لا يحتاج كودك إلى أي تغييرات. اكتشاف خدمات Aspire يحلّ نقاط النهاية في وقت التشغيل، لذا يتصل كل شيء بشكل صحيح بصرف النظر عن تعيين المنافذ.&lt;/p&gt;
&lt;h2 id="متى-تستخدمه"&gt;متى تستخدمه&lt;/h2&gt;
&lt;p&gt;استخدم &lt;code&gt;--isolated&lt;/code&gt; عند تشغيل نسخ متعددة من AppHost ذاته في الوقت نفسه — سواء كان ذلك تطويراً متوازياً، أو اختبارات آلية، أو وكلاء ذكاء اصطناعي، أو worktrees في Git. للتطوير بنسخة واحدة حيث تفضّل منافذ محددة، يظل &lt;code&gt;aspire run&lt;/code&gt; العادي يعمل بشكل جيد.&lt;/p&gt;
&lt;h2 id="خلاصة-القول"&gt;خلاصة القول&lt;/h2&gt;
&lt;p&gt;الوضع المعزول ميزة صغيرة تحلّ مشكلة حقيقية ومتزايدة الشيوع. مع دفع التطوير بمساعدة الذكاء الاصطناعي نحو سير عمل أكثر توازياً — وكلاء متعددة، وworktrees متعددة، وسياقات متعددة — أصبحت القدرة على تشغيل نسخة أخرى ببساطة دون التصارع على المنافذ أمراً ضرورياً.&lt;/p&gt;
&lt;p&gt;اقرأ &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;المنشور الكامل&lt;/a&gt; للاطلاع على جميع التفاصيل التقنية وجرّبه بـ &lt;code&gt;aspire update --self&lt;/code&gt; للحصول على الإصدار 13.2.&lt;/p&gt;</content:encoded></item><item><title>تطبيقات MCP تحصل على واجهة برمجة سلسة — أنشئ واجهات أدوات AI غنية في .NET بثلاث خطوات</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</guid><description>واجهة التهيئة السلسة الجديدة لتطبيقات MCP على Azure Functions تتيح لك تحويل أي أداة .NET MCP إلى تطبيق كامل بمشاهدات وصلاحيات وسياسات CSP في بضعة أسطر من الكود.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;أدوات MCP رائعة لمنح وكلاء الذكاء الاصطناعي قدرات. لكن ماذا لو احتاجت أداتك إلى عرض شيء للمستخدم — لوحة معلومات، أو نموذج، أو مرئيات تفاعلية؟ هنا يأتي دور تطبيقات MCP، وقد أصبح بناؤها أسهل بكثير للتوّ.&lt;/p&gt;
&lt;p&gt;Lilian Kasem من فريق Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;قدّمت واجهة التهيئة السلسة الجديدة&lt;/a&gt; لتطبيقات MCP على .NET Azure Functions، وهو نوع تحسين تجربة المطوّر الذي يجعلك تتساءل لماذا لم يكن الأمر بهذه البساطة دائماً.&lt;/p&gt;
&lt;h2 id="ما-هي-تطبيقات-mcp"&gt;ما هي تطبيقات MCP؟&lt;/h2&gt;
&lt;p&gt;تطبيقات MCP تُوسّع Model Context Protocol بالسماح للأدوات بحمل مشاهداتها UI الخاصة، والأصول الثابتة، وعناصر التحكم الأمني. بدلاً من إعادة نص فحسب، يمكن لأداة MCP الخاصة بك عرض تجارب HTML كاملة — لوحات معلومات تفاعلية، ومرئيات بيانات، ونماذج تهيئة — كلها قابلة للاستدعاء من وكلاء الذكاء الاصطناعي ومُقدَّمة للمستخدمين من قِبل عملاء MCP.&lt;/p&gt;
&lt;p&gt;كان الإشكال أن توصيل كل هذا يدوياً استلزم معرفة عميقة بمواصفات MCP: عناوين URI بصيغة &lt;code&gt;ui://&lt;/code&gt;، وأنواع MIME خاصة، وتنسيق البيانات الوصفية بين الأدوات والموارد. ليس صعباً، لكنه مُضجِر.&lt;/p&gt;
&lt;h2 id="واجهة-البرمجة-السلسة-في-ثلاث-خطوات"&gt;واجهة البرمجة السلسة في ثلاث خطوات&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;الخطوة 1: عرّف دالتك.&lt;/strong&gt; مجرد أداة Azure Functions MCP قياسية:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;[Function(nameof(HelloApp))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;HelloApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [McpToolTrigger(&amp;#34;HelloApp&amp;#34;, &amp;#34;A simple MCP App that says hello.&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ToolInvocationContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Hello from app&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;الخطوة 2: ارقِها إلى تطبيق MCP.&lt;/strong&gt; في بدء تشغيل برنامجك:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConfigureMcpTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;HelloApp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsMcpApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assets/hello-app.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello App&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithPermissions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpAppPermissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClipboardWrite&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;McpAppPermissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClipboardRead&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithCsp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csp&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;csp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllowBaseUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://www.microsoft.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConnectTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://www.microsoft.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;الخطوة 3: أضف مشهد HTML الخاص بك.&lt;/strong&gt; أنشئ &lt;code&gt;assets/hello-app.html&lt;/code&gt; بأي واجهة مستخدم تحتاجها.&lt;/p&gt;
&lt;p&gt;هذا كل شيء. واجهة البرمجة السلسة تتولى جميع التجهيزات الخاصة بمواصفات MCP — توليد دالة الموارد الاصطناعية، وضبط نوع MIME الصحيح، وحقن البيانات الوصفية التي تربط أداتك بمشهدها.&lt;/p&gt;
&lt;h2 id="سطح-واجهة-البرمجة-مصمم-جيدا"&gt;سطح واجهة البرمجة مصمَّم جيداً&lt;/h2&gt;
&lt;p&gt;بعض الأشياء التي أعجبتني حقاً:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;مصادر المشهد مرنة.&lt;/strong&gt; يمكنك تقديم HTML من ملفات على القرص، أو تضمين الموارد مباشرةً في التجميع للنشر الكامل المستقل:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpViewSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assets/my-view.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpViewSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromEmbeddedResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;MyApp.Resources.view.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;CSP قابل للتركيب.&lt;/strong&gt; تُدرج صراحةً المصادر الأصلية التي يحتاجها تطبيقك، متبعاً مبادئ الامتياز الأدنى. استدعِ &lt;code&gt;WithCsp&lt;/code&gt; عدة مرات وتتراكم المصادر:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithCsp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csp&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;csp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConnectTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://api.example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoadResourcesFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://cdn.example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllowFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://youtube.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;التحكم في الرؤية.&lt;/strong&gt; يمكنك جعل الأداة مرئية لـ LLM فقط، أو لواجهة المضيف فقط، أو لكليهما. تريد أداة تعرض واجهة المستخدم فقط ولا ينبغي للنموذج استدعاؤها؟ سهل:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithVisibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpVisibility&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// UI-only, hidden from the model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="البدء"&gt;البدء&lt;/h2&gt;
&lt;p&gt;أضف حزمة المعاينة:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Mcp --version 1.5.0-preview.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;إذا كنت تبني أدوات MCP مع Azure Functions بالفعل، فهذا مجرد تحديث حزمة. &lt;a href="https://learn.microsoft.com/azure/azure-functions/scenario-mcp-apps?tabs=bash%2Clinux&amp;amp;pivots=programming-language-csharp"&gt;دليل البدء السريع لتطبيقات MCP&lt;/a&gt; هو أفضل نقطة انطلاق إذا كنت جديداً على المفهوم.&lt;/p&gt;
&lt;h2 id="خلاصة"&gt;خلاصة&lt;/h2&gt;
&lt;p&gt;تطبيقات MCP من أكثر التطورات إثارةً في مساحة أدوات الذكاء الاصطناعي — أدوات لا تكتفي بـ &lt;em&gt;فعل الأشياء&lt;/em&gt; بل تستطيع &lt;em&gt;عرض الأشياء&lt;/em&gt; للمستخدمين. واجهة البرمجة السلسة تُزيل تعقيد البروتوكول وتتيح لك التركيز على ما يهمّ: منطق أداتك وواجهة مستخدمها.&lt;/p&gt;
&lt;p&gt;اقرأ &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;المنشور الكامل&lt;/a&gt; للمرجع الكامل لواجهة البرمجة والأمثلة.&lt;/p&gt;</content:encoded></item><item><title>تقييم التحديث من GitHub Copilot هو أفضل أداة ترحيل لا تستخدمها بعد</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/</guid><description>إضافة التحديث في GitHub Copilot لا تقترح تغييرات الكود فحسب — بل تُنتج تقييم ترحيل كاملًا مع مشكلات قابلة للتنفيذ ومقارنات لأهداف Azure وسير عمل تعاوني. إليك لماذا وثيقة التقييم هي مفتاح كل شيء.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ترحيل تطبيق .NET Framework قديم إلى .NET الحديث هو أحد تلك المهام التي يعلم الجميع أنه يجب القيام بها لكن لا أحد يريد البدء بها. إنها ليست مجرد &amp;ldquo;تغيير إطار العمل الهدف.&amp;rdquo; إنها واجهات API اختفت، وحزم لم تعد موجودة، ونماذج استضافة تعمل بشكل مختلف تمامًا، وملايين القرارات الصغيرة حول ما تضعه في حاوية، وما تُعيد كتابته، وما تتركه كما هو.&lt;/p&gt;
&lt;p&gt;نشر Jeffrey Fritz للتو &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;تعمقًا كاملًا في تقييم تحديث GitHub Copilot&lt;/a&gt;، وصراحةً؟ هذه أفضل أدوات الترحيل التي رأيتها لـ .NET. ليس بسبب توليد الكود — هذا أصبح أمرًا مفروغًا منه الآن. بل بسبب وثيقة التقييم التي تُنتجها.&lt;/p&gt;
&lt;h2 id="إنها-ليست-مجرد-محرك-اقتراحات-كود"&gt;إنها ليست مجرد محرك اقتراحات كود&lt;/h2&gt;
&lt;p&gt;تتبع إضافة VS Code نموذج &lt;strong&gt;تقييم ← تخطيط ← تنفيذ&lt;/strong&gt;. تُحلّل مرحلة التقييم قاعدة الكود بأكملها وتُنتج وثيقة منظمة تلتقط كل شيء: ما يحتاج إلى التغيير، وموارد Azure المراد توفيرها، ونموذج النشر المراد استخدامه. كل ما يلي — كود البنية التحتية، والحاويات، وبيانات النشر — ينبع مما يجده التقييم.&lt;/p&gt;
&lt;p&gt;يُخزَّن التقييم تحت &lt;code&gt;.github/modernize/assessment/&lt;/code&gt; في مشروعك. كل تشغيل يُنتج تقريرًا مستقلًا، لذا تبني سجلًا تاريخيًا ويمكنك تتبع كيف تتطور وضعية الترحيل لديك كلما أصلحت المشكلات.&lt;/p&gt;
&lt;h2 id="طريقتان-للبدء"&gt;طريقتان للبدء&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;التقييم الموصى به&lt;/strong&gt; — المسار السريع. اختر من بين المجالات المنسّقة (ترقية Java/.NET، جاهزية السحابة، الأمان) واحصل على نتائج ذات معنى دون لمس التكوين. رائع للنظرة الأولى على وضع تطبيقك.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;التقييم المخصص&lt;/strong&gt; — المسار المستهدف. قم بتكوين ما تريد تحليله بالضبط: الحوسبة المستهدفة (App Service، AKS، Container Apps)، نظام التشغيل المستهدف، تحليل الحاويات. اختر أهدافًا متعددة على Azure لمقارنة مناهج الترحيل جنبًا إلى جنب.&lt;/p&gt;
&lt;p&gt;عرض المقارنة مفيد حقًا. تطبيق به 3 مشكلات إلزامية لـ App Service قد يكون لديه 7 لـ AKS. رؤية كليهما يساعد في اتخاذ قرار الاستضافة قبل الالتزام بمسار الترحيل.&lt;/p&gt;
&lt;h2 id="تفصيل-المشكلات-قابل-للتنفيذ"&gt;تفصيل المشكلات قابل للتنفيذ&lt;/h2&gt;
&lt;p&gt;كل مشكلة تأتي بمستوى حرجية:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;إلزامية&lt;/strong&gt; — يجب إصلاحها وإلا يفشل الترحيل&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;محتملة&lt;/strong&gt; — قد تؤثر على الترحيل، تحتاج إلى حكم بشري&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;اختيارية&lt;/strong&gt; — تحسينات موصى بها، لن تعيق الترحيل&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;وكل مشكلة تربط بالملفات والأسطر المتأثرة، وتُقدم وصفًا تفصيليًا لما هو خاطئ ولماذا يهم ذلك للمنصة المستهدفة، وتُعطي خطوات معالجة ملموسة (ليس فقط &amp;ldquo;أصلح هذا&amp;rdquo;)، وتتضمن روابط للتوثيق الرسمي.&lt;/p&gt;
&lt;p&gt;يمكنك تسليم مشكلات فردية للمطورين وسيكون لديهم كل ما يحتاجون إليه للتصرف. هذا هو الفرق بين أداة تخبرك &amp;ldquo;هناك مشكلة&amp;rdquo; وأخرى تخبرك كيف تحلها.&lt;/p&gt;
&lt;h2 id="مسارات-الترقية-المدعومة"&gt;مسارات الترقية المدعومة&lt;/h2&gt;
&lt;p&gt;لـ .NET تحديدًا:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.NET Framework ← .NET 10&lt;/li&gt;
&lt;li&gt;ASP.NET ← ASP.NET Core&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;كل مسار ترقية له قواعد كشف تعرف أي واجهات API أُزيلت، وأي أنماط ليس لها مقابل مباشر، وما هي مشكلات الأمان التي تحتاج إلى اهتمام.&lt;/p&gt;
&lt;p&gt;بالنسبة للفرق التي تدير تطبيقات متعددة، هناك أيضًا واجهة سطر أوامر (CLI) تدعم تقييمات دفعية متعددة المستودعات — استنسخ جميع المستودعات، وقيّمها جميعًا، واحصل على تقارير لكل تطبيق بالإضافة إلى عرض تجميعي للمحفظة.&lt;/p&gt;
&lt;h2 id="رأيي"&gt;رأيي&lt;/h2&gt;
&lt;p&gt;إذا كنت تجلس على تطبيقات .NET Framework قديمة (ولنكن صريحين، معظم فرق المؤسسات كذلك)، فهذه &lt;em&gt;هي&lt;/em&gt; الأداة التي تبدأ بها. وثيقة التقييم وحدها تستحق الوقت — إنها تحوّل &amp;ldquo;يجب أن نحدّث&amp;rdquo; الغامضة إلى قائمة ملموسة ذات أولويات من بنود العمل مع مسارات واضحة للمضي قدمًا.&lt;/p&gt;
&lt;p&gt;سير العمل التعاوني ذكي أيضًا: صدّر التقييمات، وشاركها مع فريقك، واستوردها دون إعادة التشغيل. مراجعات المعمارية حيث صانعو القرار ليسوا من يشغّل الأدوات؟ مغطاة.&lt;/p&gt;
&lt;h2 id="خلاصة"&gt;خلاصة&lt;/h2&gt;
&lt;p&gt;يحوّل تقييم تحديث GitHub Copilot ترحيل .NET من مشروع مخيف وغير محدد إلى عملية منظمة وقابلة للتتبع. ابدأ بتقييم موصى به لترى وضعك، ثم استخدم التقييمات المخصصة لمقارنة أهداف Azure وبناء خطة الترحيل.&lt;/p&gt;
&lt;p&gt;اقرأ &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;الشرح التفصيلي الكامل&lt;/a&gt; واحصل على &lt;a href="https://aka.ms/ghcp-appmod/vscode-ext"&gt;إضافة VS Code&lt;/a&gt; لتجربتها على قاعدة الكود الخاصة بك.&lt;/p&gt;</content:encoded></item><item><title>ربط خوادم MCP على Azure Functions بوكلاء Foundry — إليك الطريقة</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</guid><description>أنشئ خادم MCP مرة واحدة، وانشره على Azure Functions، وربطه بوكلاء Microsoft Foundry مع المصادقة المناسبة. أدواتك تعمل في كل مكان — VS Code وCursor والآن وكلاء الذكاء الاصطناعي المؤسسي.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ثمة شيء أحبه في منظومة MCP البيئية: تبني خادمك مرة واحدة ويعمل في كل مكان. VS Code وVisual Studio وCursor وChatGPT — كل عميل MCP يستطيع اكتشاف أدواتك واستخدامها. الآن، تضيف Microsoft مستهلكاً جديداً إلى تلك القائمة: وكلاء Foundry.&lt;/p&gt;
&lt;p&gt;نشرت Lily Ma من فريق Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;دليلاً عملياً&lt;/a&gt; حول ربط خوادم MCP المنشورة على Azure Functions بوكلاء Microsoft Foundry. إذا كان لديك خادم MCP بالفعل، فهذا إضافة قيمة صافية — لا إعادة بناء مطلوبة.&lt;/p&gt;
&lt;h2 id="لماذا-هذا-التركيب-منطقي"&gt;لماذا هذا التركيب منطقي&lt;/h2&gt;
&lt;p&gt;يمنحك Azure Functions بنية تحتية قابلة للتوسع، ومصادقة مدمجة، وفوترة بدون خادم لاستضافة خوادم MCP. يمنحك Microsoft Foundry وكلاء ذكاء اصطناعي يستطيعون التفكير والتخطيط واتخاذ الإجراءات. ربط الاثنين يعني أن أدواتك المخصصة — الاستعلام عن قاعدة بيانات، أو استدعاء واجهة برمجية تجارية، أو تشغيل منطق التحقق — تصبح قدرات يستطيع وكلاء الذكاء الاصطناعي المؤسسي اكتشافها واستخدامها بصورة مستقلة.&lt;/p&gt;
&lt;p&gt;النقطة الجوهرية: خادم MCP الخاص بك يبقى كما هو. أنت تضيف Foundry فحسب كمستهلك إضافي. الأدوات ذاتها التي تعمل في إعداد VS Code الخاص بك تشغّل الآن وكيل ذكاء اصطناعي يتفاعل معه فريقك أو عملاؤك.&lt;/p&gt;
&lt;h2 id="خيارات-المصادقة"&gt;خيارات المصادقة&lt;/h2&gt;
&lt;p&gt;هنا تكمن القيمة الحقيقية للمقال. أربع طرق للمصادقة تبعاً لسيناريوك:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;الطريقة&lt;/th&gt;
&lt;th&gt;حالة الاستخدام&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;مبنية على مفتاح&lt;/strong&gt; (افتراضية)&lt;/td&gt;
&lt;td&gt;التطوير أو الخوادم التي لا تستخدم Entra auth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microsoft Entra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;الإنتاج مع الهويات المُدارة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OAuth identity passthrough&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;الإنتاج حيث يُصادق كل مستخدم بشكل فردي&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;بدون مصادقة&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;التطوير/الاختبار أو البيانات العامة فقط&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;للإنتاج، Entra Microsoft مع هوية الوكيل هي المسار الموصى به. OAuth identity passthrough مخصص للحالات التي يهمّ فيها سياق المستخدم — يطلب الوكيل من المستخدمين تسجيل الدخول، ويحمل كل طلب رمز المستخدم الخاص به.&lt;/p&gt;
&lt;h2 id="الإعداد"&gt;الإعداد&lt;/h2&gt;
&lt;p&gt;التدفق على مستوى عالٍ:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;انشر خادم MCP على Azure Functions&lt;/strong&gt; — نماذج متاحة لـ &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;.NET&lt;/a&gt; وPython وTypeScript وJava&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;فعّل مصادقة MCP المدمجة&lt;/strong&gt; في تطبيق الدالة الخاص بك&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;احصل على URL نقطة النهاية&lt;/strong&gt; — &lt;code&gt;https://&amp;lt;FUNCTION_APP_NAME&amp;gt;.azurewebsites.net/runtime/webhooks/mcp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;أضف خادم MCP كأداة في Foundry&lt;/strong&gt; — انتقل إلى وكيلك في البوابة، أضف أداة MCP جديدة، وأدخل نقطة النهاية وبيانات الاعتماد&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ثم اختبره في ملعب Agent Builder بإرسال موجّه يُشغّل إحدى أدواتك.&lt;/p&gt;
&lt;h2 id="رأيي"&gt;رأيي&lt;/h2&gt;
&lt;p&gt;قصة إمكانية التركيب هنا تزداد قوةً بشكل حقيقي. أنشئ خادم MCP مرة واحدة بـ .NET (أو Python أو TypeScript أو Java)، وانشره على Azure Functions، وكل عميل متوافق مع MCP يستطيع استخدامه — أدوات البرمجة، وتطبيقات الدردشة، والآن وكلاء الذكاء الاصطناعي المؤسسي. هذا نمط &amp;ldquo;اكتب مرة واحدة، استخدم في كل مكان&amp;rdquo; يعمل فعلاً.&lt;/p&gt;
&lt;p&gt;لمطوّري .NET تحديداً، &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;امتداد Azure Functions MCP&lt;/a&gt; يجعل هذا أمراً مباشراً. تعرّف على أدواتك كـ Azure Functions، وانشر، وستحصل على خادم MCP جاهز للإنتاج مع كل الأمان والتوسعية التي يوفرها Azure Functions.&lt;/p&gt;
&lt;h2 id="خلاصة"&gt;خلاصة&lt;/h2&gt;
&lt;p&gt;إذا كانت لديك أدوات MCP تعمل على Azure Functions، فإن ربطها بوكلاء Foundry هو مكسب سريع — أدواتك المخصصة تصبح قدرات ذكاء اصطناعي مؤسسية مع مصادقة مناسبة ودون تغييرات في كود الخادم.&lt;/p&gt;
&lt;p&gt;اقرأ &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;الدليل الكامل&lt;/a&gt; للحصول على تعليمات خطوة بخطوة لكل طريقة مصادقة، وراجع &lt;a href="https://learn.microsoft.com/azure/azure-functions/functions-mcp-foundry-tools?tabs=entra%2Cmcp-extension%2Cfoundry"&gt;الوثائق التفصيلية&lt;/a&gt; لإعدادات الإنتاج.&lt;/p&gt;</content:encoded></item><item><title>C# 15 يحصل على أنواع الاتحاد — وهي بالضبط ما كنا نطلبه</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/</guid><description>يُقدّم C# 15 الكلمة المفتاحية union — أنواع اتحاد مُميَّزة يُطبّقها المُحوِّل مع مطابقة أنماط شاملة. إليك شكلها ولماذا تهم وكيف تجربها اليوم.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;هذه هي الميزة التي كنت أنتظرها. يُقدّم C# 15 الكلمة المفتاحية &lt;code&gt;union&lt;/code&gt; — أنواع اتحاد مُميَّزة حقيقية مع مطابقة أنماط شاملة يُطبّقها المُحوِّل. إذا سبق لك أن حسدت F# على أنواع اتحادها المُميَّزة أو Rust على تعداداته، فأنت تعرف تمامًا لماذا يهم هذا.&lt;/p&gt;
&lt;p&gt;نشر Bill Wagner &lt;a href="https://devblogs.microsoft.com/dotnet/csharp-15-union-types/"&gt;التعمق الكامل&lt;/a&gt; على مدونة .NET، وصراحةً؟ التصميم نظيف وعملي ويتماشى تمامًا مع أسلوب C#. دعني أقودك عبر ما هو موجود فعليًا ولماذا هو أمر أكبر مما قد يبدو للوهلة الأولى.&lt;/p&gt;
&lt;h2 id="المشكلة-التي-تحلها-أنواع-الاتحاد"&gt;المشكلة التي تحلها أنواع الاتحاد&lt;/h2&gt;
&lt;p&gt;قبل C# 15، كانت إعادة &amp;ldquo;أحد الأنواع الممكنة المتعددة&amp;rdquo; من دالة دائمًا تنازلًا:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;object&lt;/code&gt;&lt;/strong&gt; — لا قيود، لا مساعدة من المُحوِّل، تحويل دفاعي في كل مكان&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;واجهات التمييز&lt;/strong&gt; — أفضل، لكن يمكن لأي شخص تنفيذها. لا يمكن للمُحوِّل أبدًا اعتبار المجموعة مكتملة&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الفئات الأساسية المجردة&lt;/strong&gt; — نفس المشكلة، بالإضافة إلى أن الأنواع تحتاج إلى سلف مشترك&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;لا شيء من هذه يمنحك ما تريده فعلًا: مجموعة مغلقة من الأنواع حيث يضمن المُحوِّل أنك تعاملت مع كل حالة. هذا ما تفعله أنواع الاتحاد.&lt;/p&gt;
&lt;h2 id="الصيغة-بسيطة-بشكل-جميل"&gt;الصيغة بسيطة بشكل جميل&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Cat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Bird&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;union&lt;/span&gt; &lt;span class="n"&gt;Pet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Cat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Bird&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;سطر واحد. يمكن لـ &lt;code&gt;Pet&lt;/code&gt; أن يحمل &lt;code&gt;Cat&lt;/code&gt; أو &lt;code&gt;Dog&lt;/code&gt; أو &lt;code&gt;Bird&lt;/code&gt;. تُولَّد التحويلات الضمنية تلقائيًا:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Pet&lt;/span&gt; &lt;span class="n"&gt;pet&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Rex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Dog { Name = Rex }&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;وهنا يكمن السحر — يُطبّق المُحوِّل المطابقة الشاملة:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pet&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Dog&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Cat&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Bird&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;لا حاجة لـ &lt;code&gt;_&lt;/code&gt; للتجاهل. يعلم المُحوِّل أن هذا التعبير يغطي كل حالة ممكنة. إذا أضفت لاحقًا نوعًا رابعًا إلى الاتحاد، فكل تعبير switch لا يتعامل معه يُنتج تحذيرًا. الحالات المفقودة تُكتشف في وقت البناء لا في وقت التشغيل.&lt;/p&gt;
&lt;h2 id="أين-يصبح-هذا-عمليا"&gt;أين يُصبح هذا عمليًا&lt;/h2&gt;
&lt;p&gt;مثال &lt;code&gt;Pet&lt;/code&gt; لطيف، لكن إليك أين تتألق الاتحادات فعلًا في الكود الحقيقي.&lt;/p&gt;
&lt;h3 id="استجابات-api-التي-تعيد-أشكالا-مختلفة"&gt;استجابات API التي تُعيد أشكالًا مختلفة&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;union&lt;/span&gt; &lt;span class="n"&gt;ApiResult&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ApiError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ValidationFailure&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;الآن كل مستهلك مُجبر على التعامل مع النجاح والخطأ وفشل التحقق. لا مزيد من أخطاء &amp;ldquo;نسيت التحقق من حالة الخطأ&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="قيمة-واحدة-أو-مجموعة"&gt;قيمة واحدة أو مجموعة&lt;/h3&gt;
&lt;p&gt;يُظهر نمط &lt;code&gt;OneOrMore&amp;lt;T&amp;gt;&lt;/code&gt; كيف يمكن لاتحادات أن تحتوي على جسم مع دوال مساعدة:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;union&lt;/span&gt; &lt;span class="n"&gt;OneOrMore&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;AsEnumerable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;single&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;single&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;multiple&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;multiple&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;المستدعون يمررون الشكل الذي يناسبهم:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;OneOrMore&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;dotnet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;OneOrMore&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;moreTags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;csharp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;unions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;preview&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsEnumerable&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$&amp;#34;[{tag}] &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// [dotnet]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="تكوين-أنواع-غير-مترابطة"&gt;تكوين أنواع غير مترابطة&lt;/h3&gt;
&lt;p&gt;هذه هي الميزة القاتلة على التسلسلات الهرمية التقليدية. يمكنك توحيد أنواع ليس بينها أي قاسم مشترك — &lt;code&gt;string&lt;/code&gt; و&lt;code&gt;Exception&lt;/code&gt;، &lt;code&gt;int&lt;/code&gt; و&lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;. لا حاجة لسلف مشترك.&lt;/p&gt;
&lt;h2 id="اتحادات-مخصصة-للمكتبات-الموجودة"&gt;اتحادات مخصصة للمكتبات الموجودة&lt;/h2&gt;
&lt;p&gt;إليك خيار تصميمي ذكي: أي فئة أو بنية بسمة &lt;code&gt;[Union]&lt;/code&gt; تُعترف بها كنوع اتحاد، طالما تتبع النمط الأساسي (مُنشئات عامة لأنواع الحالة وخاصية &lt;code&gt;Value&lt;/code&gt;). المكتبات مثل OneOf التي تُقدم بالفعل أنواعًا شبيهة بالاتحاد يمكنها الاشتراك في دعم المُحوِّل دون إعادة كتابة بنيتها الداخلية.&lt;/p&gt;
&lt;p&gt;بالنسبة للسيناريوهات الحساسة للأداء مع أنواع القيمة، يمكن للمكتبات تنفيذ نمط وصول غير ملاكم مع دوال &lt;code&gt;HasValue&lt;/code&gt; و&lt;code&gt;TryGetValue&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="الصورة-الأكبر"&gt;الصورة الأكبر&lt;/h2&gt;
&lt;p&gt;أنواع الاتحاد هي جزء من قصة شمولية أوسع قادمة إلى C#:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;أنواع الاتحاد&lt;/strong&gt; — مطابقة شاملة على مجموعة مغلقة من الأنواع (متاحة الآن في المعاينة)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;التسلسلات الهرمية المغلقة&lt;/strong&gt; — المُعدِّل &lt;code&gt;closed&lt;/code&gt; يمنع الفئات المشتقة خارج التجميع المُعرِّف (مقترح)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;التعدادات المغلقة&lt;/strong&gt; — تمنع إنشاء قيم بخلاف الأعضاء المُعلَّن عنهم (مقترح)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;معًا، ستمنح هذه الميزات الثلاث C# أحد أنظمة مطابقة الأنماط الآمنة للنوع الأكثر شمولًا في أي لغة رئيسية.&lt;/p&gt;
&lt;h2 id="جربها-اليوم"&gt;جرّبها اليوم&lt;/h2&gt;
&lt;p&gt;أنواع الاتحاد متاحة في .NET 11 Preview 2:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ثبّت &lt;a href="https://dotnet.microsoft.com/download/dotnet"&gt;.NET 11 Preview SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;استهدف &lt;code&gt;net11.0&lt;/code&gt; في مشروعك&lt;/li&gt;
&lt;li&gt;اضبط &lt;code&gt;&amp;lt;LangVersion&amp;gt;preview&amp;lt;/LangVersion&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;تحفظ واحد: في Preview 2، ستحتاج إلى تعريف &lt;code&gt;UnionAttribute&lt;/code&gt; و&lt;code&gt;IUnion&lt;/code&gt; في مشروعك لأنهما ليسا في وقت التشغيل بعد. احصل على &lt;a href="https://github.com/dotnet/docs/blob/e68b5dd1e557b53c45ca43e61b013bc919619fb9/docs/csharp/language-reference/builtin-types/snippets/unions/RuntimePolyfill.cs"&gt;RuntimePolyfill.cs&lt;/a&gt; من مستودع المستندات، أو أضف هذا:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;System.Runtime.CompilerServices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; AllowMultiple = false)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UnionAttribute&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Attribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IUnion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;object?&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="خلاصة"&gt;خلاصة&lt;/h2&gt;
&lt;p&gt;أنواع الاتحاد هي إحدى تلك الميزات التي تجعلك تتساءل كيف اجتزنا بدونها. مطابقة شاملة يُطبّقها المُحوِّل، وصيغة نظيفة، ودعم للأنماط العامة، وتكامل مع مطابقة الأنماط الموجودة — إنها كل ما كنا نطلبه، منجزًا بأسلوب C#.&lt;/p&gt;
&lt;p&gt;جرّبها في .NET 11 Preview 2، اختبر حدودها، و&lt;a href="https://github.com/dotnet/csharplang/discussions/9663"&gt;شارك ملاحظاتك على GitHub&lt;/a&gt;. هذه نسخة معاينة، وفريق C# يستمع بنشاط. حالاتك الحدية وملاحظاتك التصميمية ستشكّل الإصدار النهائي.&lt;/p&gt;
&lt;p&gt;للمرجع الكامل للغة، راجع &lt;a href="https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/union"&gt;مستندات أنواع الاتحاد&lt;/a&gt; و&lt;a href="https://learn.microsoft.com/dotnet/csharp/language-reference/proposals/unions"&gt;مواصفات الميزة&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 يُقدّم CLI للوثائق — ويمكن لوكيل الذكاء الاصطناعي استخدامه أيضاً</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</guid><description>يُضيف .NET Aspire 13.2 أمر aspire docs — واجهة CLI للبحث عن الوثائق الرسمية وتصفّحها وقراءتها دون مغادرة الطرفية. كما يعمل أداةً لوكلاء الذكاء الاصطناعي. إليك سبب أهميّته.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-docs-cli-ai-skills/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;هل تعرف تلك اللحظة التي تكون فيها غارقاً في AppHost في Aspire، تربط التكاملات ببعضها، ثم تحتاج إلى التحقق من المعاملات التي يتوقعها تكامل Redis بالضبط؟ تنتقل إلى المتصفح، وتبحث في aspire.dev، وتُحدّق في وثائق الواجهة البرمجية، ثم تعود إلى محررك. السياق ضائع. الإيقاع مقطوع.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/aspire/aspire-docs-in-your-terminal/"&gt;وصل حلٌّ لهذا&lt;/a&gt; في Aspire 13.2. تتيح لك واجهة &lt;code&gt;aspire docs&lt;/code&gt; CLI البحث عن الوثائق الرسمية لـ Aspire وتصفّحها وقراءتها مباشرةً من طرفيّتك. وبما أنها مدعومة بخدمات قابلة لإعادة الاستخدام، يمكن لوكلاء الذكاء الاصطناعي والمهارات استخدام الأوامر ذاتها للبحث في الوثائق بدلاً من ابتكار واجهات برمجية غير موجودة.&lt;/p&gt;
&lt;h2 id="المشكلة-التي-يحلها-فعلا"&gt;المشكلة التي يحلّها فعلاً&lt;/h2&gt;
&lt;p&gt;يُصيب David Pine كبد الحقيقة في منشوره الأصلي: كانت وكلاء الذكاء الاصطناعي &lt;em&gt;سيئة للغاية&lt;/em&gt; في مساعدة المطورين على بناء تطبيقات Aspire. كانت توصي بـ &lt;code&gt;dotnet run&lt;/code&gt; عوضاً عن &lt;code&gt;aspire run&lt;/code&gt;، وتُحيل إلى learn.microsoft.com للوثائق التي تعيش على aspire.dev، وتقترح حزم NuGet قديمة، وابتكار واجهات برمجية غير موجودة — وهذه أكثر ما يزعجني.&lt;/p&gt;
&lt;p&gt;لماذا؟ لأن Aspire كان مخصصاً لـ .NET فقط لفترة أطول مما كونه متعدد اللغات، وتعمل نماذج اللغة الكبيرة من بيانات تدريب سابقة للميزات الأحدث. حين تمنح وكيل الذكاء الاصطناعي القدرة على البحث الفعلي في الوثائق الحالية، يتوقف عن التخمين ويبدأ في أن يكون مفيداً.&lt;/p&gt;
&lt;h2 id="ثلاثة-أوامر-صفر-تبويبات-في-المتصفح"&gt;ثلاثة أوامر، صفر تبويبات في المتصفح&lt;/h2&gt;
&lt;p&gt;الواجهة بسيطة بشكل منعش:&lt;/p&gt;
&lt;h3 id="عرض-قائمة-بجميع-الوثائق"&gt;عرض قائمة بجميع الوثائق&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;يُعيد كل صفحة وثائق متاحة على aspire.dev. تحتاج مخرجات قابلة للقراءة آلياً؟ أضف &lt;code&gt;--format Json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="البحث-عن-موضوع"&gt;البحث عن موضوع&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;يبحث في العناوين والمحتوى مع ترتيب النتائج حسب الصلة. نفس محرك البحث الذي يُشغّل أدوات التوثيق داخلياً. تحصل على نتائج مرتّبة مع العناوين، والمسارات المختصرة، ودرجات الصلة.&lt;/p&gt;
&lt;h3 id="قراءة-صفحة-كاملة-أو-قسم-واحد-فقط"&gt;قراءة صفحة كاملة (أو قسم واحد فقط)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;يبثّ الصفحة كاملةً بتنسيق Markdown إلى طرفيّتك. تحتاج قسماً واحداً فقط؟&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration --section &lt;span class="s2"&gt;&amp;#34;Add Redis resource&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;دقة جراحية. لا تمرير عبر 500 سطر. فقط الجزء الذي تحتاجه.&lt;/p&gt;
&lt;h2 id="زاوية-وكيل-الذكاء-الاصطناعي"&gt;زاوية وكيل الذكاء الاصطناعي&lt;/h2&gt;
&lt;p&gt;هنا يصبح الأمر مثيراً للاهتمام للمطورين الذين يبنون بأدوات الذكاء الاصطناعي. تعمل أوامر &lt;code&gt;aspire docs&lt;/code&gt; ذاتها أدواتٍ لوكلاء الذكاء الاصطناعي — عبر المهارات، وخوادم MCP، أو مجمّعات CLI البسيطة.&lt;/p&gt;
&lt;p&gt;بدلاً من أن يخترع مساعد الذكاء الاصطناعي واجهات Aspire البرمجية بناءً على بيانات تدريب قديمة، يمكنه استدعاء &lt;code&gt;aspire docs search &amp;quot;postgres&amp;quot;&lt;/code&gt;، والعثور على وثائق التكامل الرسمية، وقراءة الصفحة المناسبة، وتزويدك بالنهج الموثّق. توثيق حيّ ومحدَّث — لا ما حفظه النموذج قبل ستة أشهر.&lt;/p&gt;
&lt;p&gt;البنية التحتية وراء هذا مقصودة. بنى فريق Aspire خدمات قابلة لإعادة الاستخدام (&lt;code&gt;IDocsIndexService&lt;/code&gt;، &lt;code&gt;IDocsSearchService&lt;/code&gt;، &lt;code&gt;IDocsFetcher&lt;/code&gt;، &lt;code&gt;IDocsCache&lt;/code&gt;) بدلاً من تكامل وحيد الغرض. هذا يعني أن محرك البحث ذاته يعمل للبشر في الطرفية، ولوكلاء الذكاء الاصطناعي في محررك، وللأتمتة في خط أنابيب CI.&lt;/p&gt;
&lt;h2 id="سيناريوهات-واقعية"&gt;سيناريوهات واقعية&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;بحث سريع في الطرفية:&lt;/strong&gt; أنت في عمق ثلاثة ملفات وتحتاج معاملات إعداد Redis. أمران، تسعون ثانية، والعودة إلى العمل:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt; --limit &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration --section &lt;span class="s2"&gt;&amp;#34;Configuration&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;التطوير بمساعدة الذكاء الاصطناعي:&lt;/strong&gt; مهارة VS Code الخاصة بك تُجمّع أوامر CLI. تسأل &amp;ldquo;أضف قاعدة بيانات PostgreSQL إلى AppHost&amp;rdquo; فيبحث الوكيل في الوثائق الحقيقية قبل الإجابة. لا ابتكار واجهات وهمية.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;التحقق في CI/CD:&lt;/strong&gt; يتحقق خط أنابيبك من إعدادات AppHost مقابل الوثائق الرسمية برمجياً. مخرجات &lt;code&gt;--format Json&lt;/code&gt; تنساب بسلاسة إلى &lt;code&gt;jq&lt;/code&gt; وأدوات أخرى.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;قواعد معرفة مخصصة:&lt;/strong&gt; هل تبني أدوات ذكاء اصطناعي خاصة بك؟ أرسل مخرجات JSON المنظّمة مباشرةً إلى قاعدة معرفتك:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;monitoring&amp;#34;&lt;/span&gt; --format Json &lt;span class="p"&gt;|&lt;/span&gt; jq &lt;span class="s1"&gt;&amp;#39;[.[] | {slug, title, summary}]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;لا استخلاص من الويب. لا مفاتيح API. نفس البيانات المنظّمة التي تستخدمها أدوات التوثيق داخلياً.&lt;/p&gt;
&lt;h2 id="الوثائق-دائما-حية"&gt;الوثائق دائماً حيّة&lt;/h2&gt;
&lt;p&gt;هذا هو الجانب الذي أقدّره أكثر من غيره. لا تُنزّل واجهة CLI لقطة ثابتة — بل تستعلم من aspire.dev مع تخزين مؤقت يستند إلى ETag. في اللحظة التي تتحدث فيها الوثائق، تعكس واجهتك وأي مهارة مبنية عليها ذلك التحديث. لا نسخ قديمة، لا لحظات &amp;ldquo;لكن الويكي قال&amp;hellip;&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="خلاصة-القول"&gt;خلاصة القول&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;aspire docs&lt;/code&gt; هي إحدى تلك الميزات الصغيرة التي تحلّ مشكلة حقيقية بنظافة. البشر يحصلون على وصول للوثائق من الطرفية مباشرةً. وكلاء الذكاء الاصطناعي يحصلون على طريقة للتوقف عن التخمين والبدء في الرجوع إلى الوثائق الفعلية. وكل ذلك مدعوم بمصدر حقيقة واحد.&lt;/p&gt;
&lt;p&gt;إذا كنت تبني بـ .NET Aspire ولم تجرب واجهة CLI بعد، شغِّل &lt;code&gt;aspire docs search &amp;quot;your-topic-here&amp;quot;&lt;/code&gt; وتحقق من شعورك. ثم فكّر في تغليف تلك الأوامر في أي مهارة ذكاء اصطناعي أو إعداد أتمتة تستخدمه — وكلاؤك سيشكرونك.&lt;/p&gt;
&lt;p&gt;اطّلع على &lt;a href="https://davidpine.dev/posts/aspire-docs-mcp-tools/"&gt;تحليل David Pine المعمّق&lt;/a&gt; حول كيفية تطور أدوات التوثيق، و&lt;a href="https://aspire.dev/reference/cli/commands/aspire-docs/"&gt;مرجع CLI الرسمي&lt;/a&gt; للاطلاع على كل التفاصيل.&lt;/p&gt;</content:encoded></item><item><title>إطار عمل Microsoft Agent يصل إلى الإصدار 1.0 — إليك ما يهمّ فعلاً لمطوّري .NET</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/</guid><description>إطار عمل Microsoft Agent 1.0 جاهز للإنتاج مع واجهات برمجية مستقرة، وتنسيق متعدد الوكلاء، وموصلات لكل مزوّد ذكاء اصطناعي رئيسي. إليك ما تحتاج معرفته كمطوّر .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/agent-framework-1-0-production-ready/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;إذا كنت تتابع رحلة Agent Framework منذ أيام Semantic Kernel وAutoGen الأولى، فهذا الخبر مهمّ. وصل Microsoft Agent Framework للتو إلى &lt;a href="https://devblogs.microsoft.com/agent-framework/microsoft-agent-framework-version-1-0/"&gt;الإصدار 1.0&lt;/a&gt; — جاهز للإنتاج، مع واجهات برمجية مستقرة، والتزام بالدعم طويل الأمد. متاح لكلٍّ من .NET وPython، وهو مستعد فعلاً للأعباء الحقيقية.&lt;/p&gt;
&lt;p&gt;دعني أتجاوز ضجيج الإعلان وأركّز على ما يهمّ إذا كنت تبني تطبيقات مدعومة بالذكاء الاصطناعي باستخدام .NET.&lt;/p&gt;
&lt;h2 id="الملخص-السريع"&gt;الملخص السريع&lt;/h2&gt;
&lt;p&gt;يوحّد Agent Framework 1.0 ما كان يُعرف بـ Semantic Kernel وAutoGen في حزمة تطوير واحدة مفتوحة المصدر. تجريد وكيل واحد. محرك تنسيق واحد. مزوّدو ذكاء اصطناعي متعددون. إذا كنت تتنقل بين Semantic Kernel لأنماط المؤسسات وAutoGen لمهام سير العمل متعددة الوكلاء على مستوى البحث، يمكنك التوقف عن ذلك. هذه هي الحزمة الواحدة الآن.&lt;/p&gt;
&lt;h2 id="البدء-سهل-بشكل-غير-عادل"&gt;البدء سهل بشكل غير عادل&lt;/h2&gt;
&lt;p&gt;إليك وكيل عملي في .NET:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// dotnet add package Microsoft.Agents.AI.OpenAI --prerelease&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI.Foundry&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Azure.Identity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;https://your-project.services.ai.azure.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetResponsesClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gpt-5.3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;HaikuBot&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are an upbeat assistant that writes beautifully.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Write a haiku about shipping 1.0.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;هذا كل شيء. بضعة أسطر وأمامك وكيل ذكاء اصطناعي يعمل على Azure Foundry. المكافئ في Python موجز بالقدر نفسه. أضف أدوات الدوال، والمحادثات متعددة الأدوار، والبث التدريجي كما تشاء — سطح الواجهة البرمجية يتوسع دون أن يصبح معقداً.&lt;/p&gt;
&lt;h2 id="تنسيق-متعدد-الوكلاء--هذا-هو-الأمر-الحقيقي"&gt;تنسيق متعدد الوكلاء — هذا هو الأمر الحقيقي&lt;/h2&gt;
&lt;p&gt;الوكلاء الفرديون مناسبون للعروض التوضيحية، لكن سيناريوهات الإنتاج عادةً ما تحتاج إلى تنسيق. يأتي Agent Framework 1.0 مزوّداً بأنماط تنسيق مجرّبة مباشرةً من Microsoft Research وAutoGen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;التسلسلي&lt;/strong&gt; — يعالج الوكلاء بالترتيب (كاتب ← مراجع ← محرر)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;المتزامن&lt;/strong&gt; — توزيع على وكلاء متعددين بالتوازي، وتجميع النتائج&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;التسليم&lt;/strong&gt; — يفوّض وكيل إلى آخر بناءً على النية&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;المحادثة الجماعية&lt;/strong&gt; — يناقش وكلاء متعددون ويتقاربون على حل&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magentic-One&lt;/strong&gt; — نمط متعدد الوكلاء على مستوى البحث من MSR&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;جميعها تدعم البث، ونقاط التفتيش، وموافقات الإنسان في الحلقة، والإيقاف المؤقت/الاستئناف. جزء نقاط التفتيش بالغ الأهمية — تتيح لمهام سير العمل الطويلة الأمد الصمود في وجه إعادة تشغيل العمليات. لنا نحن مطوّري .NET الذين بنينا مهام سير عمل دائمة مع Azure Functions، يبدو هذا مألوفاً.&lt;/p&gt;
&lt;h2 id="الميزات-الأكثر-أهمية"&gt;الميزات الأكثر أهمية&lt;/h2&gt;
&lt;p&gt;إليك قائمتي المختصرة بما يستحق المعرفة:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;خطّافات البرمجيات الوسيطة.&lt;/strong&gt; تعرف كيف يمتلك ASP.NET Core مسارات برمجيات وسيطة؟ المفهوم نفسه، لكن لتنفيذ الوكيل. اعترض كل مرحلة — أضف سلامة المحتوى، والتسجيل، وسياسات الامتثال — دون لمس نصوص الوكيل التوجيهية. هذه هي الطريقة التي تجعل الوكلاء جاهزين للمؤسسات.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;الذاكرة القابلة للتوصيل.&lt;/strong&gt; سجل المحادثة، وحالة المفتاح-القيمة الدائمة، والاسترجاع القائم على المتجهات. اختر خلفيتك: Foundry Agent Service، أو Mem0، أو Redis، أو Neo4j، أو أنشئ واحدة خاصة بك. الذاكرة هي ما يحوّل استدعاء نموذج لغوي عديم الحالة إلى وكيل يتذكر السياق فعلاً.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;وكلاء YAML التعريفيون.&lt;/strong&gt; عرّف تعليمات وكيلك وأدواته وذاكرته وطوبولوجيا التنسيق في ملفات YAML خاضعة للتحكم بالإصدار. حمّل وشغّل باستدعاء واجهة برمجية واحدة. هذا تغيير جذري للفرق التي تريد التكرار على سلوك الوكيل دون إعادة نشر الكود.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;دعم A2A وMCP.&lt;/strong&gt; يتيح MCP (Model Context Protocol) للوكلاء اكتشاف الأدوات الخارجية واستدعاءها ديناميكياً. يُمكّن A2A (بروتوكول الوكيل-إلى-الوكيل) التعاون عبر أوقات التشغيل — يمكن لوكلاء .NET التنسيق مع وكلاء يعملون في أطر عمل أخرى. دعم A2A 1.0 قادم قريباً.&lt;/p&gt;
&lt;h2 id="ميزات-المعاينة-التي-تستحق-المتابعة"&gt;ميزات المعاينة التي تستحق المتابعة&lt;/h2&gt;
&lt;p&gt;شُحنت بعض الميزات كمعاينة في 1.0 — وظيفية لكن الواجهات البرمجية قد تتطور:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DevUI&lt;/strong&gt; — مصحّح أخطاء محلي يعمل بالمتصفح لتصوير تنفيذ الوكيل وتدفقات الرسائل واستدعاءات الأدوات في الوقت الفعلي. فكّر في الأمر كـ Application Insights لكن للتفكير الوكيلي.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot SDK وClaude Code SDK&lt;/strong&gt; — استخدم Copilot أو Claude كإطار وكيل مباشرةً من كود التنسيق. ضع معاً وكيلاً قادراً على البرمجة إلى جانب وكلائك الأخرى في نفس سير العمل.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Harness&lt;/strong&gt; — بيئة تشغيل محلية قابلة للتخصيص تمنح الوكلاء الوصول إلى الصدفة ونظام الملفات وحلقات المراسلة. فكّر في وكلاء البرمجة وأنماط الأتمتة.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;المهارات (Skills)&lt;/strong&gt; — حزم قدرات نطاق قابلة لإعادة الاستخدام تمنح الوكلاء قدرات منظمة جاهزة.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="الترحيل-من-semantic-kernel-أو-autogen"&gt;الترحيل من Semantic Kernel أو AutoGen&lt;/h2&gt;
&lt;p&gt;إذا كان لديك كود Semantic Kernel أو AutoGen حالي، فهناك مساعدو ترحيل مخصصون يحللون كودك ويولّدون خطط ترحيل خطوة بخطوة. يرشدك &lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-semantic-kernel"&gt;دليل ترحيل Semantic Kernel&lt;/a&gt; و&lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-autogen"&gt;دليل ترحيل AutoGen&lt;/a&gt; عبر كل شيء.&lt;/p&gt;
&lt;p&gt;إذا كنت على حزم RC، فالترقية إلى 1.0 مجرد رفع رقم الإصدار.&lt;/p&gt;
&lt;h2 id="خلاصة-القول"&gt;خلاصة القول&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 هو المعلم الإنتاجي الذي كانت فرق المؤسسات تنتظره. واجهات برمجية مستقرة، ودعم متعدد المزوّدين، وأنماط تنسيق تعمل فعلاً على نطاق واسع، ومسارات ترحيل من كلٍّ من Semantic Kernel وAutoGen.&lt;/p&gt;
&lt;p&gt;الإطار &lt;a href="https://github.com/microsoft/agent-framework"&gt;مفتوح المصدر بالكامل على GitHub&lt;/a&gt;، ويمكنك البدء اليوم بـ &lt;code&gt;dotnet add package Microsoft.Agents.AI&lt;/code&gt;. اطّلع على &lt;a href="https://learn.microsoft.com/en-us/agent-framework/get-started/"&gt;دليل البدء السريع&lt;/a&gt; و&lt;a href="https://github.com/microsoft/agent-framework"&gt;الأمثلة&lt;/a&gt; للبدء عملياً.&lt;/p&gt;
&lt;p&gt;إذا كنت تنتظر إشارة &amp;ldquo;آمن للاستخدام في الإنتاج&amp;rdquo; — فهذه هي.&lt;/p&gt;</content:encoded></item><item><title>azd يتيح الآن تشغيل وكلاء الذكاء الاصطناعي وتصحيح أخطائها محلياً — إليك ما تغيّر في مارس 2026</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</guid><description>شحنت واجهة Azure Developer CLI سبعة إصدارات في مارس 2026. أبرزها: حلقة تشغيل وتصحيح محلية لوكلاء الذكاء الاصطناعي، وتكامل GitHub Copilot في إعداد المشاريع، ودعم Container App Jobs.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;سبعة إصدارات في شهر واحد. هذا ما دفعه فريق Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) في مارس 2026، والميزة الرئيسية هي التي كنت أنتظرها: &lt;strong&gt;حلقة تشغيل وتصحيح محلية لوكلاء الذكاء الاصطناعي&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;نشر PC Chan &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;الملخص الكامل&lt;/a&gt;، ومع أن المحتوى غزير، دعني أُصفّيه إلى ما يهم فعلاً مطوّري .NET الذين يبنون تطبيقات مدعومة بالذكاء الاصطناعي.&lt;/p&gt;
&lt;h2 id="تشغيل-وكلاء-الذكاء-الاصطناعي-وتصحيح-أخطائها-دون-نشر"&gt;تشغيل وكلاء الذكاء الاصطناعي وتصحيح أخطائها دون نشر&lt;/h2&gt;
&lt;p&gt;هذه هي الكبرى. تُضيف إضافة &lt;code&gt;azure.ai.agents&lt;/code&gt; الجديدة مجموعة من الأوامر التي توفّر لك تجربة حلقة داخلية حقيقية لوكلاء الذكاء الاصطناعي:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;azd ai agent run&lt;/code&gt; — يُشغّل وكيلك محلياً&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt; — يُرسل رسائل إليه (محلياً أو بعد النشر)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent show&lt;/code&gt; — يعرض حالة الحاوية وسلامتها&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt; — يبثّ سجلات الحاوية في الوقت الفعلي&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;قبل هذا، كان اختبار وكيل ذكاء اصطناعي يعني النشر إلى Microsoft Foundry في كل مرة تُجري فيها تغييراً. الآن يمكنك التكرار محلياً، واختبار سلوك وكيلك، والنشر فقط حين تكون مستعداً. إن كنت تبني وكلاء باستخدام Microsoft Agent Framework أو Semantic Kernel، فهذا يُغيّر سير عملك اليومي.&lt;/p&gt;
&lt;p&gt;يعمل أمر invoke مقابل الوكلاء المحليين والمنشورين على حدٍّ سواء، مما يعني أنك تستطيع استخدام سير عمل الاختبار ذاته بصرف النظر عن مكان تشغيل الوكيل. هذا هو النوع من التفاصيل التي تُوفّر عليك الحاجة إلى صيانة مجموعتين من نصوص الاختبار.&lt;/p&gt;
&lt;h2 id="github-copilot-ينشئ-السقالات-لمشروع-azd-الخاص-بك"&gt;GitHub Copilot يُنشئ السقالات لمشروع azd الخاص بك&lt;/h2&gt;
&lt;p&gt;بات &lt;code&gt;azd init&lt;/code&gt; يُقدّم خياراً &amp;ldquo;إعداد مع GitHub Copilot (معاينة)&amp;rdquo;. بدلاً من الإجابة يدوياً على الأسئلة حول بنية مشروعك، يُهيّئ وكيل Copilot الإعداد نيابةً عنك. يتحقق من وجود دليل عمل غير نظيف قبل تعديل أي شيء، ويطلب موافقة على أدوات خادم MCP مسبقاً.&lt;/p&gt;
&lt;p&gt;حين يفشل أمر ما، يُقدّم &lt;code&gt;azd&lt;/code&gt; الآن استكشاف أخطاء بمساعدة الذكاء الاصطناعي: اختر فئة (شرح، توجيه، استكشاف أخطاء، أو تخطّي)، ودع الوكيل يقترح حلاً، ثم أعد المحاولة — كل ذلك دون مغادرة الطرفية. لإعدادات البنية التحتية المعقدة، هذا توفير حقيقي للوقت.&lt;/p&gt;
&lt;h2 id="container-app-jobs-وتحسينات-النشر"&gt;Container App Jobs وتحسينات النشر&lt;/h2&gt;
&lt;p&gt;بعض ميزات النشر الجديرة بالإشارة:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Container App Jobs&lt;/strong&gt;: يُنشر &lt;code&gt;azd&lt;/code&gt; الآن &lt;code&gt;Microsoft.App/jobs&lt;/code&gt; من خلال إعداد &lt;code&gt;host: containerapp&lt;/code&gt; الموجود. يُحدّد قالب Bicep الخاص بك ما إذا كان الهدف Container App أم Job — لا إعداد إضافي.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;مهل نشر قابلة للتهيئة&lt;/strong&gt;: خيار &lt;code&gt;--timeout&lt;/code&gt; الجديد في &lt;code&gt;azd deploy&lt;/code&gt; وحقل &lt;code&gt;deployTimeout&lt;/code&gt; في &lt;code&gt;azure.yaml&lt;/code&gt;. لا مزيد من التخمين حول الحد الافتراضي البالغ 1200 ثانية.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;احتياطي البناء المحلي&lt;/strong&gt;: حين يفشل البناء عن بُعد في ACR، ينتقل &lt;code&gt;azd&lt;/code&gt; تلقائياً إلى البناء المحلي باستخدام Docker/Podman.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;التحقق المحلي المسبق للنشر&lt;/strong&gt;: يتم التحقق من معاملات Bicep محلياً قبل النشر، مما يكتشف المعاملات المفقودة دون رحلة ذهاب وإياب إلى Azure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="تحسينات-تجربة-المطور"&gt;تحسينات تجربة المطوّر&lt;/h2&gt;
&lt;p&gt;بعض التحسينات الأصغر التي تتراكم لتُحدث فارقاً:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;الكشف التلقائي عن pnpm/yarn&lt;/strong&gt; لمشاريع JS/TS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;دعم pyproject.toml&lt;/strong&gt; لتعبئة Python&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;أدلة قوالب محلية&lt;/strong&gt; — يقبل &lt;code&gt;azd init --template&lt;/code&gt; الآن مسارات نظام الملفات للتكرار دون اتصال&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;رسائل خطأ أفضل&lt;/strong&gt; في وضع &lt;code&gt;--no-prompt&lt;/code&gt; — تُبلَّغ جميع القيم المفقودة دفعة واحدة مع أوامر الحل&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;متغيرات بيئة البناء&lt;/strong&gt; مُحقونة في جميع العمليات الفرعية لبناء الأطر (.NET، Node.js، Java، Python)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;هذه الأخيرة دقيقة لكنها مهمة: بناء .NET الخاص بك لديه الآن وصول إلى متغيرات بيئة &lt;code&gt;azd&lt;/code&gt;، مما يعني أنك تستطيع إجراء حقن إعداد وقت البناء دون نصوص إضافية.&lt;/p&gt;
&lt;h2 id="خلاصة-القول"&gt;خلاصة القول&lt;/h2&gt;
&lt;p&gt;حلقة تصحيح أخطاء وكيل الذكاء الاصطناعي المحلية هي نجمة هذا الإصدار، لكن تراكم تحسينات النشر وصقل تجربة المطوّر يجعل &lt;code&gt;azd&lt;/code&gt; يبدو أكثر نضجاً من أي وقت مضى. إن كنت تنشر تطبيقات .NET إلى Azure — خاصةً وكلاء الذكاء الاصطناعي — فهذا التحديث يستحق التثبيت.&lt;/p&gt;
&lt;p&gt;تحقق من &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;ملاحظات الإصدار الكاملة&lt;/a&gt; لكل التفاصيل، أو ابدأ بـ &lt;a href="https://learn.microsoft.com/azure/developer/azure-developer-cli/install-azd"&gt;تثبيت azd&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>تحديث Visual Studio لشهر مارس يتيح لك بناء وكلاء Copilot مخصصين — وأداة find_symbol تستحق الاهتمام</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</guid><description>يأتي تحديث Visual Studio لشهر مارس 2026 بوكلاء Copilot مخصصين، ومهارات وكلاء قابلة لإعادة الاستخدام، وأداة find_symbol تدرك لغات البرمجة، وتحليل أداء مدعوم بـ Copilot من Test Explorer. إليك ما يستحق الاهتمام.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;حصل Visual Studio للتو على أهم تحديث لـ Copilot حتى الآن. أعلن Mark Downie عن &lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-march-update-build-your-own-custom-agents/"&gt;إصدار مارس&lt;/a&gt;، والعنوان الرئيسي هو الوكلاء المخصصون — لكن بصراحة، أداة &lt;code&gt;find_symbol&lt;/code&gt; المدفونة في منتصف القائمة قد تكون الميزة التي ستغير سير عملك أكثر من أي شيء آخر.&lt;/p&gt;
&lt;p&gt;دعني أشرح ما هو موجود فعلاً.&lt;/p&gt;
&lt;h2 id="وكلاء-copilot-مخصصون-في-مستودعك"&gt;وكلاء Copilot مخصصون في مستودعك&lt;/h2&gt;
&lt;p&gt;هل تريد أن يتبع Copilot معايير ترميز فريقك، أو يشغّل خط أنابيب البناء، أو يستعلم وثائقك الداخلية؟ يمكنك الآن بناء ذلك بالضبط.&lt;/p&gt;
&lt;p&gt;يُعرَّف الوكلاء المخصصون كملفات &lt;code&gt;.agent.md&lt;/code&gt; تضعها في &lt;code&gt;.github/agents/&lt;/code&gt; في مستودعك. يتمتع كل وكيل بوصول كامل إلى الوعي بمساحة العمل، وفهم الكود، والأدوات، ونموذجك المفضل، واتصالات MCP بالخدمات الخارجية. تظهر هذه الوكلاء في منتقي الوكلاء إلى جانب الوكلاء المدمجين.&lt;/p&gt;
&lt;p&gt;هذا النمط ذاته الذي كان VS Code يدعمه — ومن الجيد رؤية Visual Studio يلحق به. إذا كانت فرقتك قد بنت وكلاء لـ VS Code، فينبغي أن تعمل ملفات &lt;code&gt;.agent.md&lt;/code&gt; عبر كلا بيئتَي التطوير (مع ذلك، قد تتباين أسماء الأدوات، لذا اختبرها).&lt;/p&gt;
&lt;p&gt;يحتوي مستودع &lt;a href="https://github.com/github/awesome-copilot"&gt;awesome-copilot&lt;/a&gt; على إعدادات وكلاء يُسهم بها المجتمع يمكنك استخدامها نقطة انطلاق.&lt;/p&gt;
&lt;h2 id="مهارات-الوكيل-حزم-تعليمات-قابلة-لإعادة-الاستخدام"&gt;مهارات الوكيل: حزم تعليمات قابلة لإعادة الاستخدام&lt;/h2&gt;
&lt;p&gt;يتم التقاط المهارات تلقائياً من &lt;code&gt;.github/skills/&lt;/code&gt; في مستودعك أو &lt;code&gt;~/.copilot/skills/&lt;/code&gt; في ملفك الشخصي. كل مهارة هي ملف &lt;code&gt;SKILL.md&lt;/code&gt; يتبع &lt;a href="https://agentskills.io/specification"&gt;مواصفات Agent Skills&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;فكّر في المهارات كخبرات معيارية يمكنك دمجها وتبديلها. قد تكون لديك مهارة لاصطلاحات API الخاصة بك، وأخرى لأنماط الاختبار، وأخرى لسير عمل النشر. عندما تنشط مهارة، تظهر في المحادثة حتى تعرف أنها مُطبَّقة.&lt;/p&gt;
&lt;p&gt;إذا كنت تستخدم المهارات في VS Code، فهي تعمل بالطريقة ذاتها في Visual Studio الآن.&lt;/p&gt;
&lt;h2 id="find_symbol-ملاحة-رمزية-تدرك-اللغة-للوكلاء"&gt;find_symbol: ملاحة رمزية تدرك اللغة للوكلاء&lt;/h2&gt;
&lt;p&gt;هنا تصبح الأمور مثيرة للاهتمام حقاً. تمنح أداة &lt;code&gt;find_symbol&lt;/code&gt; الجديدة وضعَ وكيل Copilot ملاحةً رمزية فعلية مدعومة بخدمة اللغة. بدلاً من البحث في كودك كنص عادي، يمكن للوكيل:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;إيجاد جميع المراجع لرمز عبر مشروعك&lt;/li&gt;
&lt;li&gt;الوصول إلى معلومات النوع والإعلانات وبيانات النطاق&lt;/li&gt;
&lt;li&gt;التنقل عبر مواقع الاستدعاء بوعي كامل باللغة&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ما يعنيه هذا عملياً: عندما تطلب من Copilot إعادة هيكلة طريقة أو تحديث توقيع معامل عبر مواقع الاستدعاء، يمكنه فعلاً رؤية بنية كودك. لا مزيد من &amp;ldquo;قام الوكيل بتغيير الطريقة لكنه فاته ثلاثة مواقع استدعاء&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;اللغات المدعومة تشمل C# وC++ وRazor وTypeScript وأي لغة تتوفر لها إضافة LSP مدعومة. لمطوري .NET، هذا تحسين جوهري — قواعد كود C# ذات التسلسلات الهرمية العميقة للأنواع والواجهات تستفيد استفادة هائلة من الملاحة الرمزية.&lt;/p&gt;
&lt;h2 id="تحليل-أداء-الاختبارات-مع-copilot"&gt;تحليل أداء الاختبارات مع Copilot&lt;/h2&gt;
&lt;p&gt;يوجد الآن أمر &lt;strong&gt;Profile with Copilot&lt;/strong&gt; في قائمة سياق Test Explorer. حدد اختباراً، انقر على التحليل، ويقوم وكيل التحليل تلقائياً بتشغيله وتحليل الأداء — يجمع بين بيانات استخدام المعالج وبيانات القياس لتقديم رؤى قابلة للتنفيذ.&lt;/p&gt;
&lt;p&gt;لا مزيد من الإعداد اليدوي لجلسات المحلل، وتشغيل الاختبار، وتصدير النتائج، ومحاولة قراءة رسم بياني للهوية. يقوم الوكيل بالتحليل ويخبرك بما هو بطيء ولماذا. خاص بـ .NET حالياً، وهو أمر منطقي نظراً للتكامل العميق لـ Visual Studio مع أدوات تشخيص .NET.&lt;/p&gt;
&lt;h2 id="نصائح-الأداء-أثناء-التصحيح-المباشر"&gt;نصائح الأداء أثناء التصحيح المباشر&lt;/h2&gt;
&lt;p&gt;أصبح تحسين الأداء يحدث أثناء التصحيح، لا بعده. بينما تتنقل خطوة بخطوة عبر الكود، يعرض Visual Studio وقت التنفيذ وإشارات الأداء بشكل مضمّن. هل ترى سطراً بطيئاً؟ انقر على Perf Tip واطلب من Copilot اقتراحات للتحسين في المكان ذاته.&lt;/p&gt;
&lt;p&gt;يلتقط وكيل التحليل بيانات وقت التشغيل تلقائياً — الوقت المنقضي واستخدام المعالج وسلوك الذاكرة — ويستخدمها Copilot لتحديد مناطق الاختناق. هذا يجعل عمل الأداء جزءاً من سير عمل التصحيح بدلاً من مهمة منفصلة تؤجلها باستمرار.&lt;/p&gt;
&lt;h2 id="إصلاح-ثغرات-nuget-من-solution-explorer"&gt;إصلاح ثغرات NuGet من Solution Explorer&lt;/h2&gt;
&lt;p&gt;عندما تُكتشف ثغرة في حزمة NuGet، يظهر الآن إشعار مع رابط &lt;strong&gt;Fix with GitHub Copilot&lt;/strong&gt; مباشرةً في Solution Explorer. انقر عليه ويحلل Copilot الثغرة، ويوصي بتحديثات الحزمة المناسبة، وينفّذها.&lt;/p&gt;
&lt;p&gt;للفرق التي تكافح للحفاظ على تحديث التبعيات (وهو ما يصف الجميع تقريباً)، يُزيل هذا احتكاك &amp;ldquo;أعرف أن هناك ثغرة لكن معرفة مسار التحديث الصحيح مشروع بحد ذاته.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="خلاصة-القول"&gt;خلاصة القول&lt;/h2&gt;
&lt;p&gt;الوكلاء المخصصون والمهارات هي العنوان الرئيسي، لكن &lt;code&gt;find_symbol&lt;/code&gt; هي البطل الهادئ — إنها تغير جوهرياً مدى دقة Copilot عند إعادة هيكلة كود .NET. مجتمعةً مع تكامل التحليل المباشر وإصلاحات الثغرات، يجعل هذا التحديث ميزات الذكاء الاصطناعي في Visual Studio تشعر بالفاعلية الحقيقية لا مجرد عروض توضيحية.&lt;/p&gt;
&lt;p&gt;قم بتنزيل &lt;a href="https://visualstudio.microsoft.com/downloads/"&gt;Visual Studio 2026 Insiders&lt;/a&gt; لتجربة كل ذلك.&lt;/p&gt;</content:encoded></item><item><title>لوحة تحكم Aspire 13.2 حصلت للتو على واجهة برمجية للقياس عن بُعد — وهذا يغيّر كل شيء</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</guid><description>يُشحن .NET Aspire 13.2 مع تصدير قياس عن بُعد أذكى، وواجهة برمجية قابلة للبرمجة للتتبعات والسجلات، وتحسينات تصوير GenAI. إليك لماذا يهمّ هذا لسير عمل التصحيح لديك.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;إذا كنت تبني تطبيقات موزّعة باستخدام .NET Aspire، فأنت تعرف بالفعل أن لوحة التحكم هي أفضل شيء في التجربة بأكملها. جميع التتبعات والسجلات والمقاييس في مكان واحد — لا Jaeger خارجي، ولا إعداد Seq، ولا لحظات &amp;ldquo;دعني أتحقق من الطرفية الأخرى.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;قدّم Aspire 13.2 للتو تحسيناً ملحوظاً. أعلن James Newton-King عن &lt;a href="https://devblogs.microsoft.com/aspire/aspire-dashboard-improvements-export-and-telemetry/"&gt;التحديث&lt;/a&gt;، وبصراحة؟ ميزات تصدير القياس عن بُعد والواجهة البرمجية وحدها تستحق الترقية.&lt;/p&gt;
&lt;h2 id="تصدير-القياس-عن-بعد-بطريقة-سليمة"&gt;تصدير القياس عن بُعد بطريقة سليمة&lt;/h2&gt;
&lt;p&gt;إليك السيناريو الذي مررنا به جميعاً: أنت تصحّح مشكلة موزّعة، وتعيد إنتاجها أخيراً بعد عشرين دقيقة من الإعداد، والآن تحتاج إلى مشاركة ما حدث مع فريقك. قبل ذلك؟ لقطات شاشة. نسخ ولصق معرّفات التتبع. الفوضى المعتادة.&lt;/p&gt;
&lt;p&gt;يُضيف Aspire 13.2 حوار &lt;strong&gt;إدارة السجلات والقياس عن بُعد&lt;/strong&gt; الصحيح حيث يمكنك:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;مسح جميع بيانات القياس (مفيد قبل محاولة إعادة الإنتاج)&lt;/li&gt;
&lt;li&gt;تصدير بيانات القياس المحددة إلى ملف ZIP بتنسيق OTLP/JSON القياسي&lt;/li&gt;
&lt;li&gt;إعادة استيراد ذلك الـ ZIP إلى أي لوحة تحكم Aspire لاحقاً&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;هذا الجزء الأخير هو الميزة القاتلة. تعيد إنتاج خطأ، وتصدّر بيانات القياس، وتُرفقها ببند العمل، ويمكن لزميلك استيرادها في لوحة تحكمه الخاصة ليرى بالضبط ما رأيته. لا مزيد من &amp;ldquo;هل يمكنك إعادة إنتاجه على جهازك؟&amp;rdquo;&lt;/p&gt;
&lt;p&gt;تحصل التتبعات والامتدادات والسجلات الفردية أيضاً على خيار &amp;ldquo;تصدير JSON&amp;rdquo; في قوائم سياقها. تحتاج مشاركة تتبع واحد محدد؟ انقر بزر الماوس الأيمن، انسخ JSON، الصقه في وصف طلب السحب. انتهى.&lt;/p&gt;
&lt;h2 id="واجهة-برمجية-للقياس-عن-بعد-هي-المغير-الحقيقي-لقواعد-اللعبة"&gt;واجهة برمجية للقياس عن بُعد هي المُغيِّر الحقيقي لقواعد اللعبة&lt;/h2&gt;
&lt;p&gt;هذا ما أنا أكثر حماساً له. تكشف لوحة التحكم الآن عن واجهة برمجية HTTP تحت &lt;code&gt;/api/telemetry&lt;/code&gt; للاستعلام عن بيانات القياس برمجياً. نقاط النهاية المتاحة:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/resources&lt;/code&gt; — سرد الموارد مع بيانات القياس&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/spans&lt;/code&gt; — الاستعلام عن الامتدادات بفلاتر&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/logs&lt;/code&gt; — الاستعلام عن السجلات بفلاتر&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces&lt;/code&gt; — سرد التتبعات&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces/{traceId}&lt;/code&gt; — الحصول على جميع امتدادات تتبع محدد&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;كل شيء يعود بتنسيق OTLP JSON. هذا يُشغّل أوامر CLI الجديدة &lt;code&gt;aspire agent mcp&lt;/code&gt; و&lt;code&gt;aspire otel&lt;/code&gt;، لكن الانعكاس الحقيقي أكبر: يمكنك الآن بناء أدوات وسكريبتات وتكاملات وكلاء ذكاء اصطناعي تستعلم عن بيانات القياس الفعلية لتطبيقك مباشرةً.&lt;/p&gt;
&lt;p&gt;تخيّل وكيل ذكاء اصطناعي للبرمجة يمكنه النظر في تتبعاتك الموزّعة الفعلية أثناء التصحيح. هذا لم يعد افتراضياً — هذا ما تُمكّنه هذه الواجهة البرمجية.&lt;/p&gt;
&lt;h2 id="قياس-genai-عن-بعد-يصبح-عمليا"&gt;قياس GenAI عن بُعد يصبح عملياً&lt;/h2&gt;
&lt;p&gt;إذا كنت تبني تطبيقات مدعومة بالذكاء الاصطناعي باستخدام Semantic Kernel أو Microsoft.Extensions.AI، فستقدّر محسّن تصوير قياس GenAI عن بُعد المحسَّن. يُضيف Aspire 13.2:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;تُصيَّر أوصاف أدوات الذكاء الاصطناعي كـ Markdown&lt;/li&gt;
&lt;li&gt;زر GenAI مخصص على صفحة التتبعات للوصول السريع إلى تتبعات الذكاء الاصطناعي&lt;/li&gt;
&lt;li&gt;معالجة أفضل للأخطاء للـ JSON الغير معياري أو المقطوع للـ GenAI&lt;/li&gt;
&lt;li&gt;التنقل بالنقر لتمييز التعريفات بين تعريفات الأدوات&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;تذكر منشور المدوّنة أن VS Code Copilot chat وCopilot CLI وOpenCode جميعها تدعم إعداد &lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt;. وجّهها إلى لوحة تحكم Aspire ويمكنك حرفياً مشاهدة وكلاء الذكاء الاصطناعي تفكّر في الوقت الفعلي من خلال القياس عن بُعد. هذه تجربة تصحيح لن تجدها في أي مكان آخر.&lt;/p&gt;
&lt;h2 id="خلاصة-القول"&gt;خلاصة القول&lt;/h2&gt;
&lt;p&gt;يأخذ Aspire 13.2 لوحة التحكم من &amp;ldquo;واجهة مستخدم تصحيح لطيفة&amp;rdquo; إلى &amp;ldquo;منصة رصد قابلة للبرمجة.&amp;rdquo; سير عمل التصدير/الاستيراد وحده يوفّر وقتاً حقيقياً على التصحيح الموزّع، وتفتح الواجهة البرمجية للقياس عن بُعد الباب أمام التشخيص المدعوم بالذكاء الاصطناعي.&lt;/p&gt;
&lt;p&gt;إذا كنت بالفعل على Aspire، قم بالترقية. إذا لم تكن — هذا سبب وجيه للاطّلاع على &lt;a href="https://aspire.dev"&gt;aspire.dev&lt;/a&gt; ومعرفة سبب الاهتمام به.&lt;/p&gt;</content:encoded></item><item><title>KubeCon أوروبا 2026: ما يجب أن يهتمّ به مطوّرو .NET فعلاً</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</link><pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</guid><description>أطلقت Microsoft حزمة ضخمة من إعلانات Kubernetes في KubeCon أوروبا 2026. هذه النسخة المصفّاة — فقط تحديثات AKS والسحابة الأصيلة التي تهمّك إذا كنت تشحن تطبيقات .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;تعرف ذلك الشعور حين يصدر منشور إعلانات ضخم وأنت تتصفحه تفكّر &amp;ldquo;رائع، لكن ما الذي يغيّره هذا فعلاً بالنسبة لي&amp;rdquo;؟ هذا بالضبط شعوري في كل موسم KubeCon.&lt;/p&gt;
&lt;p&gt;نشرت Microsoft للتوّ &lt;a href="https://opensource.microsoft.com/blog/2026/03/24/whats-new-with-microsoft-in-open-source-and-kubernetes-at-kubecon-cloudnativecon-europe-2026/"&gt;ملخصها الكامل لـ KubeCon Europe 2026&lt;/a&gt; — كتبه Brendan Burns بنفسه — وفي الحقيقة؟ ثمة مضمون حقيقي هنا. لا مجرد مربعات اختيار للميزات، بل تحسينات تشغيلية من النوع الذي يغيّر طريقة تشغيل الأشياء في الإنتاج.&lt;/p&gt;
&lt;p&gt;دعني أُفصّل ما يهمّ فعلاً لنا كمطوّري .NET.&lt;/p&gt;
&lt;h2 id="mtls-دون-ضريبة-service-mesh"&gt;mTLS دون ضريبة service mesh&lt;/h2&gt;
&lt;p&gt;إليك الحقيقة بشأن شبكات الخدمات: الجميع يريد ضمانات الأمان، ولا أحد يريد الأعباء التشغيلية. AKS يسدّ تلك الفجوة أخيراً.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/application-network"&gt;Azure Kubernetes Application Network&lt;/a&gt; يمنحك TLS المتبادل، والتفويض الواعي بالتطبيق، وبيانات تتبع حركة المرور — دون نشر شبكة كاملة ثقيلة بالحاويات الجانبية. مدمجاً مع &lt;a href="https://aka.ms/acns/cilium-mtls"&gt;Cilium mTLS في Advanced Container Networking Services&lt;/a&gt;، تحصل على اتصال مشفّر بين الـ pods باستخدام شهادات X.509 وSPIRE لإدارة الهوية.&lt;/p&gt;
&lt;p&gt;ما يعنيه هذا عملياً: واجهات ASP.NET Core APIs تتحدث إلى العمال الخلفيين، وخدمات gRPC تستدعي بعضها — كل ذلك مشفّر ومُتحقق من الهوية على مستوى الشبكة، بدون أي تغييرات في كود التطبيق. هذا ضخم.&lt;/p&gt;
&lt;p&gt;للفرق التي تنقل من &lt;code&gt;ingress-nginx&lt;/code&gt;، ثمة أيضاً &lt;a href="https://aka.ms/aks/app-routing/gateway-api"&gt;Application Routing with Meshless Istio&lt;/a&gt; مع دعم كامل لـ Kubernetes Gateway API. لا حاويات جانبية. قائم على المعايير. وشحنوا أداة &lt;code&gt;ingress2gateway&lt;/code&gt; للهجرة التدريجية.&lt;/p&gt;
&lt;h2 id="إمكانية-مراقبة-gpu-ليست-ملحقة-بعد-الواقعة"&gt;إمكانية مراقبة GPU ليست مُلحقةً بعد الواقعة&lt;/h2&gt;
&lt;p&gt;إذا كنت تشغّل استدلال الذكاء الاصطناعي جنباً إلى جنب مع خدمات .NET (وبصراحة، من لا يبدأ في فعل ذلك؟)، فربما اصطدمت بنقطة عمياء في مراقبة GPU. كنت تحصل على لوحات معلومات رائعة للمعالج والذاكرة، ثم&amp;hellip; لا شيء لـ GPUs دون تجهيز أدوات تصدير يدوياً.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/managed-gpu-metrics"&gt;AKS يعرض الآن مقاييس GPU بشكل أصلي&lt;/a&gt; إلى Prometheus وGrafana المُدارَين. نفس المنظومة، نفس لوحات المعلومات، نفس خط أنابيب التنبيه. لا أدوات تصدير مخصصة، لا وكلاء من جهات خارجية.&lt;/p&gt;
&lt;p&gt;على صعيد الشبكة، أضافوا رؤية لكل تدفق لحركة HTTP وgRPC وKafka مع &lt;a href="https://learn.microsoft.com/en-us/azure/aks/container-network-observability-logs"&gt;تجربة Azure Monitor بنقرة واحدة&lt;/a&gt;. عناوين IP، والمنافذ، وأحمال العمل، واتجاه التدفق، وقرارات السياسة — كل ذلك في لوحات معلومات مدمجة.&lt;/p&gt;
&lt;p&gt;وإليك ما أوقفني مندهشاً: &lt;a href="https://learn.microsoft.com/en-us/azure/aks/advanced-container-networking-services-overview"&gt;شبكات الحاويات الوكيلية&lt;/a&gt; تضيف واجهة ويب تتيح لك طرح أسئلة باللغة الطبيعية حول حالة شبكة مجموعتك. &amp;ldquo;لماذا لا يصل pod X إلى الخدمة Y؟&amp;rdquo; ← تشخيصات للقراءة فقط من بيانات تتبع حية. هذا مفيد فعلاً في الساعة الثانية صباحاً.&lt;/p&gt;
&lt;h2 id="شبكة-متعددة-العناقيد-لا-تتطلب-شهادة-دكتوراه"&gt;شبكة متعددة العناقيد لا تتطلب شهادة دكتوراه&lt;/h2&gt;
&lt;p&gt;كان Kubernetes متعدد العناقيد تاريخياً تجربة &amp;ldquo;أحضر معك الصمغ الشبكي الخاص بك&amp;rdquo;. يشحن Azure Kubernetes Fleet Manager الآن &lt;a href="https://aka.ms/kubernetes-fleet/networking/cross-cluster"&gt;شبكة متعددة العناقيد&lt;/a&gt; عبر شبكة Cilium cluster mesh المُدارة:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;اتصال موحّد عبر عناقيد AKS&lt;/li&gt;
&lt;li&gt;سجل خدمات عالمي للاكتشاف متعدد العناقيد&lt;/li&gt;
&lt;li&gt;تهيئة مُدارة مركزياً، لا تكرار لكل عنقود&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;إذا كنت تشغّل خدمات .NET المصغّرة عبر مناطق متعددة للمرونة أو الامتثال، فهذا يستبدل الكثير من التجهيزات المخصصة الهشّة. الخدمة A في West Europe تستطيع اكتشاف واستدعاء الخدمة B في East US عبر الشبكة، مع سياسات توجيه وأمان متسقة.&lt;/p&gt;
&lt;h2 id="ترقيات-لا-تتطلب-شجاعة"&gt;ترقيات لا تتطلب شجاعة&lt;/h2&gt;
&lt;p&gt;لنكن صريحين — ترقيات Kubernetes في الإنتاج مُجهِدة. &amp;ldquo;رقّي وتأمّل الخير&amp;rdquo; كانت الاستراتيجية الفعلية لفرق كثيرة جداً، وهي السبب الرئيسي في تخلّف العناقيد عن الإصدارات.&lt;/p&gt;
&lt;p&gt;قدرتان جديدتان تُغيّران هذا:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ترقيات agent pool بالأزرق والأخضر&lt;/strong&gt; تُنشئ pool عقد موازياً بالتهيئة الجديدة. تحقق من السلوك، وانقل حركة المرور تدريجياً، واحتفظ بمسار تراجع واضح. لا مزيد من التعديلات في المكان على عقد الإنتاج.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;التراجع عن agent pool&lt;/strong&gt; يتيح لك العودة بـ pool العقد إلى إصدار Kubernetes وصورة العقدة السابقة بعد ترقية فاشلة — دون إعادة بناء العنقود.&lt;/p&gt;
&lt;p&gt;معاً، تمنح هذه القدرات المشغّلين أخيراً تحكماً حقيقياً في دورة حياة الترقية. لفرق .NET، هذا مهم لأن سرعة المنصة تُحدِّد مباشرةً مدى سرعة تبنّي بيئات التشغيل الجديدة وتصحيحات الأمان وقدرات الشبكة.&lt;/p&gt;
&lt;h2 id="أحمال-العمل-بالذكاء-الاصطناعي-تصبح-مواطنين-من-الدرجة-الأولى-في-kubernetes"&gt;أحمال العمل بالذكاء الاصطناعي تصبح مواطنين من الدرجة الأولى في Kubernetes&lt;/h2&gt;
&lt;p&gt;العمل مفتوح المصدر في المنبع لا يقل أهمية. Dynamic Resource Allocation (DRA) وصل للإتاحة العامة في Kubernetes 1.36، مما يجعل جدولة GPU ميزة من الدرجة الأولى بدلاً من حلّ مؤقت.&lt;/p&gt;
&lt;p&gt;عدة مشاريع تستحق المتابعة:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;المشروع&lt;/th&gt;
&lt;th&gt;ما يفعله&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/kaito-project/kubeairunway"&gt;AI Runway&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;واجهة Kubernetes مشتركة للاستدلال — انشر النماذج دون معرفة K8s، مع اكتشاف HuggingFace وتقديرات التكلفة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.cncf.io/blog/2026/01/07/holmesgpt-agentic-troubleshooting-built-for-the-cloud-native-era/"&gt;HolmesGPT&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;تشخيص وكيلي لبيئات السحابة الأصيلة — أصبح الآن مشروع CNCF Sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/project-dalec/dalec"&gt;Dalec&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;إنشاء صور حاويات تصريحي مع توليد SBOM — ثغرات أمنية أقل في مرحلة البناء&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;الاتجاه واضح: يجب أن تعمل واجهة .NET API الخاصة بك، وطبقة تنسيق Semantic Kernel، وأحمال عمل الاستدلال جميعها على نموذج منصة متسق واحد. نحن في طريقنا إلى ذلك.&lt;/p&gt;
&lt;h2 id="من-أين-أبدأ-هذا-الأسبوع"&gt;من أين أبدأ هذا الأسبوع&lt;/h2&gt;
&lt;p&gt;إذا كنت تُقيِّم هذه التغييرات لفريقك، فإليك قائمة الأولويات الصادقة:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;إمكانية المراقبة أولاً&lt;/strong&gt; — فعّل مقاييس GPU وسجلات تدفق الشبكة في عنقود غير الإنتاج. انظر ما الذي كنت تفتقده.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;جرّب ترقيات الأزرق والأخضر&lt;/strong&gt; — اختبر سير عمل التراجع قبل ترقية عنقود الإنتاج التالية. ابنِ الثقة في العملية.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;جرّب الشبكة الواعية بالهوية&lt;/strong&gt; — اختر مسار خدمة داخلي واحد وفعّل mTLS مع Cilium. قِس الأعباء الإضافية (تنبيه: إنها ضئيلة).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;قيّم Fleet Manager&lt;/strong&gt; — إذا كنت تشغّل أكثر من عنقودين، فإن الشبكة متعددة العناقيد تؤتي ثمارها في تقليل التجهيزات المخصصة.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;تجارب صغيرة، تغذية راجعة سريعة. هذه دائماً هي الحركة الصحيحة.&lt;/p&gt;
&lt;h2 id="خلاصة"&gt;خلاصة&lt;/h2&gt;
&lt;p&gt;إعلانات KubeCon قد تكون ساحقة، لكن هذه الدفعة تُحرِّك الإبرة فعلاً لفرق .NET على AKS. أمان شبكي أفضل دون أعباء شبكة الخدمات، وإمكانية مراقبة GPU حقيقية، وترقيات أكثر أماناً، وأسس بنية تحتية للذكاء الاصطناعي أقوى.&lt;/p&gt;
&lt;p&gt;إذا كنت على AKS بالفعل، فهذه لحظة رائعة لتحسين مستوى عملياتك. وإذا كنت تخطط لنقل أحمال عمل .NET إلى Kubernetes — المنصة أصبحت للتوّ أكثر جاهزيةً للإنتاج بشكل ملموس.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.112: ما يهمك فعلاً كمطور .NET</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/vscode-1-112-dotnet-developers/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/vscode-1-112-dotnet-developers/</guid><description>صدر VS Code 1.112 وهو محمّل بتحسينات للوكلاء، ومتصفح مدمج للتصحيح، وعزل MCP في صندوق رمل، ودعم monorepo. إليك ما يهم فعلاً إذا كنت تطور باستخدام .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/vscode-1-112-dotnet-developers/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;وصل VS Code 1.112 للتو، وبصراحة؟ هذا الإصدار مختلف إذا كنت تقضي أيامك في عالم .NET. يوجد الكثير في &lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;ملاحظات الإصدار الرسمية&lt;/a&gt;، لكن دعني أوفر عليك التمرير وأركز على ما يهم فعلاً بالنسبة لنا.&lt;/p&gt;
&lt;h2 id="copilot-cli-أصبح-أكثر-فائدة-بكثير"&gt;Copilot CLI أصبح أكثر فائدة بكثير&lt;/h2&gt;
&lt;p&gt;الموضوع الرئيسي لهذا الإصدار هو &lt;strong&gt;استقلالية الوكيل&lt;/strong&gt; — إعطاء Copilot مساحة أكبر للعمل دون مراقبة كل خطوة.&lt;/p&gt;
&lt;h3 id="توجيه-الرسائل-وإضافتها-إلى-قائمة-الانتظار"&gt;توجيه الرسائل وإضافتها إلى قائمة الانتظار&lt;/h3&gt;
&lt;p&gt;هل تعرف تلك اللحظة التي يكون فيها Copilot CLI في منتصف مهمة وتدرك أنك نسيت ذكر شيء ما؟ في السابق، كان عليك الانتظار. الآن يمكنك إرسال رسائل أثناء تشغيل طلب — إما لتوجيه الاستجابة الحالية أو لوضع تعليمات المتابعة في قائمة الانتظار.&lt;/p&gt;
&lt;p&gt;هذا رائع لمهام السقالات الطويلة باستخدام &lt;code&gt;dotnet&lt;/code&gt; حيث تشاهد Copilot يُعدّ مشروعاً وتفكر &amp;ldquo;آه، أريد أيضاً MassTransit في هذا.&amp;rdquo;&lt;/p&gt;
&lt;h3 id="مستويات-الأذونات"&gt;مستويات الأذونات&lt;/h3&gt;
&lt;p&gt;هذا الأكثر إثارة لاهتمامي. تدعم جلسات Copilot CLI الآن ثلاثة مستويات أذونات:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Default Permissions&lt;/strong&gt; — التدفق المعتاد حيث تطلب الأدوات التأكيد قبل التشغيل&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bypass Approvals&lt;/strong&gt; — يوافق تلقائياً على كل شيء ويعيد المحاولة عند الأخطاء&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilot&lt;/strong&gt; — يعمل باستقلالية كاملة: يوافق على الأدوات، ويجيب على أسئلته الخاصة، ويستمر حتى الانتهاء من المهمة&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;إذا كنت تُنشئ سقالة لـ ASP.NET Core API جديدة مع Entity Framework والترحيلات وإعداد Docker — فوضع Autopilot يعني أنك تصف ما تريد ثم تذهب لتحضير قهوة. سيعرف كيف يُنجز المهمة.&lt;/p&gt;
&lt;p&gt;يمكنك تمكين Autopilot بإعداد &lt;code&gt;chat.autopilot.enabled&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="معاينة-التغييرات-قبل-التفويض"&gt;معاينة التغييرات قبل التفويض&lt;/h3&gt;
&lt;p&gt;عندما تفوّض مهمة لـ Copilot CLI، يُنشئ worktree. في السابق، إذا كان لديك تغييرات غير مُودَعة، كان عليك مراجعة Source Control لمعرفة ما سيتأثر. الآن يعرض عرض Chat التغييرات المعلّقة مباشرةً قبل أن تقرر ما إذا كنت تريد نسخها أو نقلها أو تجاهلها.&lt;/p&gt;
&lt;p&gt;أمر بسيط، لكنه يجنّبك لحظة &amp;ldquo;انتظر، ماذا كان لديّ في منطقة الإعداد؟&amp;rdquo;&lt;/p&gt;
&lt;h2 id="تصحيح-تطبيقات-الويب-دون-مغادرة-vs-code"&gt;تصحيح تطبيقات الويب دون مغادرة VS Code&lt;/h2&gt;
&lt;p&gt;يدعم المتصفح المدمج الآن &lt;strong&gt;التصحيح الكامل&lt;/strong&gt;. يمكنك تعيين نقاط التوقف والتنقل خطوة بخطوة وفحص المتغيرات — كل ذلك داخل VS Code. لا مزيد من التبديل إلى Edge DevTools.&lt;/p&gt;
&lt;p&gt;يوجد نوع تصحيح جديد &lt;code&gt;editor-browser&lt;/code&gt;، وإذا كانت لديك تكوينات تشغيل &lt;code&gt;msedge&lt;/code&gt; أو &lt;code&gt;chrome&lt;/code&gt; موجودة، فالترحيل بسيط كتغيير حقل &lt;code&gt;type&lt;/code&gt; في &lt;code&gt;launch.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;editor-browser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;request&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;launch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Debug Blazor App&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://localhost:5001&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;لمطوري Blazor، هذا تغيير جذري. أنت بالفعل تشغّل &lt;code&gt;dotnet watch&lt;/code&gt; في الطرفية — الآن يبقى التصحيح في نفس النافذة أيضاً.&lt;/p&gt;
&lt;p&gt;حصل المتصفح أيضاً على مستويات تكبير مستقلة (أخيراً)، وقوائم سياق صحيحة بنقر يمين، ويُحفظ التكبير لكل موقع على حدة.&lt;/p&gt;
&lt;h2 id="عزل-خادم-mcp-في-صندوق-رمل"&gt;عزل خادم MCP في صندوق رمل&lt;/h2&gt;
&lt;p&gt;هذا أهم مما تعتقد. إذا كنت تستخدم خوادم MCP — ربما أعددت خادماً مخصصاً لموارد Azure أو استعلامات قاعدة البيانات — فقد كانت تعمل بنفس أذونات عملية VS Code. هذا يعني وصولاً كاملاً إلى نظام الملفات والشبكة وكل شيء.&lt;/p&gt;
&lt;p&gt;الآن يمكنك عزلها في صندوق رمل. في ملف &lt;code&gt;mcp.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;servers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;my-azure-tools&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;node&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./mcp-server.js&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;sandboxEnabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;عندما يحتاج خادم معزول إلى الوصول لشيء ليس لديه صلاحية للوصول إليه، يطلب منك VS Code منح الإذن. أفضل بكثير من نهج &amp;ldquo;نتمنى ألا يفعل أحد شيئاً غريباً&amp;rdquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ملاحظة:&lt;/strong&gt; العزل في صندوق الرمل متاح على macOS وLinux حالياً. دعم Windows قادم — سيناريوهات التشغيل عن بُعد مثل WSL تعمل بالفعل.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="اكتشاف-تخصيصات-monorepo"&gt;اكتشاف تخصيصات Monorepo&lt;/h2&gt;
&lt;p&gt;إذا كنت تعمل في monorepo (ولنكن صادقين، كثير من مشاريع .NET المؤسسية تصبح كذلك في نهاية المطاف)، فهذا يحل نقطة ألم حقيقية.&lt;/p&gt;
&lt;p&gt;في السابق، إذا فتحت مجلداً فرعياً من مستودعك، لن يجد VS Code ملف &lt;code&gt;copilot-instructions.md&lt;/code&gt; أو &lt;code&gt;AGENTS.md&lt;/code&gt; أو المهارات المخصصة الموجودة في جذر المستودع. الآن مع إعداد &lt;code&gt;chat.useCustomizationsInParentRepositories&lt;/code&gt;، يصعد إلى جذر &lt;code&gt;.git&lt;/code&gt; ويكتشف كل شيء.&lt;/p&gt;
&lt;p&gt;هذا يعني أن فريقك يمكنه مشاركة تعليمات الوكيل وملفات التلقين والأدوات المخصصة عبر جميع المشاريع في monorepo دون أن يضطر الجميع إلى فتح المجلد الجذر.&lt;/p&gt;
&lt;h2 id="troubleshoot-لتصحيح-أخطاء-الوكيل"&gt;/troubleshoot لتصحيح أخطاء الوكيل&lt;/h2&gt;
&lt;p&gt;هل سبق أن أعددت تعليمات أو مهارات مخصصة وتساءلت لماذا لا يتم التقاطها؟ مهارة &lt;code&gt;/troubleshoot&lt;/code&gt; الجديدة تقرأ سجلات تصحيح الوكيل وتخبرك بما حدث — أي الأدوات استُخدمت أو تجاوزت، ولماذا لم يُحمَّل التعليمات، وما الذي يتسبب في بطء الاستجابات.&lt;/p&gt;
&lt;p&gt;مكّنها بـ:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;github.copilot.chat.agentDebugLog.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;github.copilot.chat.agentDebugLog.fileLogging.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ثم اكتب &lt;code&gt;/troubleshoot لماذا لا تُحمَّل مهارتي المخصصة؟&lt;/code&gt; في المحادثة.&lt;/p&gt;
&lt;p&gt;يمكنك أيضاً تصدير هذه السجلات واستيرادها الآن، وهو أمر رائع لمشاركتها مع فريقك عندما لا يعمل شيء كما هو متوقع.&lt;/p&gt;
&lt;h2 id="دعم-الصور-والملفات-الثنائية"&gt;دعم الصور والملفات الثنائية&lt;/h2&gt;
&lt;p&gt;يمكن للوكلاء الآن قراءة ملفات الصور من القرص والملفات الثنائية بشكل أصلي. تُعرض الملفات الثنائية بتنسيق hexdump، ومخرجات الصور (مثل لقطات الشاشة من المتصفح المدمج) تظهر في عرض دوّار.&lt;/p&gt;
&lt;p&gt;لمطوري .NET، فكّر في: لصق لقطة شاشة لخطأ في واجهة المستخدم في المحادثة وطلب من الوكيل فهم ما الخطأ، أو تحليل مخرجات مكوّن Blazor.&lt;/p&gt;
&lt;h2 id="المراجع-الرمزية-التلقائية"&gt;المراجع الرمزية التلقائية&lt;/h2&gt;
&lt;p&gt;تحسين بسيط لجودة الحياة: عندما تنسخ اسم رمز (فئة أو طريقة وما إلى ذلك) وتلصقه في المحادثة، يحوّله VS Code الآن تلقائياً إلى مرجع &lt;code&gt;#sym:Name&lt;/code&gt;. هذا يمنح الوكيل السياق الكامل عن هذا الرمز دون الحاجة لإضافته يدوياً.&lt;/p&gt;
&lt;p&gt;إذا أردت نصاً عادياً بدلاً من ذلك، استخدم &lt;code&gt;Ctrl+Shift+V&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="تمكينتعطيل-الإضافات"&gt;تمكين/تعطيل الإضافات&lt;/h2&gt;
&lt;p&gt;في السابق، تعطيل خادم MCP أو إضافة كان يعني إلغاء تثبيته. الآن يمكنك تبديل تشغيلهم وإيقافهم — عالمياً وفي كل مساحة عمل على حدة. انقر يمين في عرض Extensions أو عرض Customizations وانتهى الأمر.&lt;/p&gt;
&lt;p&gt;الإضافات من npm وpypi يمكنها أيضاً التحديث التلقائي الآن، وإن كانت ستطلب الموافقة أولاً لأن التحديثات تعني تشغيل كود جديد على جهازك.&lt;/p&gt;
&lt;h2 id="خلاصة-القول"&gt;خلاصة القول&lt;/h2&gt;
&lt;p&gt;يدفع VS Code 1.112 بقوة نحو تجربة الوكيل — استقلالية أكبر، وتصحيح أفضل، وأمان أكثر إحكاماً. لمطوري .NET، التصحيح عبر المتصفح المدمج وتحسينات Copilot CLI هي الميزات البارزة.&lt;/p&gt;
&lt;p&gt;إذا لم تجرّب بعد تشغيل جلسة Copilot CLI كاملة في وضع Autopilot لمشروع .NET، فهذا الإصدار هو الوقت المناسب للبدء. فقط تذكر ضبط أذوناتك ودعه يعمل.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;قم بتنزيل VS Code 1.112&lt;/a&gt; أو التحديث من داخل VS Code عبر &lt;strong&gt;Help &amp;gt; Check for Updates&lt;/strong&gt;.&lt;/p&gt;</content:encoded></item><item><title>الاستجابات في الخلفية في Microsoft Agent Framework: لا مزيد من القلق من انتهاء المهلة</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</guid><description>يتيح لك Microsoft Agent Framework الآن تفريغ مهام الذكاء الاصطناعي طويلة التشغيل باستخدام رموز الاستمرارية. إليك كيفية عمل الاستجابات في الخلفية ولماذا تهم وكلاء .NET الخاصة بك.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;إذا بنيت أي شيء باستخدام نماذج التفكير مثل o3 أو GPT-5.2، فأنت تعرف المعاناة. يبدأ وكيلك في التفكير في مهمة معقدة، يجلس العميل ينتظر، وفي مكان ما بين &amp;ldquo;كل شيء على ما يرام&amp;rdquo; و&amp;quot;هل تعطل؟&amp;quot; تنتهي مهلة اتصالك. كل ذلك العمل؟ ضاع.&lt;/p&gt;
&lt;p&gt;أصدر Microsoft Agent Framework للتو &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;الاستجابات في الخلفية&lt;/a&gt; — وبصراحة، هذه من الميزات التي كان يجب أن تكون موجودة منذ اليوم الأول.&lt;/p&gt;
&lt;h2 id="مشكلة-الاستدعاءات-الحاجبة"&gt;مشكلة الاستدعاءات الحاجبة&lt;/h2&gt;
&lt;p&gt;في نمط الطلب-الاستجابة التقليدي، يحجب عميلك حتى ينتهي الوكيل. هذا يعمل بشكل جيد للمهام السريعة. لكن عندما تطلب من نموذج تفكير إجراء بحث معمق أو تحليل متعدد الخطوات أو إنشاء تقرير من 20 صفحة؟ أنت تتطلع إلى دقائق من الوقت الفعلي. خلال تلك الفترة:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;يمكن أن تنتهي مهل اتصالات HTTP&lt;/li&gt;
&lt;li&gt;تقلبات الشبكة تقتل العملية بأكملها&lt;/li&gt;
&lt;li&gt;يحدق مستخدمك في مؤشر تحميل متسائلاً إذا كان أي شيء يحدث&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;الاستجابات في الخلفية تقلب هذا رأساً على عقب.&lt;/p&gt;
&lt;h2 id="كيفية-عمل-رموز-الاستمرارية"&gt;كيفية عمل رموز الاستمرارية&lt;/h2&gt;
&lt;p&gt;بدلاً من الحجب، تطلق مهمة الوكيل وتحصل على &lt;strong&gt;رمز استمرارية&lt;/strong&gt;. فكر فيه كتذكرة مطالبة في ورشة إصلاح — لا تقف عند الكاونتر تنتظر، بل تعود عندما يكون جاهزاً.&lt;/p&gt;
&lt;p&gt;سير العمل مباشر:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;أرسل طلبك مع &lt;code&gt;AllowBackgroundResponses = true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;إذا كان الوكيل يدعم المعالجة في الخلفية، تحصل على رمز استمرارية&lt;/li&gt;
&lt;li&gt;استعلم حسب جدولك حتى يعود الرمز &lt;code&gt;null&lt;/code&gt; — هذا يعني أن النتيجة جاهزة&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;إليك الإصدار بـ .NET:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AzureOpenAIClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://&amp;lt;myresource&amp;gt;.openai.azure.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetResponsesClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;lt;deployment-name&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentRunOptions&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AllowBackgroundResponses&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentResponse&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Write a detailed market analysis for the Q4 product launch.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Poll until complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;إذا أكمل الوكيل فوراً (المهام البسيطة، النماذج التي لا تحتاج معالجة في الخلفية)، لا يُعاد رمز استمرارية. كودك يعمل فقط — بدون معالجة خاصة.&lt;/p&gt;
&lt;h2 id="البث-مع-الاستئناف-السحر-الحقيقي"&gt;البث مع الاستئناف: السحر الحقيقي&lt;/h2&gt;
&lt;p&gt;الاستعلام مناسب لسيناريوهات &amp;ldquo;أطلق وانسَ&amp;rdquo;، لكن ماذا عن عندما تريد تقدماً في الوقت الفعلي؟ الاستجابات في الخلفية تدعم أيضاً البث مع استئناف مدمج.&lt;/p&gt;
&lt;p&gt;كل تحديث مبث يحمل رمز استمراريته الخاص. إذا انقطع اتصالك في منتصف البث، تستأنف من حيث توقفت تماماً:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentRunOptions&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AllowBackgroundResponses&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentResponseUpdate&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;latestUpdate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunStreamingAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Write a detailed market analysis for the Q4 product launch.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;latestUpdate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Simulate a network interruption&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Resume from exactly where we left off&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;latestUpdate&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunStreamingAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;يستمر الوكيل في المعالجة من جانب الخادم بغض النظر عما يحدث مع عميلك. هذا تحمّل للأعطال مدمج دون كتابة منطق إعادة المحاولة أو قواطع الدائرة.&lt;/p&gt;
&lt;h2 id="متى-تستخدم-هذا-فعلا"&gt;متى تستخدم هذا فعلاً&lt;/h2&gt;
&lt;p&gt;ليست كل استدعاءات الوكيل تحتاج إلى استجابات في الخلفية. للإكمالات السريعة، أنت تضيف تعقيداً بدون سبب. لكن إليك أين تتألق:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;مهام التفكير المعقدة&lt;/strong&gt; — تحليل متعدد الخطوات وبحث معمق وأي شيء يجعل نموذج التفكير يفكر فعلاً&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;توليد محتوى طويل&lt;/strong&gt; — تقارير تفصيلية ووثائق متعددة الأجزاء وتحليل مستفيض&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;الشبكات غير الموثوقة&lt;/strong&gt; — عملاء الجوال ونشرات الحافة وشبكات VPN المؤسسية المتذبذبة&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;أنماط واجهة المستخدم غير المتزامنة&lt;/strong&gt; — أرسل مهمة، اذهب افعل شيئاً آخر، عد للنتائج&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;بالنسبة لنا كمطوري .NET الذين يبنون تطبيقات مؤسسية، النقطة الأخيرة مثيرة للاهتمام بشكل خاص. فكر في تطبيق Blazor حيث يطلب مستخدم تقريراً معقداً — تطلق مهمة الوكيل، تعرض له مؤشر تقدم، وتتركه يستمر في العمل. بدون مشاكل WebSocket، بدون بنية تحتية مخصصة للطوابير، فقط رمز واستعلام دوري.&lt;/p&gt;
&lt;h2 id="خلاصة-القول"&gt;خلاصة القول&lt;/h2&gt;
&lt;p&gt;الاستجابات في الخلفية متاحة الآن في .NET وPython من خلال Microsoft Agent Framework. إذا كنت تبني وكلاء يفعلون أي شيء أكثر تعقيداً من الأسئلة والأجوبة البسيطة، فهذا يستحق إضافته إلى أدواتك. نمط رمز الاستمرارية يبقي الأمور بسيطة مع حل مشكلة إنتاجية حقيقية جداً.&lt;/p&gt;
&lt;p&gt;اطلع على &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;الوثائق الكاملة&lt;/a&gt; للرجوع الكامل إلى واجهة برمجية والمزيد من الأمثلة.&lt;/p&gt;</content:encoded></item><item><title>خدمة Foundry Agent متاحة للعموم: ما يهمّ فعلاً لبنّائي وكلاء .NET</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</guid><description>أصبحت خدمة Foundry Agent من Microsoft متاحة للعموم مع دعم الشبكات الخاصة، وVoice Live، وتقييمات الإنتاج، وبيئة تشغيل متعددة النماذج ومفتوحة. إليك ما تحتاج إلى معرفته.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;لنكن صريحين — بناء نموذج أولي لوكيل ذكاء اصطناعي هو الجزء السهل. الجزء الصعب هو كل ما يأتي بعده: نقله إلى بيئة الإنتاج مع عزل الشبكة المناسب، وتشغيل تقييمات ذات معنى حقيقي، ومعالجة متطلبات الامتثال، وتجنّب الأعطال في الساعة الثانية صباحاً.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;خدمة Foundry Agent أصبحت الآن متاحة للعموم&lt;/a&gt;، وهذا الإصدار مركّز تماماً على سدّ تلك الفجوة في &amp;ldquo;كل ما يأتي بعده&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="مبنية-على-responses-api"&gt;مبنية على Responses API&lt;/h2&gt;
&lt;p&gt;هذا هو العنوان الرئيسي: خدمة Foundry Agent من الجيل التالي مبنية على OpenAI Responses API. إذا كنت تبني بالفعل باستخدام هذا البروتوكول، فإن الهجرة إلى Foundry تستلزم تغييرات طفيفة في الكود. ما ستكسبه: أمان المؤسسات، والشبكات الخاصة، وEntra RBAC، والتتبع الكامل، والتقييم — فوق منطق وكيلك الحالي.&lt;/p&gt;
&lt;p&gt;البنية مفتوحة عن قصد. لست مقيّداً بمزوّد نماذج واحد أو إطار تنسيق واحد. استخدم DeepSeek للتخطيط، وOpenAI للتوليد، وLangGraph للتنسيق — بيئة التشغيل تتولى طبقة الاتساق.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PromptAgentDefinition&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AZURE_AI_PROJECT_ENDPOINT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;project_client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;project_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_openai_client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;my-enterprise-agent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PromptAgentDefinition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AZURE_AI_MODEL_DEPLOYMENT_NAME&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;You are a helpful assistant.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;conversation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conversations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;What are best practices for building AI agents?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;agent_reference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;agent_reference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;إذا كنت قادماً من حزمة &lt;code&gt;azure-ai-agents&lt;/code&gt;، فإن الوكلاء أصبحوا الآن عمليات من الدرجة الأولى على &lt;code&gt;AIProjectClient&lt;/code&gt; في &lt;code&gt;azure-ai-projects&lt;/code&gt;. أزل التبعية المنفصلة واستخدم &lt;code&gt;get_openai_client()&lt;/code&gt; لتشغيل الاستجابات.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="الشبكات-الخاصة-العقبة-المؤسسية-أزيلت"&gt;الشبكات الخاصة: العقبة المؤسسية أُزيلت&lt;/h2&gt;
&lt;p&gt;هذه هي الميزة التي تفتح الطريق أمام تبنّي المؤسسات. تدعم Foundry الآن الشبكات الخاصة الكاملة من طرف إلى طرف مع BYO VNet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;لا خروج عام&lt;/strong&gt; — لا تلمس حركة مرور الوكيل شبكة الإنترنت العامة أبداً&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;حقن الحاوية/الشبكة الفرعية&lt;/strong&gt; في شبكتك للاتصال المحلي&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;اتصال الأدوات مشمول&lt;/strong&gt; — خوادم MCP، وAzure AI Search، ووكلاء بيانات Fabric تعمل جميعها عبر مسارات خاصة&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;هذه النقطة الأخيرة بالغة الأهمية. لا تبقى طلبات الاستدلال فحسب خاصة — كل استدعاء لأداة وكل طلب استرجاع يبقى داخل حدود شبكتك أيضاً. للفرق العاملة في ظل سياسات تصنيف البيانات التي تحظر التوجيه الخارجي، هذا هو ما كان مفقوداً.&lt;/p&gt;
&lt;h2 id="مصادقة-mcp-بالطريقة-الصحيحة"&gt;مصادقة MCP بالطريقة الصحيحة&lt;/h2&gt;
&lt;p&gt;تدعم اتصالات خادم MCP الآن الطيف الكامل من أنماط المصادقة:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;طريقة المصادقة&lt;/th&gt;
&lt;th&gt;متى تستخدمها&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;مبنية على المفتاح&lt;/td&gt;
&lt;td&gt;وصول مشترك بسيط للأدوات الداخلية على مستوى المؤسسة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra Agent Identity&lt;/td&gt;
&lt;td&gt;من خدمة إلى خدمة؛ الوكيل يُصادق بهويته الخاصة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra Managed Identity&lt;/td&gt;
&lt;td&gt;عزل على مستوى المشروع؛ لا إدارة لبيانات الاعتماد&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAuth Identity Passthrough&lt;/td&gt;
&lt;td&gt;وصول مُفوَّض من المستخدم؛ الوكيل يعمل نيابةً عن المستخدمين&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OAuth Identity Passthrough هو الأكثر إثارةً للاهتمام. عندما يحتاج المستخدمون إلى منح وكيل حق الوصول إلى بياناتهم الشخصية — OneDrive الخاص بهم، أو مؤسسة Salesforce الخاصة بهم، أو واجهة برمجية SaaS مقيّدة بالمستخدم — يعمل الوكيل نيابةً عنهم من خلال تدفقات OAuth القياسية. لا هوية نظام مشتركة تتظاهر بأنها الجميع.&lt;/p&gt;
&lt;h2 id="voice-live-الكلام-إلى-الكلام-دون-التعقيدات"&gt;Voice Live: الكلام إلى الكلام دون التعقيدات&lt;/h2&gt;
&lt;p&gt;كان إضافة الصوت إلى وكيل يعني سابقاً تجميع STT وLLM وTTS معاً — ثلاث خدمات، وثلاث نقاط تأخير، وثلاثة أسطح للفوترة، كلها متزامنة يدوياً. &lt;strong&gt;Voice Live&lt;/strong&gt; يدمج ذلك كله في واجهة برمجية موحّدة مُدارة مع:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;الكشف الدلالي عن نشاط الصوت ونهاية الدور (يفهم المعنى، لا الصمت فحسب)&lt;/li&gt;
&lt;li&gt;قمع الضوضاء وإلغاء الصدى من جانب الخادم&lt;/li&gt;
&lt;li&gt;دعم المقاطعة (يمكن للمستخدمين المقاطعة في منتصف الاستجابة)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;تمرّ تفاعلات الصوت عبر نفس بيئة تشغيل الوكيل كالنص. نفس المُقيِّمات، ونفس التتبعات، ونفس رؤية التكاليف. لسيناريوهات دعم العملاء، والخدمة الميدانية، أو إمكانية الوصول، يستبدل هذا ما كان يستلزم سابقاً خط أنابيب صوتياً مخصصاً.&lt;/p&gt;
&lt;h2 id="التقييمات-من-مربع-اختيار-إلى-مراقبة-مستمرة"&gt;التقييمات: من مربّع اختيار إلى مراقبة مستمرة&lt;/h2&gt;
&lt;p&gt;هنا تأخذ Foundry جودة الإنتاج بجدية. يمتلك نظام التقييم الآن ثلاث طبقات:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;مُقيِّمات جاهزة للاستخدام&lt;/strong&gt; — التماسك، والصلة، والتأريض، وجودة الاسترجاع، والسلامة. اربطها بمجموعة بيانات أو حركة المرور الحية واحصل على النتائج.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;مُقيِّمات مخصصة&lt;/strong&gt; — شفّر منطقك التجاري الخاص، ومعايير النبرة، وقواعد الامتثال الخاصة بمجالك.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;التقييم المستمر&lt;/strong&gt; — تأخذ Foundry عيّنات من حركة مرور الإنتاج الحية، وتشغّل مجموعة مُقيِّماتك، وتعرض النتائج عبر لوحات المعلومات. اضبط تنبيهات Azure Monitor لحالات انخفاض التأريض أو خرق عتبات السلامة.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;كل شيء يُنشر إلى Azure Monitor Application Insights. جودة الوكيل، وصحة البنية التحتية، والتكلفة، وتتبع التطبيق — كل ذلك في مكان واحد.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;eval_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evals&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Agent Quality Evaluation&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data_source_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DataSourceConfigCustom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;custom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;item_schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;required&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;include_sample_schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;testing_criteria&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;azure_ai_evaluator&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;fluency&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;evaluator_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;builtin.fluency&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;initialization_parameters&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;deployment_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AZURE_AI_MODEL_DEPLOYMENT_NAME&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;data_mapping&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{item.query}}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;response&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{sample.output_text}}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ستة-مناطق-جديدة-للوكلاء-المستضافين"&gt;ستة مناطق جديدة للوكلاء المستضافين&lt;/h2&gt;
&lt;p&gt;الوكلاء المستضافون متاحون الآن في East US وNorth Central US وSweden Central وSoutheast Asia وJapan East وغيرها. هذا مهم لمتطلبات إقامة البيانات ولضغط زمن الاستجابة عندما يعمل وكيلك قريباً من مصادر بياناته.&lt;/p&gt;
&lt;h2 id="لماذا-يهم-هذا-مطوري-net"&gt;لماذا يهمّ هذا مطوّري .NET&lt;/h2&gt;
&lt;p&gt;على الرغم من أن نماذج الكود في إعلان الإتاحة للعموم تُقدَّم بـ Python أولاً، فإن البنية التحتية الأساسية مستقلة عن اللغة — وحزمة .NET SDK الخاصة بـ &lt;code&gt;azure-ai-projects&lt;/code&gt; تتبع نفس الأنماط. واجهة Responses API، وإطار التقييم، والشبكات الخاصة، ومصادقة MCP — كل هذا متاح من .NET.&lt;/p&gt;
&lt;p&gt;إذا كنت تنتظر أن تنتقل وكلاء الذكاء الاصطناعي من &amp;ldquo;عرض توضيحي رائع&amp;rdquo; إلى &amp;ldquo;يمكنني فعلاً شحن هذا في العمل&amp;rdquo;، فإن إصدار الإتاحة للعموم هذا هو الإشارة. الشبكات الخاصة، والمصادقة المناسبة، والتقييم المستمر، ومراقبة الإنتاج — هذه هي القطع التي كانت مفقودة.&lt;/p&gt;
&lt;h2 id="خلاصة"&gt;خلاصة&lt;/h2&gt;
&lt;p&gt;خدمة Foundry Agent متاحة الآن. ثبّت حزمة SDK، وافتح &lt;a href="https://ai.azure.com"&gt;البوابة&lt;/a&gt;، وابدأ البناء. &lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;دليل البدء السريع&lt;/a&gt; يأخذك من الصفر إلى وكيل عامل في دقائق.&lt;/p&gt;
&lt;p&gt;للتعمق التقني الكامل مع جميع نماذج الكود، راجع &lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;إعلان الإتاحة للعموم&lt;/a&gt;.&lt;/p&gt;</content:encoded></item></channel></rss>