Бөлісу құралы:


Руководство по значительным изменениям в Python 2026

В этом документе перечислены все значительные изменения в выпусках Python с начала 2026 года, включая критические изменения и важные улучшения, которые могут повлиять на ваш код. Каждое изменение помечается как:

  • 🔴 Критическое — требуется изменение кода для обновления
  • 🟡 Усовершенствование — новые возможности или улучшения; Существующий код продолжает работать

В этом документе отслеживаются значительные изменения Python в переходе 2026 preview-to-1.0.0, поэтому обратитесь к нему при обновлении между версиями, чтобы не пропустить важные изменения. Подробные инструкции по обновлению по конкретным темам (например, миграция параметров) можно найти в связанных руководствах по обновлению или в связанных PR.


python-1.0.0

В этом разделе фиксируются значительные изменения Python, которые были внедрены после python-1.0.0rc6 и теперь являются частью python-1.0.0.

🔴 Message(..., text=...) Конструкция теперь полностью удалена

PR:#5062

PR #5062 завершает более раннюю очистку модели сообщений Python, удаляя последние пути кода на стороне фреймворка, которые по-прежнему создают Message объекты с text=... помощью.

  • Создавайте текстовые сообщения Message(role="user", contents=["Hello"]) вместо Message(role="user", text="Hello").
  • Это применимо везде, где вы создаете сообщения напрямую, включая запросы, связанные с рабочими процессами, пользовательские ответы промежуточного программного обеспечения, вспомогательные средства оркестрации и код миграции.
  • Обычные строки внутри contents=[...] по-прежнему нормализуются в текстовое содержимое автоматически, поэтому contents=["Hello"] остается простейшей формой только для текста.

Before:

message = Message(role="assistant", text="Hello")

After:

message = Message(role="assistant", contents=["Hello"])

🟡 Выпущенные пакеты Python больше не требуются --pre

PR:#5062

PR #5062 повышает статус основных пакетов Python до 1.0.0 и обновляет руководство по установке, чтобы отличить выпущенные пакеты от пакетов, которые все еще находятся на стадии предварительного релиза.

  • agent-framework, agent-framework-core, agent-framework-openai и agent-framework-foundry теперь являются выпущенными пакетами и больше не нуждаются в --pre.
  • Бета-соединители, такие как agent-framework-ag-ui, agent-framework-azurefunctions, agent-framework-copilotstudio, agent-framework-foundry-local, agent-framework-github-copilot, agent-framework-mem0 и agent-framework-ollama, все еще требуют --pre.
  • Если одна команда установки включает любой бета-пакет, оставьте --pre в этой команде.

🔴 Foundry теперь владеет встраиваниями Python и настройками конечных точек моделей

PR:#5056

Pr #5056 удаляет автономный agent-framework-azure-ai пакет и перемещает область внедрения Python в agent-framework-foundry и agent_framework.foundry.

  • Используйте FoundryEmbeddingClient, FoundryEmbeddingOptions, а также FoundryEmbeddingSettings из agent_framework.foundry.
  • Установите agent-framework-foundry для чата Foundry, агентов под управлением службы, поставщиков памяти и эмбеддингов.
  • agent_framework.azureбольше не экспортируетAzureAIInferenceEmbeddingClient, AzureAIInferenceEmbeddingOptionsAzureAIInferenceEmbeddingSettingsилиAzureAISettings.
  • Теперь встраивания Foundry используют FOUNDRY_MODELS_ENDPOINT, FOUNDRY_MODELS_API_KEY, FOUNDRY_EMBEDDING_MODEL, а также необязательные FOUNDRY_IMAGE_EMBEDDING_MODEL.
  • FoundryChatClient и FoundryAgent по-прежнему используйте параметры конечной точки проекта, такие как FOUNDRY_PROJECT_ENDPOINT и FOUNDRY_MODEL.

Before:

import os

from agent_framework.azure import AzureAIInferenceEmbeddingClient

client = AzureAIInferenceEmbeddingClient(
    endpoint=os.environ["AZURE_AI_SERVICES_ENDPOINT"],
    model=os.environ["AZURE_AI_EMBEDDING_NAME"],
    credential=credential,
)

After:

import os

from agent_framework.foundry import FoundryEmbeddingClient

client = FoundryEmbeddingClient(
    endpoint=os.environ["FOUNDRY_MODELS_ENDPOINT"],
    api_key=os.environ["FOUNDRY_MODELS_API_KEY"],
    model=os.environ["FOUNDRY_EMBEDDING_MODEL"],
)

🔴 Рабочие процессы теперь направляют kwargs среды выполнения через явные контейнеры

PR:#5010

PR #5010 обновляет Python workflow.run(...), поэтому kwargs среды выполнения передаются явно как function_invocation_kwargs= и client_kwargs= вместо универсального перенаправления **kwargs.

  • Плоское отображение обрабатывается как глобальное и пересылается каждому исполнителю агента в соответствии с сопоставлением в рамках рабочего процесса.
  • Если один или несколько ключей верхнего уровня соответствуют идентификаторам исполнителей, всё сопоставление обрабатывается как назначение для каждого исполнителя, и каждый исполнитель получает только свою собственную запись.
  • Пользовательские AgentExecutor(id="...") и другие явные идентификаторы исполнителя рабочих процессов — это те ключи, на которые вы нацелены.
  • Одни и те же глобальные и целевые правила применяются к обоим function_invocation_kwargs и client_kwargs.

Before:

await workflow.run(
    "Draft the report",
    db_config={"connection_string": "..."},
    user_preferences={"format": "markdown"},
)

After:

await workflow.run(
    "Draft the report",
    function_invocation_kwargs={
        "researcher": {
            "db_config": {"connection_string": "..."},
        },
        "writer": {
            "user_preferences": {"format": "markdown"},
        },
    },
)

🟡 GitHubCopilotAgent Теперь контекстные поставщики выполняются при каждом вызове

PR:#5013

PR #5013 исправляет разрыв в поведении Python, где GitHubCopilotAgent принимались context_providers, но фактически не вызывались.

  • before_run() теперь выполняется до отправки запроса Copilot.
  • Добавленные поставщиком сообщения и инструкции включаются в запрос, который достигает интерфейса командной строки Copilot.
  • after_run() теперь выполняется после сборки окончательного ответа, включая путь потоковой передачи.

Если вы уже передали context_providers к GitHubCopilotAgent, миграция не требуется — теперь хуки работают согласованно с остальной частью интерфейса агента Python.


🟡 Структурированные выходные данные теперь принимают сопоставления схем JSON в дополнение к моделям Pydantic

PR:#5022

PR #5022 расширяет возможности структурированного синтаксического анализа в Python, позволяя response_format быть либо моделью Pydantic, либо отображением схемы JSON.

  • Pydantic модели по-прежнему анализируются в типизированные экземпляры модели response.value.
  • Сопоставления схем JSON теперь анализируют значения response.value Python, совместимые с JSON (обычно dict или list).
  • Те же правила синтаксического анализа применяются при сборе окончательного ответа из потока.

Это улучшение, а не критическое изменение, но полезно знать, храните ли схемы как словари JSON.


python-1.0.0rc6

В этом разделе описываются значительные изменения в Python, которые были включены или отслеживались для python-1.0.0rc6.

🔴 Выбор модели стандартизован в model

PR:#4999

Pr #4999 завершает очистку на стороне Python для выбора модели между конструкторами, типизированными параметрами, параметрами агента по умолчанию, объектами ответа и переменными среды.

  • Используйте model везде, где вы ранее использовали model_id.
  • Agent.default_options и для каждого запуска options={...} теперь ожидается "model", а не "model_id".
  • Объекты ответа отображаются на response.model, а не на response.model_id.
  • Параметры OpenAI теперь используют OPENAI_MODEL, OPENAI_CHAT_MODEL, OPENAI_CHAT_COMPLETION_MODEL, и OPENAI_EMBEDDING_MODEL.
  • Параметры Azure OpenAI теперь используют AZURE_OPENAI_MODEL, AZURE_OPENAI_CHAT_MODELAZURE_OPENAI_CHAT_COMPLETION_MODELи AZURE_OPENAI_EMBEDDING_MODEL.
  • Теперь Anthropic использует ANTHROPIC_CHAT_MODEL, а Foundry Local использует FOUNDRY_LOCAL_MODEL.
  • Пакет Anthropic также добавляет размещенные у поставщика оболочки, такие как AnthropicFoundryClient, AnthropicBedrockClientи AnthropicVertexClient.

Before:

from agent_framework.anthropic import AnthropicClient

client = AnthropicClient(model_id="claude-sonnet-4-5-20250929")
response = await client.get_response(
    "Hello!",
    options={"model_id": "claude-sonnet-4-5-20250929"},
)

After:

from agent_framework.anthropic import AnthropicClient

client = AnthropicClient(model="claude-sonnet-4-5-20250929")
response = await client.get_response(
    "Hello!",
    options={"model": "claude-sonnet-4-5-20250929"},
)

🔴 Поставщики контекстов могут добавлять посредническое ПО и сохранять историю для каждого вызова модели

PR:#4992

PR #4992 обновляет конвейер контекст-провайдера Python и способ, которым история, управляемая фреймворком, может сохраняться во время многократных вызовов.

  • ContextProvider и HistoryProvider теперь являются каноническими базовыми классами Python.
  • BaseContextProvider и BaseHistoryProvider остаются временно устаревшими псевдонимами для совместимости, но новый код должен перейти на новые имена.
  • SessionContext теперь может собирать чат или функциональность в виде промежуточного ПО, добавленного поставщиком, через extend_middleware() и предоставлять выровненный список через get_middleware().
  • Agent(..., require_per_service_call_history_persistence=True) запускает историю провайдеров для каждого вызова модели, вместо одного раза после полного run().
  • Этот режим предназначен для локальной истории, управляемой фреймворком, и не может сочетаться с существующей беседой, управляемой службой, например session.service_session_id или options={"conversation_id": ...}.

Before:

from agent_framework import BaseHistoryProvider

class CustomHistoryProvider(BaseHistoryProvider):
    ...

After:

from agent_framework import Agent, HistoryProvider

class CustomHistoryProvider(HistoryProvider):
    ...

agent = Agent(
    client=client,
    context_providers=[CustomHistoryProvider()],
    require_per_service_call_history_persistence=True,
)

🔴 Устаревшие элементы совместимости для Azure и OpenAI удалены

PR:#4990

