<?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>Azure | The .NET Blog</title><link>https://thedotnetblog.com/ru/tags/azure/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>ru</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Tue, 02 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/ru/tags/azure/index.xml" rel="self" type="application/rss+xml"/><item><title>Microsoft Foundry Апрель 2026: Foundry Local GA, GPT-5.5, CodeAct с Hyperlight</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/microsoft-foundry-april-2026-whats-new/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/microsoft-foundry-april-2026-whats-new/</guid><description>Апрельский обзор Foundry насыщен: Foundry Local достигает GA, приходит GPT-5.5, Agent Framework получает трассировку OpenTelemetry, CodeAct выполняет Python в микро-VM Hyperlight, и появляется Панель мониторинга агентов.</description><content:encoded>&lt;p&gt;Насыщенный месяц для Microsoft Foundry. Вот самые важные анонсы.&lt;/p&gt;
&lt;h2 id="foundry-local-стал-общедоступным"&gt;Foundry Local Стал Общедоступным&lt;/h2&gt;
&lt;p&gt;Foundry Local — кроссплатформенная локальная среда выполнения ИИ от Microsoft — переходит из предварительной версии в GA на Windows, macOS (Apple Silicon) и Linux x64. Готовая к производству локальная inference моделей с удобным для разработчиков SDK. Версия 1.1 добавляет поддержку транскрипции, embeddings и API Responses.&lt;/p&gt;
&lt;h2 id="gpt-55"&gt;GPT-5.5&lt;/h2&gt;
&lt;p&gt;Последняя модель семейства GPT-5 теперь доступна в Foundry. Квота по умолчанию для подписок Tier 5 и Tier 6. Если вы работали с более ранними вариантами GPT-5, стоит оценить его для своих случаев использования.&lt;/p&gt;
&lt;h2 id="трассировка-agent-framework-в-foundry"&gt;Трассировка Agent Framework в Foundry&lt;/h2&gt;
&lt;p&gt;В этом месяце в предварительную версию выходят две функции трассировки:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Трассировка Microsoft Agent Framework&lt;/strong&gt; — Агенты MAF теперь могут отправлять трассировки OpenTelemetry в Foundry. Отлаживайте поведение агентов, отслеживайте многошаговое выполнение, выявляйте задержки и ошибки во вызовах инструментов. Это заполняет реальный пробел: знать &lt;em&gt;что именно сделал ваш агент&lt;/em&gt; в продакшене, не только что он вернул.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Трассировка hosted-агентов&lt;/strong&gt; — Сессии, вызовы инструментов и шаги выполнения hosted-агентов также отображаются в трассировках Foundry. Та же история наблюдаемости распространяется на hosted-уровень.&lt;/p&gt;
&lt;h2 id="codeact-с-hyperlight-alpha"&gt;CodeAct с Hyperlight (Alpha)&lt;/h2&gt;
&lt;p&gt;Это технически самое интересное дополнение: Agent Framework теперь может выполнять код Python внутри микро-виртуальных машин &lt;a href="https://github.com/hyperlight-dev/hyperlight"&gt;Hyperlight&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;CodeAct — это паттерн, где агент генерирует и выполняет код Python как инструмент. Очевидная проблема — безопасность: вы запускаете код, сгенерированный моделью. Микро-VM Hyperlight обеспечивают изоляцию на уровне процесса с временем запуска близким к нативному, делая выполнение кода в sandbox практичным без накладных расходов полных контейнеров или VM.&lt;/p&gt;
&lt;p&gt;Для агентных рабочих процессов, где выполнение кода необходимо, это значительное улучшение безопасности по сравнению с выполнением кода в хост-процессе.&lt;/p&gt;
&lt;h2 id="панель-мониторинга-агентов-предварительная-версия"&gt;Панель Мониторинга Агентов (Предварительная Версия)&lt;/h2&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;Теперь вы можете использовать собственные эвалюаторы на основе кода или промптов в пайплайнах непрерывной оценки. Ранее непрерывная оценка была ограничена встроенными эвалюаторами. Пользовательские эвалюаторы позволяют применять специфические для команды критерии качества в вашем производственном цикле мониторинга.&lt;/p&gt;
&lt;h2 id="инвентарь-агентов-в-плоскости-управления"&gt;Инвентарь Агентов в Плоскости Управления&lt;/h2&gt;
&lt;p&gt;Представление Operate в Плоскости Управления Foundry теперь показывает все поддерживаемые агенты в рамках подписки: агенты Foundry, Azure SRE Agent, циклы агентов Logic Apps и зарегистрированные пользовательские агенты. Одно представление для понимания того, что развёрнуто и где.&lt;/p&gt;
&lt;p&gt;Оригинальная публикация: &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-apr-2026/"&gt;What&amp;rsquo;s new in Microsoft Foundry | April 2026&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Ваш Локальный Агент MAF Только Что Получил Дом в Продакшене</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/maf-agent-local-to-production-foundry-hosted-agents/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/maf-agent-local-to-production-foundry-hosted-agents/</guid><description>Foundry Hosted Agents даёт вашему агенту Microsoft Agent Framework идентичность, масштабирование, сохранение сессий и наблюдаемость без дополнительной настройки. Вот как это выглядит на практике.</description><content:encoded>&lt;p&gt;Заставить агента работать локально — это весёлая часть. Сложная часть — всё, что идёт после: развернуть его без потери рассудка, управлять сессиями, настроить идентичность, подключить наблюдаемость. Обычно это означает много пользовательской инфраструктурной склейки.&lt;/p&gt;
&lt;p&gt;Foundry Hosted Agents только что убрал большую часть этой склейки для пользователей Microsoft Agent Framework (MAF).&lt;/p&gt;
&lt;h2 id="что-на-самом-деле-делает-foundry-hosted-agents"&gt;Что На Самом Деле Делает Foundry Hosted Agents&lt;/h2&gt;
&lt;p&gt;Когда вы развёртываете агент MAF в Foundry Hosted Agents, платформа берёт на себя удивительно длинный список вещей, которые вам иначе пришлось бы строить самостоятельно:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Масштабирование до нуля&lt;/strong&gt; — ваш агент ничего не стоит в простое и автоматически запускается снова&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Изолированные VM-сандбоксы на сессию&lt;/strong&gt; — каждая пользовательская сессия получает собственный сандбокс с персистентностью файловой системы, которая переживает события масштабирования вниз&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Встроенный Entra ID&lt;/strong&gt; — каждый агент получает собственную идентичность для вызова моделей Foundry, Toolbox и сервисов Azure без секретов в образе&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Версионированные развёртывания&lt;/strong&gt; — каждое развёртывание является неизменяемым снимком с поддержкой blue/green и canary выкатки&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Наблюдаемость без настройки&lt;/strong&gt; — &lt;code&gt;APPLICATIONINSIGHTS_CONNECTION_STRING&lt;/code&gt; внедряется в runtime, так что трейсы OpenTelemetry MAF автоматически попадают в App Insights&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Последнее действительно приятно. Никакого дополнительного подключения, никакой дополнительной настройки. Трейсы просто появляются.&lt;/p&gt;
&lt;h2 id="разница-в-коде-минимальна"&gt;Разница в Коде Минимальна&lt;/h2&gt;
&lt;p&gt;Именно это мне нравится больше всего в этой интеграции. Вы не переписываете своего агента. Вы просто оборачиваете его:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;В .NET:&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="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI.Foundry.Hosting&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;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&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;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddFoundryResponses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&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;app&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&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;MapFoundryResponses&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&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;strong&gt;В Python:&lt;/strong&gt;&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;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResponsesHostServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&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;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&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;/p&gt;
&lt;h2 id="два-протокола-один-агент"&gt;Два Протокола, Один Агент&lt;/h2&gt;
&lt;p&gt;Hosted Agents поддерживают два стиля эндпоинтов:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Responses&lt;/strong&gt; (&lt;code&gt;/responses&lt;/code&gt;) — совместим с OpenAI, управляет историей разговора и стримингом. Хороший выбор по умолчанию для чат-агентов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Invocations&lt;/strong&gt; (&lt;code&gt;/invocations&lt;/code&gt;) — вы определяете схему запроса/ответа. Хорошо для неконверсационных рабочих процессов.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Если вы строите что-то похожее на разговор, начните с Responses. Если вы строите API-подобного агента, который принимает структурированный ввод и возвращает структурированный вывод, Invocations даёт вам гибкость.&lt;/p&gt;
&lt;h2 id="процесс-развёртывания-с-azd"&gt;Процесс Развёртывания с &lt;code&gt;azd&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Когда вы запускаете &lt;code&gt;azd up&lt;/code&gt; с агентом MAF:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Опционально создаёт проект Foundry и развёртывает модель&lt;/li&gt;
&lt;li&gt;Упаковывает ваш код и отправляет образ в Azure Container Registry&lt;/li&gt;
&lt;li&gt;Подготавливает вычислительные ресурсы из образа ACR&lt;/li&gt;
&lt;li&gt;Назначает агенту выделенный Entra ID&lt;/li&gt;
&lt;li&gt;Открывает стабильный эндпоинт (&lt;code&gt;https://{project_endpoint}/agents/{agent_name}&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Обрабатывает всё остальное с этого момента&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Сессии сохраняются до 30 дней. Неактивные вычислительные ресурсы деподготавливаются через 15 минут и прозрачно восстанавливаются при следующем запросе. С точки зрения агента ничего не изменилось.&lt;/p&gt;
&lt;h2 id="заключение"&gt;Заключение&lt;/h2&gt;
&lt;p&gt;Расстояние между &amp;ldquo;работает локально&amp;rdquo; и &amp;ldquo;запускается в продакшене&amp;rdquo; исторически было долгим и болезненным для ИИ-агентов. Foundry Hosted Agents + MAF значительно сокращает этот разрыв. Если у вас уже есть локальный агент, построенный с Agent Framework, это стоит попробовать сегодня.&lt;/p&gt;
&lt;p&gt;Команда говорит, что GA придёт скоро — сейчас это в preview. Ознакомьтесь с &lt;a href="https://learn.microsoft.com/en-us/agent-framework/hosting/foundry-hosted-agent"&gt;документацией по интеграции MAF Hosted Agent&lt;/a&gt; и &lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet/samples/04-hosting/FoundryHostedAgents"&gt;примерами .NET&lt;/a&gt; для начала работы.&lt;/p&gt;
&lt;p&gt;Оригинальная статья: &lt;a href="https://devblogs.microsoft.com/agent-framework/from-local-to-production-deploy-your-microsoft-agent-framework-agent-with-foundry-hosted-agents/"&gt;From Local to Production: Deploy Your Microsoft Agent Framework Agent with Foundry Hosted Agents&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Foundry Local 1.1: Транскрипция в реальном времени, Embeddings и Responses API</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/foundry-local-11-transcription-embeddings-responses-api/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/foundry-local-11-transcription-embeddings-responses-api/</guid><description>Foundry Local 1.1 добавляет живую транскрипцию с микрофона, text embeddings и поддержку Responses API — всё работает локально без зависимости от облака, без сетевой задержки, без платы за токен.</description><content:encoded>&lt;p&gt;Foundry Local 1.0 доказал концепцию: запускать модели ИИ локально на Windows, macOS (Apple Silicon) и Linux x64 с дружественным для разработчиков SDK. Версия 1.1 добавляет три возможности, покрывающие множество реальных производственных сценариев.&lt;/p&gt;
&lt;h2 id="живая-транскрипция-аудио"&gt;Живая транскрипция аудио&lt;/h2&gt;
&lt;p&gt;Наиболее значимая новая функция: потоковое преобразование речи в текст в реальном времени непосредственно с микрофона. Субтитры, голосовые интерфейсы, транскрипция встреч, инструменты доступности — всё работает локально без каких-либо облачных зависимостей.&lt;/p&gt;
&lt;p&gt;API является сессионным и передаёт результаты по мере их поступления с маркерами &lt;code&gt;is_final&lt;/code&gt; для разграничения промежуточного и финализированного текста. Доступно для всех языковых привязок: JavaScript, C#, Python и Rust.&lt;/p&gt;
&lt;p&gt;Загрузите потоковую речевую модель из каталога, создайте сессию с настройками аудио (частота дискретизации, каналы, язык), запустите её, отправляйте необработанные PCM-аудиочанки и потребляйте асинхронный поток результатов. В статье есть полные примеры на Python и C#.&lt;/p&gt;
&lt;h2 id="text-embeddings"&gt;Text Embeddings&lt;/h2&gt;
&lt;p&gt;Семантический поиск, RAG-пайплайны, кластеризация, сопоставление по схожести — всё это требует embeddings. Foundry Local 1.1 добавляет поддержку embedding-моделей, чтобы генерировать векторы локально из того же SDK без отправки данных на облачный эндпоинт.&lt;/p&gt;
&lt;p&gt;Для приложений, где важна резидентность данных или где обрабатывается чувствительный контент, локальная генерация embeddings является значимой возможностью.&lt;/p&gt;
&lt;h2 id="responses-api"&gt;Responses API&lt;/h2&gt;
&lt;p&gt;Foundry Local теперь поддерживает &lt;a href="https://platform.openai.com/docs/api-reference/responses"&gt;Responses API&lt;/a&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;Мультимодальный ввод vision-language&lt;/strong&gt; — передавайте изображение + текст моделям с поддержкой зрения&lt;/li&gt;
&lt;li&gt;Совместимость со стандартной формой API, поэтому существующие агенты, нацеленные на Responses API OpenAI, работают с локальными моделями&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="улучшения-размера-пакета"&gt;Улучшения размера пакета&lt;/h2&gt;
&lt;p&gt;Два изменения уменьшают размер пакета JavaScript:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Слой FFI &lt;code&gt;koffi&lt;/code&gt; был заменён на пользовательский Node-API C аддон&lt;/li&gt;
&lt;li&gt;Провайдер выполнения WebGPU поставляется как отдельный плагин, так что приложениям без GPU-ускорения не нужно платить за его размер&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SDK для C# теперь нацелен на более низкие версии фреймворка для более широкой совместимости с .NET.&lt;/p&gt;
&lt;h2 id="почему-это-важно"&gt;Почему это важно&lt;/h2&gt;
&lt;p&gt;Три возможности вместе — транскрипция, embeddings, вызов инструментов — покрывают основные строительные блоки многих приложений ИИ. Запуск их локально означает:&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;Стабильная задержка независимо от сетевых условий&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Foundry Local — правильный выбор для edge-сценариев, чувствительных к конфиденциальности рабочих нагрузок, офлайн-приложений или всего, где нужно избежать облачной зависимости во время разработки.&lt;/p&gt;
&lt;p&gt;Оригинальный пост: &lt;a href="https://devblogs.microsoft.com/foundry/foundry-local-v1-1/"&gt;Foundry Local 1.1: Live Transcription, Embeddings, and Responses API&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Cosmos DB Shell В Публичной Предварительной Версии — И В Нём Встроен MCP-Сервер</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/cosmosdb-shell-public-preview-mcp-server-cli/</link><pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/cosmosdb-shell-public-preview-mcp-server-cli/</guid><description>Azure Cosmos DB Shell — это новый CLI с открытым исходным кодом, который предоставляет команды базы данных как инструменты MCP. Ваши ИИ-агенты могут навигировать по контейнерам, выполнять запросы и управлять данными, используя тот же интерфейс, что используете вы.</description><content:encoded>&lt;p&gt;Если вы когда-либо вынуждены были переключаться между вкладкой портала, примером SDK и незаконченным скриптом только для ответа на один вопрос о Cosmos DB, вы уже знаете трение, которое этот проект призван устранить.&lt;/p&gt;
&lt;p&gt;Azure Cosmos DB Shell только что вошёл в публичную предварительную версию. Это CLI с открытым исходным кодом с bash-подобным синтаксисом и — часть, которая делает это интересным — встроенным MCP-сервером.&lt;/p&gt;
&lt;h2 id="что-отличает-его-от-других-cli-баз-данных"&gt;Что Отличает Его от Других CLI Баз Данных&lt;/h2&gt;
&lt;p&gt;CLI сам по себе полезен: знакомые команды, поддержка скриптов, интеграция CI/CD. Эта часть — минимальный стандарт для инструмента базы данных, ориентированного на разработчиков.&lt;/p&gt;
&lt;p&gt;Интересная часть — интеграция MCP-сервера. Каждая команда, которую предоставляет CLI, становится доступной как MCP-инструмент, который ваши ИИ-агенты могут вызывать. Нет пользовательского API-слоя, нет кода интеграции для написания. Ваш агент может:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Навигировать по иерархиям баз данных с помощью &lt;code&gt;cd&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;pwd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Выполнять SQL-запросы с помощью &lt;code&gt;query&lt;/code&gt; и получать структурированные результаты&lt;/li&gt;
&lt;li&gt;Создавать и изменять элементы с помощью &lt;code&gt;create item&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;rm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Управлять базами данных и контейнерами с помощью &lt;code&gt;mkdb&lt;/code&gt;, &lt;code&gt;mkcon&lt;/code&gt;, &lt;code&gt;rmdb&lt;/code&gt;, &lt;code&gt;rmcon&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Инспектировать текущий контекст с помощью &lt;code&gt;endpoint&lt;/code&gt;, &lt;code&gt;pwd&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ключевое изменение: ваш агент не общается с API Cosmos DB — он общается с тем же интерфейсом оболочки, который используете вы. Команды детерминированы, поддаются аудиту и имеют открытый исходный код, так что вы можете проверить, что именно происходит.&lt;/p&gt;
&lt;h2 id="основа-с-открытым-исходным-кодом-важна"&gt;Основа с Открытым Исходным Кодом Важна&lt;/h2&gt;
&lt;p&gt;Это не управляемый сервис &amp;ldquo;чёрного ящика&amp;rdquo;. Оболочка имеет открытый исходный код, что означает:&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;Для корпоративных команд, внедряющих инструменты ИИ, &amp;ldquo;можем ли мы точно видеть, как это работает&amp;rdquo; всё реже является необязательным требованием. Открытый исходный код здесь — значимое отличие.&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;strong&gt;Автономное управление данными&lt;/strong&gt; — рабочие процессы, которым необходимо создавать, обновлять или удалять данные в Cosmos DB, могут делать это через MCP-инструменты без необходимости пользовательской интеграции.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Мониторинг и оповещения в реальном времени&lt;/strong&gt; — агент может периодически запрашивать контейнеры, сравнивать результаты и выявлять аномалии через подходящий канал уведомлений.&lt;/p&gt;
&lt;p&gt;Интерфейс MCP делает эти сценарии компонуемыми с любой ИИ-платформой, поддерживающей MCP — не только с инструментами Microsoft.&lt;/p&gt;
&lt;h2 id="с-чего-начать"&gt;С Чего Начать&lt;/h2&gt;
&lt;p&gt;Оболочка находится в публичной предварительной версии. Установите её, настройте подключение к Cosmos DB и включите MCP-сервер. После этого любой совместимый с MCP хост агента может обнаружить и использовать инструменты.&lt;/p&gt;
&lt;p&gt;Оригинальный пост: &lt;a href="https://devblogs.microsoft.com/cosmosdb/azure-cosmos-db-shell-public-preview-ai-mcp-cli/"&gt;Announcing the Public Preview of Azure Cosmos DB Shell: Open-Source Power Meets AI-Driven Database Automation&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>У Вашего ИИ-Агента Проблема с Идентификацией (И Вот Шаблон, Который Её Решает)</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azd-least-privilege-ai-agents-oauth-token-pattern/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azd-least-privilege-ai-agents-oauth-token-pattern/</guid><description>Новый шаблон azd от Curity и Microsoft показывает, как создавать ИИ-агентов, использующих краткосрочные токены OAuth с детально настроенными областями — чтобы агенты никогда не могли видеть данные, которые не должны видеть.</description><content:encoded>&lt;p&gt;Есть момент в каждом проекте ИИ-агента, который выглядит примерно так: демо работает идеально, агент интерпретирует естественный язык, вызывает нужные API, возвращает нужные данные. Затем вы начинаете думать о реальных пользователях.&lt;/p&gt;
&lt;p&gt;Что мешает сессии агента одного пользователя видеть данные другого пользователя? Что если агент будет обманут через инъекцию промпта? Что если он вызовет инструмент неожиданным образом?&lt;/p&gt;
&lt;p&gt;Это не крайние случаи. Это проектные решения, которые нужно принять перед запуском.&lt;/p&gt;
&lt;p&gt;Новый шаблон &lt;code&gt;azd&lt;/code&gt; от Curity и Microsoft даёт вам рабочий эталон именно для этой проблемы.&lt;/p&gt;
&lt;h2 id="основная-проблема-аутентификация--авторизация"&gt;Основная Проблема: Аутентификация ≠ Авторизация&lt;/h2&gt;
&lt;p&gt;Большинство примеров агентов хорошо справляются с аутентификацией пользователей. Они плохо справляются с авторизацией. Знание &lt;em&gt;кто&lt;/em&gt; является пользователем не говорит вам, &lt;em&gt;какие данные&lt;/em&gt; он должен видеть.&lt;/p&gt;
&lt;p&gt;Традиционное клиентское приложение делает предсказуемые вызовы API. ИИ-агент не является детерминированным — он интерпретирует естественный язык и решает, что вызывать. Он может быть творческим. Он также может ошибаться. И если он манипулируется через инъекцию промпта, вам нужны правила, которые не зависят от хорошего поведения ИИ.&lt;/p&gt;
&lt;p&gt;Решение, которое демонстрирует этот шаблон: &lt;strong&gt;краткосрочные токены, несущие именно правильную информацию для каждого перехода&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="как-работает-цепочка-токенов"&gt;Как Работает Цепочка Токенов&lt;/h2&gt;
&lt;p&gt;Шаблон использует токены доступа OAuth 2.0 с обменом токенов для сужения разрешений на каждом шаге. Токен пользователя обменивается дважды, прежде чем достигнет MCP-сервера:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Первый обмен&lt;/strong&gt; — сужает область применения и преобразует непрозрачный токен в JWT&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Второй обмен&lt;/strong&gt; — добавляет идентификацию агента и новую аудиторию для перехода к MCP-серверу&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Как выглядит токен MCP-сервера:&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;scope&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;stocks/read&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;sub&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;62c839b8...&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;aud&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://mcp.demo.example&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;customer_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;178&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;region&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;USA&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;code&gt;customer_id&lt;/code&gt; встроен в токен сервером авторизации, а не передаётся как параметр, которым управляет агент. API проверяет токен, а не инструкции агента.&lt;/p&gt;
&lt;p&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;ul&gt;
&lt;li&gt;Бэкенд-агент на Microsoft Foundry (C#, SDK Microsoft A2A и MCP)&lt;/li&gt;
&lt;li&gt;MCP-сервер, предоставляющий пример портфельного API&lt;/li&gt;
&lt;li&gt;Curity Identity Server в качестве сервера авторизации, наряду с Entra ID для аутентификации&lt;/li&gt;
&lt;li&gt;Внешние и внутренние API-шлюзы, обрабатывающие обмен токенов и журналирование аудита&lt;/li&gt;
&lt;li&gt;Bicep для всей инфраструктуры Azure: Container Apps, VNet, ACR, Azure AI Foundry, Key Vault, Azure SQL Database, хранилище&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Весь шаблон поддаётся проверке и настройке.&lt;/p&gt;
&lt;h2 id="принцип-дизайна-достойный-заимствования"&gt;Принцип Дизайна, Достойный Заимствования&lt;/h2&gt;
&lt;p&gt;Даже если вы не используете Curity, шаблон можно перенести: &lt;strong&gt;агенты никогда не должны иметь постоянный доступ к API&lt;/strong&gt;. Каждое действие должно использовать краткосрочный токен с минимальной областью применения, необходимой для этого конкретного вызова, выданный для конкретной идентификации агента, несущий утверждения, которые API нужны для принятия решений об авторизации.&lt;/p&gt;
&lt;p&gt;Это устойчиво к творческим агентам, ошибкам и инъекции промпта теми способами, которыми «просто убедитесь, что агент не делает плохих вещей» никогда не будет.&lt;/p&gt;
&lt;h2 id="заключение"&gt;Заключение&lt;/h2&gt;
&lt;p&gt;Шаблоны безопасности для ИИ-агентов всё ещё разрабатываются в отрасли. Этот шаблон является одной из наиболее полных эталонных реализаций, которые я видел — он охватывает фактический поток авторизации, а не только аутентификацию.&lt;/p&gt;
&lt;p&gt;Оригинальный пост: &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-curity-least-privilege-ai-agents/"&gt;Least privilege AI agents: A new azd template from Curity and Microsoft&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Частные Endpoints, VNets, NSG — Aspire Теперь Управляет Сетью</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/aspire-azure-enterprise-networking-private-endpoints/</link><pubDate>Tue, 19 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/aspire-azure-enterprise-networking-private-endpoints/</guid><description>Новая поддержка корпоративных сетей Azure для Aspire позволяет моделировать VNet, частные endpoints, NAT-шлюзы, NSG и периметры сетевой безопасности прямо в AppHost — без дрейфа инфраструктуры.</description><content:encoded>&lt;p&gt;Я видел этот сценарий слишком много раз. Приложение готово. Демонстрация великолепна. Затем появляется чеклист безопасности: убрать хранилище из публичного интернета, запустить внутри VNet, предоставить исходящие IP для allowlist партнёра, доказать, что только правильные подсети общаются с правильными сервисами.&lt;/p&gt;
&lt;p&gt;В этот момент модель приложения и модель инфраструктуры начинают расходиться способами, которые болезненно поддерживать.&lt;/p&gt;
&lt;p&gt;Новая поддержка корпоративных сетей Azure для Aspire решает это напрямую. Вы описываете форму сети рядом с ресурсами, которые её используют, в вашем AppHost.&lt;/p&gt;
&lt;h2 id="строительные-блоки"&gt;Строительные блоки&lt;/h2&gt;
&lt;p&gt;Вот для чего предназначена каждая концепция сети Azure, в кратком изложении:&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;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;td&gt;Сетевая граница для подсетей, частных endpoints и маршрутизации&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Подсеть&lt;/td&gt;
&lt;td&gt;Вам нужно разделить рабочие нагрузки внутри VNet&lt;/td&gt;
&lt;td&gt;Каждая часть системы получает свой собственный диапазон адресов и поверхность политики&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Делегированная подсеть&lt;/td&gt;
&lt;td&gt;Платформенный сервис (например, ACA) должен управлять подсетью&lt;/td&gt;
&lt;td&gt;Позволяет сервису безопасно размещать управляемую инфраструктуру в вашей VNet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NAT-шлюз&lt;/td&gt;
&lt;td&gt;Вам нужны предсказуемые исходящие публичные IP&lt;/td&gt;
&lt;td&gt;Стабильный адрес для allowlist и аудита&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Частный endpoint&lt;/td&gt;
&lt;td&gt;Вы хотите, чтобы ресурс PaaS был доступен приватно&lt;/td&gt;
&lt;td&gt;Помещает частный IP для этого сервиса внутри вашей VNet, убирает публичную экспозицию&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NSG&lt;/td&gt;
&lt;td&gt;Вам нужны правила трафика на уровне подсети&lt;/td&gt;
&lt;td&gt;Явное разрешение/запрет для входящего и исходящего трафика на подсеть&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="описание-в-apphost"&gt;Описание в AppHost&lt;/h2&gt;
&lt;p&gt;Ключевое изменение здесь состоит в том, что вы моделируете сеть &lt;em&gt;вместе&lt;/em&gt; с ресурсами, которые её используют, а не в отдельном файле Bicep, который со временем расходится с моделью приложения.&lt;/p&gt;
&lt;p&gt;Из AppHost вы можете:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Создавать VNet и подсети с &lt;code&gt;AddVirtualNetwork()&lt;/code&gt; и &lt;code&gt;AddSubnet()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Прикреплять NAT-шлюз к подсетям для стабильных исходящих IP&lt;/li&gt;
&lt;li&gt;Создавать частные endpoints для хранилища, Key Vault, SQL и других PaaS-сервисов&lt;/li&gt;
&lt;li&gt;Определять NSG с правилами входящей и исходящей безопасности&lt;/li&gt;
&lt;li&gt;Настраивать периметры сетевой безопасности для межресурсных политик&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В результате когда вы запускаете &lt;code&gt;azd up&lt;/code&gt;, инфраструктура соответствует тому, что модель приложения говорит, что ей нужно. Не то, что говорит вручную поддерживаемый шаблон.&lt;/p&gt;
&lt;h2 id="почему-это-важно-для-реальных-приложений"&gt;Почему Это Важно для Реальных Приложений&lt;/h2&gt;
&lt;p&gt;Несколько вещей, которые становятся значительно проще, как только сеть смоделирована в Aspire:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Частные endpoints для Key Vault и хранилища&lt;/strong&gt; — вы описываете &lt;code&gt;WithPrivateEndpoint()&lt;/code&gt; на этих ресурсах, и Aspire берёт на себя настройку DNS-зон и присоединение endpoints. Приложение никогда не меняется.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Стабильные исходящие IP&lt;/strong&gt; — добавьте NAT-шлюз к соответствующей подсети, и каждый исходящий запрос вашего приложения проходит через известный, стабильный IP. Партнёры могут добавить его в allowlist. Аудиторы могут его отследить.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Правила NSG из кода&lt;/strong&gt; — вместо того чтобы кликать по порталу или поддерживать фрагмент Bicep, ваши правила безопасности живут в AppHost рядом с ресурсами, которые они защищают.&lt;/p&gt;
&lt;p&gt;Это тот тип интеграции, который не делает демонстрации захватывающими, но делает производственные системы обслуживаемыми.&lt;/p&gt;
&lt;h2 id="итог"&gt;Итог&lt;/h2&gt;
&lt;p&gt;Сетевая безопасность, появляющаяся поздно в жизненном цикле проекта, — решённая проблема, если вы моделируете её вместе с приложением с самого начала. Поддержка корпоративных сетей Aspire делает это возможным без необходимости отдельного инфраструктурного трека.&lt;/p&gt;
&lt;p&gt;Полные подробности в оригинальном посте: &lt;a href="https://devblogs.microsoft.com/aspire/aspire-azure-enterprise-networking/"&gt;Securing Azure apps with Aspire enterprise networking&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.3: Поддержка Kubernetes, журналы браузера и навык Aspireify</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/aspire-133-kubernetes-browser-logs-aspireify/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/aspire-133-kubernetes-browser-logs-aspireify/</guid><description>Через пять недель после 13.2 выходит Aspire 13.3 с 45 новыми функциями, включая первоклассное развёртывание AKS, навык онбординга с ИИ, захват журналов браузера и структурированные результаты команд.</description><content:encoded>&lt;p&gt;Пять недель — небольшой срок для релиза, но Aspire 13.3 так не ощущается. Ключевые элементы весомые: первоклассное развёртывание Kubernetes и AKS с Helm, навык онбординга с помощью агента под названием Aspireify, захват журналов браузера прямо в дашборде и структурированные результаты команд. Плюс 45 новых функций, 134 улучшения и 93 исправления ошибок.&lt;/p&gt;
&lt;p&gt;Давайте разберём основные моменты.&lt;/p&gt;
&lt;h2 id="aspireify-онбординг-с-помощью-агента"&gt;Aspireify: Онбординг с помощью агента&lt;/h2&gt;
&lt;p&gt;Добавление Aspire к существующему проекту звучит просто — добавьте AppHost, готово. На практике это требует немало исследований: какие порты важны, какие переменные окружения являются реальными зависимостями, какие сервисы Docker Compose должны отображаться на интеграции Aspire.&lt;/p&gt;
&lt;p&gt;Новый &lt;strong&gt;навык Aspireify&lt;/strong&gt; даёт вашему агенту кодирования управляемый рабочий процесс именно для этого. Когда &lt;code&gt;aspire init&lt;/code&gt; создаёт скелетный AppHost, навык Aspireify помогает агенту проверить репозиторий, понять как он уже работает и подключить AppHost так, чтобы он соответствовал приложению — а не наоборот.&lt;/p&gt;
&lt;p&gt;Позиция по умолчанию — &amp;ldquo;минимизировать изменения в вашем коде.&amp;rdquo; Если ваше приложение уже читает &lt;code&gt;DATABASE_URL&lt;/code&gt;, агент сопоставляет это с &lt;code&gt;WithEnvironment()&lt;/code&gt; вместо того, чтобы просить вас переписать конфигурацию. Если порт жёстко задан, навык указывает агенту, когда его сохранить.&lt;/p&gt;
&lt;p&gt;Это именно тот тип ИИ-инструментов, который реально экономит время, а не генерирует больше работы для проверки.&lt;/p&gt;
&lt;h2 id="первоклассное-развёртывание-kubernetes-и-aks"&gt;Первоклассное развёртывание Kubernetes и AKS&lt;/h2&gt;
&lt;p&gt;Это было в списке пожеланий уже давно. Aspire 13.3 поставляется с &lt;strong&gt;первоклассной поддержкой развёртывания Kubernetes и AKS с Helm&lt;/strong&gt;. Теперь вы можете указывать AKS в качестве целевого объекта развёртывания прямо из инструментов Aspire.&lt;/p&gt;
&lt;p&gt;Для команд, которые уже запускают производственные нагрузки на AKS, это закрывает значительный пробел. Ваша модель приложения Aspire теперь имеет чёткий путь от локальной разработки до Kubernetes без ручного создания Helm-чартов.&lt;/p&gt;
&lt;h2 id="журналы-браузера-в-дашборде"&gt;Журналы браузера в дашборде&lt;/h2&gt;
&lt;p&gt;Это одна из тех функций, которые кажутся небольшими, пока вы не отлаживаете проблему с фронтендом.&lt;/p&gt;
&lt;p&gt;Новый API &lt;code&gt;WithBrowserLogs()&lt;/code&gt; прикрепляет отслеживаемый ресурс браузера к любому ресурсу, поддерживающему endpoint&amp;rsquo;ы. Aspire запускает Chromium с использованием приватного CDP-пайпа и передаёт журналы консоли, сетевые запросы и ошибки прямо в поток журналов ресурса:&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;var&lt;/span&gt; &lt;span class="n"&gt;frontend&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&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="n"&gt;WithHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3000&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;WithBrowserLogs&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;TypeScript AppHost поддерживает то же самое:&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;const&lt;/span&gt; &lt;span class="nx"&gt;frontend&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;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;withHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt;: &lt;span class="kt"&gt;3000&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;withBrowserLogs&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;Ошибки консоли, неудавшиеся сетевые запросы, исключения на стороне клиента — всё видно в том же дашборде, где вы уже следите за трассировками и метриками. Больше не нужно переключаться на DevTools браузера для базовых вещей.&lt;/p&gt;
&lt;h2 id="структурированные-результаты-команд"&gt;Структурированные результаты команд&lt;/h2&gt;
&lt;p&gt;Команды ресурсов получили значительное обновление. До сих пор команды возвращали успех/неудачу. Теперь они возвращают структурированные результаты: текст, JSON или markdown, который проходит через модель, интерфейс дашборда, CLI и MCP-инструменты.&lt;/p&gt;
&lt;p&gt;Дашборд связывает всё это с новым центром уведомлений в заголовке. Результаты команд отображаются как уведомления с временными метками с рендерингом markdown и действием &amp;ldquo;Просмотреть ответ&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Это делает команды ресурсов по-настоящему компонуемыми. Интеграция теперь может предоставлять команду, которая возвращает значимый вывод — например, URL туннеля — вместо того, чтобы просто изменять состояние где-то.&lt;/p&gt;
&lt;h2 id="итог"&gt;Итог&lt;/h2&gt;
&lt;p&gt;Aspire 13.3 стоит обновления хотя бы ради поддержки Kubernetes. Журналы браузера и структурированные результаты команд — это тип улучшений качества жизни, которые быстро накапливаются в повседневном рабочем процессе разработки.&lt;/p&gt;
&lt;p&gt;Полные заметки о выпуске: &lt;a href="https://devblogs.microsoft.com/aspire/whats-new-aspire-13-3/"&gt;What&amp;rsquo;s New in Aspire 13.3&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>SDD Conference 2026</title><link>https://thedotnetblog.com/ru/events/sdd-conference-2026/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/ru/events/sdd-conference-2026/</guid><description>5-дневная конференция по разработке ПО в Barbican Centre в Лондоне с 78 сессиями и 14 воркшопами по архитектуре, .NET, ИИ, Azure, DevOps и другим темам.</description><content:encoded>&lt;p&gt;&lt;strong&gt;SDD 2026&lt;/strong&gt; проходит с &lt;strong&gt;11 по 15 мая 2026 года&lt;/strong&gt; в &lt;strong&gt;Barbican Centre в Лондоне&lt;/strong&gt;. Основная 3-дневная конференция — со вторника по четверг, с опциональными однодневными воркшопами в понедельник и пятницу.&lt;/p&gt;
&lt;p&gt;С &lt;strong&gt;78 сессиями&lt;/strong&gt; и &lt;strong&gt;14 воркшопами&lt;/strong&gt; это одна из самых насыщенных конференций для разработчиков в Европе.&lt;/p&gt;
&lt;h2 id="темы"&gt;Темы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Архитектурное мышление&lt;/li&gt;
&lt;li&gt;Функциональный код на C# 13&lt;/li&gt;
&lt;li&gt;Serverless-дизайн&lt;/li&gt;
&lt;li&gt;Семантический ИИ&lt;/li&gt;
&lt;li&gt;Azure Kubernetes Services&lt;/li&gt;
&lt;li&gt;Lean DevOps стратегии&lt;/li&gt;
&lt;li&gt;Протокол контекста модели (MCP)&lt;/li&gt;
&lt;li&gt;Агентный ИИ в .NET&lt;/li&gt;
&lt;li&gt;Рефакторинг монолита&lt;/li&gt;
&lt;li&gt;Быстрее программировать с LLM&lt;/li&gt;
&lt;li&gt;Криптография в постквантовом мире&lt;/li&gt;
&lt;li&gt;Local-First разработка&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="спикеры"&gt;Спикеры&lt;/h2&gt;
&lt;p&gt;Программу мирового класса представляют &lt;strong&gt;Kevlin Henney&lt;/strong&gt;, &lt;strong&gt;Neal Ford&lt;/strong&gt;, &lt;strong&gt;Sander Hoogendoorn&lt;/strong&gt;, &lt;strong&gt;Andrew Clymer&lt;/strong&gt;, &lt;strong&gt;Jacqui Read&lt;/strong&gt;, &lt;strong&gt;Christian Weyer&lt;/strong&gt;, &lt;strong&gt;Jeff Prosise&lt;/strong&gt;, &lt;strong&gt;Jules May&lt;/strong&gt;, &lt;strong&gt;Oliver Sturm&lt;/strong&gt; и &lt;strong&gt;Raju Gandhi&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="билеты-и-информация"&gt;Билеты и информация&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sddconf.com/"&gt;Сайт мероприятия&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sddvault.s3.amazonaws.com/assets/SDD_2026_schedule.pdf"&gt;PDF полного расписания&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sddconf.com/register"&gt;Варианты регистрации&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;98% участников SDD 2025 оценили общее впечатление как хорошее, очень хорошее или отличное.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server на Azure App Service — без контейнеров</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/</guid><description>SQL MCP Server теперь может работать на Azure App Service без Docker и Kubernetes. Что это значит для .NET-разработчиков, создающих AI-агентов для работы с SQL-базами данных.</description><content:encoded>&lt;p&gt;&lt;em&gt;Этот пост переведён автоматически. Чтобы прочитать оригинал, &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/"&gt;нажмите здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Честно говоря: каждый раз, когда в туториале вижу «требует контейнер», где-то внутри вздыхаю. Контейнеры великолепны — пока у вашей команды нет стратегии контейнеризации, и функция, казавшаяся простой, вдруг упирается в неожиданную оркестрационную сложность, которую никто не планировал.&lt;/p&gt;
&lt;p&gt;Именно поэтому это привлекло моё внимание. SQL MCP Server теперь может работать на Azure App Service — без Docker, без Kubernetes, только с тем же конфигурационным файлом Data API Builder (DAB), который открывает ваш SQL-датабаз через MCP, REST и GraphQL.&lt;/p&gt;
&lt;h2 id="что-такое-sql-mcp-server"&gt;Что такое SQL MCP Server?&lt;/h2&gt;
&lt;p&gt;Кратко для тех, кто ещё не знаком. SQL MCP Server располагается между вашим AI-агентом и SQL-базой данных. Вместо того чтобы давать агенту прямой доступ к базе данных (ужасная идея), он открывает ваши таблицы и представления как уровень абстракции — сущности с определёнными правами доступа.&lt;/p&gt;
&lt;p&gt;Построен на &lt;a href="https://learn.microsoft.com/ru-ru/azure/data-api-builder/"&gt;Data API Builder&lt;/a&gt;, что означает: один конфигурационный файл управляет MCP &lt;em&gt;и&lt;/em&gt; REST &lt;em&gt;и&lt;/em&gt; GraphQL одновременно. Ваш агент общается с MCP-эндпоинтом. Традиционное приложение общается с REST или GraphQL. Одна конфигурация, одна среда выполнения, разные интерфейсы.&lt;/p&gt;
&lt;p&gt;Это действительно удобно. Не нужно поддерживать два отдельных API-слоя.&lt;/p&gt;
&lt;h2 id="проблема-контейнеров-и-её-решение"&gt;Проблема контейнеров (и её решение)&lt;/h2&gt;
&lt;p&gt;Изначальная модель развёртывания SQL MCP Server использовала контейнеры. Это хорошо работает во многих командах — но не во всех. Многие .NET-команды стандартизировались на Azure App Service или виртуальных машинах. Требовать контейнерный runtime только ради одного SQL-эндпоинта — это лишнее трение, которого никто не просил.&lt;/p&gt;
&lt;p&gt;Новое руководство показывает, как обойтись без контейнера вовсе. Всё работает через команду &lt;code&gt;dab start&lt;/code&gt;, запущенный как стандартный .NET 8 веб-процесс на App Service.&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;# Установка Data API Builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet tool install microsoft.dataapibuilder --prerelease -g
&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;# Инициализация конфигурации&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab init --database-type mssql --host-mode Development --connection-string &lt;span class="s2"&gt;&amp;#34;@env(&amp;#39;SQL_CONNECTION_STRING&amp;#39;)&amp;#34;&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;# Добавление сущности&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab add products --source dbo.products --permissions &lt;span class="s2"&gt;&amp;#34;authenticated:*&amp;#34;&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;# Настройка провайдера аутентификации App Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab configure --runtime.host.authentication.provider AppService
&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;# Запуск сервера&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;На этом этапе у вас есть MCP по адресу &lt;code&gt;/mcp&lt;/code&gt;, REST и GraphQL из того же процесса — и ничего в контейнере.&lt;/p&gt;
&lt;h2 id="аутентификация-без-общих-api-ключей"&gt;Аутентификация без общих API-ключей&lt;/h2&gt;
&lt;p&gt;Это та часть, которую я ценю больше всего. При развёртывании на App Service вы настраиваете Microsoft Entra ID в качестве провайдера аутентификации. Никаких общих секретов в конфигурационных файлах, никаких API-ключей для ротации.&lt;/p&gt;
&lt;p&gt;Строка подключения хранится в переменных среды App Service (не в &lt;code&gt;dab-config.json&lt;/code&gt;), а MCP-эндпоинт защищён платформенной аутентификацией. Если ваши Azure-нагрузки уже используют Entra ID, интеграция происходит органично.&lt;/p&gt;
&lt;p&gt;Для локальной разработки переключайтесь в режим &lt;code&gt;Simulator&lt;/code&gt; и STDIO-транспорт. Возвращайтесь к режиму &lt;code&gt;AppService&lt;/code&gt; перед развёртыванием. Чисто и явно.&lt;/p&gt;
&lt;h2 id="развёртывание-на-app-service"&gt;Развёртывание на App Service&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;az appservice plan create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;plan-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --sku B1 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --is-linux
&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;az webapp create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;app-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --plan &amp;lt;plan-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --runtime &lt;span class="s2"&gt;&amp;#34;DOTNETCORE:8.0&amp;#34;&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;az webapp config &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;app-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --startup-file &lt;span class="s2"&gt;&amp;#34;dab start&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Затем разверните свой DAB-проект методом, который уже использует ваша команда. Ключевой момент: это развёртывание &lt;strong&gt;кода&lt;/strong&gt;, а не контейнера.&lt;/p&gt;
&lt;h2 id="почему-это-важно-для-net-разработчиков"&gt;Почему это важно для .NET-разработчиков&lt;/h2&gt;
&lt;p&gt;Если вы создаёте AI-агентов на .NET, рано или поздно им нужно будет работать с базой данных. SQL MCP Server предоставляет структурированный способ сделать это — без открытия сырых строк подключения или написания собственных API-слоёв.&lt;/p&gt;
&lt;p&gt;Ознакомьтесь с полным руководством в &lt;a href="https://devblogs.microsoft.com/azure-sql/sql-mcp-server-app-service/"&gt;оригинальной статье&lt;/a&gt; и &lt;a href="https://github.com/Azure-Samples/SQL-MCP-NoContainer"&gt;примере на GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="итог"&gt;Итог&lt;/h2&gt;
&lt;p&gt;SQL MCP Server на App Service — практичный выбор для .NET-команд, которые хотят дать агентам структурированный доступ к SQL-данным без контейнерной стратегии. Попробуйте — ваши агенты оценят чистый API-интерфейс.&lt;/p&gt;</content:encoded></item><item><title>Устранение Рутинной Работы Миграции с Помощью Agentic Platform Engineering</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/agentic-platform-engineering-migration-automation/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/agentic-platform-engineering-migration-automation/</guid><description>Git-Ape демонстрирует миграцию реального AWS Terraform-развёртывания в Azure Bicep — извлекая намерение развёртывания и переопределяя архитектуру вместо конвертации синтаксиса 1:1.</description><content:encoded>&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Для оригинальной версии &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/agentic-platform-engineering-migration-automation/"&gt;нажмите здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/all-things-azure/removing-the-monkey-work-of-migration-using-agentic-platform-engineering/"&gt;Removing the Monkey Work of Migration with Agentic Platform Engineering&lt;/a&gt; — руководство по Git-Ape (инструменту git для агентной инженерии платформ), который мигрирует реальный репозиторий AWS Terraform в Azure, фокусируясь на извлечении намерения вместо построчного преобразования.&lt;/p&gt;
&lt;h2 id="входные-данные-contoso-migration"&gt;Входные данные: contoso-migration&lt;/h2&gt;
&lt;p&gt;Источником является реальный проект Terraform (&lt;code&gt;contoso-migration&lt;/code&gt;), который разворачивает приложение Next.js на AWS — EC2 для вычислений, ALB для балансировки нагрузки, S3 для артефактов и ключи IAM для идентификации. Стоимость: ~34 $/месяц. Цель — не воспроизвести ту же инфраструктуру в Azure; речь идёт о том, чтобы понять, что развёртывание действительно пытается сделать, и воссоздать это с помощью нативных сервисов Azure.&lt;/p&gt;
&lt;h2 id="шаг-1-валидация-и-аутентификация"&gt;Шаг 1: Валидация и аутентификация&lt;/h2&gt;
&lt;p&gt;Git-Ape начинает с проверки всех необходимых инструментов CLI — &lt;code&gt;az&lt;/code&gt;, &lt;code&gt;aws&lt;/code&gt;, &lt;code&gt;gh&lt;/code&gt;, &lt;code&gt;jq&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt; — и подтверждения активных сеансов аутентификации перед тем, как что-либо трогать. Никаких частичных запусков.&lt;/p&gt;
&lt;h2 id="шаг-2-извлечение-намерения"&gt;Шаг 2: Извлечение намерения&lt;/h2&gt;
&lt;p&gt;Агент читает весь исходный репозиторий через API GitHub и извлекает намерение развёртывания: среда выполнения (Node.js), тип вычислений, шаблон ingress, обработка артефактов, модель идентификации, сеть и мониторинг. Это ключевой шаг — строится семантическая модель того, что делает развёртывание, а не какие ключевые слова Terraform оно использует.&lt;/p&gt;
&lt;h2 id="шаг-3-сопоставление-сервисов"&gt;Шаг 3: Сопоставление сервисов&lt;/h2&gt;
&lt;p&gt;Сервисы AWS сопоставляются с эквивалентами Azure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EC2 → App Service (Linux, Node 20 LTS)&lt;/li&gt;
&lt;li&gt;ALB → Встроенная балансировка нагрузки App Service&lt;/li&gt;
&lt;li&gt;Роли/ключи IAM → Managed Identity&lt;/li&gt;
&lt;li&gt;Terraform → Bicep + GitHub Actions&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="шаг-4-агент-критик"&gt;Шаг 4: Агент-критик&lt;/h2&gt;
&lt;p&gt;Перед генерацией вывода запускается агент-критик, который обнаруживает две блокирующие проблемы:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Антипаттерн сборки при запуске&lt;/strong&gt; — исходный Terraform запускал &lt;code&gt;npm install &amp;amp;&amp;amp; npm run build&lt;/code&gt; на EC2 при старте. Исправление: собирать в CI, разворачивать готовый артефакт.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ненужный Blob Storage&lt;/strong&gt; — S3 использовался для промежуточного хранения артефактов, что можно устранить при правильном CI/CD. Агент-критик полностью удалил его.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="шаг-5-сгенерированный-вывод"&gt;Шаг 5: Сгенерированный вывод&lt;/h2&gt;
&lt;p&gt;Результатом являются ~80 строк Bicep вместо оригинальных 200+ строк Terraform. Агент создал новый репозиторий GitHub с &lt;code&gt;infra/main.bicep&lt;/code&gt; и &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt; и удалил все файлы, специфичные для AWS.&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;AWS оригинал&lt;/th&gt;
&lt;th&gt;Вывод Azure&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Только HTTP&lt;/td&gt;
&lt;td&gt;Только HTTPS, TLS 1.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH открыт для 0.0.0.0/0&lt;/td&gt;
&lt;td&gt;Нет SSH-экспозиции&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ключи доступа IAM&lt;/td&gt;
&lt;td&gt;OIDC + Managed Identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Нет мониторинга&lt;/td&gt;
&lt;td&gt;Application Insights&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Стоимость: ~13 $/месяц против первоначальных 34 $/месяц.&lt;/p&gt;
&lt;h2 id="чем-это-отличается-от-конвертора-синтаксиса"&gt;Чем это отличается от конвертора синтаксиса&lt;/h2&gt;
&lt;p&gt;Шаг агента-критика — вот что отличает это от механического перевода. Он обнаружил паттерны, которые работали бы на AWS, но были бы неверны на Azure — и исправил их вместо того, чтобы воспроизводить. Вывод — это не «AWS в синтаксисе Azure»; это нативное для Azure развёртывание, которое достигает той же цели более чисто.&lt;/p&gt;
&lt;p&gt;Смотрите &lt;a href="https://devblogs.microsoft.com/all-things-azure/removing-the-monkey-work-of-migration-using-agentic-platform-engineering/"&gt;полное руководство&lt;/a&gt; для полной трассировки агента и сгенерированных файлов.&lt;/p&gt;</content:encoded></item><item><title>SQL Server 2025 как База Данных для Агентов: Безопасность, Бэкап и MCP в Одном Движке</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</link><pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/</guid><description>Финальная часть серии Polyglot Tax разбирает сложные задачи производства: единая Row-Level Security по реляционным, JSON, граф и векторным данным, плюс MCP-интеграция.</description><content:encoded>&lt;p&gt;&lt;em&gt;Этот пост был автоматически переведён. Для оригинальной версии &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/sql-server-2025-agent-ready-security-mcp/"&gt;нажмите здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Я следил за серией Polyglot Tax Адитьи Бадрамраджу с большим интересом. Часть 4 завершает серию частями, которые реально определяют, доверяли бы вы этой архитектуре в продакшне.&lt;/p&gt;
&lt;h2 id="одна-модель-безопасности-для-всех-моделей-данных"&gt;Одна Модель Безопасности для Всех Моделей Данных&lt;/h2&gt;
&lt;p&gt;Одна политика Row-Level Security покрывает все таблицы — реляционные, JSON, граф, векторы. Одна политика, одно доказательство для аудитора.&lt;/p&gt;
&lt;h2 id="единый-бэкап--атомарное-восстановление"&gt;Единый Бэкап = Атомарное Восстановление&lt;/h2&gt;
&lt;p&gt;В полиглотном стеке point-in-time recovery через пять баз данных — это кошмар согласованности. С одной базой данных восстановление атомарно по определению.&lt;/p&gt;
&lt;h2 id="mcp-интеграция-агенты-без-middleware"&gt;MCP-Интеграция: Агенты Без Middleware&lt;/h2&gt;
&lt;p&gt;SQL Server 2025 напрямую поддерживает SQL MCP Server. Агенты вызывают инструменты, движок автоматически обеспечивает изоляцию тенантов и маскировку столбцов.&lt;/p&gt;
&lt;p&gt;Оригинальный пост Адитьи Бадрамраджу: &lt;a href="https://devblogs.microsoft.com/azure-sql/the-polyglot-tax-part-4/"&gt;The Polyglot Tax – Part 4&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server Теперь .mcpb — Установка без Какого-либо Runtime</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</guid><description>Azure MCP Server теперь доступен как MCP Bundle (.mcpb) — скачайте, перетащите в Claude Desktop, и готово. Node.js, Python или .NET не нужны.</description><content:encoded>&lt;p&gt;&lt;em&gt;Этот пост переведён автоматически. Чтобы просмотреть оригинал, &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/"&gt;нажмите здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Знаете, что раздражало в настройке MCP-серверов? Нужен был runtime. Node.js для npm-версии, Python для pip/uvx, .NET SDK для dotnet-варианта.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;Azure MCP Server только что изменил это&lt;/a&gt;. Теперь он доступен как &lt;code&gt;.mcpb&lt;/code&gt; — MCP Bundle — и настройка выполняется перетаскиванием.&lt;/p&gt;
&lt;h2 id="что-такое-mcp-bundle"&gt;Что такое MCP Bundle?&lt;/h2&gt;
&lt;p&gt;Думайте о нём как о расширении VS Code (&lt;code&gt;.vsix&lt;/code&gt;) или расширении браузера (&lt;code&gt;.crx&lt;/code&gt;), но для MCP-серверов. Файл &lt;code&gt;.mcpb&lt;/code&gt; — это автономный ZIP-архив с бинарным файлом сервера и всеми его зависимостями.&lt;/p&gt;
&lt;h2 id="как-установить"&gt;Как установить&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Скачайте bundle для вашей платформы&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Перейдите на &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server"&gt;страницу GitHub Releases&lt;/a&gt; и скачайте файл &lt;code&gt;.mcpb&lt;/code&gt; для вашей ОС и архитектуры.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Установите в Claude Desktop&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Самый простой способ: перетащите файл &lt;code&gt;.mcpb&lt;/code&gt; в окно Claude Desktop на странице настроек расширений (&lt;code&gt;☰ → Файл → Настройки → Расширения&lt;/code&gt;). Проверьте детали сервера, нажмите «Установить», подтвердите.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Аутентифицируйтесь в Azure&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;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Всё. Azure MCP Server использует ваши существующие учётные данные Azure.&lt;/p&gt;
&lt;h2 id="что-можно-делать"&gt;Что можно делать&lt;/h2&gt;
&lt;p&gt;Доступ к 100+ инструментам сервисов Azure прямо из вашего ИИ-клиента:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Запрашивать и управлять Cosmos DB, Storage, Key Vault, App Service, Foundry&lt;/li&gt;
&lt;li&gt;Генерировать команды &lt;code&gt;az&lt;/code&gt; CLI для любых задач&lt;/li&gt;
&lt;li&gt;Создавать шаблоны Bicep и Terraform&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="с-чего-начать"&gt;С чего начать&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Загрузка&lt;/strong&gt;: &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server-"&gt;GitHub Releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Репозиторий&lt;/strong&gt;: &lt;a href="https://aka.ms/azmcp"&gt;aka.ms/azmcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Документация&lt;/strong&gt;: &lt;a href="https://aka.ms/azmcp/docs"&gt;aka.ms/azmcp/docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Смотрите &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;полный пост&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Azure SDK Апрель 2026: AI Foundry 2.0 и Что Должны Знать .NET-Разработчики</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-sdk-april-2026-ai-foundry-2-stable/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-sdk-april-2026-ai-foundry-2-stable/</guid><description>Апрельский релиз Azure SDK включает стабильный Azure.AI.Projects 2.0.0 со значительными ломающими изменениями, критические исправления безопасности Cosmos DB и новые библиотеки Provisioning для .NET.</description><content:encoded>&lt;p&gt;&lt;em&gt;Этот пост был автоматически переведён. Для оригинальной версии &lt;a href="https://thedotnetblog.com/posts/emiliano-montesdeoca/azure-sdk-april-2026-ai-foundry-2-stable/"&gt;нажмите здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ежемесячные SDK-релизы часто легко пропустить. В этом есть несколько вещей, заслуживающих внимания.&lt;/p&gt;
&lt;h2 id="azureaiprojects-200--ломающие-изменения-которые-имеют-смысл"&gt;Azure.AI.Projects 2.0.0 — Ломающие Изменения, Которые Имеют Смысл&lt;/h2&gt;
&lt;p&gt;Разделение пространств имён, переименование типов, последовательное соглашение &lt;code&gt;Is*&lt;/code&gt; для булевых свойств.&lt;/p&gt;
&lt;h2 id="cosmos-db-java-критическое-исправление-безопасности-rce"&gt;Cosmos DB Java: Критическое Исправление Безопасности (RCE)&lt;/h2&gt;
&lt;p&gt;Версия 4.79.0 исправляет &lt;strong&gt;уязвимость удалённого выполнения кода (CWE-502)&lt;/strong&gt;. Обновитесь немедленно.&lt;/p&gt;
&lt;h2 id="новые-provisioning-библиотеки-для-net"&gt;Новые Provisioning-Библиотеки для .NET&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nuget.org/packages/Azure.Provisioning.Network/1.0.0"&gt;Azure.Provisioning.Network 1.0.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nuget.org/packages/Azure.Provisioning.PrivateDns/1.0.0"&gt;Azure.Provisioning.PrivateDns 1.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Оригинальный пост: &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-sdk-release-april-2026/"&gt;Azure SDK Release (April 2026)&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>GPT-5.5 Уже Здесь и Приходит в Azure Foundry — Что Нужно Знать .NET-разработчикам</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/</guid><description>GPT-5.5 доступен в Microsoft Foundry для всех. Эволюция от GPT-5 до 5.5, что реально улучшилось и как начать использовать его в своих агентах уже сегодня.</description><content:encoded>&lt;p&gt;&lt;em&gt;Этот пост переведён автоматически. Чтобы просмотреть оригинал, &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/"&gt;нажмите здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Microsoft только что объявила, что &lt;a href="https://azure.microsoft.com/en-us/blog/openais-gpt-5-5-in-microsoft-foundry-frontier-intelligence-on-an-enterprise-ready-platform/"&gt;GPT-5.5 доступен в Microsoft Foundry&lt;/a&gt;. Если вы создаёте агентов на Azure, это обновление, которого вы ждали.&lt;/p&gt;
&lt;h2 id="эволюция-gpt-5"&gt;Эволюция GPT-5&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-5&lt;/strong&gt;: объединил рассуждение и скорость в единую систему&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-5.4&lt;/strong&gt;: более мощное многошаговое рассуждение, ранние агентские возможности для enterprise&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;: более глубокое рассуждение в длинном контексте, более надёжное агентское выполнение, лучшая эффективность токенов&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="что-реально-изменилось"&gt;Что реально изменилось&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Улучшенное агентное кодирование&lt;/strong&gt;: GPT-5.5 удерживает контекст на больших кодовых базах, диагностирует архитектурные сбои и предвидит требования к тестированию. Модель рассуждает о том, &lt;em&gt;на что ещё&lt;/em&gt; влияет исправление, прежде чем действовать.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Эффективность токенов&lt;/strong&gt;: Выходные данные более высокого качества с меньшим количеством токенов и меньшим числом повторных попыток. Непосредственно снижает стоимость и задержку в производстве.&lt;/p&gt;
&lt;h2 id="цены"&gt;Цены&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Модель&lt;/th&gt;
&lt;th&gt;Входные данные ($/M токенов)&lt;/th&gt;
&lt;th&gt;Кэшированный ввод&lt;/th&gt;
&lt;th&gt;Выходные данные ($/M токенов)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;$5,00&lt;/td&gt;
&lt;td&gt;$0,50&lt;/td&gt;
&lt;td&gt;$30,00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
&lt;td&gt;$30,00&lt;/td&gt;
&lt;td&gt;$3,00&lt;/td&gt;
&lt;td&gt;$180,00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="почему-важен-foundry"&gt;Почему важен Foundry&lt;/h2&gt;
&lt;p&gt;Foundry Agent Service позволяет определять агентов в YAML или подключать их с Microsoft Agent Framework, GitHub Copilot SDK, LangGraph или OpenAI Agents SDK — и запускать их как изолированных хостированных агентов с постоянной файловой системой, идентичностью Microsoft Entra и тарификацией по принципу scale-to-zero.&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="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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gpt-5.5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&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;Вы полезный помощник.&amp;#34;&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 class="s"&gt;&amp;#34;МойАгент&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;a href="https://azure.microsoft.com/en-us/blog/openais-gpt-5-5-in-microsoft-foundry-frontier-intelligence-on-an-enterprise-ready-platform/"&gt;полное объявление&lt;/a&gt; для всех подробностей.&lt;/p&gt;</content:encoded></item><item><title>Foundry Toolboxes: Единый эндпоинт для всех инструментов агентов</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</guid><description>Microsoft Foundry выпустила Toolboxes в Public Preview — способ централизованно управлять инструментами ИИ-агентов и предоставлять их через единый MCP-совместимый эндпоинт.</description><content:encoded>&lt;p&gt;&lt;em&gt;Этот пост был автоматически переведён. Для оригинальной версии &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/"&gt;нажмите здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Есть проблема, которая кажется скучной, пока не столкнёшься с ней лично: организация строит несколько ИИ-агентов, каждому нужны инструменты, и каждая команда настраивает их с нуля. Та же интеграция веб-поиска, та же конфигурация Azure AI Search, то же подключение к GitHub MCP-серверу — но в другом репозитории, другой командой, с другими учётными данными и без общего управления.&lt;/p&gt;
&lt;p&gt;Microsoft Foundry только что выпустила &lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;Toolboxes&lt;/a&gt; в Public Preview — прямой ответ на эту проблему.&lt;/p&gt;
&lt;h2 id="что-такое-toolbox"&gt;Что такое Toolbox?&lt;/h2&gt;
&lt;p&gt;Toolbox — это именованный, многократно используемый набор инструментов, который определяется один раз в Foundry и предоставляется через единый MCP-совместимый эндпоинт. Любая среда выполнения агента, говорящая на MCP, может его потреблять — никакой привязки к Foundry Agents.&lt;/p&gt;
&lt;p&gt;Обещание простое: &lt;strong&gt;build once, consume anywhere&lt;/strong&gt;. Определить инструменты, настроить аутентификацию централизованно (OAuth passthrough, управляемые удостоверения Entra), опубликовать эндпоинт. Каждый агент, которому нужны эти инструменты, подключается к эндпоинту и получает их все.&lt;/p&gt;
&lt;h2 id="четыре-столпа-два-доступны-сегодня"&gt;Четыре столпа (два доступны сегодня)&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Столп&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;&lt;strong&gt;Discover&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Скоро&lt;/td&gt;
&lt;td&gt;Находить одобренные инструменты без ручного поиска&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Доступен&lt;/td&gt;
&lt;td&gt;Собирать инструменты в многократно используемый bundle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consume&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Доступен&lt;/td&gt;
&lt;td&gt;Единый MCP-эндпоинт предоставляет все инструменты&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Govern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Скоро&lt;/td&gt;
&lt;td&gt;Централизованная аутентификация + observability для всех вызовов&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="практический-пример"&gt;Практический пример&lt;/h2&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.identity&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&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&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;import&lt;/span&gt; &lt;span class="nn"&gt;os&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;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&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;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;FOUNDRY_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;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&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;toolbox_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toolboxes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_toolbox_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;toolbox_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;customer-feedback-triaging-toolbox&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;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Поиск по документации и ответы на GitHub-issues.&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;tools&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 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;web_search&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Поиск в публичной документации&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="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_search&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;index_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;internal-docs&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="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;mcp_server&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;server_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://your-github-mcp-server.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;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;После публикации Foundry предоставляет единый эндпоинт. Одно подключение — все инструменты.&lt;/p&gt;
&lt;h2 id="нет-привязки-к-foundry-agents"&gt;Нет привязки к Foundry Agents&lt;/h2&gt;
&lt;p&gt;Toolboxes &lt;strong&gt;создаются и управляются&lt;/strong&gt; в Foundry, но поверхность потребления — открытый протокол MCP. Их можно использовать из кастомных агентов (Microsoft Agent Framework, LangGraph), GitHub Copilot и других MCP-совместимых IDE.&lt;/p&gt;
&lt;h2 id="почему-это-важно-сейчас"&gt;Почему это важно сейчас&lt;/h2&gt;
&lt;p&gt;Волна мульти-агентов добирается до продакшена. Каждый новый агент — это новая поверхность для дублированной конфигурации, устаревших учётных данных и непоследовательного поведения. Основа Build + Consume достаточна, чтобы начать централизацию. Когда придёт столп Govern, появится полностью наблюдаемый, централизованно управляемый инструментальный слой для всего парка агентов.&lt;/p&gt;
&lt;h2 id="итог"&gt;Итог&lt;/h2&gt;
&lt;p&gt;Пока рано — Public Preview, сначала Python SDK, Discover и Govern ещё впереди. Но модель надёжная, а MCP-нативный дизайн означает, что она работает с инструментами, которые уже строятся. Подробности в &lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;официальном анонсе&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>azd + GitHub Copilot: настройка проекта с помощью ИИ и умное исправление ошибок</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/</guid><description>Azure Developer CLI теперь интегрируется с GitHub Copilot для генерации инфраструктуры проекта и устранения ошибок деплоя — прямо из терминала.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Эта статья переведена автоматически. Оригинальную версию на английском можно найти &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azd-copilot-integration-ai-setup-troubleshooting/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Знаком ли вам момент, когда хочешь задеплоить существующее приложение в Azure и смотришь на пустой &lt;code&gt;azure.yaml&lt;/code&gt;, пытаясь вспомнить, какой тип хостинга выбрать для Express API — Container Apps или App Service? Этот момент станет намного короче.&lt;/p&gt;
&lt;p&gt;Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) теперь интегрируется с GitHub Copilot двумя практичными способами: AI-ассистированный скаффолдинг проекта при &lt;code&gt;azd init&lt;/code&gt; и интеллектуальное устранение ошибок при сбое деплоя. Обе функции работают полностью в терминале — именно там, где они и должны быть.&lt;/p&gt;
&lt;h2 id="настройка-с-copilot-при-azd-init"&gt;Настройка с Copilot при azd init&lt;/h2&gt;
&lt;p&gt;При запуске &lt;code&gt;azd init&lt;/code&gt; теперь появляется опция &amp;ldquo;Set up with GitHub Copilot (Preview)&amp;rdquo;. Выберите её, и Copilot проанализирует вашу кодовую базу, чтобы сгенерировать &lt;code&gt;azure.yaml&lt;/code&gt;, шаблоны инфраструктуры и Bicep-модули — на основе вашего реального кода.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd init
# Выберите: &amp;#34;Set up with GitHub Copilot (Preview)&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Что потребуется:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;azd 1.23.11 или новее&lt;/strong&gt; — проверьте &lt;code&gt;azd version&lt;/code&gt; или обновитесь через &lt;code&gt;azd update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Активная подписка GitHub Copilot&lt;/strong&gt; (Individual, Business или Enterprise)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub CLI (&lt;code&gt;gh&lt;/code&gt;)&lt;/strong&gt; — &lt;code&gt;azd&lt;/code&gt; запросит вход при необходимости&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Что мне по-настоящему нравится: это работает в обоих направлениях. Строите с нуля? Copilot поможет настроить правильные сервисы Azure с самого начала. Есть существующее приложение, которое давно хотели задеплоить? Направьте на него Copilot — конфигурация будет сгенерирована без необходимости что-либо переструктурировать.&lt;/p&gt;
&lt;h3 id="что-происходит-на-самом-деле"&gt;Что происходит на самом деле&lt;/h3&gt;
&lt;p&gt;Допустим, у вас есть Node.js Express API с зависимостью от PostgreSQL. Вместо того чтобы вручную выбирать между Container Apps и App Service, а затем писать Bicep с нуля, Copilot определит стек и сгенерирует:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;azure.yaml&lt;/code&gt; с правильными настройками &lt;code&gt;language&lt;/code&gt;, &lt;code&gt;host&lt;/code&gt; и &lt;code&gt;build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Bicep-модуль для Azure Container Apps&lt;/li&gt;
&lt;li&gt;Bicep-модуль для Azure Database for PostgreSQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Перед любыми изменениями выполняются предварительные проверки — убеждается в чистоте рабочей директории git, заранее запрашивает согласие на инструменты MCP-сервера. Ничего не произойдёт без вашего понимания того, что именно изменится.&lt;/p&gt;
&lt;h2 id="устранение-ошибок-с-помощью-copilot"&gt;Устранение ошибок с помощью Copilot&lt;/h2&gt;
&lt;p&gt;Ошибки деплоя неизбежны. Пропущенные параметры, проблемы с правами, недоступность SKU — и сообщение об ошибке редко подсказывает именно то, что нужно: &lt;em&gt;как это исправить&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Без Copilot цикл выглядит так: скопировать ошибку → искать в документации → читать три нерелевантных ответа на Stack Overflow → выполнить команды &lt;code&gt;az&lt;/code&gt; CLI → попробовать снова. С Copilot в &lt;code&gt;azd&lt;/code&gt; этот цикл рушится. При любом сбое команды &lt;code&gt;azd&lt;/code&gt; сразу предлагаются четыре варианта:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Explain&lt;/strong&gt; — простое объяснение того, что пошло не так&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guidance&lt;/strong&gt; — пошаговые инструкции по исправлению&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diagnose and Guide&lt;/strong&gt; — полный анализ + Copilot применяет исправление (с вашего одобрения) + опциональный повтор&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skip&lt;/strong&gt; — разобраться самостоятельно&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ключевой момент: у Copilot уже есть контекст вашего проекта, упавшей команды и деталей ошибки. Его предложения специфичны именно для &lt;em&gt;вашей ситуации&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id="настройка-поведения-по-умолчанию"&gt;Настройка поведения по умолчанию&lt;/h3&gt;
&lt;p&gt;Если всегда выбираете одно и то же, пропустите интерактивный запрос:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd config set copilot.errorHandling.category troubleshoot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Значения: &lt;code&gt;explain&lt;/code&gt;, &lt;code&gt;guidance&lt;/code&gt;, &lt;code&gt;troubleshoot&lt;/code&gt;, &lt;code&gt;fix&lt;/code&gt;, &lt;code&gt;skip&lt;/code&gt;. Можно включить автоматическое исправление и повтор:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd config set copilot.errorHandling.fix allow
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Вернуться к интерактивному режиму в любой момент:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;azd config unset copilot.errorHandling.category
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="итоги"&gt;Итоги&lt;/h2&gt;
&lt;p&gt;Запустите &lt;code&gt;azd update&lt;/code&gt; для получения последней версии и попробуйте &lt;code&gt;azd init&lt;/code&gt; на следующем проекте. Это именно та интеграция Copilot, которая приносит реальную ценность.&lt;/p&gt;
&lt;p&gt;Читайте &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-copilot-integration/"&gt;оригинальное объявление здесь&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Global Azure Spain 2026</title><link>https://thedotnetblog.com/ru/events/global-azure-spain-2026/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/ru/events/global-azure-spain-2026/</guid><description>Крупнейшее Azure-мероприятие сообщества в Испании — полный день сессий по Azure, ИИ, данным, безопасности и облачной разработке с 38 спикерами на 3 треках.</description><content:encoded>&lt;p&gt;Global Azure Spain 2026 проходит &lt;strong&gt;18 апреля 2026 года&lt;/strong&gt; в &lt;strong&gt;Kinépolis Diversia&lt;/strong&gt; в Алькобендасе, Мадрид. Это крупнейшее сообщественное Azure-мероприятие в Испании, объединяющее 38 спикеров на 3 параллельных треках: ИИ-агенты, сети Azure, Cosmos DB, Fabric, IoT, безопасность и многое другое.&lt;/p&gt;
&lt;p&gt;Мероприятие проходит с &lt;strong&gt;08:30 до 18:30&lt;/strong&gt; и включает в себя кейноут, кофе-брейки, обед и заключительную сессию вопросов и ответов.&lt;/p&gt;
&lt;h2 id="основные-моменты-программы"&gt;Основные моменты программы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Domando Agentes de IA&lt;/strong&gt;: управление, инструменты и API с Azure AI Foundry и Azure API Management&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Construyendo agentes con LibreChat en Azure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How Can I Steal Your Data with Azure Private Endpoints&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stop Building APIs. Forge Agents with Azure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agentic DevOps Meets IoT: Real-Time Systems with Fabric and GitHub Copilot&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El regreso de los tamagotchis!&lt;/strong&gt;: мультиагентные системы в действии&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Foundry Control Plane como plataforma de Agentes global&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rompiendo el perímetro: Zero Trust aplicado en Azure&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="билеты"&gt;Билеты&lt;/h2&gt;
&lt;p&gt;Регистрация — символическое пожертвование. Вся стоимость билета направляется в &lt;strong&gt;Plan International&lt;/strong&gt; на поддержку прав детей и равенства по всему миру. Количество мест ограничено, поэтому бронируйте заранее.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.eventbrite.es/e/entradas-global-azure-spain-2026-en-madrid-1981594189564"&gt;Билеты на Eventbrite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://globalazure.es/"&gt;Сайт мероприятия&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="azure-tour-2026"&gt;Azure Tour 2026&lt;/h2&gt;
&lt;p&gt;Помимо Мадрида, Global Azure Tour 2026 также проходит в &lt;strong&gt;Сарагосе&lt;/strong&gt;, &lt;strong&gt;Тенерифе&lt;/strong&gt; и &lt;strong&gt;Севилье&lt;/strong&gt;.&lt;/p&gt;</content:encoded></item><item><title>RFT в Foundry стал дешевле и умнее — Вот что изменилось</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/</guid><description>Microsoft Foundry выпустил три обновления RFT в этом месяце: глобальное обучение для o4-mini, новые модельные грейдеры GPT-4.1 и руководство по лучшим практикам, которое сэкономит вам часы отладки.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Оригинал можно прочитать &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Если вы разрабатываете .NET-приложения, которые зависят от дообученных моделей, обновления Foundry этого месяца заслуживают внимания. Reinforcement Fine-Tuning стал более доступным и значительно дешевле.&lt;/p&gt;
&lt;p&gt;Полные подробности — в &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-foundry-finetune-april-2026/"&gt;официальном анонсе&lt;/a&gt;, а здесь — практическая выжимка.&lt;/p&gt;
&lt;h2 id="глобальное-обучение-для-o4-mini"&gt;Глобальное обучение для o4-mini&lt;/h2&gt;
&lt;p&gt;o4-mini — это основная модель для задач, требующих рассуждений, и агентных нагрузок. Главная новость: теперь вы можете запускать задачи файнтюнинга из 13+ регионов Azure с более низкими тарифами за токен по сравнению со Standard-обучением. Та же инфраструктура, то же качество, более широкий охват.&lt;/p&gt;
&lt;p&gt;Если ваша команда распределена по разным географиям, это важно. Вы больше не привязаны к нескольким регионам для обучения.&lt;/p&gt;
&lt;p&gt;Вот REST API вызов для запуска глобальной задачи обучения:&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;curl -X POST &lt;span class="s2"&gt;&amp;#34;https://&amp;lt;your-resource&amp;gt;.openai.azure.com/openai/fine_tuning/jobs?api-version=2025-04-01-preview&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;api-key: &lt;/span&gt;&lt;span class="nv"&gt;$AZURE_OPENAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;model&amp;#34;: &amp;#34;o4-mini&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;training_file&amp;#34;: &amp;#34;&amp;lt;your-training-file-id&amp;gt;&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;method&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;type&amp;#34;: &amp;#34;reinforcement&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;reinforcement&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;grader&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;type&amp;#34;: &amp;#34;string_check&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;name&amp;#34;: &amp;#34;answer-check&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;input&amp;#34;: &amp;#34;{{sample.output_text}}&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;reference&amp;#34;: &amp;#34;{{item.reference_answer}}&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;operation&amp;#34;: &amp;#34;eq&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;hyperparameters&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;n_epochs&amp;#34;: 2,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;compute_multiplier&amp;#34;: 1.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;trainingType&amp;#34;: &amp;#34;globalstandard&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Флаг &lt;code&gt;trainingType: globalstandard&lt;/code&gt; — это ключевое отличие.&lt;/p&gt;
&lt;h2 id="новые-модельные-грейдеры-семейство-gpt-41"&gt;Новые модельные грейдеры: семейство GPT-4.1&lt;/h2&gt;
&lt;p&gt;Грейдеры определяют сигнал вознаграждения, под который оптимизируется ваша модель. До сих пор модельные грейдеры были ограничены небольшим набором моделей. Теперь у вас есть три новых варианта: GPT-4.1, GPT-4.1-mini и GPT-4.1-nano.&lt;/p&gt;
&lt;p&gt;Когда стоит использовать модельные грейдеры вместо детерминированных? Когда вывод вашей задачи открытый, когда вам нужна частичная оценка по нескольким измерениям, или когда вы строите агентные рабочие процессы, где корректность вызовов инструментов зависит от семантического контекста.&lt;/p&gt;
&lt;p&gt;Суть в том, что стратегия уровней практична:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1-nano&lt;/strong&gt; для начальных итераций. Низкая стоимость, быстрые циклы обратной связи.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1-mini&lt;/strong&gt; когда ваша рубрика оценки стабильна и нужна более высокая точность.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1&lt;/strong&gt; для продакшен-оценки или сложных рубрик, где важно каждое решение по оценке.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Вы даже можете комбинировать типы грейдеров в одной задаче RFT. Используйте string-match для измерения «правильный ответ» и модельный грейдер для оценки качества рассуждений. Честно говоря, именно эта гибкость делает его полезным для реальных нагрузок.&lt;/p&gt;
&lt;h2 id="подводный-камень-формата-данных-rft"&gt;Подводный камень формата данных RFT&lt;/h2&gt;
&lt;p&gt;На этом многие спотыкаются. Формат данных RFT отличается от SFT. Последнее сообщение в каждой строке должно иметь роль User или Developer — не Assistant. Ожидаемый ответ помещается в ключ верхнего уровня, например &lt;code&gt;reference_answer&lt;/code&gt;, на который грейдер ссылается напрямую.&lt;/p&gt;
&lt;p&gt;Если вы занимались supervised fine-tuning и хотите перейти на RFT, вам нужно перестроить обучающие данные. Не пропускайте этот шаг, иначе ваши задачи будут молча завершаться с ошибкой.&lt;/p&gt;
&lt;h2 id="почему-это-важно-для-net-разработчиков"&gt;Почему это важно для .NET-разработчиков&lt;/h2&gt;
&lt;p&gt;Если вы вызываете дообученные модели из .NET-приложений через Azure OpenAI SDK, более дешёвое обучение означает, что вы можете итерировать более агрессивно. Варианты модельных грейдеров означают, что вы можете файнтюнить для нюансированных задач — не только для сценариев точного совпадения. А руководство по лучшим практикам на &lt;a href="https://github.com/microsoft-foundry/fine-tuning/blob/main/Demos/Agentic_RFT_PrivatePreview/RFT_Best_Practice.md"&gt;GitHub&lt;/a&gt; сэкономит вам реальное время отладки.&lt;/p&gt;
&lt;p&gt;Начните с малого. От десяти до ста примеров. Простой грейдер. Проверьте цикл. Затем масштабируйте.&lt;/p&gt;</content:encoded></item><item><title>Ваши AI-эксперименты в Azure сжигают деньги — Вот как это исправить</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/</guid><description>AI-нагрузки в Azure могут быстро стать дорогими. Давайте поговорим о том, что действительно работает для контроля расходов без замедления разработки.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Оригинал можно прочитать &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Если вы сейчас создаёте приложения на базе ИИ в Azure, вы, вероятно, заметили кое-что: ваш счёт за облако выглядит иначе, чем раньше. Не просто выше — странно. Скачкообразно. Трудно предсказать.&lt;/p&gt;
&lt;p&gt;Microsoft только что опубликовал отличную статью о &lt;a href="https://azure.microsoft.com/en-us/blog/cloud-cost-optimization-principles-that-still-matter/"&gt;принципах оптимизации облачных затрат, которые по-прежнему актуальны&lt;/a&gt;, и, честно говоря, момент не мог быть лучше. Потому что AI-нагрузки изменили правила игры, когда речь идёт о затратах.&lt;/p&gt;
&lt;h2 id="почему-ai-нагрузки--это-другая-история"&gt;Почему AI-нагрузки — это другая история&lt;/h2&gt;
&lt;p&gt;Вот в чём дело. Традиционные .NET-нагрузки относительно предсказуемы. Вы знаете свой уровень App Service, знаете свои SQL DTU, можете довольно точно оценить ежемесячные расходы. AI-нагрузки? Не совсем.&lt;/p&gt;
&lt;p&gt;Вы тестируете несколько моделей, чтобы понять, какая подходит. Вы поднимаете инфраструктуру с GPU для дообучения. Вы делаете API-вызовы к Azure OpenAI, где потребление токенов сильно варьируется в зависимости от длины промпта и поведения пользователей. Каждый эксперимент стоит реальных денег, и вы можете провести десятки, прежде чем найдёте правильный подход.&lt;/p&gt;
&lt;p&gt;Эта непредсказуемость делает оптимизацию затрат критически важной — не как запоздалую мысль, а с первого дня.&lt;/p&gt;
&lt;h2 id="управление-vs-оптимизация--знайте-разницу"&gt;Управление vs. оптимизация — знайте разницу&lt;/h2&gt;
&lt;p&gt;Одно различие из статьи, которое, на мой взгляд, разработчики упускают: есть разница между &lt;em&gt;управлением&lt;/em&gt; затратами и &lt;em&gt;оптимизацией&lt;/em&gt; затрат.&lt;/p&gt;
&lt;p&gt;Управление — это отслеживание и отчётность. Вы настраиваете бюджеты в Azure Cost Management, получаете оповещения, смотрите дашборды. Это базовый минимум.&lt;/p&gt;
&lt;p&gt;Оптимизация — это когда вы действительно принимаете решения. Вам правда нужен этот уровень S3, или S1 справится с вашей нагрузкой? Та постоянно работающая вычислительная инстанция простаивает по выходным? Можно ли использовать спот-инстансы для задач обучения?&lt;/p&gt;
&lt;p&gt;Как .NET-разработчики, мы склонны сосредотачиваться на коде и оставлять решения по инфраструктуре «команде эксплуатации». Но если вы деплоите в Azure, эти решения — тоже ваши решения.&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; Тегируйте свои ресурсы. Серьёзно. Если вы не можете определить, какой проект или эксперимент поедает ваш бюджет, вы не сможете ничего оптимизировать. Azure Cost Management с правильным тегированием — ваш лучший друг.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Установите ограничения перед экспериментами.&lt;/strong&gt; Используйте Azure Policy для ограничения дорогих SKU в средах dev/test. Установите лимиты расходов на ваши развёртывания Azure OpenAI. Не ждите, пока придёт счёт, чтобы обнаружить, что кто-то оставил GPU-кластер работать на выходных.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Постоянно подбирайте правильный размер.&lt;/strong&gt; Та VM, которую вы выбрали при прототипировании? Она, вероятно, не подходит для продакшена. Azure Advisor даёт рекомендации — реально посмотрите на них. Пересматривайте ежемесячно, а не ежегодно.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Думайте о жизненном цикле.&lt;/strong&gt; Ресурсы разработки должны выключаться. Тестовые среды не должны работать 24/7. Используйте политики автоматического выключения. Для AI-нагрузок в частности рассмотрите бессерверные варианты, где вы платите за выполнение, вместо того чтобы держать вычислительные мощности включёнными.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Измеряйте ценность, а не только стоимость.&lt;/strong&gt; Об этом легко забыть. Модель, которая стоит дороже, но даёт значительно лучшие результаты, может быть правильным выбором. Цель — не тратить меньше всего, а тратить разумно.&lt;/p&gt;
&lt;h2 id="итог"&gt;Итог&lt;/h2&gt;
&lt;p&gt;Оптимизация облачных затрат — это не разовая уборка. Это привычка. И поскольку AI-нагрузки делают расходы менее предсказуемыми, чем когда-либо, формирование этой привычки на раннем этапе избавит вас от болезненных сюрпризов в будущем.&lt;/p&gt;
&lt;p&gt;Если вы .NET-разработчик, создающий решения на Azure, начните относиться к своему облачному счёту так же, как к своему коду — регулярно ревьюйте, рефакторите, когда становится беспорядочно, и никогда не деплойте, не понимая, во сколько это обойдётся.&lt;/p&gt;</content:encoded></item><item><title>Инструменты Azure MCP теперь встроены в Visual Studio 2022 — Расширение не требуется</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/</guid><description>Инструменты Azure MCP поставляются как часть рабочей нагрузки разработки Azure в Visual Studio 2022. Более 230 инструментов, 45 сервисов Azure, ноль расширений для установки.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Эта статья была переведена автоматически. Для просмотра оригинала &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/"&gt;нажмите здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Если вы использовали инструменты Azure MCP в Visual Studio через отдельное расширение, вы знаете этот ритуал — установить VSIX, перезапустить, надеяться, что ничего не сломается, разбираться с несовместимостью версий. Это трение осталось в прошлом.&lt;/p&gt;
&lt;p&gt;Yun Jung Choi &lt;a href="https://devblogs.microsoft.com/visualstudio/azure-mcp-tools-now-ship-built-into-visual-studio-2022-no-extension-required/"&gt;объявила&lt;/a&gt;, что инструменты Azure MCP теперь поставляются непосредственно в составе рабочей нагрузки разработки Azure в Visual Studio 2022. Без расширения. Без VSIX. Без танцев с перезапуском.&lt;/p&gt;
&lt;h2 id="что-это-означает-на-практике"&gt;Что это означает на практике&lt;/h2&gt;
&lt;p&gt;Начиная с Visual Studio 2022 версии 17.14.30, Azure MCP Server включён в рабочую нагрузку разработки Azure. Если эта рабочая нагрузка уже установлена, достаточно включить его в GitHub Copilot Chat — и всё готово.&lt;/p&gt;
&lt;p&gt;Более 230 инструментов для 45 сервисов Azure — доступны прямо из окна чата. Просмотр учётных записей хранилища, развёртывание приложения ASP.NET Core, диагностика проблем App Service, запросы к Log Analytics — всё это без открытия вкладки браузера.&lt;/p&gt;
&lt;h2 id="почему-это-важнее-чем-кажется"&gt;Почему это важнее, чем кажется&lt;/h2&gt;
&lt;p&gt;Вот в чём суть инструментов для разработчиков: каждый лишний шаг — это трение, а трение убивает внедрение. MCP в виде отдельного расширения означал несовместимость версий, ошибки установки и ещё одну вещь, которую нужно поддерживать в актуальном состоянии. Встраивание в рабочую нагрузку означает:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Единый путь обновления&lt;/strong&gt; через Visual Studio Installer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Никакого расхождения версий&lt;/strong&gt; между расширением и IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Всегда актуально&lt;/strong&gt; — MCP Server обновляется с регулярными релизами VS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Для команд, стандартизирующих на Azure, это очень важно. Устанавливаете рабочую нагрузку один раз, включаете инструменты, и они доступны в каждой сессии.&lt;/p&gt;
&lt;h2 id="что-можно-делать-с-помощью-этих-инструментов"&gt;Что можно делать с помощью этих инструментов&lt;/h2&gt;
&lt;p&gt;Инструменты охватывают полный жизненный цикл разработки через Copilot Chat:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Изучать&lt;/strong&gt; — спрашивайте о сервисах Azure, лучших практиках, архитектурных паттернах&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Проектировать и разрабатывать&lt;/strong&gt; — получайте рекомендации по сервисам, настраивайте код приложения&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Развёртывать&lt;/strong&gt; — выделяйте ресурсы и развёртывайте прямо из IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Устранять неполадки&lt;/strong&gt; — запрашивайте логи, проверяйте состояние ресурсов, диагностируйте проблемы в продакшене&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Быстрый пример — введите это в Copilot Chat:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;List my storage accounts in my current subscription.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Copilot вызывает инструменты Azure MCP за кулисами, запрашивает ваши подписки и возвращает отформатированный список с именами, расположениями и SKU. Портал не нужен.&lt;/p&gt;
&lt;h2 id="как-включить"&gt;Как включить&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Обновите Visual Studio 2022 до версии &lt;strong&gt;17.14.30&lt;/strong&gt; или выше&lt;/li&gt;
&lt;li&gt;Убедитесь, что установлена рабочая нагрузка &lt;strong&gt;Azure development&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Откройте GitHub Copilot Chat&lt;/li&gt;
&lt;li&gt;Нажмите кнопку &lt;strong&gt;Select tools&lt;/strong&gt; (значок с двумя гаечными ключами)&lt;/li&gt;
&lt;li&gt;Включите &lt;strong&gt;Azure MCP Server&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;Инструменты отключены по умолчанию — нужно включить их вручную. И инструменты, специфичные для VS 2026, недоступны в VS 2022. Доступность инструментов также зависит от разрешений вашей подписки Azure, как и в портале.&lt;/p&gt;
&lt;h2 id="общая-картина"&gt;Общая картина&lt;/h2&gt;
&lt;p&gt;Это часть чёткого тренда: MCP становится стандартным способом предоставления облачных инструментов в IDE для разработчиков. Мы уже видели &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; и интеграции MCP в VS Code и других редакторах. Встраивание в систему рабочих нагрузок Visual Studio — естественное развитие.&lt;/p&gt;
&lt;p&gt;Для нас, .NET-разработчиков, которые живут в Visual Studio, это устраняет ещё одну причину переключаться на портал Azure. И честно говоря, чем меньше переключений между вкладками, тем лучше.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 получает MongoDB EF Core и Azure Data Lake — Две интеграции, которые стоит попробовать</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/aspire-132-mongodb-efcore-data-lake/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/aspire-132-mongodb-efcore-data-lake/</guid><description>Aspire 13.2 добавляет интеграции MongoDB Entity Framework Core и Azure Data Lake Storage с автоматическими проверками работоспособности и обнаружением сервисов без настройки. Вот как они выглядят на практике.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Оригинальная версия доступна &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/aspire-132-mongodb-efcore-data-lake/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Aspire 13.2 вышел с &lt;a href="https://devblogs.microsoft.com/aspire/aspire-new-database-integrations/"&gt;двумя новыми интеграциями баз данных&lt;/a&gt;, которые заслуживают внимания: MongoDB Entity Framework Core и Azure Data Lake Storage. Если вы хотели использовать EF Core с MongoDB в приложении Aspire или вам нужно было подключить рабочие нагрузки Data Lake с обнаружением сервисов, этот релиз предоставляет и то, и другое.&lt;/p&gt;
&lt;h2 id="mongodb-встречает-ef-core-в-aspire"&gt;MongoDB встречает EF Core в Aspire&lt;/h2&gt;
&lt;p&gt;Это интеграция, которая радует меня больше всего. Aspire поддерживал MongoDB уже давно, но это всегда был сырой драйвер — никакого EF Core, никакого &lt;code&gt;DbContext&lt;/code&gt;, никаких LINQ-запросов к документам. Теперь вы получаете полноценный EF Core с MongoDB, плюс автоматические проверки работоспособности и обнаружение сервисов от Aspire.&lt;/p&gt;
&lt;p&gt;Настройка следует типичному паттерну Aspire. В вашем AppHost:&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;var&lt;/span&gt; &lt;span class="n"&gt;mongodb&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddMongoDB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mongodb&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;WithDataVolume&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;WithLifetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ContainerLifetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Persistent&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;apiService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddProject&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Projects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ApiService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;api&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;WithReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mongodb&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;Затем в потребляющем проекте добавьте интеграцию EF Core:&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 Aspire.MongoDB.EntityFrameworkCore
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;И зарегистрируйте свой &lt;code&gt;DbContext&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;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddMongoDbContext&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyDbContext&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mongodb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;mydb&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;Дальше — стандартный EF Core. Определяйте сущности, используйте &lt;code&gt;DbContext&lt;/code&gt; как с любым другим провайдером. Интеграция берёт на себя пул соединений, трассировки OpenTelemetry и проверки работоспособности за кулисами.&lt;/p&gt;
&lt;p&gt;Для .NET-разработчиков, которые использовали MongoDB с сырым драйвером и вручную настраивали строки подключения, это приятное улучшение качества жизни. Вы получаете полную абстракцию EF Core, не теряя обнаружение сервисов Aspire.&lt;/p&gt;
&lt;h2 id="azure-data-lake-storage-присоединяется"&gt;Azure Data Lake Storage присоединяется&lt;/h2&gt;
&lt;p&gt;Второе крупное дополнение — &lt;a href="https://aspire.dev/integrations/cloud/azure/azure-storage-datalake/"&gt;интеграция Azure Data Lake Storage (ADLS)&lt;/a&gt;. Если вы строите конвейеры данных, ETL-процессы или аналитические платформы, теперь можно подключать ресурсы Data Lake так же, как любую другую зависимость Aspire.&lt;/p&gt;
&lt;p&gt;В AppHost:&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;var&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddAzureStorage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;azure-storage&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;dataLake&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddDataLake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;data-lake&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;fileSystem&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddDataLakeFileSystem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;data-lake-file-system&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;analyticsService&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddProject&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Projects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AnalyticsService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;analytics&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;WithReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataLake&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;WithReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileSystem&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;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;AddAzureDataLakeServiceClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;data-lake&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;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddAzureDataLakeFileSystemClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;data-lake-file-system&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;Никакого ручного управления строками подключения, никакой охоты за учётными данными. Aspire выделяет ресурсы и внедряет их. Для тех из нас, кто строит облачно-нативные .NET-приложения, работающие как с операционными данными, так и с аналитическими нагрузками, Data Lake теперь ощущается как полноценный участник модели Aspire.&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;Исправление строки подключения MongoDB&lt;/strong&gt; — косая черта перед именем базы данных теперь обрабатывается корректно. Если у вас был обходной путь, можете его убрать&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Экспорт SQL Server&lt;/strong&gt; — &lt;code&gt;Aspire.Hosting.SqlServer&lt;/code&gt; теперь экспортирует дополнительные параметры конфигурации сервера для более тонкого контроля&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Обновления эмуляторов&lt;/strong&gt; — эмулятор ServiceBus 2.0.0, эмулятор App Configuration 1.0.2, предварительный эмулятор CosmosDB теперь включает проверку готовности&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Managed Redis&lt;/strong&gt; — теперь по умолчанию использует &lt;code&gt;rediss://&lt;/code&gt; (Redis Secure), так что соединения шифруются из коробки&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Последний пункт тонкий, но важный — шифрованный Redis по умолчанию означает на одну настройку меньше в продакшене.&lt;/p&gt;
&lt;h2 id="подводя-итоги"&gt;Подводя итоги&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 — инкрементальный релиз, но интеграции MongoDB EF Core и Data Lake заполняют реальные пробелы. Если вы ждали нормальную поддержку EF Core для MongoDB в Aspire или вам нужен Data Lake как полноценная зависимость, &lt;a href="https://get.aspire.dev"&gt;обновитесь до 13.2&lt;/a&gt; и попробуйте. Команда &lt;code&gt;aspire add&lt;/code&gt; создаст всё необходимое.&lt;/p&gt;
&lt;p&gt;Читайте &lt;a href="https://aspire.dev/whats-new/aspire-13-2/#-integrations-updates"&gt;полные примечания к релизу&lt;/a&gt; для подробностей и загляните в &lt;a href="https://aspire.dev/integrations/gallery/"&gt;галерею интеграций&lt;/a&gt; для полного списка.&lt;/p&gt;</content:encoded></item><item><title>azd update — Одна команда для всех ваших пакетных менеджеров</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azd-update-universal-upgrade-command/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azd-update-universal-upgrade-command/</guid><description>Azure Developer CLI теперь имеет универсальную команду обновления, которая работает независимо от способа установки — winget, Homebrew, Chocolatey или скрипт установки.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Оригинальная версия доступна &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azd-update-universal-upgrade-command/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Знаете это сообщение «Доступна новая версия azd», которое появляется каждые несколько недель? То самое, которое вы закрываете, потому что не помните, устанавливали ли вы &lt;code&gt;azd&lt;/code&gt; через winget, Homebrew или тот curl-скрипт, который запустили полгода назад? Так вот, это наконец-то исправлено.&lt;/p&gt;
&lt;p&gt;Microsoft выпустила &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;&lt;code&gt;azd update&lt;/code&gt;&lt;/a&gt; — единую команду, которая обновляет Azure Developer CLI до последней версии независимо от того, как вы её изначально установили. Windows, macOS, Linux — неважно. Одна команда.&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;azd update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Вот и всё. Если хотите ранний доступ к новым возможностям, можно переключиться на ежедневную Insiders-сборку:&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;azd update --channel daily
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd update --channel stable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Команда определяет текущий метод установки и использует подходящий механизм обновления под капотом. Больше никаких «подожди, я на этой машине winget или choco использовал?»&lt;/p&gt;
&lt;h2 id="небольшой-нюанс"&gt;Небольшой нюанс&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd update&lt;/code&gt; доступна начиная с версии 1.23.x. Если у вас более старая версия, придётся выполнить последнее ручное обновление через исходный метод установки. После этого &lt;code&gt;azd update&lt;/code&gt; берёт всё на себя.&lt;/p&gt;
&lt;p&gt;Проверьте текущую версию командой &lt;code&gt;azd version&lt;/code&gt;. Если нужна чистая установка, &lt;a href="https://learn.microsoft.com/azure/developer/azure-developer-cli/install-azd"&gt;документация по установке&lt;/a&gt; вам поможет.&lt;/p&gt;
&lt;h2 id="почему-это-важно"&gt;Почему это важно&lt;/h2&gt;
&lt;p&gt;Это небольшое улучшение качества жизни, но для тех из нас, кто ежедневно использует &lt;code&gt;azd&lt;/code&gt; для деплоя ИИ-агентов и Aspire-приложений в Azure, быть на последней версии означает меньше моментов «этот баг уже был исправлен в последнем релизе». На одну заботу меньше.&lt;/p&gt;
&lt;p&gt;Читайте &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;полный анонс&lt;/a&gt; и &lt;a href="https://blog.jongallant.com/2026/04/azd-update"&gt;подробный разбор&lt;/a&gt; Джона Галланта для дополнительного контекста.&lt;/p&gt;</content:encoded></item><item><title>Azure Smart Tier вышел в GA — Автоматическая оптимизация стоимости Blob Storage без правил жизненного цикла</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-smart-tier-blob-storage-ga/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-smart-tier-blob-storage-ga/</guid><description>Smart tier для Azure Blob Storage теперь общедоступен — автоматическое перемещение объектов между уровнями hot, cool и cold на основе реальных паттернов доступа, без правил жизненного цикла.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Оригинальная версия доступна &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-smart-tier-blob-storage-ga/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Если вы когда-нибудь тратили время на настройку политик жизненного цикла Azure Blob Storage, а потом наблюдали, как они разваливаются при изменении паттернов доступа, эта статья для вас. Microsoft только что объявил о &lt;a href="https://azure.microsoft.com/en-us/blog/optimize-object-storage-costs-automatically-with-smart-tier-now-generally-available/"&gt;общей доступности smart tier&lt;/a&gt; для Azure Blob и Data Lake Storage — полностью управляемой возможности тиеринга, которая автоматически перемещает объекты между уровнями hot, cool и cold на основе реального использования.&lt;/p&gt;
&lt;h2 id="что-на-самом-деле-делает-smart-tier"&gt;Что на самом деле делает smart tier&lt;/h2&gt;
&lt;p&gt;Концепция проста: smart tier непрерывно оценивает время последнего доступа к каждому объекту в вашем аккаунте хранения. Часто используемые данные остаются в hot, неактивные данные перемещаются в cool через 30 дней, а затем в cold ещё через 60 дней. Когда к данным снова обращаются, они немедленно возвращаются в hot. Цикл начинается заново.&lt;/p&gt;
&lt;p&gt;Никаких правил жизненного цикла для настройки. Никаких прогнозов паттернов доступа. Никакой ручной настройки.&lt;/p&gt;
&lt;p&gt;Во время превью Microsoft сообщил, что &lt;strong&gt;более 50% ёмкости, управляемой smart tier, автоматически переместилось на более холодные уровни&lt;/strong&gt; на основе реальных паттернов доступа. Это существенная экономия для крупных аккаунтов хранения.&lt;/p&gt;
&lt;h2 id="почему-это-важно-для-net-разработчиков"&gt;Почему это важно для .NET-разработчиков&lt;/h2&gt;
&lt;p&gt;Если вы создаёте приложения, генерирующие логи, телеметрию, аналитические данные или любой растущий массив данных — а давайте будем честны, кто этого не делает? — затраты на хранение быстро накапливаются. Традиционный подход заключался в написании политик управления жизненным циклом, их тестировании, а затем перенастройке при изменении паттернов доступа вашего приложения. Smart tier полностью устраняет этот рабочий процесс.&lt;/p&gt;
&lt;p&gt;Несколько практических сценариев, где это помогает:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Телеметрия и логи приложений&lt;/strong&gt; — hot при отладке, почти не используются через несколько недель&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Конвейеры данных и выходные данные ETL&lt;/strong&gt; — интенсивно используются во время обработки, затем в основном cold&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Контент, создаваемый пользователями&lt;/strong&gt; — недавние загрузки hot, старый контент постепенно остывает&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Данные резервного копирования и архивирования&lt;/strong&gt; — иногда используются для соответствия требованиям, в основном простаивают&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="настройка"&gt;Настройка&lt;/h2&gt;
&lt;p&gt;Включение smart tier — это однократная настройка:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Новые аккаунты&lt;/strong&gt;: Выберите smart tier как уровень доступа по умолчанию при создании аккаунта хранения (требуется зональная избыточность)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Существующие аккаунты&lt;/strong&gt;: Переключите уровень доступа blob с текущего значения по умолчанию на smart tier&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Объекты размером менее 128 КиБ остаются в hot и не облагаются платой за мониторинг. Для всего остального вы платите стандартные тарифы hot/cool/cold без платы за переход между уровнями, без штрафов за раннее удаление и без стоимости извлечения данных. Ежемесячная плата за мониторинг на объект покрывает оркестрацию.&lt;/p&gt;
&lt;h2 id="компромисс-о-котором-стоит-знать"&gt;Компромисс, о котором стоит знать&lt;/h2&gt;
&lt;p&gt;Правила тиеринга smart tier фиксированы (30 дней → cool, 90 дней → cold). Если вам нужны пользовательские пороги — например, перемещение в cool через 7 дней для конкретной рабочей нагрузки — правила жизненного цикла по-прежнему подходят лучше. И не смешивайте оба подхода: избегайте использования правил жизненного цикла для объектов, управляемых smart tier, так как они могут конфликтовать.&lt;/p&gt;
&lt;h2 id="заключение"&gt;Заключение&lt;/h2&gt;
&lt;p&gt;Это не революция, но решает реальную операционную головную боль. Если вы управляете растущими аккаунтами blob storage и устали поддерживать политики жизненного цикла, &lt;a href="https://learn.microsoft.com/en-us/azure/storage/blobs/access-tiers-smart"&gt;включите smart tier&lt;/a&gt; и позвольте Azure заниматься этим. Доступно уже сегодня практически во всех зональных регионах публичного облака.&lt;/p&gt;</content:encoded></item><item><title>Где размещать AI-агентов в Azure? Практическое руководство по выбору</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/</guid><description>Azure предлагает шесть способов размещения AI-агентов — от контейнеров до полностью управляемых Foundry Hosted Agents. Вот как выбрать подходящий вариант для вашей .NET нагрузки.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Оригинальная версия доступна &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Если вы сейчас создаёте AI-агентов с .NET, вы наверняка заметили: способов разместить их в Azure &lt;em&gt;очень много&lt;/em&gt;. Container Apps, AKS, Functions, App Service, Foundry Agents, Foundry Hosted Agents — и все звучат разумно, пока вам не нужно действительно выбрать один. Microsoft только что опубликовала &lt;a href="https://devblogs.microsoft.com/all-things-azure/hostedagent/"&gt;полное руководство по размещению AI-агентов в Azure&lt;/a&gt;, и я хочу разобрать его с практической точки зрения .NET-разработчика.&lt;/p&gt;
&lt;h2 id="шесть-вариантов-с-первого-взгляда"&gt;Шесть вариантов с первого взгляда&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Вариант&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;&lt;strong&gt;Container Apps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Полный контроль контейнеров без сложности K8s&lt;/td&gt;
&lt;td&gt;Наблюдаемость, состояние, жизненный цикл&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AKS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Корпоративный комплаенс, мультикластер, пользовательские сети&lt;/td&gt;
&lt;td&gt;Всем (в этом и суть)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure Functions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Событийные краткосрочные задачи агентов&lt;/td&gt;
&lt;td&gt;Почти ничем — настоящий serverless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App Service&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Простые HTTP-агенты, предсказуемый трафик&lt;/td&gt;
&lt;td&gt;Развёртывание, настройка масштабирования&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Foundry Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Агенты без кода через портал/SDK&lt;/td&gt;
&lt;td&gt;Почти ничем&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Foundry Hosted Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Агенты с пользовательским фреймворком на управляемой инфраструктуре&lt;/td&gt;
&lt;td&gt;Только ваш код агента&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Первые четыре — это вычисления общего назначения: вы &lt;em&gt;можете&lt;/em&gt; запускать на них агентов, но они не были для этого спроектированы. Последние два — нативные для агентов: они понимают разговоры, вызовы инструментов и жизненные циклы агентов как первоклассные концепции.&lt;/p&gt;
&lt;h2 id="foundry-hosted-agents--оптимальный-выбор-для-net-разработчиков-агентов"&gt;Foundry Hosted Agents — оптимальный выбор для .NET-разработчиков агентов&lt;/h2&gt;
&lt;p&gt;Вот что привлекло моё внимание. Foundry Hosted Agents находятся точно посередине: вы получаете гибкость запуска собственного кода (Semantic Kernel, Agent Framework, LangGraph — что угодно), а платформа управляет инфраструктурой, наблюдаемостью и управлением разговорами.&lt;/p&gt;
&lt;p&gt;Ключевой элемент — &lt;strong&gt;Hosting Adapter&lt;/strong&gt; — тонкий слой абстракции, который соединяет ваш фреймворк агентов с платформой Foundry. Для Microsoft Agent Framework это выглядит так:&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.agentserver.agentframework&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;from_agent_framework&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;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ChatAgent&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;chat_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AzureAIAgentClient&lt;/span&gt;&lt;span class="p"&gt;(&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="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="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;get_local_time&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="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&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;from_agent_framework&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&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;Это вся ваша история хостинга. Адаптер обрабатывает трансляцию протоколов, стриминг через server-sent events, историю разговоров и трассировку OpenTelemetry — всё автоматически. Никакого пользовательского middleware, никакой ручной прокладки.&lt;/p&gt;
&lt;h2 id="развёртывание-действительно-простое"&gt;Развёртывание действительно простое&lt;/h2&gt;
&lt;p&gt;Я раньше развёртывал агентов в Container Apps, и это работает, но в итоге вы пишете много связующего кода для управления состоянием и наблюдаемости. С Hosted Agents и &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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Установить расширение AI-агента&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ext install azure.ai.agents
&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;# Инициализировать из шаблона&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent init
&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;# Собрать, отправить, развернуть — готово&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Эта единственная команда &lt;code&gt;azd up&lt;/code&gt; собирает ваш контейнер, отправляет его в ACR, создаёт проект Foundry, развёртывает endpoints моделей и запускает вашего агента. Пять шагов сжаты в одну команду.&lt;/p&gt;
&lt;h2 id="встроенное-управление-разговорами"&gt;Встроенное управление разговорами&lt;/h2&gt;
&lt;p&gt;Это та часть, которая экономит больше всего времени в продакшене. Вместо создания собственного хранилища состояния разговоров, Hosted Agents обрабатывают это нативно:&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="c1"&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;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&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;&lt;span class="n"&gt;response1&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="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 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="s2"&gt;&amp;#34;MyAgent&amp;#34;&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="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Remember: my favorite number is 42.&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&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;&lt;span class="n"&gt;response2&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="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 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="s2"&gt;&amp;#34;MyAgent&amp;#34;&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="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Multiply my favorite number by 10.&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;Никакого Redis. Никакого хранилища сессий Cosmos DB. Никакого middleware для сериализации сообщений. Платформа просто справляется.&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; → Foundry Agents (портал/SDK, без контейнеров)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Есть пользовательский код агента, но нужен управляемый хостинг?&lt;/strong&gt; → Foundry Hosted Agents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Нужны событийные краткосрочные задачи агентов?&lt;/strong&gt; → Azure Functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Нужен максимальный контроль контейнеров без K8s?&lt;/strong&gt; → Container Apps&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Нужен строгий комплаенс и мультикластер?&lt;/strong&gt; → AKS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Простой HTTP-агент с предсказуемым трафиком?&lt;/strong&gt; → App Service&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Для большинства .NET-разработчиков, работающих с Semantic Kernel или Microsoft Agent Framework, Hosted Agents — вероятно правильная отправная точка. Вы получаете scale-to-zero, встроенный OpenTelemetry, управление разговорами и гибкость фреймворка — без управления Kubernetes или создания собственного стека наблюдаемости.&lt;/p&gt;
&lt;h2 id="подводя-итог"&gt;Подводя итог&lt;/h2&gt;
&lt;p&gt;Ландшафт хостинга агентов в Azure быстро зреет. Если вы начинаете новый проект AI-агента сегодня, я бы серьёзно рассмотрел Foundry Hosted Agents, прежде чем по привычке тянуться к Container Apps или AKS. Управляемая инфраструктура экономит реальное время, а паттерн hosting adapter позволяет сохранить ваш выбор фреймворка.&lt;/p&gt;
&lt;p&gt;Ознакомьтесь с &lt;a href="https://devblogs.microsoft.com/all-things-azure/hostedagent/"&gt;полным руководством Microsoft&lt;/a&gt; и &lt;a href="https://github.com/microsoft-foundry/foundry-samples/tree/main/samples/python/hosted-agents"&gt;репозиторием Foundry Samples&lt;/a&gt; для рабочих примеров.&lt;/p&gt;</content:encoded></item><item><title>Agent Skills в .NET стали по-настоящему гибкими</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/</link><pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/</guid><description>Microsoft Agent Framework теперь поддерживает три способа создания навыков — файлы, классы и инлайн-код — все компонуются через единый provider. Рассказываю почему это важно и как использовать каждый из них.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Эта статья была переведена автоматически. Оригинал доступен &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Если вы строили агентов с Microsoft Agent Framework, вам знаком процесс: определяете навыки, подключаете их к provider и позволяете агенту решать, какой вызвать. Новое — это &lt;em&gt;как&lt;/em&gt; вы создаёте эти навыки, и скачок в гибкости значительный.&lt;/p&gt;
&lt;p&gt;Последнее обновление вводит три паттерна создания agent skills: &lt;strong&gt;файловые&lt;/strong&gt;, &lt;strong&gt;классовые&lt;/strong&gt; и &lt;strong&gt;определённые инлайн-кодом&lt;/strong&gt;. Все три подключаются к единому &lt;code&gt;AgentSkillsProviderBuilder&lt;/code&gt;, что означает свободное комбинирование без логики маршрутизации или специального связующего кода. Расскажу о каждом и когда его использовать.&lt;/p&gt;
&lt;h2 id="файловые-навыки-отправная-точка"&gt;Файловые навыки: отправная точка&lt;/h2&gt;
&lt;p&gt;Файловые навыки — это именно то, что звучит: директория на диске с файлом &lt;code&gt;SKILL.md&lt;/code&gt;, опциональными скриптами и справочными документами. Самый прямой способ дать агенту новые возможности:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;skills/
└── onboarding-guide/
├── SKILL.md
├── scripts/
│ └── check-provisioning.py
└── references/
└── onboarding-checklist.md
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Фронтматтер &lt;code&gt;SKILL.md&lt;/code&gt; объявляет имя и описание навыка, а секция инструкций говорит агенту, как использовать скрипты и ссылки:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&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;name: onboarding-guide
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;description: &amp;gt;-
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Walk new hires through their first-week setup checklist.
&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Instructions
&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;1.&lt;/span&gt; Ask for the employee&amp;#39;s name and start date.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; Run &lt;span class="sb"&gt;`scripts/check-provisioning.py`&lt;/span&gt; to verify accounts.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;3.&lt;/span&gt; Walk through &lt;span class="sb"&gt;`references/onboarding-checklist.md`&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;4.&lt;/span&gt; Follow up on incomplete items.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Затем подключаете &lt;code&gt;SubprocessScriptRunner.RunAsync&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&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;AgentSkillsProvider&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;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&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;SubprocessScriptRunner&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&gt;&lt;/span&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 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="n"&gt;endpoint&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;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&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 class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ChatClientAgentOptions&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;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;HRAgent&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;ChatOptions&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="n"&gt;Instructions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are a helpful HR 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="n"&gt;AIContextProviders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;skillsProvider&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;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;deploymentName&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="классовые-навыки-распространяем-через-nuget"&gt;Классовые навыки: распространяем через NuGet&lt;/h2&gt;
&lt;p&gt;Здесь для команд становится интересно. Классовые навыки наследуют от &lt;code&gt;AgentClassSkill&amp;lt;T&amp;gt;&lt;/code&gt; и используют атрибуты &lt;code&gt;[AgentSkillResource]&lt;/code&gt; и &lt;code&gt;[AgentSkillScript]&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="kd"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BenefitsEnrollmentSkill&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AgentClassSkill&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BenefitsEnrollmentSkill&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="kd"&gt;override&lt;/span&gt; &lt;span class="n"&gt;AgentSkillFrontmatter&lt;/span&gt; &lt;span class="n"&gt;Frontmatter&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 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="s"&gt;&amp;#34;benefits-enrollment&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="s"&gt;&amp;#34;Enroll an employee in health, dental, or vision plans.&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="kd"&gt;protected&lt;/span&gt; &lt;span class="kd"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Instructions&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;1.&lt;/span&gt; &lt;span class="n"&gt;Read&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plans&lt;/span&gt; &lt;span class="n"&gt;resource&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="m"&gt;2.&lt;/span&gt; &lt;span class="n"&gt;Confirm&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;plan&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="n"&gt;wants&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="m"&gt;3.&lt;/span&gt; &lt;span class="n"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;enroll&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;complete&lt;/span&gt; &lt;span class="n"&gt;enrollment&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;&amp;#34;&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&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; [AgentSkillResource(&amp;#34;available-plans&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [Description(&amp;#34;Plan options with monthly pricing.&amp;#34;)]&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;AvailablePlans&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="n"&gt;Available&lt;/span&gt; &lt;span class="n"&gt;Plans&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2026&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;Health&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;HMO&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Premium&lt;/span&gt; &lt;span class="n"&gt;PPO&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;45&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&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;Dental&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Standard&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Enhanced&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;25&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&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;Vision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&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;&amp;#34;&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&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; [AgentSkillScript(&amp;#34;enroll&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [Description(&amp;#34;Enrolls employee in the specified benefit plan.&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Enroll&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;employeeId&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;planCode&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="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HrClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EnrollInPlan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;planCode&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;return&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Serialize&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="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;planCode&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;Красота в том, что команда может упаковать это как NuGet-пакет. Добавляете в проект, помещаете в builder, и оно работает рядом с файловыми навыками без координации:&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;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&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;AgentSkillsProviderBuilder&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;UseFileSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&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;UseSkill&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;BenefitsEnrollmentSkill&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;UseFileScriptRunner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubprocessScriptRunner&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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&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;Знаете тот момент, когда другая команда строит именно тот навык, который вам нужен, но он будет готов только к следующему спринту? &lt;code&gt;AgentInlineSkill&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;timeOffSkill&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;AgentInlineSkill&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;time-off-balance&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;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Calculate remaining vacation and sick days.&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;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;1.&lt;/span&gt; &lt;span class="n"&gt;Ask&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;provided&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="m"&gt;2.&lt;/span&gt; &lt;span class="n"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="n"&gt;balance&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="m"&gt;3.&lt;/span&gt; &lt;span class="n"&gt;Present&lt;/span&gt; &lt;span class="n"&gt;used&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="n"&gt;clearly&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;&amp;#34;&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 class="n"&gt;AddScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;calculate-balance&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&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;employeeId&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;leaveType&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;int&lt;/span&gt; &lt;span class="n"&gt;totalDays&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HrDatabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetAnnualAllowance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leaveType&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;daysUsed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HrDatabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetDaysUsed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leaveType&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;totalDays&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;daysUsed&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;return&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Serialize&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="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leaveType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;totalDays&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;daysUsed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remaining&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;Добавьте в builder так же, как и остальные:&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;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&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;AgentSkillsProviderBuilder&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;UseFileSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&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;UseSkill&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;BenefitsEnrollmentSkill&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;UseSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeOffSkill&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;UseFileScriptRunner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubprocessScriptRunner&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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&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;Когда NuGet-пакет наконец выйдет, замените инлайн-навык на классовую версию. Агент не заметит разницы.&lt;/p&gt;
&lt;p&gt;Но инлайн-навыки не только для мостов. Они также правильный выбор, когда нужно генерировать навыки динамически в рантайме — представьте навык для каждого бизнес-подразделения, загруженный из конфигурации — или когда скрипту нужно захватить локальное состояние, которое не принадлежит DI-контейнеру.&lt;/p&gt;
&lt;h2 id="одобрение-скриптов-человек-в-цикле"&gt;Одобрение скриптов: человек в цикле&lt;/h2&gt;
&lt;p&gt;Для нас, .NET-разработчиков, строящих продакшен-агентов, это та часть, которая по-настоящему разблокирует разговоры о деплое. Некоторые скрипты имеют реальные последствия — записать кого-то на бенефиты, запросить продакшен-инфраструктуру. Включите &lt;code&gt;UseScriptApproval&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&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;AgentSkillsProviderBuilder&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;UseFileSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&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;UseSkill&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;BenefitsEnrollmentSkill&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;UseSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeOffSkill&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;UseFileScriptRunner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubprocessScriptRunner&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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseScriptApproval&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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&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;Настоящая сила не в каком-то отдельном паттерне — а в композиции. Вы можете:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Начать с малого&lt;/strong&gt; с файловым навыком, итерировать инструкции и опубликовать без написания C#&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Распространять переиспользуемые навыки&lt;/strong&gt; как NuGet-пакеты, которые другие команды добавляют одной строкой&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Закрывать пробелы&lt;/strong&gt; инлайн-навыками, когда что-то нужно &lt;em&gt;прямо сейчас&lt;/em&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;code&gt;AgentSkillsProviderBuilder&lt;/code&gt;. Никакой специальной маршрутизации, никакой условной логики, никаких проверок типа навыка.&lt;/p&gt;
&lt;h2 id="подводя-итог"&gt;Подводя итог&lt;/h2&gt;
&lt;p&gt;Agent skills в .NET теперь имеют по-настоящему гибкую модель создания. Будь вы соло-разработчик, прототипирующий с файловыми навыками, или корпоративная команда, распространяющая упакованные возможности через NuGet — паттерны подходят. А механизм одобрения скриптов делает решение готовым к продакшену в средах, где нужен человеческий чекпоинт.&lt;/p&gt;
&lt;p&gt;Ознакомьтесь с &lt;a href="https://devblogs.microsoft.com/agent-framework/agent-skills-in-net-three-ways-to-author-one-provider-to-run-them/"&gt;оригинальным объявлением&lt;/a&gt;, &lt;a href="https://learn.microsoft.com/en-us/agent-framework/agents/skills"&gt;документацией Agent Skills&lt;/a&gt; на Microsoft Learn и &lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet/samples/02-agents/AgentSkills"&gt;примерами .NET на GitHub&lt;/a&gt;, чтобы начать.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server 2.0 выпущен — Self-Hosted Agentic Cloud Automation здесь</title><link>https://thedotnetblog.com/ru/news/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/ru/news/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</guid><description>Azure MCP Server 2.0 достиг стабильности с self-hosted удалёнными развёртываниями, 276 инструментами в 57 сервисах Azure и enterprise-grade безопасностью — вот что важно для .NET разработчиков, создающих agentic workflows.</description><content:encoded>&lt;p&gt;&lt;em&gt;Эта статья была переведена автоматически. Оригинал доступен &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Если вы в последнее время создавали что-то с MCP и Azure, вы наверняка уже знаете, что локальный опыт работает хорошо. Подключите MCP сервер, позвольте вашему AI агенту общаться с ресурсами Azure, и двигайтесь дальше. Но в момент, когда нужно поделиться этой настройкой с командой? Вот тогда всё становится сложным.&lt;/p&gt;
&lt;p&gt;Больше не нужно. Azure MCP Server &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;только что достиг стабильности версии 2.0&lt;/a&gt;, и главная фишка — это ровно то, о чём просили enterprise команды: &lt;strong&gt;поддержка self-hosted удалённых 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;Model Context Protocol&lt;/a&gt; и раскрывает возможности Azure в виде структурированных, обнаруживаемых инструментов, которые AI агенты могут вызывать. Думайте об этом как о стандартизированном мосте между вашим агентом и Azure — provisioning, развёртывание, мониторинг, диагностика, всё через один консистентный интерфейс.&lt;/p&gt;
&lt;p&gt;Цифры говорят сами за себя: &lt;strong&gt;276 MCP инструментов в 57 сервисах Azure&lt;/strong&gt;. Это серьёзное покрытие.&lt;/p&gt;
&lt;h2 id="главное-self-hosted-удалённые-развёртывания"&gt;Главное: self-hosted удалённые развёртывания&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;Enterprise границы сети и политики&lt;/li&gt;
&lt;li&gt;Интеграция в CI/CD pipelines&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) flow&lt;/strong&gt; — OpenID Connect делегирование, которое вызывает Azure API, используя контекст вошедшего пользователя&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Этот OBO flow особенно интересен для нас, .NET разработчиков. Это означает, что ваши agentic workflows могут работать с реальными разрешениями пользователя, а не с какой-то чрезмерно привилегированной сервисной учётной записью. Принцип наименьших привилегий, встроенный прямо туда.&lt;/p&gt;
&lt;h2 id="усиление-безопасности"&gt;Усиление безопасности&lt;/h2&gt;
&lt;p&gt;Это не просто выпуск фич — это ещё и выпуск безопасности. Релиз 2.0 добавляет:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Более сильную валидацию endpoints&lt;/li&gt;
&lt;li&gt;Защиту от injection паттернов в инструментах, ориентированных на запросы&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;IDEs&lt;/strong&gt;: VS Code, Visual Studio, IntelliJ, Eclipse, Cursor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI agents&lt;/strong&gt;: GitHub Copilot CLI, Claude Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standalone&lt;/strong&gt;: локальный сервер для простых настроек&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-hosted remote&lt;/strong&gt;: новая звезда версии 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Плюс есть поддержка sovereign cloud для Azure US Government и Azure, управляемого 21Vianet, что критично для регулируемых развёртываний.&lt;/p&gt;
&lt;h2 id="почему-это-важно-для-net-разработчиков"&gt;Почему это важно для .NET разработчиков&lt;/h2&gt;
&lt;p&gt;Если вы создаёте agentic приложения с .NET — будь то Semantic Kernel, Microsoft Agent Framework или ваша собственная оркестровка — Azure MCP Server 2.0 даёт вам production-ready способ дать вашим агентам взаимодействовать с инфраструктурой 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 API для MCP Apps&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 Repo&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 Image&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 Extension&lt;/a&gt;&lt;/strong&gt; — интеграция IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/self-host"&gt;Self-hosting guide&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 — это ровно тот вид upgrade инфраструктуры, который не выглядит ослепительно на демо, но всё изменяет на практике. Self-hosted удалённый MCP с правильной аутентификацией, усилением безопасности и поддержкой sovereign cloud означает, что MCP готов для реальных команд, создающих реальные agentic workflows на Azure. Если вы ждали сигнала &amp;ldquo;enterprise-ready&amp;rdquo; — вот он.&lt;/p&gt;</content:encoded></item><item><title>Microsoft Foundry Март 2026 — GPT-5.4, Agent Service GA и Обновление SDK, Которое Меняет Всё</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/</guid><description>Мартовское обновление Microsoft Foundry 2026 года масштабно: Agent Service выходит в GA, GPT-5.4 обеспечивает надёжное рассуждение, SDK azure-ai-projects стабилизируется на всех языках, а Fireworks AI приносит открытые модели в Azure.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Оригинал можно прочитать &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ежемесячные посты «Что нового в Microsoft Foundry» обычно представляют собой сочетание инкрементальных улучшений и редких ключевых функций. &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-mar-2026/"&gt;Мартовский выпуск 2026 года&lt;/a&gt;? Практически сплошные ключевые функции. Foundry Agent Service выходит в GA, GPT-5.4 выпускается для продакшена, SDK получает крупный стабильный релиз, а Fireworks AI приносит инференс открытых моделей в Azure. Давайте разберём, что важно для .NET-разработчиков.&lt;/p&gt;
&lt;h2 id="foundry-agent-service-готов-к-продакшену"&gt;Foundry Agent Service готов к продакшену&lt;/h2&gt;
&lt;p&gt;Это главная новость. Среда выполнения агентов нового поколения вышла в общую доступность — построена на OpenAI Responses API, совместима на уровне протокола с агентами OpenAI и открыта для моделей от различных поставщиков. Если вы сегодня строите на Responses API, миграция на Foundry добавит корпоративную безопасность, приватную сеть, Entra RBAC, полную трассировку и оценку поверх вашей существующей агентной логики.&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="n"&gt;project_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&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;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;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&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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ключевые дополнения: сквозная приватная сеть, расширение MCP-аутентификации (включая OAuth passthrough), предварительный просмотр Voice Live для голосовых агентов и размещённые агенты в 6 новых регионах.&lt;/p&gt;
&lt;h2 id="gpt-54--надёжность-важнее-чистого-интеллекта"&gt;GPT-5.4 — надёжность важнее чистого интеллекта&lt;/h2&gt;
&lt;p&gt;GPT-5.4 — это не про то, чтобы стать умнее. Это про надёжность. Более сильное рассуждение в длинных взаимодействиях, лучшее следование инструкциям, меньше сбоев в середине рабочего процесса и встроенные возможности использования компьютера. Для продакшен-агентов эта надёжность значит гораздо больше, чем результаты бенчмарков.&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;th&gt;Лучше всего для&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 (≤272K)&lt;/td&gt;
&lt;td&gt;$2.50 / $15 вывод&lt;/td&gt;
&lt;td&gt;Продакшен-агенты, кодирование, документооборот&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 Pro&lt;/td&gt;
&lt;td&gt;$30 / $180 вывод&lt;/td&gt;
&lt;td&gt;Глубокий анализ, научное рассуждение&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 Mini&lt;/td&gt;
&lt;td&gt;Экономичный&lt;/td&gt;
&lt;td&gt;Классификация, извлечение, лёгкие вызовы инструментов&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Умная стратегия — маршрутизация: GPT-5.4 Mini обрабатывает высоконагруженную работу с низкой задержкой, а GPT-5.4 берёт на себя запросы с интенсивным рассуждением.&lt;/p&gt;
&lt;h2 id="sdk-наконец-стабилен"&gt;SDK наконец стабилен&lt;/h2&gt;
&lt;p&gt;SDK &lt;code&gt;azure-ai-projects&lt;/code&gt; выпустил стабильные релизы на всех языках — Python 2.0.0, JS/TS 2.0.0, Java 2.0.0 и .NET 2.0.0 (1 апреля). Зависимость от &lt;code&gt;azure-ai-agents&lt;/code&gt; исчезла — всё живёт под &lt;code&gt;AIProjectClient&lt;/code&gt;. Установите через &lt;code&gt;pip install azure-ai-projects&lt;/code&gt;, пакет включает &lt;code&gt;openai&lt;/code&gt; и &lt;code&gt;azure-identity&lt;/code&gt; как прямые зависимости.&lt;/p&gt;
&lt;p&gt;Для .NET-разработчиков это означает единый NuGet-пакет для всей поверхности Foundry. Больше никакого жонглирования отдельными SDK для агентов.&lt;/p&gt;
&lt;h2 id="fireworks-ai-приносит-открытые-модели-в-azure"&gt;Fireworks AI приносит открытые модели в Azure&lt;/h2&gt;
&lt;p&gt;Пожалуй, самое архитектурно интересное дополнение: Fireworks AI обрабатывает более 13 триллионов токенов в день при ~180K запросов/секунду, теперь доступен через Foundry. DeepSeek V3.2, gpt-oss-120b, Kimi K2.5 и MiniMax M2.5 при запуске.&lt;/p&gt;
&lt;p&gt;Настоящая история — это &lt;strong&gt;bring-your-own-weights&lt;/strong&gt; — загружайте квантованные или дообученные веса откуда угодно без смены стека обслуживания. Развёртывание через бессерверную модель с оплатой за токен или выделенную пропускную способность.&lt;/p&gt;
&lt;h2 id="другие-важные-моменты"&gt;Другие важные моменты&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phi-4 Reasoning Vision 15B&lt;/strong&gt; — мультимодальное рассуждение для графиков, диаграмм и макетов документов&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluations GA&lt;/strong&gt; — готовые оценщики с непрерывным мониторингом продакшена через Azure Monitor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Priority Processing&lt;/strong&gt; (Preview) — выделенная вычислительная линия для нагрузок, чувствительных к задержке&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voice Live&lt;/strong&gt; — среда выполнения «голос-к-голосу», подключаемая напрямую к агентам Foundry&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tracing GA&lt;/strong&gt; — сквозная инспекция трассировок агентов с сортировкой и фильтрацией&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Устаревание PromptFlow&lt;/strong&gt; — миграция на Microsoft Framework Workflows к январю 2027&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="заключение"&gt;Заключение&lt;/h2&gt;
&lt;p&gt;Март 2026 — это поворотный момент для Foundry. Agent Service GA, стабильные SDK на всех языках, GPT-5.4 для надёжных продакшен-агентов и инференс открытых моделей через Fireworks AI — платформа готова к серьёзным нагрузкам.&lt;/p&gt;
&lt;p&gt;Прочитайте &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-mar-2026/"&gt;полный обзор&lt;/a&gt; и &lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;создайте своего первого агента&lt;/a&gt;, чтобы начать.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server — Правильный способ дать AI-агентам доступ к базе данных</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</guid><description>SQL MCP Server от Data API builder даёт AI-агентам безопасный, детерминированный доступ к базам данных без раскрытия схем и без NL2SQL. RBAC, кеширование, поддержка нескольких баз — всё встроено.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Оригинал можно прочитать &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Давайте будем честны: большинство доступных сегодня MCP-серверов для баз данных устрашают. Они берут запрос на естественном языке, генерируют SQL на лету и выполняют его против ваших продакшн-данных. Что может пойти не так? (Всё. Абсолютно всё.)&lt;/p&gt;
&lt;p&gt;Команда Azure SQL только что &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;представила SQL MCP Server&lt;/a&gt;, и он использует принципиально другой подход. Построенный как функция Data API builder (DAB) 2.0, он даёт AI-агентам структурированный, детерминированный доступ к операциям с базой данных — без NL2SQL, без раскрытия вашей схемы и с полным RBAC на каждом шагу.&lt;/p&gt;
&lt;h2 id="почему-не-nl2sql"&gt;Почему не NL2SQL?&lt;/h2&gt;
&lt;p&gt;Это самое интересное проектное решение. Модели недетерминированы, а сложные запросы наиболее склонны порождать тонкие ошибки. Именно те запросы, которые пользователи надеются, что AI сможет сгенерировать, также требуют наибольшей проверки, когда генерируются недетерминированно.&lt;/p&gt;
&lt;p&gt;Вместо этого SQL MCP Server использует подход &lt;strong&gt;NL2DAB&lt;/strong&gt;. Агент работает со слоем абстракции сущностей Data API builder и встроенным конструктором запросов для детерминированной генерации точного, хорошо сформированного T-SQL. Тот же результат для пользователя, но без риска галлюцинированных JOIN или случайного раскрытия данных.&lt;/p&gt;
&lt;h2 id="семь-инструментов-а-не-семьсот"&gt;Семь инструментов, а не семьсот&lt;/h2&gt;
&lt;p&gt;SQL MCP Server предоставляет ровно семь DML-инструментов, независимо от размера базы данных:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;describe_entities&lt;/code&gt; — обнаружение доступных сущностей и операций&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create_record&lt;/code&gt; — вставка строк&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read_records&lt;/code&gt; — запрос таблиц и представлений&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_record&lt;/code&gt; — изменение строк&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete_record&lt;/code&gt; — удаление строк&lt;/li&gt;
&lt;li&gt;&lt;code&gt;execute_entity&lt;/code&gt; — выполнение хранимых процедур&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aggregate_records&lt;/code&gt; — запросы агрегации&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Это умно, потому что контекстные окна — это пространство для мышления агента. Наводнение их сотнями определений инструментов оставляет меньше места для рассуждений. Семь фиксированных инструментов держат агента сфокусированным на &lt;em&gt;мышлении&lt;/em&gt;, а не на &lt;em&gt;навигации&lt;/em&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="s2"&gt;&amp;#34;runtime&amp;#34;&lt;/span&gt;&lt;span class="err"&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;mcp&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;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;path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/mcp&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;dml-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;describe-entities&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;create-record&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;read-records&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;update-record&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;delete-record&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;execute-entity&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;aggregate-records&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;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;dab init &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --database-type mssql &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --connection-string &lt;span class="s2"&gt;&amp;#34;@env(&amp;#39;sql_connection_string&amp;#39;)&amp;#34;&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;dab add Customers &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --source dbo.Customers &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --permissions &lt;span class="s2"&gt;&amp;#34;anonymous:*&amp;#34;&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;dab start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Это работающий SQL MCP Server, предоставляющий доступ к вашей таблице Customers. Слой абстракции сущностей позволяет задавать псевдонимы для имён и столбцов, ограничивать поля по ролям и точно контролировать, что видят агенты — не раскрывая внутренних деталей схемы.&lt;/p&gt;
&lt;h2 id="история-безопасности-убедительна"&gt;История безопасности убедительна&lt;/h2&gt;
&lt;p&gt;Здесь зрелость Data API builder окупается:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RBAC на каждом уровне&lt;/strong&gt; — каждая сущность определяет, какие роли могут читать, создавать, обновлять или удалять, и какие поля видны&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Интеграция с Azure Key Vault&lt;/strong&gt; — строки подключения и секреты управляются безопасно&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Entra + пользовательский OAuth&lt;/strong&gt; — аутентификация продакшн-уровня&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Security Policy&lt;/strong&gt; — агенты взаимодействуют через контролируемый контракт, а не сырой SQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Абстракция схемы особенно важна. Внутренние имена таблиц и столбцов никогда не раскрываются агенту. Вы определяете сущности, псевдонимы и описания, имеющие смысл для AI-взаимодействия — а не вашу ER-диаграмму.&lt;/p&gt;
&lt;h2 id="мульти-база-и-мульти-протокол"&gt;Мульти-база и мульти-протокол&lt;/h2&gt;
&lt;p&gt;SQL MCP Server поддерживает Microsoft SQL, PostgreSQL, Azure Cosmos DB и MySQL. А поскольку это функция DAB, вы получаете REST, GraphQL и MCP эндпоинты одновременно из одной конфигурации. Те же определения сущностей, те же правила RBAC, та же безопасность — по всем трём протоколам.&lt;/p&gt;
&lt;p&gt;Автоконфигурация в DAB 2.0 может даже проинспектировать вашу базу данных и динамически построить конфигурацию, если вам подходит меньше абстракции для быстрого прототипирования.&lt;/p&gt;
&lt;h2 id="моё-мнение"&gt;Моё мнение&lt;/h2&gt;
&lt;p&gt;Вот как должен работать корпоративный доступ к базам данных для AI-агентов. Не «эй, LLM, напиши мне SQL и YOLO его по продакшну». Вместо этого: чётко определённый слой сущностей, детерминированная генерация запросов, RBAC на каждом шагу, кеширование, мониторинг и телеметрия. Скучно в самом лучшем смысле.&lt;/p&gt;
&lt;p&gt;Для .NET-разработчиков история интеграции чистая — DAB является .NET-инструментом, MCP Server работает как контейнер и интегрируется с Azure SQL, который большинство из нас уже использует. Если вы строите AI-агентов, которым нужен доступ к данным, начните здесь.&lt;/p&gt;
&lt;h2 id="подводя-итоги"&gt;Подводя итоги&lt;/h2&gt;
&lt;p&gt;SQL MCP Server бесплатен, с открытым исходным кодом и работает где угодно. Это предписывающий подход Microsoft к предоставлению AI-агентам безопасного доступа к базам данных. Ознакомьтесь с &lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;полным постом&lt;/a&gt; и &lt;a href="https://aka.ms/sql/mcp"&gt;документацией&lt;/a&gt; для начала работы.&lt;/p&gt;</content:encoded></item><item><title>Агентная платформенная инженерия становится реальностью — Git-APE показывает как</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/agentic-platform-engineering-git-ape/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/agentic-platform-engineering-git-ape/</guid><description>Проект Git-APE от Microsoft воплощает агентную платформенную инженерию на практике — используя агенты GitHub Copilot и Azure MCP для превращения запросов на естественном языке в валидированную облачную инфраструктуру.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Оригинал можно прочитать &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/agentic-platform-engineering-git-ape/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Платформенная инженерия была одним из тех терминов, которые звучат отлично на конференциях, но обычно означают «мы построили внутренний портал и обёртку для Terraform.» Настоящее обещание — самообслуживающаяся инфраструктура, которая действительно безопасна, управляема и быстра — всегда была в нескольких шагах.&lt;/p&gt;
&lt;p&gt;Команда Azure только что опубликовала &lt;a href="https://devblogs.microsoft.com/all-things-azure/putting-agentic-platform-engineering-to-the-test/"&gt;Часть 2 серии об агентной платформенной инженерии&lt;/a&gt;, и эта часть целиком о практической реализации. Они называют это &lt;strong&gt;Git-APE&lt;/strong&gt; (да, акроним намеренный), и это open-source проект, который использует агенты GitHub Copilot плюс серверы Azure MCP для превращения запросов на естественном языке в валидированную и развёрнутую инфраструктуру.&lt;/p&gt;
&lt;h2 id="что-git-ape-делает-на-самом-деле"&gt;Что Git-APE делает на самом деле&lt;/h2&gt;
&lt;p&gt;Основная идея: вместо того чтобы разработчики изучали модули Terraform, навигировали по UI порталов или создавали тикеты для платформенной команды, они разговаривают с агентом Copilot. Агент интерпретирует намерение, генерирует Infrastructure-as-Code, валидирует его по политикам и разворачивает — всё внутри VS Code.&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-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/Azure/git-ape
&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; git-ape
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Откройте workspace в VS Code, и файлы конфигурации агента автоматически обнаруживаются GitHub Copilot. Вы взаимодействуете с агентом напрямую:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;@git-ape deploy a function app with storage in West Europe
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Агент использует Azure MCP Server под капотом для взаимодействия с сервисами Azure. Конфигурация MCP в настройках VS Code активирует конкретные возможности:&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;azureMcp.serverMode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;namespace&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;azureMcp.enabledServices&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;deploy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bestpractices&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;group&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;subscription&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;functionapp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;storage&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;sql&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;monitor&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 class="nt"&gt;&amp;#34;azureMcp.readOnly&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&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;Для тех из нас, кто строит на Azure, это смещает разговор о платформенной инженерии с «как построить портал» на «как описать наши ограничения как API.» Когда интерфейс вашей платформы — это ИИ-агент, качество ваших ограничений и политик становится продуктом.&lt;/p&gt;
&lt;p&gt;Блог Части 1 изложил теорию: хорошо описанные API, схемы контроля и явные ограничения делают платформы agent-ready. Часть 2 доказывает, что это работает, поставляя реальные инструменты. Агент не генерирует ресурсы вслепую — он валидирует по лучшим практикам, соблюдает соглашения об именовании и применяет политики вашей организации.&lt;/p&gt;
&lt;p&gt;Очистка так же проста:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;@git-ape destroy my-resource-group
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="моё-мнение"&gt;Моё мнение&lt;/h2&gt;
&lt;p&gt;Буду честен — здесь больше о паттерне, чем о конкретном инструменте. Git-APE сам по себе — это демо/референсная архитектура. Но лежащая в основе идея — агенты как интерфейс к вашей платформе, MCP как протокол, GitHub Copilot как хост — вот куда движется experience корпоративного разработчика.&lt;/p&gt;
&lt;p&gt;Если вы — платформенная команда, которая ищет, как сделать внутренние инструменты agent-friendly, лучшего стартового пункта не найти. А если вы .NET-разработчик и думаете, как это связано с вашим миром: Azure MCP Server и агенты GitHub Copilot работают с любыми нагрузками Azure. Ваш ASP.NET Core API, ваш стек .NET Aspire, ваши контейнеризированные микросервисы — всё это может быть целью агентного потока деплоя.&lt;/p&gt;
&lt;h2 id="подведём-итоги"&gt;Подведём итоги&lt;/h2&gt;
&lt;p&gt;Git-APE — это ранний, но конкретный взгляд на агентную платформенную инженерию на практике. Клонируйте &lt;a href="https://github.com/Azure/git-ape"&gt;репозиторий&lt;/a&gt;, попробуйте демо и начните думать о том, как API и политики вашей платформы должны выглядеть, чтобы агент мог безопасно их использовать.&lt;/p&gt;
&lt;p&gt;Читайте &lt;a href="https://devblogs.microsoft.com/all-things-azure/putting-agentic-platform-engineering-to-the-test/"&gt;полный пост&lt;/a&gt; для walkthrough и видео-демонстраций.&lt;/p&gt;</content:encoded></item><item><title>Оценка модернизации GitHub Copilot — лучший инструмент миграции, который вы ещё не используете</title><link>https://thedotnetblog.com/ru/news/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/ru/news/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/ru/news/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 — одна из тех задач, о которых все знают, что их нужно сделать, но никто не хочет начинать. Это никогда не просто «сменить целевой фреймворк». Это API, которые исчезли, пакеты, которых больше нет, модели хостинга, которые работают совершенно по-другому, и миллион мелких решений о том, что контейнеризировать, что переписать и что оставить как есть.&lt;/p&gt;
&lt;p&gt;Джеффри Фриц только что опубликовал &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; — прицельный путь. Настройте точно, что анализировать: целевой compute (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;И каждая проблема ссылается на затронутые файлы и номера строк, предоставляет подробное описание того, что не так и почему это важно для вашей целевой платформы, даёт конкретные шаги по устранению (не просто «исправьте это») и включает ссылки на официальную документацию.&lt;/p&gt;
&lt;p&gt;Вы можете передать отдельные проблемы разработчикам, и у них есть всё необходимое для действий. В этом разница между инструментом, который говорит «есть проблема» и инструментом, который говорит, как её решить.&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; инструмент, с которого стоит начать. Только документ оценки стоит потраченного времени — он превращает расплывчатое «нам бы модернизировать» в конкретный, приоритизированный список рабочих элементов с чёткими путями вперёд.&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/ru/news/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/ru/news/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</guid><description>Создайте MCP-сервер один раз, разверните на Azure Functions и подключите к агентам Microsoft Foundry с правильной аутентификацией. Ваши инструменты работают везде — VS Code, Cursor, а теперь и корпоративные AI-агенты.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Оригинал можно прочитать &lt;a href="https://thedotnetblog.com/ru/news/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;Лили Ма из команды 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 даёт вам AI-агентов, которые могут рассуждать, планировать и выполнять действия. Соединение этих двух означает, что ваши пользовательские инструменты — запросы к базе данных, вызовы бизнес-API, выполнение логики валидации — становятся возможностями, которые корпоративные AI-агенты могут автономно обнаруживать и использовать.&lt;/p&gt;
&lt;p&gt;Ключевой момент: ваш MCP-сервер остаётся прежним. Вы просто добавляете Foundry как ещё одного потребителя. Те же инструменты, которые работают в вашей конфигурации VS Code, теперь обеспечивают работу AI-агента, с которым взаимодействуют ваша команда или клиенты.&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&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-удостоверений&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;Для продакшна рекомендуется Microsoft Entra с идентификацией агента. Проброс OAuth-удостоверений — для случаев, когда важен контекст пользователя: агент предлагает пользователям войти, и каждый запрос несёт собственный токен пользователя.&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; на вашем function app&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-совместимый клиент может его использовать — инструменты для кодирования, чат-приложения, а теперь и корпоративные AI-агенты. Это паттерн «напиши один раз, используй везде», который действительно работает.&lt;/p&gt;
&lt;p&gt;Для .NET-разработчиков конкретно, &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;расширение MCP для Azure Functions&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 — быстрый выигрыш: ваши пользовательские инструменты становятся корпоративными AI-возможностями с правильной аутентификацией и без изменений кода на сервере.&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>Создаём мультиагентные UI в реальном времени, которые не выглядят как чёрный ящик</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/</guid><description>AG-UI и Microsoft Agent Framework объединяются, чтобы дать мультиагентным рабочим процессам полноценный фронтенд — с потоковой передачей в реальном времени, человеческими одобрениями и полной видимостью действий агентов.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Оригинал можно прочитать &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Вот в чём дело с мультиагентными системами: в демо они выглядят невероятно. Три агента передают друг другу работу, решают задачи, принимают решения. А потом ты пытаешься показать это реальным пользователям и&amp;hellip; тишина. Крутящийся индикатор. Непонятно, какой агент чем занимается и почему система встала на паузу. Это не продукт — это проблема доверия.&lt;/p&gt;
&lt;p&gt;Команда Microsoft Agent Framework только что опубликовала &lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;отличный walkthrough&lt;/a&gt; о том, как связать рабочие процессы MAF с &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;AG-UI&lt;/a&gt; — открытым протоколом для потоковой передачи событий выполнения агентов на фронтенд через Server-Sent Events. И честно? Это именно тот мост, которого нам не хватало.&lt;/p&gt;
&lt;h2 id="почему-это-важно-для-net-разработчиков"&gt;Почему это важно для .NET-разработчиков&lt;/h2&gt;
&lt;p&gt;Если вы строите приложения с ИИ, наверняка уже упирались в эту стену. Ваша серверная оркестрация работает отлично — агенты передают задачи друг другу, инструменты запускаются, решения принимаются. Но фронтенд понятия не имеет, что происходит за кулисами. AG-UI решает это, определяя стандартный протокол для потоковой передачи событий агентов (&lt;code&gt;RUN_STARTED&lt;/code&gt;, &lt;code&gt;STEP_STARTED&lt;/code&gt;, &lt;code&gt;TOOL_CALL_*&lt;/code&gt;, &lt;code&gt;TEXT_MESSAGE_*&lt;/code&gt;) напрямую в ваш UI-слой через SSE.&lt;/p&gt;
&lt;p&gt;Демо — это рабочий процесс клиентской поддержки с тремя агентами: агент триажа маршрутизирует запросы, агент возвратов обрабатывает денежные вопросы, и агент заказов управляет заменами. У каждого агента свои инструменты, а топология передач определена явно — никакого «разберись из промпта».&lt;/p&gt;
&lt;h2 id="топология-передач--настоящая-звезда"&gt;Топология передач — настоящая звезда&lt;/h2&gt;
&lt;p&gt;Что зацепило мой взгляд — как &lt;code&gt;HandoffBuilder&lt;/code&gt; позволяет объявить направленный граф маршрутизации между агентами:&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;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HandoffBuilder&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;ag_ui_handoff_workflow_demo&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;participants&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&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;termination_condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;termination_condition&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="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;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Refunds, damaged-item claims...&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Replacement, exchange...&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Replacement logistics needed after refund.&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;After replacement/shipping tasks complete.&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;code&gt;add_handoff&lt;/code&gt; создаёт направленное ребро с описанием на естественном языке. Фреймворк генерирует инструменты передачи для каждого агента на основе этой топологии. Решения о маршрутизации основываются на вашей структуре оркестрации, а не на том, что LLM решит сделать. Это огромное преимущество для надёжности в продакшене.&lt;/p&gt;
&lt;h2 id="human-in-the-loop-который-действительно-работает"&gt;Human-in-the-loop, который действительно работает&lt;/h2&gt;
&lt;p&gt;Демо показывает два паттерна прерываний, без которых не обойтись ни одному реальному агентному приложению:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Прерывания для одобрения инструментов&lt;/strong&gt; — когда агент вызывает инструмент с &lt;code&gt;approval_mode=&amp;quot;always_require&amp;quot;&lt;/code&gt;, рабочий процесс ставится на паузу и отправляет событие. Фронтенд рендерит модальное окно одобрения с названием инструмента и аргументами. Никаких циклов повторных попыток, сжигающих токены — просто чистый поток пауза-одобрение-возобновление.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Прерывания запроса информации&lt;/strong&gt; — когда агенту нужно больше контекста от пользователя (например, ID заказа), он ставит на паузу и спрашивает. Фронтенд показывает вопрос, пользователь отвечает, и выполнение возобновляется с того же места, где остановилось.&lt;/p&gt;
&lt;p&gt;Оба паттерна передаются как стандартные события AG-UI, поэтому вашему фронтенду не нужна специальная логика для каждого агента — он просто отображает любое событие, приходящее через SSE-соединение.&lt;/p&gt;
&lt;h2 id="подключение-удивительно-простое"&gt;Подключение удивительно простое&lt;/h2&gt;
&lt;p&gt;Интеграция между MAF и AG-UI — это один вызов функции:&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;agent_framework.ag_ui&lt;/span&gt; &lt;span class="kn"&gt;import&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;AgentFrameworkWorkflow&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;add_agent_framework_fastapi_endpoint&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastAPI&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;demo_workflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AgentFrameworkWorkflow&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;workflow_factory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;_thread_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;create_handoff_workflow&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;ag_ui_handoff_workflow_demo&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;add_agent_framework_fastapi_endpoint&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="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;app&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;demo_workflow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/handoff_demo&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;code&gt;workflow_factory&lt;/code&gt; создаёт свежий рабочий процесс для каждого потока, так что каждый диалог получает изолированное состояние. Эндпоинт автоматически обрабатывает всю SSE-обвязку. Если вы уже используете FastAPI (или можете добавить его как лёгкий слой), это практически без трения.&lt;/p&gt;
&lt;h2 id="моё-мнение"&gt;Моё мнение&lt;/h2&gt;
&lt;p&gt;Для нас, .NET-разработчиков, немедленный вопрос: «Можно ли сделать это на C#?» Agent Framework доступен и для .NET, и для Python, а протокол AG-UI не зависит от языка (это просто SSE). Так что хотя конкретная демка использует Python и FastAPI, паттерн переносится напрямую. Вы можете настроить минимальный API ASP.NET Core с SSE-эндпоинтами, следуя той же схеме событий AG-UI.&lt;/p&gt;
&lt;p&gt;Более важный вывод — мультиагентные UI становятся полноценной задачей первого класса, а не чем-то придуманным постфактум. Если вы строите что-либо, где агенты взаимодействуют с людьми — клиентская поддержка, рабочие процессы утверждения, обработка документов — эта комбинация оркестрации MAF и прозрачности AG-UI является паттерном, которому стоит следовать.&lt;/p&gt;
&lt;h2 id="подведём-итоги"&gt;Подведём итоги&lt;/h2&gt;
&lt;p&gt;AG-UI + Microsoft Agent Framework даёт вам лучшее из обоих миров: надёжную мультиагентную оркестрацию на бэкенде и видимость в реальном времени на фронтенде. Больше никаких взаимодействий агентов как чёрный ящик.&lt;/p&gt;
&lt;p&gt;Посмотрите &lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;полный walkthrough&lt;/a&gt; и &lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;репозиторий протокола AG-UI&lt;/a&gt;, чтобы погрузиться глубже.&lt;/p&gt;</content:encoded></item><item><title>azd теперь позволяет запускать и отлаживать ИИ-агенты локально — Что изменилось в марте 2026</title><link>https://thedotnetblog.com/ru/news/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/ru/news/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/ru/news/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; добавляет команды для полноценного inner-loop для ИИ-агентов:&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 при каждом изменении. Теперь можно итерировать локально, тестировать поведение агента и деплоить только когда готов.&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;Set up with GitHub Copilot (Preview)&amp;rdquo;. Вместо ручного ответа на промпты, Copilot-агент генерирует конфигурацию за вас. Когда команда падает, &lt;code&gt;azd&lt;/code&gt; предлагает ИИ-ассистированное устранение неполадок — всё не выходя из терминала.&lt;/p&gt;
&lt;h2 id="container-app-jobs-и-улучшения-деплоя"&gt;Container App Jobs и улучшения деплоя&lt;/h2&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;.&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;.&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;Локальная preflight-валидация&lt;/strong&gt;: Bicep-параметры проверяются локально перед деплоем.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="улучшения-dx"&gt;Улучшения DX&lt;/h2&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;h2 id="подведём-итоги"&gt;Подведём итоги&lt;/h2&gt;
&lt;p&gt;Локальный цикл отладки ИИ-агентов — звезда этого релиза, но совокупность улучшений деплоя и DX делает &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;/p&gt;</content:encoded></item><item><title>KubeCon Europe 2026: Что на самом деле важно для .NET-разработчиков</title><link>https://thedotnetblog.com/ru/news/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/ru/news/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</guid><description>Microsoft выпустила массу анонсов Kubernetes на KubeCon Europe 2026. Вот отфильтрованная версия — только обновления AKS и cloud-native, которые важны, если вы поставляете .NET-приложения.</description><content:encoded>&lt;p&gt;&lt;em&gt;Этот пост был переведён автоматически. Оригинальную версию можно прочитать &lt;a href="https://thedotnetblog.com/ru/news/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/"&gt;здесь&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Знаете это чувство, когда выходит огромный пост с анонсами и вы листаете его, думая «круто, но что это на самом деле меняет для меня»? Это я каждый сезон 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; — написанный лично Бренданом Бёрнсом — и честно? Здесь настоящая суть. Не просто чеклисты фич, а операционные улучшения, которые меняют подход к управлению в продакшене.&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;Вот в чём дело с service mesh: все хотят гарантий безопасности, никто не хочет операционной нагрузки. AKS наконец закрывает этот разрыв.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/application-network"&gt;Azure Kubernetes Application Network&lt;/a&gt; даёт вам mutual TLS, авторизацию с учётом приложения и телеметрию трафика — без развёртывания полного mesh с тяжёлыми sidecar. В сочетании с &lt;a href="https://aka.ms/acns/cilium-mtls"&gt;Cilium mTLS в Advanced Container Networking Services&lt;/a&gt; вы получаете зашифрованную связь между подами с использованием сертификатов X.509 и SPIRE для управления идентификацией.&lt;/p&gt;
&lt;p&gt;Что это значит на практике: ваши ASP.NET Core API общаются с фоновыми воркерами, ваши 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 с Meshless Istio&lt;/a&gt; с полной поддержкой Kubernetes Gateway API. Без sidecar. На основе стандартов. Плюс инструменты &lt;code&gt;ingress2gateway&lt;/code&gt; для постепенной миграции.&lt;/p&gt;
&lt;h2 id="наблюдаемость-gpu--не-как-запоздалая-мысль"&gt;Наблюдаемость GPU — не как запоздалая мысль&lt;/h2&gt;
&lt;p&gt;Если вы запускаете AI-инференс рядом с .NET-сервисами (а давайте честно, кто сейчас не начинает?), вы наверняка столкнулись со слепым пятном мониторинга GPU. У вас были отличные дашборды CPU/памяти, а потом&amp;hellip; ничего для GPU без ручной настройки экспортёров.&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;agentic container networking&lt;/a&gt; добавляет веб-интерфейс, где можно задавать вопросы на естественном языке о состоянии сети кластера. «Почему под X не достигает сервис Y?» → диагностика только для чтения из live-телеметрии. Реально полезно в 2 часа ночи.&lt;/p&gt;
&lt;h2 id="кросс-кластерная-сеть-без-учёной-степени"&gt;Кросс-кластерная сеть без учёной степени&lt;/h2&gt;
&lt;p&gt;Мульти-кластерный Kubernetes исторически был опытом «принеси свой сетевой клей». 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 через mesh, с согласованными политиками маршрутизации и безопасности.&lt;/p&gt;
&lt;h2 id="обновления-не-требующие-смелости"&gt;Обновления, не требующие смелости&lt;/h2&gt;
&lt;p&gt;Давайте честно — обновления Kubernetes в продакшене — это стресс. «Обновить и надеяться» было стратегией по умолчанию для слишком многих команд и главной причиной, по которой кластеры отстают по версиям.&lt;/p&gt;
&lt;p&gt;Две новые возможности меняют это:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blue-green обновления пулов агентов&lt;/strong&gt; создают параллельный пул нод с новой конфигурацией. Валидируйте поведение, постепенно переключайте трафик и сохраняйте чистый путь отката. Больше никаких мутаций на месте на продакшн-нодах.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Откат пула агентов&lt;/strong&gt; позволяет вернуть пул нод на предыдущую версию Kubernetes и образ ноды после неудачного обновления — без пересборки кластера.&lt;/p&gt;
&lt;p&gt;Вместе они наконец дают операторам реальный контроль над жизненным циклом обновлений. Для .NET-команд это важно, потому что скорость платформы напрямую определяет, как быстро вы можете принять новые рантаймы, патчи безопасности и сетевые возможности.&lt;/p&gt;
&lt;h2 id="ai-рабочие-нагрузки-становятся-полноценными-гражданами-kubernetes"&gt;AI-рабочие нагрузки становятся полноценными гражданами Kubernetes&lt;/h2&gt;
&lt;p&gt;Upstream-работа в open source не менее важна. Dynamic Resource Allocation (DRA) только что стала GA в 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 API для инференса — деплой моделей без знания 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;Агентный troubleshooting для cloud-native — теперь проект 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 — меньше CVE на этапе сборки&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;Попробуйте blue-green обновления&lt;/strong&gt; — протестируйте workflow отката перед следующим обновлением продакшен-кластера. Постройте доверие к процессу.&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. Лучшая сетевая безопасность без оверхеда mesh, настоящая наблюдаемость GPU, более безопасные обновления и более прочные основы AI-инфраструктуры.&lt;/p&gt;
&lt;p&gt;Если вы уже на AKS, сейчас отличный момент укрепить ваш операционный baseline. А если планируете перенести .NET-рабочие нагрузки на Kubernetes — платформа только что стала значительно более готовой к продакшену.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server, Copilot в SSMS и Database Hub с ИИ-агентами: что действительно важно с SQLCon 2026</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/agentic-ai-microsoft-databases-what-matters/</link><pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/agentic-ai-microsoft-databases-what-matters/</guid><description>Microsoft представила целый ряд анонсов по базам данных на SQLCon 2026. Вот что действительно важно, если вы создаёте приложения с ИИ на Azure SQL.</description><content:encoded>&lt;p&gt;Microsoft только что открыла &lt;a href="https://www.microsoft.com/en-us/sql-server/blog/2026/03/18/advancing-agentic-ai-with-microsoft-databases-across-a-unified-data-estate/"&gt;SQLCon 2026 вместе с FabCon в Атланте&lt;/a&gt;, и тут есть что разбирать. Оригинальный анонс охватывает всё — от планов экономии до корпоративных функций соответствия требованиям. Я пропущу слайды с корпоративными ценами и сосредоточусь на том, что важно, если вы разработчик, создающий решения с Azure SQL и ИИ.&lt;/p&gt;
&lt;h2 id="sql-mcp-server-в-публичном-превью"&gt;SQL MCP Server в публичном превью&lt;/h2&gt;
&lt;p&gt;Это главная новость для меня. Azure SQL Database Hyperscale теперь имеет &lt;strong&gt;SQL MCP Server&lt;/strong&gt; в публичном превью, который позволяет безопасно подключать ваши данные SQL к ИИ-агентам и Copilot через &lt;a href="https://modelcontextprotocol.io/"&gt;Model Context Protocol&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Если вы следили за волной MCP — а честно говоря, сейчас это трудно пропустить — это большое дело. Вместо создания пользовательских конвейеров данных для передачи контекста из базы данных вашим ИИ-агентам, вы получаете стандартизированный протокол для прямого предоставления SQL-данных. Ваши агенты могут запрашивать, анализировать и действовать на основе актуальной информации из базы данных.&lt;/p&gt;
&lt;p&gt;Для тех из нас, кто создаёт ИИ-агентов с Semantic Kernel или Microsoft Agent Framework, это открывает чистый путь интеграции. Вашему агенту нужно проверить наличие товара? Найти запись клиента? Валидировать заказ? MCP даёт ему структурированный способ сделать это без написания индивидуального кода получения данных для каждого сценария.&lt;/p&gt;
&lt;h2 id="github-copilot-в-ssms-22-вышел-в-ga"&gt;GitHub Copilot в SSMS 22 вышел в GA&lt;/h2&gt;
&lt;p&gt;Если вы проводите время в SQL Server Management Studio — и будем честны, большинство из нас до сих пор это делает — GitHub Copilot теперь общедоступен в SSMS 22. Тот же опыт Copilot, который вы уже используете в VS Code и Visual Studio, но для T-SQL.&lt;/p&gt;
&lt;p&gt;Практическая ценность понятна: чат-ассистент для написания запросов, рефакторинга хранимых процедур, устранения проблем производительности и выполнения административных задач. Ничего революционного в концепции, но наличие этого прямо в SSMS означает, что вам не нужно переключаться на другой редактор, чтобы получить помощь ИИ при работе с базой данных.&lt;/p&gt;
&lt;h2 id="векторные-индексы-получили-серьёзное-обновление"&gt;Векторные индексы получили серьёзное обновление&lt;/h2&gt;
&lt;p&gt;Azure SQL Database теперь имеет более быстрые и функциональные векторные индексы с полной поддержкой вставки, обновления и удаления. Это означает, что ваши векторные данные остаются актуальными в реальном времени — без необходимости пакетного переиндексирования.&lt;/p&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;Если вы используете retrieval-augmented generation (RAG) с Azure SQL в качестве векторного хранилища, эти улучшения напрямую полезны. Вы можете хранить векторы рядом с реляционными данными в одной базе данных, что значительно упрощает архитектуру по сравнению с запуском отдельной векторной базы данных.&lt;/p&gt;
&lt;p&gt;Те же улучшения для векторов доступны и в SQL database в Fabric, поскольку обе системы работают на одном движке SQL.&lt;/p&gt;
&lt;h2 id="database-hub-в-fabric-агентное-управление"&gt;Database Hub в Fabric: агентное управление&lt;/h2&gt;
&lt;p&gt;Этот анонс больше ориентирован на будущее, но он интересен. Microsoft анонсировала &lt;strong&gt;Database Hub в Microsoft Fabric&lt;/strong&gt; (ранний доступ), который даёт единую панель управления для Azure SQL, Cosmos DB, PostgreSQL, MySQL и SQL Server через Arc.&lt;/p&gt;
&lt;p&gt;Интересный момент не только в едином представлении — а в агентном подходе к управлению. ИИ-агенты непрерывно мониторят вашу инфраструктуру баз данных, выявляют изменения, объясняют, почему они важны, и предлагают, что делать дальше. Это модель с участием человека, где агент выполняет рутинную работу, а вы принимаете решения.&lt;/p&gt;
&lt;p&gt;Для команд, управляющих более чем несколькими базами данных, это может реально снизить операционный шум. Вместо переключения между порталами и ручной проверки метрик агент приносит вам значимый сигнал.&lt;/p&gt;
&lt;h2 id="что-это-значит-для-net-разработчиков"&gt;Что это значит для .NET-разработчиков&lt;/h2&gt;
&lt;p&gt;Нить, соединяющая все эти анонсы, очевидна: Microsoft встраивает ИИ-агентов на каждом уровне стека баз данных. Не как маркетинговый трюк, а как практический инструментальный слой.&lt;/p&gt;
&lt;p&gt;Если вы создаёте приложения на .NET с Azure SQL, вот что я бы реально сделал:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Попробуйте SQL MCP Server&lt;/strong&gt;, если вы создаёте ИИ-агентов. Это самый чистый способ дать вашим агентам доступ к базе данных без пользовательской обвязки.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Включите Copilot в SSMS&lt;/strong&gt;, если ещё не сделали — бесплатный прирост производительности для ежедневной работы с SQL.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Посмотрите на векторные индексы&lt;/strong&gt;, если вы используете RAG и сейчас запускаете отдельное векторное хранилище. Консолидация на Azure SQL — это на один сервис меньше для управления.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="итог"&gt;Итог&lt;/h2&gt;
&lt;p&gt;Полный анонс содержит больше — планы экономии, помощники миграции, функции соответствия — но история для разработчиков сводится к MCP Server, улучшениям векторов и агентному слою управления. Это те элементы, которые меняют подход к разработке, а не только к бюджетированию.&lt;/p&gt;
&lt;p&gt;Ознакомьтесь с &lt;a href="https://www.microsoft.com/en-us/sql-server/blog/2026/03/18/advancing-agentic-ai-with-microsoft-databases-across-a-unified-data-estate/"&gt;полным анонсом от Shireesh Thota&lt;/a&gt; для полной картины и &lt;a href="https://aka.ms/database-hub"&gt;зарегистрируйтесь для раннего доступа к Database Hub&lt;/a&gt;, если хотите попробовать новый опыт управления.&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps MCP Server появился в Microsoft Foundry: что это значит для ваших ИИ-агентов</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-devops-mcp-server-microsoft-foundry/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/azure-devops-mcp-server-microsoft-foundry/</guid><description>Azure DevOps MCP Server теперь доступен в Microsoft Foundry. Подключайте своих ИИ-агентов напрямую к рабочим процессам DevOps — work items, репозитории, пайплайны — в несколько кликов.</description><content:encoded>&lt;p&gt;MCP (Model Context Protocol) переживает свой момент. Если вы следите за экосистемой ИИ-агентов, вы наверняка заметили, что MCP-серверы появляются повсюду — давая агентам возможность взаимодействовать с внешними инструментами и сервисами через стандартизированный протокол.&lt;/p&gt;
&lt;p&gt;Теперь &lt;a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"&gt;Azure DevOps MCP Server доступен в Microsoft Foundry&lt;/a&gt;, и это одна из тех интеграций, которая заставляет задуматься о практических возможностях.&lt;/p&gt;
&lt;h2 id="что-здесь-на-самом-деле-происходит"&gt;Что здесь на самом деле происходит&lt;/h2&gt;
&lt;p&gt;Microsoft уже выпустила Azure DevOps MCP Server в &lt;a href="https://devblogs.microsoft.com/devops/azure-devops-remote-mcp-server-public-preview"&gt;публичном превью&lt;/a&gt; — это сам MCP-сервер. Новое — это интеграция с Foundry. Теперь вы можете добавить Azure DevOps MCP Server к своим агентам в Foundry прямо из каталога инструментов.&lt;/p&gt;
&lt;p&gt;Для тех, кто ещё не знаком с Foundry: это унифицированная платформа Microsoft для создания и управления ИИ-приложениями и агентами в масштабе. Доступ к моделям, оркестрация, оценка, развёртывание — всё в одном месте.&lt;/p&gt;
&lt;h2 id="настройка"&gt;Настройка&lt;/h2&gt;
&lt;p&gt;Настройка удивительно проста:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;В вашем агенте Foundry перейдите в &lt;strong&gt;Add Tools&lt;/strong&gt; &amp;gt; &lt;strong&gt;Catalog&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Найдите &amp;ldquo;Azure DevOps&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Выберите Azure DevOps MCP Server (preview) и нажмите &lt;strong&gt;Create&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Введите имя вашей организации и подключитесь&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Вот и всё. Ваш агент теперь имеет доступ к инструментам Azure DevOps.&lt;/p&gt;
&lt;h2 id="контроль-доступа-агента"&gt;Контроль доступа агента&lt;/h2&gt;
&lt;p&gt;Вот что мне нравится: вы не ограничены подходом «всё или ничего». Вы можете указать, какие инструменты доступны вашему агенту. Если вы хотите, чтобы он только читал work items, но не трогал пайплайны, это можно настроить. Принцип наименьших привилегий, применённый к вашим ИИ-агентам.&lt;/p&gt;
&lt;p&gt;Это важно для корпоративных сценариев, где вы не хотите, чтобы агент случайно запустил пайплайн развёртывания, потому что кто-то попросил его «помочь с релизом».&lt;/p&gt;
&lt;h2 id="почему-это-интересно-для-net-команд"&gt;Почему это интересно для .NET-команд&lt;/h2&gt;
&lt;p&gt;Подумайте о том, что это позволяет на практике:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Помощники планирования спринтов&lt;/strong&gt; — агенты, которые могут извлекать work items, анализировать данные о скорости работы и предлагать ёмкость спринта&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Боты для код-ревью&lt;/strong&gt; — агенты, которые понимают контекст вашего PR, потому что могут реально читать ваши репозитории и связанные work items&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Реагирование на инциденты&lt;/strong&gt; — агенты, которые могут создавать work items, запрашивать последние развёртывания и сопоставлять баги с недавними изменениями&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Онбординг разработчиков&lt;/strong&gt; — &amp;ldquo;Над чем мне работать?&amp;rdquo; получает реальный ответ, основанный на фактических данных проекта&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Для .NET-команд, уже использующих Azure DevOps для CI/CD-пайплайнов и управления проектами, наличие ИИ-агента, который может напрямую взаимодействовать с этими системами, — это значительный шаг к полезной автоматизации (а не просто чат-бот как сервис).&lt;/p&gt;
&lt;h2 id="более-широкая-картина-mcp"&gt;Более широкая картина MCP&lt;/h2&gt;
&lt;p&gt;Это часть более крупного тренда: MCP-серверы становятся стандартным способом взаимодействия ИИ-агентов с внешним миром. Мы видим их для GitHub, Azure DevOps, баз данных, SaaS API — и Foundry становится хабом, где все эти соединения объединяются.&lt;/p&gt;
&lt;p&gt;Если вы создаёте агентов в экосистеме .NET, на MCP стоит обратить внимание. Протокол стандартизирован, инструментарий развивается, а интеграция с Foundry делает его доступным без необходимости вручную настраивать серверные подключения.&lt;/p&gt;
&lt;h2 id="итог"&gt;Итог&lt;/h2&gt;
&lt;p&gt;Azure DevOps MCP Server в Foundry находится в превью, так что ожидайте его развития. Но основной рабочий процесс надёжен: подключите, настройте доступ к инструментам и позвольте вашим агентам работать с данными DevOps. Если вы уже в экосистеме Foundry, это в нескольких кликах. Попробуйте и посмотрите, какие рабочие процессы вы сможете построить.&lt;/p&gt;
&lt;p&gt;Ознакомьтесь с &lt;a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"&gt;полным анонсом&lt;/a&gt; для пошаговых инструкций по настройке и дополнительных деталей.&lt;/p&gt;</content:encoded></item><item><title>Foundry Agent Service вышел в GA: что действительно важно для .NET-разработчиков агентов</title><link>https://thedotnetblog.com/ru/news/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/ru/news/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</guid><description>Foundry Agent Service от Microsoft вышел в GA с приватной сетью, Voice Live, продакшен-оценками и открытым мультимодельным рантаймом. Вот что нужно знать.</description><content:encoded>&lt;p&gt;Будем честны — создать прототип ИИ-агента — это простая часть. Сложная часть — всё, что идёт после: вывести его в продакшен с правильной сетевой изоляцией, запустить оценки, которые действительно что-то значат, обеспечить соответствие требованиям и не сломать ничего в 2 часа ночи.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;Foundry Agent Service только что вышел в GA&lt;/a&gt;, и этот релиз сфокусирован именно на этом разрыве «всё, что после».&lt;/p&gt;
&lt;h2 id="построен-на-responses-api"&gt;Построен на Responses API&lt;/h2&gt;
&lt;p&gt;Вот главная новость: Foundry Agent Service нового поколения построен на OpenAI Responses API. Если вы уже работаете с этим wire-протоколом, миграция на 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 API с пользовательской областью — агент действует от их имени через стандартные 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; сворачивает это в единый управляемый API с:&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;Хотя примеры кода в анонсе GA написаны на Python, базовая инфраструктура не зависит от языка — и .NET SDK для &lt;code&gt;azure-ai-projects&lt;/code&gt; следует тем же паттернам. Responses API, фреймворк оценки, приватная сеть, аутентификация MCP — всё это доступно из .NET.&lt;/p&gt;
&lt;p&gt;Если вы ждали, пока ИИ-агенты перейдут от «классной демо» к «я реально могу отправить это на работе», этот GA-релиз — тот самый сигнал. Приватная сеть, правильная аутентификация, непрерывная оценка и продакшен-мониторинг — это были недостающие элементы.&lt;/p&gt;
&lt;h2 id="итог"&gt;Итог&lt;/h2&gt;
&lt;p&gt;Foundry Agent Service доступен сейчас. Установите 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;анонсом GA&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>С ноутбука в продакшен: развёртывание ИИ-агентов в Microsoft Foundry двумя командами</title><link>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ru/news/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</guid><description>Azure Developer CLI теперь имеет команды 'azd ai agent', которые переносят вашего ИИ-агента с локальной разработки на живой эндпоинт Foundry за минуты. Вот полный рабочий процесс.</description><content:encoded>&lt;p&gt;Вы знаете тот разрыв между «работает на моей машине» и «развёрнуто и обслуживает трафик»? Для ИИ-агентов этот разрыв был болезненно широким. Нужно подготовить ресурсы, развернуть модели, настроить идентификацию, организовать мониторинг — и это до того, как кто-либо сможет реально вызвать вашего агента.&lt;/p&gt;
&lt;p&gt;Azure Developer CLI только что превратил это в &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;дело двух команд&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="новый-рабочий-процесс-azd-ai-agent"&gt;Новый рабочий процесс &lt;code&gt;azd ai agent&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Давайте пройдём по тому, как это реально выглядит. У вас есть проект ИИ-агента — допустим, агент-консьерж для отеля. Он работает локально. Вы хотите запустить его на Microsoft Foundry.&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;azd ai agent init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Вот и всё. Две команды. &lt;code&gt;azd ai agent init&lt;/code&gt; генерирует инфраструктуру как код в вашем репозитории, а &lt;code&gt;azd up&lt;/code&gt; разворачивает всё в Azure и публикует вашего агента. Вы получаете прямую ссылку на вашего агента в портале Foundry.&lt;/p&gt;
&lt;h2 id="что-происходит-под-капотом"&gt;Что происходит под капотом&lt;/h2&gt;
&lt;p&gt;Команда &lt;code&gt;init&lt;/code&gt; генерирует реальные, проверяемые шаблоны Bicep в вашем репозитории:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Foundry Resource&lt;/strong&gt; (контейнер верхнего уровня)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Foundry Project&lt;/strong&gt; (где живёт ваш агент)&lt;/li&gt;
&lt;li&gt;Конфигурация &lt;strong&gt;развёртывания модели&lt;/strong&gt; (GPT-4o и т.д.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed identity&lt;/strong&gt; с правильными назначениями ролей RBAC&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azure.yaml&lt;/code&gt; для карты сервисов&lt;/li&gt;
&lt;li&gt;&lt;code&gt;agent.yaml&lt;/code&gt; с метаданными агента и переменными окружения&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ключевой момент: всё это принадлежит вам. Это версионированный Bicep в вашем репозитории. Вы можете его проверить, настроить и закоммитить рядом с кодом вашего агента. Никаких магических чёрных ящиков.&lt;/p&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;azd ai agent run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Это запускает вашего агента локально. Комбинируйте с &lt;code&gt;azd ai agent invoke&lt;/code&gt; для отправки тестовых промптов, и у вас есть быстрый цикл обратной связи. Редактируете код, перезапускаете, вызываете, повторяете.&lt;/p&gt;
&lt;p&gt;Команда &lt;code&gt;invoke&lt;/code&gt; умная в плане маршрутизации — когда локальный агент запущен, она автоматически направляет на него. Когда нет — обращается к удалённому эндпоинту.&lt;/p&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;azd ai agent monitor --follow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Каждый запрос и ответ, проходящий через вашего агента, транслируется в ваш терминал в реальном времени. Для отладки продакшен-проблем это бесценно. Никакого копания в log analytics, никакого ожидания агрегации метрик — вы видите, что происходит прямо сейчас.&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;code&gt;azd ai agent init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Генерирует проект агента Foundry с IaC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd up&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Разворачивает Azure-ресурсы и публикует агента&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Отправляет промпты удалённому или локальному агенту&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Запускает агента локально для разработки&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Транслирует логи от опубликованного агента в реальном времени&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent show&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Проверяет состояние и здоровье агента&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd down&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Удаляет все Azure-ресурсы&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="почему-это-важно-для-net-разработчиков"&gt;Почему это важно для .NET-разработчиков&lt;/h2&gt;
&lt;p&gt;Хотя пример в анонсе написан на Python, история инфраструктуры не зависит от языка. Ваш .NET-агент получает тот же Bicep-шаблон, ту же настройку managed identity, тот же пайплайн мониторинга. И если вы уже используете &lt;code&gt;azd&lt;/code&gt; для своих .NET Aspire-приложений или развёртываний Azure, это вписывается прямо в ваш существующий рабочий процесс.&lt;/p&gt;
&lt;p&gt;Разрыв в развёртывании ИИ-агентов был одной из самых больших точек трения в экосистеме. Переход от работающего прототипа к продакшен-эндпоинту с правильной идентификацией, сетью и мониторингом не должен требовать недели DevOps-работы. Теперь для этого нужны две команды и несколько минут.&lt;/p&gt;
&lt;h2 id="итог"&gt;Итог&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd ai agent&lt;/code&gt; доступен сейчас. Если вы откладывали развёртывание своих ИИ-агентов, потому что настройка инфраструктуры казалась слишком трудоёмкой, попробуйте это. Ознакомьтесь с &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;полным руководством&lt;/a&gt; для полной пошаговой инструкции, включая интеграцию с фронтенд-чат-приложением.&lt;/p&gt;</content:encoded></item><item><title>Фоновые ответы в Microsoft Agent Framework: больше никакой тревоги из-за таймаутов</title><link>https://thedotnetblog.com/ru/news/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/ru/news/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</guid><description>Microsoft Agent Framework теперь позволяет выносить длительные ИИ-задачи с помощью continuation-токенов. Вот как работают фоновые ответы и почему они важны для ваших .NET-агентов.</description><content:encoded>&lt;p&gt;Если вы создавали что-либо с моделями рассуждения, такими как o3 или GPT-5.2, вы знаете эту боль. Ваш агент начинает обдумывать сложную задачу, клиент сидит и ждёт, и где-то между «всё нормально» и «он завис?» ваше соединение падает по таймауту. Вся работа? Потеряна.&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="как-работают-continuation-токены"&gt;Как работают continuation-токены&lt;/h2&gt;
&lt;p&gt;Вместо блокировки вы запускаете задачу агента и получаете обратно &lt;strong&gt;continuation-токен&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;Если агент поддерживает фоновую обработку, вы получаете continuation-токен&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;// Опрашиваем до завершения&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;Если агент завершает немедленно (простые задачи, модели, не требующие фоновой обработки), continuation-токен не возвращается. Ваш код просто работает — никакой специальной обработки не нужно.&lt;/p&gt;
&lt;h2 id="стриминг-с-возобновлением-настоящая-магия"&gt;Стриминг с возобновлением: настоящая магия&lt;/h2&gt;
&lt;p&gt;Опрос подходит для сценариев «запустил и забыл», но что если вы хотите видеть прогресс в реальном времени? Фоновые ответы также поддерживают стриминг со встроенным возобновлением.&lt;/p&gt;
&lt;p&gt;Каждое потоковое обновление несёт свой continuation-токен. Если соединение прерывается посреди потока, вы продолжаете ровно с того места, где остановились:&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;// Симулируем разрыв сети&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;// Возобновляем ровно с того места, где остановились&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;Агент продолжает обработку на стороне сервера независимо от того, что происходит с вашим клиентом. Это встроенная отказоустойчивость без написания логики повторных попыток или circuit breaker&amp;rsquo;ов.&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;Асинхронные UX-паттерны&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. Если вы создаёте агентов, которые делают что-то сложнее простых вопросов-ответов, это стоит добавить в свой инструментарий. Паттерн с continuation-токенами сохраняет простоту, решая очень реальную продакшен-проблему.&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; для полного справочника API и дополнительных примеров.&lt;/p&gt;</content:encoded></item></channel></rss>