Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
В этом документе перечислены все значительные изменения в выпусках 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.valuePython, совместимые с 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, используйте следующие замены:
-
AzureOpenAIResponsesClient→OpenAIChatClient -
AzureOpenAIChatClient→OpenAIChatCompletionClient -
AzureOpenAIEmbeddingClient→OpenAIEmbeddingClient -
AzureAIAgentClient/AzureAIClient/AzureAIProjectAgentProvider/AzureAIAgentsProvider→FoundryChatClientилиFoundryAgent, в зависимости от того, принадлежит ли ваше приложение определению агента -
OpenAIAssistantsClient/OpenAIAssistantProvider→OpenAIChatClientдля текущей работы с 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, ведущими в секторе предоставления услуг:
-
AzureOpenAIResponsesClient→OpenAIChatClient -
AzureOpenAIChatClient→OpenAIChatCompletionClient -
AzureOpenAIEmbeddingClient→OpenAIEmbeddingClient -
AzureOpenAIAssistantsClientOpenAIChatClient→ для прямой миграции 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/v1URL-адрес и задайте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(),
)
Для сценариев внедрения см. схему:
-
AzureOpenAIEmbeddingClient→OpenAIEmbeddingClient -
AZURE_OPENAI_EMBEDDING_MODEL→model -
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()
Класс на основе 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 и старые типы поставщиков контекста были удалены.
-
AgentThread→AgentSession -
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)
🔴 Переименование основного контекста или типа протокола
| До | После |
|---|---|
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 (TName → NameT)
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_manager→with_manager -
participant_factories→register_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)
Поддержка ИИ 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 | 🔴 Прорыв |
SharedState→ State; 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 → , ChatMessage → Message, RawChatAgent → RawAgent, ChatClientProtocol → SupportsChatGetResponse |
#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 (TName → NameT) |
#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_manager → with_manager, participant_factories → register_participant |
#3224 |
| 1.0.0b260128 | Notes | 🔴 Прорыв |
Github → GitHub |
#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_agent → as_agent |
#3249 |
| 1.0.0b260116 | Notes | 🔴 Прорыв |
source_executor_id → executor_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 | — | Никаких существенных изменений | — |