Pr #4990 завершает миграцию с ведущих #4818 поставщиков путем удаления оставшихся устаревших поверхностей совместимости Python, которые оставались доступными в предыдущих предварительных версиях.

  • agent_framework.azure больше не экспортирует поверхности агента/клиента/поставщика AzureOpenAI* или более старые поверхности AzureAI*.
  • Типы совместимости Python OpenAI Assistants больше не являются частью текущей agent_framework.openai поверхности.
  • Используйте OpenAIChatClientи OpenAIChatCompletionClientOpenAIEmbeddingClient для прямых сценариев OpenAI или Azure OpenAI.
  • Используйте FoundryChatClient для вывода проекта Foundry и FoundryAgent для агентов запроса или HostedAgents.
  • Текущее agent_framework.azure пространство имен теперь охватывает оставшиеся интеграции Azure, такие как Azure Поиск ИИ, история Cosmos, Функции Azure и долговременные рабочие процессы. Чат Foundry, агент, память и клиенты для внедрения размещаются под agent_framework.foundry.

Если вы переносите старый код Python, используйте следующие замены:

  • AzureOpenAIResponsesClientOpenAIChatClient
  • AzureOpenAIChatClientOpenAIChatCompletionClient
  • AzureOpenAIEmbeddingClientOpenAIEmbeddingClient
  • AzureAIAgentClient / AzureAIClient / AzureAIProjectAgentProvider / AzureAIAgentsProviderFoundryChatClient или FoundryAgent, в зависимости от того, принадлежит ли ваше приложение определению агента
  • OpenAIAssistantsClient / OpenAIAssistantProviderOpenAIChatClient для текущей работы с Python OpenAI или FoundryAgent, если вам нужен агент, обслуживаемый службой в Foundry

🔴 Лидирующий клиентский дизайн и разделение пакета

PR:#4818

PR #4818 реорганизует поверхность поставщика Python вокруг пакетов и пространств имен, относящихся к поставщику.

  • Клиенты OpenAI теперь находятся в пакете agent-framework-openai, хотя всё ещё импортируются из пространства имен agent_framework.openai.
  • Клиенты Microsoft Foundry теперь живут в пакете agent-framework-foundry и agent_framework.foundry пространстве имен.
  • Foundry Local также представляется из agent_framework.foundry как FoundryLocalClient.
  • OpenAIResponsesClient переименован в OpenAIChatClient.
  • OpenAIChatClient переименован в OpenAIChatCompletionClient.
  • Конфигурация клиента стандартизована modelпри замене старых параметров, таких как model_id, deployment_nameи model_deployment_name.
  • Используйте клиенты agent_framework.openai для нового кода Azure OpenAI. Более ранние AzureOpenAI* шайбы совместимости были удалены позже в #4990.
  • Для нового кода Foundry используйте FoundryChatClient для прямого вывода проекта, FoundryAgent для агентов запроса и HostedAgents, а FoundryLocalClient также для локальных сред выполнения.
  • AzureAIClient, AzureAIProjectAgentProvider, AzureAIAgentClientAzureAIAgentsProviderи поверхность совместимости Помощников Python переехала на пути совместимости во время этого рефакторинга и позже удалена в #4990.
  • Образцы покрытия были реорганизованы для соответствия новому макету, ориентированному на поставщика, включая образцы Foundry в разделе samples/02-agents/providers/foundry/.

Сопоставление пакетов

Сценарий Install Основное пространство имен
OpenAI и Azure OpenAI pip install agent-framework-openai agent_framework.openai
Конечные точки проекта Microsoft Foundry, служба агента, память и внедрение pip install agent-framework-foundry agent_framework.foundry
Локальный литейный завод pip install agent-framework-foundry-local --pre agent_framework.foundry

Before:

from agent_framework.openai import OpenAIResponsesClient

client = OpenAIResponsesClient(model_id="gpt-5.4")

After:

from agent_framework.openai import OpenAIChatClient

client = OpenAIChatClient(model="gpt-5.4")

Если вы ранее использовали Azure OpenAI непосредственно, сопоставьте старые выделенные классы с новыми классами OpenAI, ведущими в секторе предоставления услуг:

  • AzureOpenAIResponsesClientOpenAIChatClient
  • AzureOpenAIChatClientOpenAIChatCompletionClient
  • AzureOpenAIEmbeddingClientOpenAIEmbeddingClient
  • AzureOpenAIAssistantsClient OpenAIChatClient→ для прямой миграции API ответов или FoundryAgent если вам нужен агент Foundry, управляемый службой

Изменение кода в основном заключается в перемещении имени класса плюс deployment_name до model. Для совместимости Azure OpenAI используйте явные входные данные Azure для новых клиентов OpenAI. credential= теперь является предпочтительным интерфейсом аутентификации Azure, в то время как вызов api_key функции остается маршрутом совместимости.

До (AzureOpenAIResponsesClient):

from agent_framework.azure import AzureOpenAIResponsesClient

client = AzureOpenAIResponsesClient(
    endpoint=azure_endpoint,
    deployment_name=deployment_name,
    credential=credential,
)

После (OpenAIChatClient):

from agent_framework.openai import OpenAIChatClient
from azure.identity import AzureCliCredential

api_version = "your-azure-openai-api-version"

client = OpenAIChatClient(
    azure_endpoint=azure_endpoint,
    model=deployment_name,
    credential=AzureCliCredential(),
    api_version=api_version,
)

До (AzureOpenAIChatClient):

from agent_framework.azure import AzureOpenAIChatClient

client = AzureOpenAIChatClient(
    endpoint=azure_endpoint,
    deployment_name=deployment_name,
    credential=credential,
)

После (OpenAIChatCompletionClient):

from agent_framework.openai import OpenAIChatCompletionClient
from azure.identity import AzureCliCredential

api_version = "your-azure-openai-api-version"

client = OpenAIChatCompletionClient(
    azure_endpoint=azure_endpoint,
    model=deployment_name,
    credential=AzureCliCredential(),
    api_version=api_version,
)

Если вы хотите перейти из конечных точек Azure OpenAI в конечную точку проекта Microsoft Foundry, используйте вместо этого область, ориентированную на Foundry:

До (конечная точка Azure OpenAI):

from agent_framework.azure import AzureOpenAIResponsesClient
from azure.identity import AzureCliCredential

client = AzureOpenAIResponsesClient(
    deployment_name="gpt-4.1",
    credential=AzureCliCredential(),
)

После (проект Foundry):

from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential

client = FoundryChatClient(
    project_endpoint="https://your-project.services.ai.azure.com",
    model="gpt-4.1",
    credential=AzureCliCredential(),
)

agent = Agent(client=client)

Для локальных сред выполнения Microsoft Foundry используйте пространство имен Foundry и локальный соединитель:

from agent_framework.foundry import FoundryLocalClient

client = FoundryLocalClient(model="phi-4-mini")

Если опущено model, задайте FOUNDRY_LOCAL_MODEL в вашей среде.

Также обновите имена среды и конфигурации, если это применимо:

  • Используйте OPENAI_CHAT_MODEL для OpenAIChatClient, OPENAI_CHAT_COMPLETION_MODEL для OpenAIChatCompletionClient, с OPENAI_MODEL в качестве общего резервного варианта.
  • Azure OpenAI теперь используется AZURE_OPENAI_CHAT_MODEL для OpenAIChatClient, AZURE_OPENAI_CHAT_COMPLETION_MODEL для OpenAIChatCompletionClientи AZURE_OPENAI_MODEL как общий резервный вариант.
  • Используйте azure_endpoint для URL-адресов ресурсов Azure OpenAI или base_url если у вас уже есть полный .../openai/v1 URL-адрес и задайте api_version для используемой области API Azure OpenAI.
  • Применение специфичных для Foundry параметров, таких как FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL, FOUNDRY_AGENT_NAME, и FOUNDRY_AGENT_VERSION, для облачных клиентов Foundry
  • Используйте ANTHROPIC_CHAT_MODEL для Anthropic и FOUNDRY_LOCAL_MODEL для Foundry Local

Это изменение впервые внедрено во время python-1.0.0rc6 цикла.


🔴 Основные зависимости теперь намеренно минимальны

PR:#4904

PR #4904 следует разделению пакета поставщика от #4818 путем упрощения agent-framework-core и удаления дополнительных транзитивных зависимостей от поставщика из основного пакета.

  • agent-framework-core теперь специально сделан минимальным.
  • При импорте agent_framework.openai установите agent-framework-openai.
  • Во время импорта agent_framework.foundry установите agent-framework-foundry для вывода проекта Foundry, агентов, управляемых службой, поставщиков памяти и встраиваний. Используйте agent-framework-foundry-local --pre для локальных сред выполнения.
  • Если вы используете средства MCP или Agent.as_mcp_server()другие интеграции MCP для минимальной установки, установите mcp --pre вручную. Для поддержки WebSocket MCP установите mcp[ws] --pre.
  • Если требуется широкий интерфейс "все включено", установите метапакет agent-framework.

Это не изменяет внешний интерфейс поставщика; это изменяет установки по умолчанию, когда подключается только основной компонент.

Ранее (установки только ядра часто приводили к добавлению дополнительных функций поставщика автоматически):

pip install agent-framework-core

После (установите пакет поставщика, который вы фактически используете):

pip install agent-framework-core
pip install agent-framework-openai

или:

pip install agent-framework-core
pip install agent-framework-foundry

При обновлении существующего проекта, который ранее зависел от импортов основных и ленивых провайдеров, проверьте ваши импорты и явно укажите пакеты провайдеров в файлах среды или зависимостей. Выполните то же самое для зависимостей MCP, если вы используете инструменты MCP или хостинг сервера MCP.


🔴 Универсальные клиенты OpenAI теперь предпочитают явные сигналы маршрутизации

PR:#4925

Pr #4925 изменяет способ выбора универсальных agent_framework.openai клиентов между OpenAI и Azure OpenAI.

  • Универсальные клиенты OpenAI больше не переключаются на Azure только из-за присутствия AZURE_OPENAI_* переменных среды.
  • Если OPENAI_API_KEY настроено, универсальные клиенты остаются в OpenAI, если вы не передаете явный сигнал маршрутизации Azure, например credential или azure_endpoint.
  • Если присутствуют только AZURE_OPENAI_* параметры, универсальные клиенты по-прежнему могут вернуться к маршрутизации на основе среды Azure.
  • Предпочтительным шаблоном использования Azure OpenAI теперь является передача явных параметров Azure вместе с credential=AzureCliCredential(), OpenAIChatClient, OpenAIChatCompletionClient и клиентом для встраивания.
  • AzureOpenAI* Устаревшие оболочки сохраняют поведение совместимости, поэтому существующий код на основе оболочки не соответствует новым правилам приоритета универсального клиента.

До (OpenAIChatClient можно было перенаправить в Azure, так как azure env vars присутствовал):

import os
from agent_framework.openai import OpenAIChatClient

os.environ["OPENAI_API_KEY"] = "sk-openai"
os.environ["AZURE_OPENAI_ENDPOINT"] = "https://your-resource.openai.azure.com"
os.environ["AZURE_OPENAI_CHAT_MODEL"] = "gpt-4o-mini"

client = OpenAIChatClient(model="gpt-4o-mini")

После (универсальный openAI остается в OpenAI; передайте явные входные данные Azure для принудительной маршрутизации Azure):

import os
from agent_framework.openai import OpenAIChatClient
from azure.identity import AzureCliCredential

client = OpenAIChatClient(
    model=os.environ["AZURE_OPENAI_CHAT_MODEL"],
    azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
    api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
    credential=AzureCliCredential(),
)

Если ваша среда содержит как OPENAI_*, так и AZURE_OPENAI_* значения, проверьте любой общий процесс создания клиента agent_framework.openai и сделайте выбор поставщика явным. Примеры поставщика Azure были обновлены для передачи входных данных Azure непосредственно по этой причине.

Теперь эмбеддинги Azure теперь следуют той же модели маршрутизации.

import os
from agent_framework.openai import OpenAIEmbeddingClient
from azure.identity import AzureCliCredential

client = OpenAIEmbeddingClient(
    model=os.environ["AZURE_OPENAI_EMBEDDING_MODEL"],
    azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
    api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
    credential=AzureCliCredential(),
)

Для сценариев внедрения см. схему:

  • AzureOpenAIEmbeddingClientOpenAIEmbeddingClient
  • AZURE_OPENAI_EMBEDDING_MODELmodel
  • OPENAI_EMBEDDING_MODEL остается переменной среды встраивания для OpenAI

python-1.0.0rc5 / python-1.0.0b260319 (19 марта 2026 г.)

🔴 Переупорядоченный конвейер клиента чата: FunctionInvocation теперь упаковывает ChatMiddleware

PR:#4746

Порядок конвейера ChatClient изменился. FunctionInvocation теперь является самым внешним слоем и оборачивает ChatMiddleware, что означает, что промежуточное программное обеспечение для чата выполняется на каждый вызов модели (включая каждую итерацию цикла вызова инструмента), а не один раз для всей последовательности вызовов функции.

Старый порядок конвейера:

ChatMiddleware → FunctionInvocation → RawChatClient

Новый порядок конвейера:

FunctionInvocation → ChatMiddleware → ChatTelemetry → RawChatClient

Если у вас есть настраиваемое программное обеспечение промежуточного слоя для чата, которое предполагалось, что оно выполняется только один раз при вызове агента (охватывая весь цикл вызова инструмента), обновите его, чтобы обеспечить безопасность для повторного выполнения. Промежуточное программное обеспечение чата теперь вызывается для каждого отдельного запроса LLM, включая запросы, отправляющие результаты инструмента обратно в модель.

Кроме того, ChatTelemetry теперь это отдельный слой в конвейере от ChatMiddleware, который расположен ближе всего к RawChatClient.

🔴 Общедоступная среда выполнения kwargs разбивается на явные контейнеры

PR:#4581

Общедоступный агент Python и API чата больше не рассматривают всеобъемлющее общедоступное **kwargs перенаправление как основной механизм передачи данных во время выполнения. Теперь значения среды выполнения разделяются по назначению:

  • Используйте function_invocation_kwargs для значений, которые должны видеть только инструменты или функциональное промежуточное ПО.
  • Используйте client_kwargs для конфигурации kwargs клиентского уровня и настройки промежуточного слоя клиента.
  • Доступ к данным инструмента или среды выполнения через FunctionInvocationContext (ctx.kwargs и ctx.session).
  • Определите инструменты с внедренным параметром контекста вместо использования **kwargs; внедренные параметры контекста не отображаются в схеме, видимой модели.
  • При делегировании подагенту в качестве инструмента используйте agent.as_tool(propagate_session=True) , если дочерний агент должен разделять сеанс вызывающего.

Before:

from typing import Any

from agent_framework import tool


@tool
def send_email(address: str, **kwargs: Any) -> str:
    return f"Queued email for {kwargs['user_id']}"


response = await agent.run(
    "Send the update to finance@example.com",
    user_id="user-123",
    request_id="req-789",
)

After:

from agent_framework import FunctionInvocationContext, tool


@tool
def send_email(address: str, ctx: FunctionInvocationContext) -> str:
    user_id = ctx.kwargs["user_id"]
    session_id = ctx.session.session_id if ctx.session else "no-session"
    return f"Queued email for {user_id} in {session_id}"


response = await agent.run(
    "Send the update to finance@example.com",
    session=agent.create_session(),
    function_invocation_kwargs={
        "user_id": "user-123",
        "request_id": "req-789",
    },
)

При реализации пользовательских общедоступных run() или get_response() методов добавьте function_invocation_kwargs и client_kwargs в эти сигнатуры. Для инструментов предпочитайте параметр, аннотированный как FunctionInvocationContext — его можно назвать ctx, context или любым другим аннотированным именем. Если вы предоставите явную схему или модель ввода, также будет распознан простой неаннотированный параметр с именем ctx. Тот же объект контекста доступен для промежуточного слоя функций, и это место, где аргументы функции времени выполнения и состояние сеанса теперь живут. Определения инструментов, которые все еще зависят от **kwargs и используют только путь устаревшей совместимости, будут удалены.


python-1.0.0rc4 / python-1.0.0b260311 (11 марта 2026 г.)

Заметки о выпуске:python-1.0.0rc4

🔴 Интеграции Искусственного Интеллекта Azure теперь направлены на azure-ai-projects общедоступную версию 2.0

PR:#4536

Интеграции Python с Azure ИИ теперь используют интерфейс GA 2.0 azure-ai-projects.

  • Теперь поддерживается azure-ai-projects>=2.0.0,<3.0диапазон зависимостей.
  • foundry_features сквозная передача была удалена из создания агента ИИ Azure.
  • Теперь поведение предварительного просмотра используется в поддерживаемых клиентах и поставщиках с allow_preview=True.
  • Были удалены смешанные прокладки совместимости бета-версии и общедоступной версии (GA), поэтому обновите все импорты и имена типов до интерфейса SDK версии 2.0 GA.

🔴 Обработчики инструментов GitHub Copilot теперь используют ToolInvocation / ToolResult и Python 3.11+

PR:#4551

agent-framework-github-copilot теперь отслеживает github-copilot-sdk>=0.1.32.

  • Обработчики инструментов получают ToolInvocation класс данных вместо необработанного dict.
  • Возвращайте ToolResult, используя поля snake_case, такие как result_type и text_result_for_llm.
  • Пакет agent-framework-github-copilot теперь требует Python 3.11+.

Before:

from typing import Any


def handle_tool(invocation: dict[str, Any]) -> dict[str, Any]:
    args = invocation.get("arguments", {})
    return {
        "resultType": "success",
        "textResultForLlm": f"Handled {args.get('city', 'request')}",
    }

After:

from copilot.types import ToolInvocation, ToolResult


def handle_tool(invocation: ToolInvocation) -> ToolResult:
    args = invocation.arguments
    return ToolResult(
        result_type="success",
        text_result_for_llm=f"Handled {args.get('city', 'request')}",
    )

python-1.0.0rc3 / python-1.0.0b260304 (4 марта 2026 г.)

Заметки о выпуске:python-1.0.0rc3

🔴 Поставщик навыков завершил разработку на основе кода Skill / SkillResource

PR:#4387

Навыки агента Python теперь поддерживают объекты Skill и SkillResource, определяемые кодом, а также навыки, определяемые файлами, и область применения общедоступного провайдера стандартизирована на SkillsProvider.

  • Если вы по-прежнему импортируете старую предварительную версию или внутреннюю FileAgentSkillsProviderверсию, переключитесь на SkillsProvider.
  • Поиск ресурсов на основе файлов больше не зависит от ссылок на цитаты в обратных кавычках в SKILL.md; ресурсы обнаруживаются в каталоге навыков.

Если вы использовали предварительный просмотр или внутренний импортированный код FileAgentSkillsProvider, переключитесь на текущий публичный интерфейс:

from agent_framework import Skill, SkillResource, SkillsProvider

python-1.0.0rc2 / python-1.0.0b260226 (26 февраля 2026 г.)

Заметки о выпуске:python-1.0.0rc2

🔴 Декларативные рабочие процессы заменяются InvokeTool на InvokeFunctionTool

PR:#3716

Декларативные рабочие процессы Python больше не используют старый InvokeTool тип действия. Замените это на InvokeFunctionTool и зарегистрируйте вызываемые объекты Python с помощью WorkflowFactory.register_tool().

Before:

actions:
  - kind: InvokeTool
    toolName: send_email

After:

factory = WorkflowFactory().register_tool("send_email", send_email)
actions:
  - kind: InvokeFunctionTool
    functionName: send_email

python-1.0.0rc1 / python-1.0.0b260219 (19 февраля 2026 г.)

Выпуск:agent-framework-core и agent-framework-azure-ai повышены до 1.0.0rc1. Все остальные пакеты обновлены до 1.0.0b260219.

🔴 Единая обработка учетных данных Azure во всех пакетах

PR:#4088

ad_token, ad_token_provider и get_entra_auth_token параметры/помощники заменены единым параметром credential во всех связанных с Azure пакетах Python. Новый подход использует azure.identity.get_bearer_token_provider для автоматического кэширования и обновления токенов.

Затронутые классы:AzureOpenAIChatClient, AzureOpenAIResponsesClient. AzureOpenAIAssistantsClientAzureAIClientAzureAIAgentClientAzureAIProjectAgentProviderAzureAIAgentsProviderAzureAISearchContextProviderPurviewClientPurviewPolicyMiddlewarePurviewChatPolicyMiddleware

Before:

from azure.identity import AzureCliCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    AzureCliCredential(), "https://cognitiveservices.azure.com/.default"
)

client = AzureOpenAIResponsesClient(
    azure_ad_token_provider=token_provider,
    ...
)

After:

from azure.identity import AzureCliCredential

client = AzureOpenAIResponsesClient(
    credential=AzureCliCredential(),
    ...
)

Параметр credential принимает TokenCredential, AsyncTokenCredential или провайдера токенов, который может быть вызван. Кэширование токенов и их обновление обрабатываются автоматически.


🔴 Измененная иерархия исключений Python

PR:#4082

Неплоское ServiceException семейство было заменено ветвлениями исключений, относящимися к домену, под одним AgentFrameworkException корнем. Это дает вызывающим абонентам точные except цели и четкую семантику ошибок.

Новая иерархия:

AgentFrameworkException
├── AgentException
│   ├── AgentInvalidAuthException
│   ├── AgentInvalidRequestException
│   ├── AgentInvalidResponseException
│   └── AgentContentFilterException
├── ChatClientException
│   ├── ChatClientInvalidAuthException
│   ├── ChatClientInvalidRequestException
│   ├── ChatClientInvalidResponseException
│   └── ChatClientContentFilterException
├── IntegrationException
│   ├── IntegrationInitializationError
│   ├── IntegrationInvalidAuthException
│   ├── IntegrationInvalidRequestException
│   ├── IntegrationInvalidResponseException
│   └── IntegrationContentFilterException
├── ContentError
├── WorkflowException
│   ├── WorkflowRunnerException
│   ├── WorkflowValidationError
│   └── WorkflowActionError
├── ToolExecutionException
├── MiddlewareTermination
└── SettingNotFoundError

Удалены исключения:ServiceException, ServiceInitializationErrorServiceResponseExceptionServiceContentFilterExceptionServiceInvalidAuthErrorServiceInvalidExecutionSettingsErrorServiceInvalidRequestErrorServiceInvalidResponseErrorAgentExecutionExceptionAgentInvocationErrorAgentInitializationErrorAgentSessionExceptionChatClientInitializationErrorCheckpointDecodingError

Before:

from agent_framework.exceptions import ServiceException, ServiceResponseException

try:
    result = await agent.run("Hello")
except ServiceResponseException:
    ...
except ServiceException:
    ...

After:

from agent_framework.exceptions import AgentException, AgentInvalidResponseException, AgentFrameworkException

try:
    result = await agent.run("Hello")
except AgentInvalidResponseException:
    ...
except AgentException:
    ...
except AgentFrameworkException:
    # catch-all for any Agent Framework error
    ...

Замечание

Ошибки проверки инициализации теперь используют встроенные ValueError/TypeError вместо пользовательских исключений. Исключения agent Framework зарезервированы для сбоев уровня домена.


🔴 Состояние поставщика, ограниченное областью действия source_id

PR:#3995

Теперь перехватчики поставщиков получают словарь состояния с областью действия поставщика вместоstate.setdefault(provider.source_id, {}) состояния полного сеанса. Это означает, что реализации поставщиков, которые ранее обращались к вложенному состоянию через state[self.source_id]["key"], теперь должны обращаться непосредственно через state["key"].

Кроме того, InMemoryHistoryProvider значение по умолчанию source_id изменилось с "memory" на "in_memory".

Before:

# In a custom provider hook:
async def on_before_agent(self, state: dict, **kwargs):
    my_data = state[self.source_id]["my_key"]

# InMemoryHistoryProvider default source_id
provider = InMemoryHistoryProvider("memory")

After:

# Provider hooks receive scoped state — no nested access needed:
async def on_before_agent(self, state: dict, **kwargs):
    my_data = state["my_key"]

# InMemoryHistoryProvider default source_id changed
provider = InMemoryHistoryProvider("in_memory")

🔴 Выравнивание ввода сообщений чата/агента (run vs get_response)

PR:#3920

Реализации чат-клиента get_response теперь стабильно получают Sequence[Message]. agent.run(...) остается гибким (str, Content, Message или последовательности этих) и нормализует входные данные перед вызовом клиентов чата.

Before:

async def get_response(self, messages: str | Message | list[Message], **kwargs): ...

After:

from collections.abc import Sequence
from agent_framework import Message

async def get_response(self, messages: Sequence[Message], **kwargs): ...

🔴 FunctionTool[Any] общая настройка удалена для сквозной передачи схемы

PR:#3907

Пути инструментов на основе схемы больше не зависят от предыдущего FunctionTool[Any] общего поведения. Используйте FunctionTool напрямую и предоставьте pydantic BaseModel или, где необходимо, явные схемы (например, с @tool(schema=...)).

Before:

placeholder: FunctionTool[Any] = FunctionTool(...)

After:

placeholder: FunctionTool = FunctionTool(...)

🔴 Параметры Pydantic заменены на TypedDict + load_settings()

PRs:#3843, #4032

Класс на основе pydantic-settings и AFBaseSettings был заменен легковесной системой параметров, основанной на функциях с использованием TypedDict и load_settings(). Зависимость pydantic-settings была полностью удалена.

Все классы параметров (например, OpenAISettings, , AzureOpenAISettingsAnthropicSettings) теперь TypedDict являются определениями, а значения параметров доступны с помощью синтаксиса словаря вместо доступа к атрибутам.

Before:

from agent_framework.openai import OpenAISettings

settings = OpenAISettings()  # pydantic-settings auto-loads from env
api_key = settings.api_key
model_id = settings.model_id

After:

from agent_framework.openai import OpenAISettings, load_settings

settings = load_settings(OpenAISettings, env_prefix="OPENAI_")
api_key = settings["api_key"]
model = settings["model"]

Это важно

Agent Framework не загружает значения из .env файлов автоматически. Вы должны явно разрешить загрузку .env, либо:

  • Вызов load_dotenv() из python-dotenv пакета в начале работы вашего приложения
  • Передача env_file_path=".env" в load_settings()
  • Установка переменных среды непосредственно в оболочке или интегрированной среде разработки

load_settings Порядок разрешения: явные переопределения → .env значения файлов (если env_file_path указано) → переменные среды → значения по умолчанию. Если задано env_file_path, файл должен существовать или FileNotFoundError вызывается.


🟡 Исправление передачи рабочего процесса модели рассуждений и сериализации истории

PR:#4083

Устраняет несколько сбоев при использовании моделей причин (например, gpt-5-mini, gpt-5.2) в рабочих процессах с несколькими агентами. Логические элементы из API ответов теперь правильно сериализуются и включаются только в журнал, если function_call также присутствует, предотвращая ошибки API. Зашифрованное или скрытое содержимое логи отныне правильно эмитируется, а формат поля summary исправлен. При передаче управления service_session_id также очищается для предотвращения утечки состояния между агентами.


🟡 Добавлено в Bedrock core[all], и по умолчанию исправлен выбор инструментов

PR:#3953

Amazon Bedrock в настоящее время входит в agent-framework-core[all] дополнения и доступен через ленивый agent_framework.amazon способ импорта. Поведение выбора инструментов также было исправлено: значения выбора инструментов не заданы, поэтому поставщики используют их значения по умолчанию службы, а явно заданные значения сохраняются.

from agent_framework.amazon import BedrockClient

🟡 AzureAIClient предупредил о переопределении неподдерживаемых настроек среды выполнения

PR:#3919

Во время этого изменения в журнале появилось предупреждение, когда среда исполнения tools или structured_output отличается от конфигурации времени создания агента. Эта поверхность Python с тех пор была удалена. Для текущего кода Python используйте FoundryChatClient , если требуется настройка средства или среды выполнения приложения, или OpenAIChatClient для сценариев API прямых ответов, требующих динамических переопределений.


🟡 workflow.as_agent() Теперь по умолчанию используется локальная история, когда поставщики не заданы

PR:#3918

Теперь, при создании workflow.as_agent() без context_providers, InMemoryHistoryProvider("memory") добавляется по умолчанию. Если поставщики контекста явно указываются, этот список сохраняется без изменений.

workflow_agent = workflow.as_agent(name="MyWorkflowAgent")
# Default local history provider is injected when none are provided.

🟡 Контекст трассировки OpenTelemetry распространяется на запросы MCP

PR:#3780

При установке OpenTelemetry контекст трассировки (например, W3C traceparent) автоматически внедряется в запросы MCP через params._meta. Это обеспечивает сквозную распределённую трассировку в вызовах от агента к серверу MCP. Изменения кода не требуются. Это аддитивное поведение, которое активируется при наличии допустимого контекста диапазона.


🟡 Поддержка устойчивых рабочих процессов для Функций Azure

PR:#3630

Пакет agent-framework-azurefunctions теперь поддерживает выполнение Workflow графов в Azure Durable Functions. Передайте параметр в workflow для автоматической регистрации сущностей агента, функций активности и конечных точек HTTP.

from agent_framework.azurefunctions import AgentFunctionApp

app = AgentFunctionApp(workflow=my_workflow)
# Automatically registers:
#   POST /api/workflow/run          — start a workflow
#   GET  /api/workflow/status/{id}  — check status
#   POST /api/workflow/respond/{id}/{requestId} — HITL response

Поддерживает схемы расширения и сужения, общую среду и шаблоны "человек в процессе" с настраиваемым временем ожидания и автоматическим отклонением при истечении срока действия.


python-1.0.0b260212 (12 февраля 2026 г.)

Заметки о выпуске:python-1.0.0b260212

🔴 Hosted*Tool классы, замененные клиентскими get_*_tool() методами

PR:#3634

Классы хостируемых инструментов были удалены в пользу методов фабрики с клиентской областью действия. Это делает доступность инструментов явной по поставщику.

Удаленный класс Replacement
HostedCodeInterpreterTool client.get_code_interpreter_tool()
HostedWebSearchTool client.get_web_search_tool()
HostedFileSearchTool client.get_file_search_tool(...)
HostedMCPTool client.get_mcp_tool(...)
HostedImageGenerationTool client.get_image_generation_tool(...)

Before:

from agent_framework import HostedCodeInterpreterTool, HostedWebSearchTool

tools = [HostedCodeInterpreterTool(), HostedWebSearchTool()]

After:

from agent_framework.openai import OpenAIResponsesClient

client = OpenAIResponsesClient()
tools = [client.get_code_interpreter_tool(), client.get_web_search_tool()]

🔴 Завершен конвейер поставщика сеансов и контекста (AgentSession, context_providers)

PR:#3850

Завершена миграция сеанса Python и поставщика контекста. AgentThread и старые типы поставщиков контекста были удалены.

  • AgentThreadAgentSession
  • agent.get_new_thread()agent.create_session()
  • agent.get_new_thread(service_thread_id=...)agent.get_session(service_session_id=...)
  • context_provider= / chat_message_store_factory= шаблоны заменяются context_providers=[...]

Before:

thread = agent.get_new_thread()
response = await agent.run("Hello", thread=thread)

After:

session = agent.create_session()
response = await agent.run("Hello", session=session)

🔴 Модель контрольных точек и рефакторинг поведения хранилища

PR:#3744

Внутренняя структура контрольных точек была переработана, что влияет на совместимость сохранённых контрольных точек и пользовательские реализации систем хранения.

  • WorkflowCheckpoint теперь хранит динамические объекты (сериализация происходит в хранилище контрольных точек)
  • FileCheckpointStorage теперь использует сериализацию pickle
  • workflow_id удален и previous_checkpoint_id добавлен
  • Устаревшие хуки контрольных точек были удалены

При сохранении контрольных точек между версиями повторно создайте или переносите существующие артефакты контрольных точек перед возобновлением рабочих процессов.


🟡 Конечные точки проекта Foundry первоначально появлялись через AzureOpenAIResponsesClient

PR:#3814

Эта возможность предварительной версии изначально позволяла AzureOpenAIResponsesClient подключаться к конечным точкам проекта Foundry. Текущее руководство по Python использует FoundryChatClient для инференса проектов Foundry или FoundryAgent для агентов Foundry, управляемых службами, вместо удаленных AzureOpenAIResponsesClient.

from azure.identity import DefaultAzureCredential
from agent_framework.foundry import FoundryChatClient

client = FoundryChatClient(
    project_endpoint="https://<your-project>.services.ai.azure.com",
    model="gpt-4o-mini",
    credential=DefaultAzureCredential(),
)

🔴 ПО промежуточного слоя call_next больше не принимает context

PR:#3829

Продолжение ПО промежуточного слоя теперь не принимает аргументов. Если ваше программное обеспечение промежуточного слоя все еще вызывает call_next(context), обновите его до call_next().

Before:

async def telemetry_middleware(context, call_next):
    # ...
    return await call_next(context)

After:

async def telemetry_middleware(context, call_next):
    # ...
    return await call_next()

python-1.0.0b260210 (10 февраля 2026 г.)

Заметки о выпуске:python-1.0.0b260210

🔴 Методы создания рабочих процессов удалены из WorkflowBuilder

PR:#3781

register_executor() и register_agent() удалены из WorkflowBuilder. Все методы построителя (add_edge, add_fan_out_edges, add_fan_in_edges, add_chain, add_switch_case_edge_group, add_multi_selection_edge_group) и start_executor больше не принимают строковые имена — они требуют в качестве аргументов непосредственно экземпляры исполнителя или агента.

Для изоляции состояния оберните создание экземпляров исполнителя или агента и построение рабочего процесса внутри вспомогательного метода, чтобы каждый вызов создавал свежие экземпляры.

WorkflowBuilder с исполнителями

Before:

workflow = (
    WorkflowBuilder(start_executor="UpperCase")
    .register_executor(lambda: UpperCaseExecutor(id="upper"), name="UpperCase")
    .register_executor(lambda: ReverseExecutor(id="reverse"), name="Reverse")
    .add_edge("UpperCase", "Reverse")
    .build()
)

After:

upper = UpperCaseExecutor(id="upper")
reverse = ReverseExecutor(id="reverse")

workflow = WorkflowBuilder(start_executor=upper).add_edge(upper, reverse).build()

WorkflowBuilder с агентами

Before:

builder = WorkflowBuilder(start_executor="writer_agent")
builder.register_agent(factory_func=create_writer_agent, name="writer_agent")
builder.register_agent(factory_func=create_reviewer_agent, name="reviewer_agent")
builder.add_edge("writer_agent", "reviewer_agent")

workflow = builder.build()

After:

writer_agent = create_writer_agent()
reviewer_agent = create_reviewer_agent()

workflow = WorkflowBuilder(start_executor=writer_agent).add_edge(writer_agent, reviewer_agent).build()

Изоляция состояния с помощью вспомогательных методов

Для рабочих процессов, которым требуется изолированное состояние для каждого вызова, заключите построение в вспомогательный метод:

def create_workflow() -> Workflow:
    """Each call produces fresh executor instances with independent state."""
    upper = UpperCaseExecutor(id="upper")
    reverse = ReverseExecutor(id="reverse")

    return WorkflowBuilder(start_executor=upper).add_edge(upper, reverse).build()

workflow_a = create_workflow()
workflow_b = create_workflow()

🔴 ChatAgent переименовано в Agent, ChatMessage переименовано в Message

PR:#3747

Основные типы Python были упрощены путем удаления избыточного Chat префикса. Псевдонимы для обратной совместимости не предоставляются.

До После
ChatAgent Agent
RawChatAgent RawAgent
ChatMessage Message
ChatClientProtocol SupportsChatGetResponse

Обновление импорта

Before:

from agent_framework import ChatAgent, ChatMessage

After:

from agent_framework import Agent, Message

Обновление ссылок на типы

Before:

agent = ChatAgent(
    chat_client=client,
    name="assistant",
    instructions="You are a helpful assistant.",
)

message = ChatMessage(role="user", contents=[Content.from_text("Hello")])

After:

agent = Agent(
    client=client,
    name="assistant",
    instructions="You are a helpful assistant.",
)

message = Message(role="user", contents=[Content.from_text("Hello")])

Замечание

ChatClient, , ChatResponseChatOptionsи ChatMessageStoreне переименованы этим изменением.


🔴 Типы API просматривают обновления в моделях ответов и сообщений

PR:#3647

Этот выпуск включает в себя широкую и серьезную очистку типизации сообщений и ответов, а также вспомогательных интерфейсов API.

  • Role и FinishReason теперь NewType оболочки над str с RoleLiteral/FinishReasonLiteral для известных значений. Обрабатывать их как строки (не использовать .value).
  • Message строительство стандартизировано по Message(role, contents=[...]); строки в contents автоматически преобразуются в текстовое содержимое.
  • ChatResponse и AgentResponse конструкторы теперь ориентированы на messages= (один Message или последовательность); устаревшее использование text= конструктора удалено из ответов.
  • ChatResponseUpdate и AgentResponseUpdate больше не принимает text=; используется contents=[Content.from_text(...)].
  • Имена вспомогательных элементов для объединения обновлений были упрощены.
  • try_parse_value удален из ChatResponse и AgentResponse.

Метод-помощник переименовывает

До После
ChatResponse.from_chat_response_updates(...) ChatResponse.from_updates(...)
ChatResponse.from_chat_response_generator(...) ChatResponse.from_update_generator(...)
AgentResponse.from_agent_run_response_updates(...) AgentResponse.from_updates(...)

Обновление конструкции обновления ответа

Before:

update = AgentResponseUpdate(text="Processing...", role="assistant")

After:

from agent_framework import AgentResponseUpdate, Content

update = AgentResponseUpdate(
    contents=[Content.from_text("Processing...")],
    role="assistant",
)

Замена try_parse_value на try/except на .value

Before:

if parsed := response.try_parse_value(MySchema):
    print(parsed.name)

After:

from pydantic import ValidationError

try:
    parsed = response.value
    if parsed:
        print(parsed.name)
except ValidationError as err:
    print(f"Validation failed: {err}")

🔴Унифицированная run/get_responseмодель и ResponseStream использование

PR:#3379

API Python были консолидированы вокруг agent.run(...) и client.get_response(...), с потоковой передачей, представленной ResponseStream.

Before:

async for update in agent.run_stream("Hello"):
    print(update)

After:

stream = agent.run("Hello", stream=True)
async for update in stream:
    print(update)

🔴 Переименование основного контекста или типа протокола

PRs:#3714, #3717

До После
AgentRunContext AgentContext
AgentProtocol SupportsAgentRun

Обновите импорты и аннотации типов соответствующим образом.


🔴 Параметр продолжения Middleware переименован в call_next

PR:#3735

Подписи промежуточного ПО теперь должны использовать call_next вместо next.

Before:

async def my_middleware(context, next):
    return await next(context)

After:

async def my_middleware(context, call_next):
    return await call_next(context)

🔴 Стандартизированные имена TypeVar (TNameNameT)

PR:#3770

База кода теперь соответствует согласованному стилю именования TypeVar, где используется суффикс T .

Before:

TMessage = TypeVar("TMessage")

After:

MessageT = TypeVar("MessageT")

Если вы поддерживаете пользовательские оболочки вокруг генериков фреймворка, выровняйте ваши локальные имена TypeVar с новым соглашением, чтобы уменьшить количество аннотаций.


🔴 Изменения в системе Workflow-as-agent и потоковой обработке данных

PR:#3649

workflow.as_agent() поведение было обновлено для приведения выходных данных и потоковой передачи в соответствие со стандартными шаблонами ответов агента. Просмотрите потребителей "рабочих процессов как агента", которые зависят от устаревшей обработки выходных данных и обновлений, и обновите их до текущего AgentResponse/AgentResponseUpdate потока.


🔴 Методы Fluent Builder, перенесенные в параметры конструктора

PR:#3693

Одноконфигурные методы fluent в 6 построителях (WorkflowBuilder, SequentialBuilder, ConcurrentBuilderGroupChatBuilder, , MagenticBuilderHandoffBuilder) перенесены в параметры конструктора. Методы Fluent, которые были единственным путем конфигурации для параметра, удаляются в пользу аргументов конструктора.

WorkflowBuilder

set_start_executor(), with_checkpointing()и with_output_from() удаляются. Вместо этого используйте параметры конструктора.

Before:

upper = UpperCaseExecutor(id="upper")
reverse = ReverseExecutor(id="reverse")

workflow = (
    WorkflowBuilder(start_executor=upper)
    .add_edge(upper, reverse)
    .set_start_executor(upper)
    .with_checkpointing(storage)
    .build()
)

After:

upper = UpperCaseExecutor(id="upper")
reverse = ReverseExecutor(id="reverse")

workflow = (
    WorkflowBuilder(start_executor=upper, checkpoint_storage=storage)
    .add_edge(upper, reverse)
    .build()
)

SequentialBuilder / ConcurrentBuilder

participants(), , register_participants()with_checkpointing()и with_intermediate_outputs() удаляются. Вместо этого используйте параметры конструктора.

Before:

workflow = SequentialBuilder().participants([agent_a, agent_b]).with_checkpointing(storage).build()

After:

workflow = SequentialBuilder(participants=[agent_a, agent_b], checkpoint_storage=storage).build()

GroupChatBuilder

participants(), register_participants(), with_orchestrator()with_termination_condition()with_max_rounds()with_checkpointing()и with_intermediate_outputs() удаляются. Вместо этого используйте параметры конструктора.

Before:

workflow = (
    GroupChatBuilder()
    .with_orchestrator(selection_func=selector)
    .participants([agent1, agent2])
    .with_termination_condition(lambda conv: len(conv) >= 4)
    .with_max_rounds(10)
    .build()
)

After:

workflow = GroupChatBuilder(
    participants=[agent1, agent2],
    selection_func=selector,
    termination_condition=lambda conv: len(conv) >= 4,
    max_rounds=10,
).build()

MagenticBuilder

participants(), register_participants(), with_manager()with_plan_review()with_checkpointing(), и with_intermediate_outputs() удаляются. Вместо этого используйте параметры конструктора.

Before:

workflow = (
    MagenticBuilder()
    .participants([researcher, coder])
    .with_manager(agent=manager_agent)
    .with_plan_review()
    .build()
)

After:

workflow = MagenticBuilder(
    participants=[researcher, coder],
    manager_agent=manager_agent,
    enable_plan_review=True,
).build()

HandoffBuilder

with_checkpointing() и with_termination_condition() удаляются. Вместо этого используйте параметры конструктора.

Before:

workflow = (
    HandoffBuilder(participants=[triage, specialist])
    .with_start_agent(triage)
    .with_termination_condition(lambda conv: len(conv) > 5)
    .with_checkpointing(storage)
    .build()
)

After:

workflow = (
    HandoffBuilder(
        participants=[triage, specialist],
        termination_condition=lambda conv: len(conv) > 5,
        checkpoint_storage=storage,
    )
    .with_start_agent(triage)
    .build()
)

Изменения валидации

  • WorkflowBuilder теперь требуется start_executor в качестве аргумента конструктора (ранее заданный с помощью метода fluent)
  • SequentialBuilder, ConcurrentBuilder, GroupChatBuilder и MagenticBuilder теперь требуют либо participants или participant_factories при создании — отсутствие их вызовет ValueError.

Замечание

HandoffBuilder уже принимал participants/participant_factories в качестве параметров конструктора и в этом отношении не изменился.


🔴События рабочего процесса объединены в единый WorkflowEvent с type дискриминатором

PR:#3690

Все подклассы событий рабочего процесса заменены одним универсальным WorkflowEvent[DataT] классом. Вместо использования isinstance() проверок для идентификации типов событий теперь вы проверяете строковый литерал event.type (например, "output", "request_info", "status"). Это следует тому же шаблону, что и консолидация класса Content из python-1.0.0b260123.

Удаленные классы событий

Следующие экспортированные подклассы событий больше не существуют:

Старый класс Новое event.type значение
WorkflowOutputEvent "output"
RequestInfoEvent "request_info"
WorkflowStatusEvent "status"
WorkflowStartedEvent "started"
WorkflowFailedEvent "failed"
ExecutorInvokedEvent "executor_invoked"
ExecutorCompletedEvent "executor_completed"
ExecutorFailedEvent "executor_failed"
SuperStepStartedEvent "superstep_started"
SuperStepCompletedEvent "superstep_completed"

Обновление импорта

Before:

from agent_framework import (
    WorkflowOutputEvent,
    RequestInfoEvent,
    WorkflowStatusEvent,
    ExecutorCompletedEvent,
)

After:

from agent_framework import WorkflowEvent
# Individual event classes no longer exist; use event.type to discriminate

Обновление проверок типов событий

Before:

async for event in workflow.run_stream(input_message):
    if isinstance(event, WorkflowOutputEvent):
        print(f"Output from {event.executor_id}: {event.data}")
    elif isinstance(event, RequestInfoEvent):
        requests[event.request_id] = event.data
    elif isinstance(event, WorkflowStatusEvent):
        print(f"Status: {event.state}")

After:

async for event in workflow.run_stream(input_message):
    if event.type == "output":
        print(f"Output from {event.executor_id}: {event.data}")
    elif event.type == "request_info":
        requests[event.request_id] = event.data
    elif event.type == "status":
        print(f"Status: {event.state}")

Потоковая передача с помощью AgentResponseUpdate

Before:

from agent_framework import AgentResponseUpdate, WorkflowOutputEvent

async for event in workflow.run_stream("Write a blog post about AI agents."):
    if isinstance(event, WorkflowOutputEvent) and isinstance(event.data, AgentResponseUpdate):
        print(event.data, end="", flush=True)
    elif isinstance(event, WorkflowOutputEvent):
        print(f"Final output: {event.data}")

After:

from agent_framework import AgentResponseUpdate

async for event in workflow.run_stream("Write a blog post about AI agents."):
    if event.type == "output" and isinstance(event.data, AgentResponseUpdate):
        print(event.data, end="", flush=True)
    elif event.type == "output":
        print(f"Final output: {event.data}")

Заметки типа

Before:

pending_requests: list[RequestInfoEvent] = []
output: WorkflowOutputEvent | None = None

After:

from typing import Any
from agent_framework import WorkflowEvent

pending_requests: list[WorkflowEvent[Any]] = []
output: WorkflowEvent | None = None

Замечание

WorkflowEvent является универсальным (WorkflowEvent[DataT]), но для коллекций смешанных событий используйте WorkflowEvent[Any] или unparameterized WorkflowEvent.


🔴 workflow.send_responses* Удалены; Использовать workflow.run(responses=...)

PR:#3720

send_responses() и send_responses_streaming() были удалены из Workflow. Продолжайте приостановленные рабочие процессы, передав ответы непосредственно в run().

Before:

async for event in workflow.send_responses_streaming(
    checkpoint_id=checkpoint_id,
    responses=[approved_response],
):
    ...

After:

async for event in workflow.run(
    checkpoint_id=checkpoint_id,
    responses=[approved_response],
):
    ...

🔴 SharedState переименованы в State; API состояния рабочего процесса синхронны

PR:#3667

API состояния больше не требуют await, а именование было стандартизировано.

До После
ctx.shared_state ctx.state
await ctx.get_shared_state("k") ctx.get_state("k")
await ctx.set_shared_state("k", v) ctx.set_state("k", v)
checkpoint.shared_state checkpoint.state

🔴 Построители оркестрации переехали в agent_framework.orchestrations

PR:#3685

Построители оркестрации теперь находятся в выделенном пространстве имен пакета.

Before:

from agent_framework import SequentialBuilder, GroupChatBuilder

After:

from agent_framework.orchestrations import SequentialBuilder, GroupChatBuilder

🟡 Длительные фоновые ответы и маркеры продолжения

PR:#3808

Фоновые ответы теперь поддерживаются для запуска агента на Python через options={"background": True} и continuation_token.

response = await agent.run("Long task", options={"background": True})
while response.continuation_token is not None:
    response = await agent.run(options={"continuation_token": response.continuation_token})

🟡 Типы предварительной версии поставщика сеансов и контекста, добавленные параллельно

PR:#3763

Новые типы конвейеров сеансов и контекста появились вместе с устаревшими API для добавочной миграции, включая SessionContext и BaseContextProvider.


🟡 Потоковая передача интерпретатора кода теперь включает разностные значения добавочного кода

PR:#3775

Интерпретатор кода для потоковой передачи теперь отображает дельта-обновления кода в потоковом содержимом, чтобы пользовательские интерфейсы могли постепенно отображать сгенерированный код.


🟡 @tool поддерживает явную обработку схемы

PR:#3734

Теперь определения инструментов могут использовать явное управление схемой, когда требуется настройка выводимых данных предполагаемой схемы.


python-1.0.0b260130 (30 января 2026 г.)

Заметки о выпуске:python-1.0.0b260130

🟡 ChatOptions и ChatResponse/AgentResponse теперь универсальный формат ответа

PR:#3305

ChatOptions, ChatResponseи AgentResponse теперь являются универсальными типами, параметризованными по типу формата ответа. Это обеспечивает более эффективное определение типов при использовании структурированных выходных данных с response_format.

Before:

from agent_framework import ChatOptions, ChatResponse
from pydantic import BaseModel

class MyOutput(BaseModel):
    name: str
    score: int

options: ChatOptions = {"response_format": MyOutput}  # No type inference
response: ChatResponse = await client.get_response("Query", options=options)
result = response.value  # Type: Any

After:

from agent_framework import ChatOptions, ChatResponse
from pydantic import BaseModel

class MyOutput(BaseModel):
    name: str
    score: int

options: ChatOptions[MyOutput] = {"response_format": MyOutput}  # Generic parameter
response: ChatResponse[MyOutput] = await client.get_response("Query", options=options)
result = response.value  # Type: MyOutput | None (inferred!)

Подсказка

Это не критическое улучшение. Существующий код без параметров типа продолжает работать. Вам не нужно указывать типы в приведенном выше фрагменте кода для параметров и ответа; они показаны здесь для ясности.


🟡 BaseAgent добавлена поддержка пакета SDK агента Claude

PR:#3509

Пакет SDK для Python теперь включает BaseAgent реализацию пакета SDK для агента Claude, что позволяет использовать адаптеры первого класса в рамках Agent Framework.


python-1.0.0b260128 (28 января 2026 г.)

Заметки о выпуске:python-1.0.0b260128

🔴 AIFunction переименовано в FunctionTool и @ai_function переименовано в @tool

PR:#3413

Класс и декоратор были переименованы для ясности и согласованности с терминологией отрасли.

Before:

from agent_framework.core import ai_function, AIFunction

@ai_function
def get_weather(city: str) -> str:
    """Get the weather for a city."""
    return f"Weather in {city}: Sunny"

# Or using the class directly
func = AIFunction(get_weather)

After:

from agent_framework.core import tool, FunctionTool

@tool
def get_weather(city: str) -> str:
    """Get the weather for a city."""
    return f"Weather in {city}: Sunny"

# Or using the class directly
func = FunctionTool(get_weather)

🔴 Фабричный метод добавлен в GroupChat и Magnetic; Переименование API

PR:#3224

Добавлена фабрика участников и фабрика оркестратора в групповый чат. Также включает в себя переименования:

  • with_standard_managerwith_manager
  • participant_factoriesregister_participant

Before:

from agent_framework.workflows import MagenticBuilder

builder = MagenticBuilder()
builder.with_standard_manager(manager)
builder.participant_factories(factory1, factory2)

After:

from agent_framework.workflows import MagenticBuilder

builder = MagenticBuilder()
builder.with_manager(manager)
builder.register_participant(factory1)
builder.register_participant(factory2)

🔴 Github переименовано в GitHub

PR:#3486

Имена классов и пакетов обновлены для соответствия правильному регистру.

Before:

from agent_framework_github_copilot import GithubCopilotAgent

agent = GithubCopilotAgent(...)

After:

from agent_framework_github_copilot import GitHubCopilotAgent

agent = GitHubCopilotAgent(...)

python-1.0.0b260127 (27 января 2026 г.)

Заметки о выпуске:python-1.0.0b260127

🟡 BaseAgent добавлена поддержка пакета SDK для GitHub Copilot

PR:#3404

Пакет SDK для Python теперь включает реализацию BaseAgent для интеграций в GitHub Copilot SDK.


python-1.0.0b260123 (23 января 2026 г.)

Заметки о выпуске:python-1.0.0b260123

🔴 Тип контента упрощен до одного класса с конструкторами класса classmethod

PR:#3252

Заменены все старые типы контента (производные от BaseContent) одним классом Content с методами класса для создания определённых типов.

Полный справочник по миграции

Старый тип Новый метод
TextContent(text=...) Content.from_text(text=...)
DataContent(data=..., media_type=...) Content.from_data(data=..., media_type=...)
UriContent(uri=..., media_type=...) Content.from_uri(uri=..., media_type=...)
ErrorContent(message=...) Content.from_error(message=...)
HostedFileContent(file_id=...) Content.from_hosted_file(file_id=...)
FunctionCallContent(name=..., arguments=..., call_id=...) Content.from_function_call(name=..., arguments=..., call_id=...)
FunctionResultContent(call_id=..., result=...) Content.from_function_result(call_id=..., result=...)
FunctionApprovalRequestContent(...) Content.from_function_approval_request(...)
FunctionApprovalResponseContent(...) Content.from_function_approval_response(...)

Дополнительные новые методы (без прямого предшественника):

  • Content.from_text_reasoning(...) — Соображения и мышление контента
  • Content.from_hosted_vector_store(...) — для ссылок на векторное хранилище
  • Content.from_usage(...) — сведения об использовании и токене
  • Content.from_mcp_server_tool_call(...) / Content.from_mcp_server_tool_result(...) — для средств сервера MCP
  • Content.from_code_interpreter_tool_call(...) / Content.from_code_interpreter_tool_result(...) — интерпретатор кода
  • Content.from_image_generation_tool_call(...) / Content.from_image_generation_tool_result(...) — для создания образа

Проверка типов

Вместо isinstance() проверок используйте type свойство.

Before:

from agent_framework.core import TextContent, FunctionCallContent

if isinstance(content, TextContent):
    print(content.text)
elif isinstance(content, FunctionCallContent):
    print(content.name)

After:

from agent_framework.core import Content

if content.type == "text":
    print(content.text)
elif content.type == "function_call":
    print(content.name)

Базовый пример

Before:

from agent_framework.core import TextContent, DataContent, UriContent

text = TextContent(text="Hello world")
data = DataContent(data=b"binary", media_type="application/octet-stream")
uri = UriContent(uri="https://example.com/image.png", media_type="image/png")

After:

from agent_framework.core import Content

text = Content.from_text("Hello world")
data = Content.from_data(data=b"binary", media_type="application/octet-stream")
uri = Content.from_uri(uri="https://example.com/image.png", media_type="image/png")

🔴 Типы аннотаций упрощены до Annotation и TextSpanRegion TypedDicts

PR:#3252

Заменены типы заметок на основе классов более простыми TypedDict определениями.

Старый тип Новый тип
CitationAnnotation (класс) Annotation (TypedDict с type="citation")
BaseAnnotation (класс) Annotation (TypedDict)
TextSpanRegion (класс с SerializationMixin) TextSpanRegion (TypedDict)
Annotations (псевдоним типа) Annotation
AnnotatedRegions (псевдоним типа) TextSpanRegion

Before:

from agent_framework import CitationAnnotation, TextSpanRegion

region = TextSpanRegion(start_index=0, end_index=25)
citation = CitationAnnotation(
    annotated_regions=[region],
    url="https://example.com/source",
    title="Source Title"
)

After:

from agent_framework import Annotation, TextSpanRegion

region: TextSpanRegion = {"start_index": 0, "end_index": 25}
citation: Annotation = {
    "type": "citation",
    "annotated_regions": [region],
    "url": "https://example.com/source",
    "title": "Source Title"
}

Замечание

Теперь, когда Annotation и TextSpanRegion стали TypedDict, вы создаете их как словари, а не как экземпляры классов.


Теперь 🔴response_format ошибки проверки видны пользователям

PR:#3274

ChatResponse.value и AgentResponse.value теперь выдают ValidationError, когда проверка схемы завершается ошибкой, вместо того чтобы молча возвращать None.

Before:

response = await agent.run(query, options={"response_format": MySchema})
if response.value:  # Returns None on validation failure - no error details
    print(response.value.name)

After:

from pydantic import ValidationError

# Option 1: Catch validation errors
try:
    print(response.value.name)  # Raises ValidationError on failure
except ValidationError as e:
    print(f"Validation failed: {e}")

# Option 2: Safe parsing (returns None on failure)
if result := response.try_parse_value(MySchema):
    print(result.name)

🔴 Упрощена логика выполнения AG-UI; Исправления клиента MCP и клиента Anthropic

PR:#3322

Сигнатура run метода и поведение в AG-UI была упрощена.

Before:

from agent_framework.ag_ui import AGUIEndpoint

endpoint = AGUIEndpoint(agent=agent)
result = await endpoint.run(
    request=request,
    run_config={"streaming": True, "timeout": 30}
)

After:

from agent_framework.ag_ui import AGUIEndpoint

endpoint = AGUIEndpoint(agent=agent)
result = await endpoint.run(
    request=request,
    streaming=True,
    timeout=30
)

🟡 Теперь anthropic client поддерживает response_format структурированные выходные данные

PR:#3301

Теперь можно использовать структурированный анализ выходных данных с помощью клиентов Anthropic, response_formatаналогичных OpenAI и клиентам Azure.


🟡 Расширенная конфигурация искусственного интеллекта Azure (reasoning, rai_config)

PRs:#3403, #3265

Поддержка ИИ Azure была расширена добавлением поддержки конфигурации логического вывода и rai_config во время создания агента.


python-1.0.0b260116 (16 января 2026 г.)

Заметки о выпуске:python-1.0.0b260116

🔴 create_agent переименовано в as_agent

PR:#3249

Метод переименовывается для лучшей ясности в своей цели.

Before:

from agent_framework.core import ChatClient

client = ChatClient(...)
agent = client.create_agent()

After:

from agent_framework.core import ChatClient

client = ChatClient(...)
agent = client.as_agent()

🔴 WorkflowOutputEvent.source_executor_id переименовано в executor_id

PR:#3166

Свойство, переименованное для согласованности API.

Before:

async for event in workflow.run_stream(...):
    if isinstance(event, WorkflowOutputEvent):
        executor = event.source_executor_id

After:

async for event in workflow.run_stream(...):
    if isinstance(event, WorkflowOutputEvent):
        executor = event.executor_id

🟡 AG-UI поддерживает непрерывность сеансов, управляемых службой

PR:#3136

AG-UI теперь сохраняет идентификатор беседы, управляемый службой (например, сеансы и потоки, управляемые Foundry), для обеспечения непрерывности в многократных взаимодействиях.


python-1.0.0b260114 (14 января 2026 г.)

Заметки о выпуске:python-1.0.0b260114

🔴 Рефакторинг оркестрации

PR:#3023

Обширный рефакторинг и упрощение оркестраций в рабочих процессах Agent Framework.

  • Групповой чат: разделение механизма исполнения оркестратора на выделенных агентов, а также на функции (BaseGroupChatOrchestrator, GroupChatOrchestrator, AgentBasedGroupChatOrchestrator). Упрощенная топология звезд с моделью вещания.
  • Передача: удалена поддержка одного уровня, координатора и пользовательского исполнителя. Перемещено на модель вещания с HandoffAgentExecutor.
  • Последовательный и параллельный: упрощенный механизм сведений о запросах для использования вложенных рабочих процессов с помощью AgentApprovalExecutor и AgentRequestInfoExecutor.

Before:

from agent_framework.workflows import GroupChat, HandoffOrchestrator

# Group chat with custom coordinator
group = GroupChat(
    participants=[agent1, agent2],
    coordinator=my_coordinator
)

# Handoff with single tier
handoff = HandoffOrchestrator(
    agents=[agent1, agent2],
    tier="single"
)

After:

from agent_framework.workflows import (
    GroupChatOrchestrator,
    HandoffAgentExecutor,
    AgentApprovalExecutor
)

# Group chat with star topology
group = GroupChatOrchestrator(
    participants=[agent1, agent2]
)

# Handoff with executor-based approach
handoff = HandoffAgentExecutor(
    agents=[agent1, agent2]
)

🔴 Параметры, представленные как TypedDict и Generic

PR:#3140

Теперь параметры типизируются с использованием TypedDict, что повышает безопасность типов и автозавершение в интегрированной среде разработки.

📖 Полные инструкции по миграции см. в руководстве по типизированным параметрам.

Before:

response = await client.get_response(
    "Hello!",
    model_id="gpt-4",
    temperature=0.7,
    max_tokens=1000,
)

After:

response = await client.get_response(
    "Hello!",
    options={
        "model": "gpt-4",
        "temperature": 0.7,
        "max_tokens": 1000,
    },
)

🔴 display_name удалены; context_provider в единственное число; middleware должен быть в виде списка

PR:#3139

  • display_name параметр удален из агентов
  • context_providers (множественное число, прием списка) изменилось на context_provider (только 1 разрешено)
  • middleware Теперь требуется список (больше не принимает один экземпляр)
  • AggregateContextProvider удален из кода (при необходимости используйте пример реализации)

Before:

from agent_framework.core import Agent, AggregateContextProvider

agent = Agent(
    name="my-agent",
    display_name="My Agent",
    context_providers=[provider1, provider2],
    middleware=my_middleware,  # single instance was allowed
)

aggregate = AggregateContextProvider([provider1, provider2])

After:

from agent_framework.core import Agent

# Only one context provider allowed; combine manually if needed
agent = Agent(
    name="my-agent",  # display_name removed
    context_provider=provider1,  # singular, only 1
    middleware=[my_middleware],  # must be a list now
)

# For multiple context providers, create your own aggregate
class MyAggregateProvider:
    def __init__(self, providers):
        self.providers = providers
    # ... implement aggregation logic

🔴 AgentRunResponse* переименовано в AgentResponse*

PR:#3207

AgentRunResponse и AgentRunResponseUpdate были переименованы AgentResponse в и AgentResponseUpdate.

Before:

from agent_framework import AgentRunResponse, AgentRunResponseUpdate

After:

from agent_framework import AgentResponse, AgentResponseUpdate

🟡 Добавлена исполнительная среда для декларативных рабочих процессов, определенных в YAML

PR:#2815

Среда выполнения на основе графа была добавлена для выполнения декларативных рабочих процессов YAML, что позволяет выполнять оркестрацию с несколькими агентами без пользовательского кода среды выполнения.


🟡 Улучшения загрузки и надежности MCP

PR:#3154

Интеграция MCP получила улучшенное поведение при потере подключения, поддержку разбиения на страницы при загрузке и варианты управления отображением.


🟡 Foundry A2ATool теперь поддерживает подключения без целевого URL-адреса

PR:#3127

A2ATool теперь может разрешать соединения A2A с поддержкой Foundry через метаданные подключения к проекту, даже если прямой URL-адрес назначения не настроен.


python-1.0.0b260107 (7 января 2026 г.)

Заметки о выпуске:python-1.0.0b260107

В этом выпуске нет существенных изменений.


python-1.0.0b260106 (6 января 2026 г.)

Заметки о выпуске:python-1.0.0b260106

В этом выпуске нет существенных изменений.


Сводная таблица

Релиз Заметки о релизе Тип Изменение PR
1.0.0 Только pr 🔴 Прорыв Message(..., text=...) структура полностью удалена; создавайте текстовые сообщения с contents=[...] вместо этого #5062
1.0.0 Только pr 🟡 Улучшение Выпущенные пакеты Python (agent-framework, agent-framework-core, agent-framework-openai, agent-framework-foundry) больше не требуют --pre; бета-соединители по-прежнему требуют --pre. #5062
1.0.0 Только pr 🔴 Прорыв Перенос Python-отображений в agent_framework.foundry, используйте параметры agent-framework-foundry, FoundryEmbeddingClient и FOUNDRY_MODELS_* вместо удаленного пакета agent-framework-azure-ai. #5056
1.0.0 Только pr 🔴 Прорыв workflow.run() теперь используется явный function_invocation_kwargs / client_kwargs, где глобальная или по исполнителю нацеленность определяется идентификаторами исполнителя #5010
1.0.0 Только pr 🟡 Улучшение GitHubCopilotAgent теперь вызывает обработчики контекста поставщика и включает контекст запроса, добавленный поставщиком before_run / after_run #5013
1.0.0 Только pr 🟡 Улучшение Структурированный вывод Python теперь поддерживает сопоставления с JSON схемами через response_format, при этом разобранный JSON выводится на response.value. #5022
1.0.0rc6 Только pr 🔴 Прорыв Устаревшие интерфейсы совместимости Azure/OpenAI были удалены; вместо этого используйте передовые клиенты OpenAI от поставщика или клиенты Foundry Python. #4990
1.0.0rc6 Только pr 🔴 Прорыв Ведущий провайдер выполняет рефакторинг: разделение agent-framework-openai, agent-framework-foundry, и agent-framework-foundry-local; переименовать клиентов OpenAI; переместить Foundry в agent_framework.foundry; устаревшие пути совместимости Azure ИИ и помощников #4818
1.0.0rc6 Только pr 🔴 Прорыв agent-framework-core теперь намеренно минимальный; установите конкретные пакеты поставщиков, такие как agent-framework-openai или agent-framework-foundry, и установите mcp вручную для инструментов MCP на минимальных установках, или используйте метапакет agent-framework для более полного стандартного функционала. #4904
1.0.0rc6 Только pr 🔴 Прорыв Универсальные agent_framework.openai клиенты теперь предпочитают явные сигналы маршрутизации. OpenAI остается в рамках OpenAI, если задано OPENAI_API_KEY, а в сценариях Azure следует передавать явные входные данные маршрутизации Azure, такие как credential или azure_endpoint, после чего настроить api_version. #4925
1.0.0rc5 / 1.0.0b260318 N/A (запланировано) 🔴 Прорыв Открытые kwargs разделены на function_invocation_kwargs и client_kwargs; инструменты теперь используют FunctionInvocationContext / ctx.session #4581
1.0.0rc4 / 1.0.0b260311 Notes 🔴 Прорыв Интеграции Azure AI теперь нацелены на azure-ai-projects 2.0 GA; foundry_features была удалена, а allow_preview является опцией предварительного доступа. #4536
1.0.0rc4 / 1.0.0b260311 Notes 🔴 Прорыв Интеграция GitHub Copilot теперь использует ToolInvocation / ToolResult; agent-framework-github-copilot требует Python 3.11+ #4551
1.0.0rc3 / 1.0.0b260304 Notes 🔴 Прорыв Поставщик навыков добавляет код, определяемый кодом Skill / SkillResource; необходимо обновить старый импорт FileAgentSkillsProvider и ссылки на ресурсы с обратными апострофами. #4387
1.0.0rc2 / 1.0.0b260226 Notes 🔴 Прорыв Декларативные рабочие процессы заменяют InvokeTool на InvokeFunctionTool и WorkflowFactory.register_tool() #3716
1.0.0rc1 / 1.0.0b260219 Notes 🔴 Прорыв Единая обработка учетных данных Azure в пакетах Azure #4088
1.0.0rc1 / 1.0.0b260219 Notes 🔴 Прорыв Иерархия исключений Python изменена в разделе AgentFrameworkException #4082
1.0.0rc1 / 1.0.0b260219 Notes 🔴 Прорыв Состояние поставщика теперь ограничено source_id #3995
1.0.0rc1 / 1.0.0b260219 Notes 🔴 Прорыв Пользовательские get_response() реализации должны принимать Sequence[Message] #3920
1.0.0rc1 / 1.0.0b260219 Notes 🔴 Прорыв FunctionTool[Any] Удалена прокладка для сквозной передачи схемы #3907
1.0.0rc1 / 1.0.0b260219 Notes 🔴 Прорыв Параметры перемещены из AFBaseSettings pydantic-settings в TypedDict + load_settings() #3843, #4032
1.0.0rc1 / 1.0.0b260219 Notes 🟡 Улучшение Исправлены передача задачи и сериализация истории рабочего процесса с моделью рассуждения #4083
1.0.0rc1 / 1.0.0b260219 Notes 🟡 Улучшение По умолчанию добавлен core[all]Bedrock; исправлены значения для выбора инструментов по умолчанию #3953
1.0.0rc1 / 1.0.0b260219 Notes 🟡 Улучшение AzureAIClient предупреждает о переопределениях в неподдерживаемой среде выполнения #3919
1.0.0rc1 / 1.0.0b260219 Notes 🟡 Улучшение workflow.as_agent() внедряет локальную историю, когда поставщики не заданы #3918
1.0.0rc1 / 1.0.0b260219 Notes 🟡 Улучшение Контекст трассировки OpenTelemetry распространяется на запросы MCP #3780
1.0.0rc1 / 1.0.0b260219 Notes 🟡 Улучшение Поддержка устойчивых рабочих процессов, добавленная для функций Azure #3630
1.0.0b260212 Notes 🔴 Прорыв Hosted*Tool удаленные классы; создание размещенных инструментов с помощью методов клиента get_*_tool() #3634
1.0.0b260212 Notes 🔴 Прорыв Конвейер поставщика сеансов и контекста завершен: AgentThread удален, используйте AgentSession + context_providers #3850
1.0.0b260212 Notes 🔴 Прорыв Модель контрольных точек или рефакторинг хранилища (workflow_id удалено, previous_checkpoint_id добавлено, изменено поведение хранилища) #3744
1.0.0b260212 Notes 🟡 Улучшение AzureOpenAIResponsesClient можно создать из конечной точки проекта Foundry или AIProjectClient #3814
1.0.0b260212 Notes 🔴 Прорыв Продолжение промежуточного слоя больше не принимает context; обновите call_next(context) на call_next() #3829
1.0.0b260210 Notes 🔴 Прорыв send_responses() / send_responses_streaming() Удалены; Использовать workflow.run(responses=...) #3720
1.0.0b260210 Notes 🔴 Прорыв SharedStateState; API состояния рабочего процесса являются синхронными, и поле состояния контрольной точки переименовано. #3667
1.0.0b260210 Notes 🔴 Прорыв Построители оркестрации перемещены в agent_framework.orchestrations пакет #3685
1.0.0b260210 Notes 🟡 Улучшение Добавлена поддержка фоновых ответов и continuation_token в ответы агента Python #3808
1.0.0b260210 Notes 🟡 Улучшение Типы предварительной версии сеансов и контекста, добавленные параллельно (SessionContext, BaseContextProvider) #3763
1.0.0b260210 Notes 🟡 Улучшение Теперь обновления потокового интерпретатора кода включают инкрементные изменения кода #3775
1.0.0b260210 Notes 🟡 Улучшение @tool декоратор добавляет явную поддержку обработки схемы #3734
1.0.0b260210 Notes 🔴 Прорыв register_executor() / register_agent() удалено из WorkflowBuilder; используйте экземпляры напрямую и вспомогательные методы для изоляции состояния. #3781
1.0.0b260210 Notes 🔴 Прорыв ChatAgent, Agent → , ChatMessageMessage, RawChatAgentRawAgent, ChatClientProtocolSupportsChatGetResponse #3747
1.0.0b260210 Notes 🔴 Прорыв Проверка API типов: Role/FinishReason изменения типов, ужесточение конструкторов ответа и обновления, переименование вспомогательных функций в from_updates, а также удаление try_parse_value. #3647
1.0.0b260210 Notes 🔴 Прорыв API-интерфейсы, объединенные на базе run/get_response и ResponseStream #3379
1.0.0b260210 Notes 🔴 Прорыв AgentRunContext переименовано в AgentContext #3714
1.0.0b260210 Notes 🔴 Прорыв AgentProtocol переименовано в SupportsAgentRun #3717
1.0.0b260210 Notes 🔴 Прорыв Параметр ПО промежуточного слоя next переименован в call_next #3735
1.0.0b260210 Notes 🔴 Прорыв Стандартизированное именование TypeVar (TNameNameT) #3770
1.0.0b260210 Notes 🔴 Прорыв Поведение рабочего процесса в формате "Workflow-as-agent": выходные данные и потоки согласованы с текущим потоком ответов агента. #3649
1.0.0b260210 Notes 🔴 Прорыв Методы Fluent-Builder перемещены в параметры конструктора для шести билдеров #3693
1.0.0b260210 Notes 🔴 Прорыв События рабочего процесса объединены в один WorkflowEvent с type дискриминатором; isinstance()event.type == "..." #3690
1.0.0b260130 Notes 🟡 Улучшение ChatOptions / ChatResponse / AgentResponse универсальный формат ответа #3305
1.0.0b260130 Notes 🟡 Улучшение BaseAgent добавлена поддержка интеграции с SDK агента Claude #3509
1.0.0b260128 Notes 🔴 Прорыв AIFunction FunctionTool, → @ai_function@tool #3413
1.0.0b260128 Notes 🔴 Прорыв Шаблон фабрики для GroupChat/Magentic; with_standard_managerwith_manager, participant_factoriesregister_participant #3224
1.0.0b260128 Notes 🔴 Прорыв GithubGitHub #3486
1.0.0b260127 Notes 🟡 Улучшение BaseAgent добавлена поддержка интеграции SDK для GitHub Copilot #3404
1.0.0b260123 Notes 🔴 Прорыв Типы контента объединены в один Content класс с classmethods #3252
1.0.0b260123 Notes 🔴 Прорыв response_format Теперь возникают ошибки проверки ValidationError #3274
1.0.0b260123 Notes 🔴 Прорыв упрощенная логика работы AG-UI #3322
1.0.0b260123 Notes 🟡 Улучшение Anthropic client добавляет response_format поддержку структурированных выходных данных #3301
1.0.0b260123 Notes 🟡 Улучшение Конфигурация ИИ Azure расширена поддержкой reasoning и rai_config #3403, #3265
1.0.0b260116 Notes 🔴 Прорыв create_agentas_agent #3249
1.0.0b260116 Notes 🔴 Прорыв source_executor_idexecutor_id #3166
1.0.0b260116 Notes 🟡 Улучшение AG-UI поддерживает непрерывность сеансов и потоков, управляемых службой #3136
1.0.0b260114 Notes 🔴 Прорыв Рефакторинг оркестраций (Групповой чат, Передача, Последовательный, Параллельный) #3023
1.0.0b260114 Notes 🔴 Прорыв Параметры typedDict и generic #3140
1.0.0b260114 Notes 🔴 Прорыв display_name Удалены; context_providerscontext_provider → (сингулярный); middleware должен быть списком #3139
1.0.0b260114 Notes 🔴 Прорыв AgentRunResponse / AgentRunResponseUpdate переименовано в AgentResponse/AgentResponseUpdate #3207
1.0.0b260114 Notes 🟡 Улучшение Декларативная среда выполнения рабочего процесса, добавленная для рабочих процессов, определенных YAML #2815
1.0.0b260114 Notes 🟡 Улучшение Улучшения загрузки и надежности MCP (обработка потери подключения, разбиение на страницы, элементы управления представлением) #3154
1.0.0b260114 Notes 🟡 Улучшение Foundry A2ATool поддерживает подключения без явного целевого URL-адреса #3127
1.0.0b260107 Notes Никаких существенных изменений
1.0.0b260106 Notes Никаких существенных изменений

Дальнейшие шаги