Partekatu honen bidez:


Guía de cambios significativos de Python 2026

En este documento se enumeran todos los cambios significativos en las versiones de Python desde el inicio de 2026, incluidos los cambios importantes y las mejoras importantes que pueden afectar al código. Cada cambio se marca como:

  • 🔴 Interrupción : requiere cambios de código para actualizar
  • 🟡 Mejora : nueva funcionalidad o mejora; El código existente sigue funcionando

Este documento realiza un seguimiento de los cambios significativos de Python en la transición de versión preliminar a 1.0.0 de 2026, por lo que debe consultarlo al actualizar entre versiones para asegurarse de que no se pierdan cambios importantes. Para obtener instrucciones de actualización detalladas sobre temas específicos (por ejemplo, migración de opciones), consulte las guías de actualización vinculadas o las solicitudes de incorporación de cambios vinculadas.


python-1.0.0

En esta sección se capturan los cambios significativos de Python que se han producido después python-1.0.0rc6, y que ahora forman parte de python-1.0.0.

🔴 Message(..., text=...) la construcción ahora se ha eliminado completamente

PR:#5062

La pull request #5062 completa la limpieza anterior del modelo de mensajes en Python eliminando las últimas rutas de código del framework que constituían objetos Message con text=....

  • Cree mensajes de texto como Message(role="user", contents=["Hello"]) en lugar de Message(role="user", text="Hello").
  • Esto se aplica en cualquier lugar en el que cree mensajes directamente, incluidas las solicitudes de flujo de trabajo, las respuestas de middleware personalizadas, los asistentes de orquestación y el código de migración.
  • Las cadenas sin formato dentro de contents=[...] son automáticamente normalizadas en contenido de texto, por lo que contents=["Hello"] sigue siendo la forma de solo texto más sencilla.

Before:

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

After:

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

🟡 Los paquetes de Python publicados ya no requieren --pre

PR:#5062

PR #5062 promueve los principales paquetes de Python a 1.0.0 y actualiza las guías de instalación para distinguir los paquetes liberados de aquellos que son versiones preliminares.

  • Ahora, agent-framework, agent-framework-core, agent-framework-openai y agent-framework-foundry son paquetes publicados y ya no requieren --pre.
  • Los conectores beta como agent-framework-ag-ui, , agent-framework-azurefunctionsagent-framework-copilotstudio, agent-framework-foundry-local, agent-framework-github-copilot, , agent-framework-mem0y agent-framework-ollama todavía requieren --pre.
  • Si un único comando de instalación incluye algún paquete beta, mantenga --pre en ese comando.

🔴 Foundry ahora posee los embeddings de Python y los ajustes del endpoint de los modelos

PR:#5056

Pr #5056 quita el paquete independiente agent-framework-azure-ai y mueve la superficie de inserción de Python a agent-framework-foundry y agent_framework.foundry.

  • Utiliza FoundryEmbeddingClient, FoundryEmbeddingOptions y FoundryEmbeddingSettings desde agent_framework.foundry.
  • Instale agent-framework-foundry para chats de Foundry, agentes administrados por servicios, proveedores de memoria e incrustaciones.
  • agent_framework.azure ya no exporta AzureAIInferenceEmbeddingClient, AzureAIInferenceEmbeddingOptions, AzureAIInferenceEmbeddingSettingso AzureAISettings.
  • Las incrustaciones de Foundry ahora usan FOUNDRY_MODELS_ENDPOINT, FOUNDRY_MODELS_API_KEY, FOUNDRY_EMBEDDING_MODEL, y opcional FOUNDRY_IMAGE_EMBEDDING_MODEL.
  • FoundryChatClient y FoundryAgent siguen usando la configuración del punto de conexión del proyecto, como FOUNDRY_PROJECT_ENDPOINT y 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"],
)

🔴 Los flujos de trabajo ahora enrutan los kwargs en tiempo de ejecución a través de cubos explícitos

PR:#5010

La PR #5010 actualiza Python workflow.run(...) para que los kwargs en tiempo de ejecución se pasen explícitamente como function_invocation_kwargs= y client_kwargs= en lugar de como argumentos genéricos reenviados **kwargs.

  • Se considera que un mapeo plano es global y se envía a cada ejecutor de agente correspondiente en el flujo de trabajo.
  • Si una o varias claves de nivel superior coinciden con identificadores de ejecutor, toda la asignación se considera un destino por ejecutor y cada ejecutor recibe solo su propia entrada.
  • Los identificadores de ejecutor de flujo de trabajo personalizados AgentExecutor(id="...") y otros explícitos son las claves que usted quiere alcanzar.
  • Las mismas reglas globales y específicas se aplican a function_invocation_kwargs y 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 ahora ejecuta proveedores de contexto en torno a cada invocación

PR:#5013

PR #5013 corrige una brecha de comportamiento de Python donde GitHubCopilotAgent aceptaba context_providers pero no las invocaba realmente.

  • before_run() ahora se ejecuta antes de enviar el prompt de Copilot.
  • Los mensajes e instrucciones añadidos por el proveedor se incluyen en la interfaz de línea de comandos que llega a Copilot CLI.
  • after_run() ahora se ejecuta una vez ensamblada la respuesta final, incluida la ruta de transmisión.

Si ya ha pasado context_providers a GitHubCopilotAgent, no se requiere ninguna migración; los hooks ahora se comportan de manera coherente con el resto de la superficie del agente de Python.


🟡 La salida estructurada ahora acepta mapeos de esquemas JSON además de modelos Pydantic

PR:#5022

La solicitud de extracción #5022 amplía el análisis de salida estructurada de Python, de modo que response_format puede ser un modelo Pydantic o un mapeo de esquema JSON.

  • Los modelos Pydantic se siguen analizando en instancias de modelo tipadas en response.value.
  • Las asignaciones de esquemas JSON ahora analizan los valores de Python compatibles con JSON en response.value (normalmente dict o list).
  • Las mismas reglas de análisis se aplican al recopilar la respuesta final de una secuencia.

Se trata de una mejora en lugar de un cambio importante, pero resulta útil saber si ya almacena esquemas como diccionarios similares a JSON.


python-1.0.0rc6

En esta sección se capturan los cambios significativos de Python que se incluyen o se rastrean para python-1.0.0rc6.

🔴 La selección de modelos está estandarizada en model

PR:#4999

PR #4999 completa la limpieza de la selección de modelos del lado de Python en constructores, opciones tipadas, valores predeterminados de agentes, objetos de respuesta y variables de entorno.

  • Utilice model en todas partes donde previamente usó model_id anteriormente.
  • Agent.default_options y por cada ejecución options={...} ahora esperan "model", no "model_id".
  • Los objetos de respuesta muestran response.model, no response.model_id.
  • La configuración de OpenAI ahora usa OPENAI_MODEL, OPENAI_CHAT_MODEL, OPENAI_CHAT_COMPLETION_MODELy OPENAI_EMBEDDING_MODEL.
  • La configuración de Azure OpenAI ahora usa AZURE_OPENAI_MODEL, AZURE_OPENAI_CHAT_MODEL, AZURE_OPENAI_CHAT_COMPLETION_MODELy AZURE_OPENAI_EMBEDDING_MODEL.
  • Anthropic ahora usa ANTHROPIC_CHAT_MODEL, y Foundry Local usa FOUNDRY_LOCAL_MODEL.
  • El paquete antropónico también agrega contenedores hospedados por el proveedor, como AnthropicFoundryClient, AnthropicBedrockClienty 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"},
)

🔴 Los proveedores de contexto pueden agregar middleware y conservar el historial por llamada al modelo

PR:#4992

La solicitud #4992 de incorporación de cambios actualiza la canalización del proveedor de contexto de Python y la forma en que se puede conservar el historial administrado por el framework durante las ejecuciones de varias llamadas.

  • ContextProvider y HistoryProvider ahora son las clases base canónicas de Python.
  • BaseContextProvider y BaseHistoryProvider permanecen temporalmente como alias en desuso para la compatibilidad, pero el nuevo código debe migrar a los nuevos nombres.
  • SessionContext ahora puede recopilar el middleware de función o de chat agregado por el proveedor a través de extend_middleware() y exponer la lista aplanada a través de get_middleware().
  • Agent(..., require_per_service_call_history_persistence=True) ejecuta proveedores de historial alrededor de cada llamada de modelo en lugar de una vez después de la completa run().
  • Este modo está diseñado para el historial local administrado por el marco y no se puede combinar con una conversación administrada por el servicio existente, como session.service_session_id o 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,
)

🔴 Se han quitado las superficies de compatibilidad de Azure/OpenAI en desuso

PR:#4990

La Pull Request (PR) #4990 completa la migración #4818 liderada por el proveedor quitando las interfaces de compatibilidad restantes de Python obsoletas que permanecieron disponibles durante las versiones preliminares anteriores.

  • agent_framework.azure ya no exporta AzureOpenAI* ni las superficies anteriores de agente/cliente/proveedor AzureAI*.
  • Los tipos de compatibilidad de los asistentes OpenAI de Python ya no forman parte de la superficie actual agent_framework.openai.
  • Use OpenAIChatClient, OpenAIChatCompletionClienty OpenAIEmbeddingClient para escenarios directos de OpenAI o Azure OpenAI.
  • Use FoundryChatClient para la inferencia del proyecto Foundry y FoundryAgent para Prompt Agents o HostedAgents.
  • El espacio de nombres actual agent_framework.azure ahora cubre las integraciones restantes de Azure, como Azure AI Search, el historial de Cosmos, Azure Functions y los flujos de trabajo duraderos. Chat de Foundry, agente, memoria y clientes de incrustación activos en agent_framework.foundry.

Si va a migrar código de Python anterior, use estos reemplazos:

  • AzureOpenAIResponsesClientOpenAIChatClient
  • AzureOpenAIChatClientOpenAIChatCompletionClient
  • AzureOpenAIEmbeddingClientOpenAIEmbeddingClient
  • AzureAIAgentClient / AzureAIClient / AzureAIProjectAgentProvider / AzureAIAgentsProvider FoundryChatClient→ o FoundryAgent, en función de si la aplicación posee la definición del agente
  • OpenAIAssistantsClient / OpenAIAssistantProvider OpenAIChatClient→ para el trabajo actual de OpenAI de Python o FoundryAgent si necesita un agente administrado por el servicio en Foundry

🔴 Diseño de cliente y división de paquetes líderes del proveedor

PR:#4818

PR #4818 reorganiza la interfaz del proveedor de Python basándose en paquetes y espacios de nombres específicos del proveedor.

  • Los clientes de OpenAI ahora residen dentro del paquete agent-framework-openai, mientras siguen importando desde el espacio de nombres agent_framework.openai.
  • Los clientes de Microsoft Foundry ahora se encuentran en el paquete agent-framework-foundry y el espacio de nombres agent_framework.foundry.
  • Foundry Local también se expone desde agent_framework.foundry como FoundryLocalClient.
  • OpenAIResponsesClient se renombra a OpenAIChatClient.
  • OpenAIChatClient se renombra a OpenAIChatCompletionClient.
  • La configuración de cliente se estandariza en model, reemplazando parámetros anteriores como model_id, deployment_namey model_deployment_name.
  • Para el nuevo código de Azure OpenAI, utilice los clientes agent_framework.openai. Los ajustes de compatibilidad anteriores AzureOpenAI* fueron eliminados posteriormente en #4990.
  • Para el nuevo código Foundry, use FoundryChatClient para la inferencia directa del proyecto, FoundryAgent para Prompt Agents y HostedAgents, y FoundryLocalClient para los entornos de ejecución locales.
  • AzureAIClient, AzureAIProjectAgentProvider, AzureAIAgentClient y la superficie de compatibilidad de los asistentes de Python se movieron a las rutas de compatibilidad en el transcurso de esta refactorización y se quitaron posteriormente en AzureAIAgentsProvider.
  • Se ha reorganizado la cobertura de muestra para que coincida con el nuevo diseño encabezado por el proveedor, incluidos los ejemplos de Foundry en samples/02-agents/providers/foundry/.

Mapeo de paquetes

Escenario Instalación Espacio de nombres principal
OpenAI y Azure OpenAI pip install agent-framework-openai agent_framework.openai
Puntos de conexión del proyecto de Microsoft Foundry, servicio del agente, memoria e incrustaciones pip install agent-framework-foundry agent_framework.foundry
Fundición Local 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")

Si anteriormente usaba Azure OpenAI directamente, asigne las clases dedicadas antiguas a las nuevas clases openAI líderes del proveedor:

  • AzureOpenAIResponsesClientOpenAIChatClient
  • AzureOpenAIChatClientOpenAIChatCompletionClient
  • AzureOpenAIEmbeddingClientOpenAIEmbeddingClient
  • AzureOpenAIAssistantsClient OpenAIChatClient→ para la migración de la API de respuestas directas o FoundryAgent si necesita un agente Foundry administrado por el servicio

El cambio de código se basa principalmente en un cambio de nombre de clase, junto con deployment_namemodel. Para la compatibilidad con Azure OpenAI, use entradas explícitas de Azure en los nuevos clientes OpenAI. credential= es ahora la superficie preferida de autenticación de Azure, mientras que un invocable api_key sigue siendo una ruta de compatibilidad:

Antes (AzureOpenAIResponsesClient):

from agent_framework.azure import AzureOpenAIResponsesClient

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

Después (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,
)

Antes (AzureOpenAIChatClient):

from agent_framework.azure import AzureOpenAIChatClient

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

Después (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,
)

Si quiere pasar de los puntos de conexión de Azure OpenAI a un punto de conexión de un proyecto de Microsoft Foundry, utilice en su lugar la superficie orientada a Foundry.

Antes (punto de conexión de Azure OpenAI):

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

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

Después (proyecto 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)

Para los entornos de ejecución locales de Microsoft Foundry, use el espacio de nombres Foundry más el conector local:

from agent_framework.foundry import FoundryLocalClient

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

Si omite model, establezca FOUNDRY_LOCAL_MODEL en su entorno.

Actualice también los nombres de entorno o configuración cuando corresponda:

  • Utiliza OPENAI_CHAT_MODEL para OpenAIChatClient, OPENAI_CHAT_COMPLETION_MODEL para OpenAIChatCompletionClient, con OPENAI_MODEL como reserva compartida.
  • Azure OpenAI ahora usa AZURE_OPENAI_CHAT_MODEL para OpenAIChatClient, AZURE_OPENAI_CHAT_COMPLETION_MODEL para OpenAIChatCompletionClient, y AZURE_OPENAI_MODEL como fallback compartido.
  • Use azure_endpoint para las direcciones URL de recursos de Azure OpenAI, u base_url si ya tiene una dirección URL completa .../openai/v1, y establezca api_version para la superficie de API de Azure OpenAI que usa.
  • Adopción de una configuración específica de Foundry, como FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODELFOUNDRY_AGENT_NAME, y FOUNDRY_AGENT_VERSION para clientes de Cloud Foundry
  • Uso ANTHROPIC_CHAT_MODEL para Anthropic y FOUNDRY_LOCAL_MODEL para Foundry Local

Este cambio se produjo primero durante el python-1.0.0rc6 ciclo.


🔴 Las dependencias principales ahora son intencionadamente reducidas

PR:#4904

La solicitud de extracción #4904 sigue la división del paquete del proveedor #4818 al reducir agent-framework-core y eliminar más dependencias transitivas del proveedor del paquete principal.

  • agent-framework-core ahora es deliberadamente mínimo.
  • Si importa agent_framework.openai, instale agent-framework-openai.
  • Si importa agent_framework.foundry, instale agent-framework-foundry para la inferencia del proyecto Foundry, los agentes administrados por el servicio, los proveedores de memoria y las inserciones. Se usa agent-framework-foundry-local --pre para entornos de ejecución locales.
  • Si usa herramientas de MCP, Agent.as_mcp_server(), u otras integraciones de MCP en una instalación mínima, instale mcp --pre manualmente. Para la compatibilidad con MCP de WebSocket, instale mcp[ws] --pre.
  • Si desea la amplia experiencia de "todo incluido", instale el metapaquete agent-framework.

Esto no vuelve a rediseñar la superficie del proveedor; cambia lo que se instala de forma predeterminada cuando solo se incorpora el núcleo.

Antes (las instalaciones de solo núcleo suelen incluir más funcionalidades de proveedor transitivamente):

pip install agent-framework-core

Después (instale el paquete de proveedor que realmente use):

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

or:

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

Si actualiza un proyecto existente que dependía anteriormente de las importaciones de núcleo más proveedor diferido, audite las importaciones y especifique claramente los paquetes de proveedor en su entorno o archivos de dependencia. Haga lo mismo para las dependencias de MCP si depende de las herramientas de MCP o el alojamiento del servidor MCP.


🔴 Los clientes genéricos de OpenAI ahora prefieren señales de enrutamiento explícitas

PR:#4925

El PR #4925 cambia cómo los clientes genéricos agent_framework.openai deciden entre OpenAI y Azure OpenAI.

  • Los clientes genéricos de OpenAI ya no cambian a Azure solo porque AZURE_OPENAI_* hay variables de entorno presentes.
  • Si OPENAI_API_KEY está configurado, los clientes genéricos permanecen en OpenAI a menos que pase una señal de enrutamiento explícita de Azure, como credential o azure_endpoint.
  • Si la configuración AZURE_OPENAI_* está presente, los clientes genéricos todavía pueden recurrir al enrutamiento basado en entornos de Azure.
  • El patrón preferido de Azure OpenAI ahora es pasar la configuración explícita de Azure más credential=AzureCliCredential() en OpenAIChatClient, OpenAIChatCompletionClient y el cliente de incrustación.
  • AzureOpenAI* Los envoltorios en desuso conservan su compatibilidad, por lo que el código existente basado en envoltorios no sigue las nuevas reglas de precedencia de cliente genérico.

Antes (OpenAIChatClient se podía enrutar a Azure porque las variables de entorno de Azure estaban presentes):

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")

Después (OpenAI genérico permanece en OpenAI; pase entradas explícitas de Azure para forzar el enrutamiento de 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(),
)

Si su entorno contiene tanto valores de OPENAI_* como de AZURE_OPENAI_*, audite cualquier construcción de cliente genérica agent_framework.openai y asegúrese de que la elección del proveedor sea explícita. Por este motivo, los ejemplos del proveedor de Azure se actualizaron para pasar las entradas de Azure directamente.

Las incrustaciones de Azure ahora siguen el mismo modelo de enrutamiento:

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(),
)

Para escenarios de inserción, mapee:

  • AzureOpenAIEmbeddingClientOpenAIEmbeddingClient
  • AZURE_OPENAI_EMBEDDING_MODELmodel
  • OPENAI_EMBEDDING_MODEL sigue siendo la variable de entorno de embeddings del lado de OpenAI

python-1.0.0rc5 / python-1.0.0b260319 (19 de marzo de 2026)

🔴 Canalización de cliente de chat reordenada: FunctionInvocation ahora encapsula ChatMiddleware

PR:#4746

El orden de canalización de ChatClient ha cambiado. FunctionInvocation es ahora la capa más externa y envuelve a ChatMiddleware, lo que significa que el middleware de chat se ejecuta por cada llamada de modelo (incluida cada iteración del bucle de llamada de herramienta) en lugar de hacerlo una vez durante toda la secuencia completa de invocación de funciones.

Orden de canalización anterior:

ChatMiddleware → FunctionInvocation → RawChatClient

Nuevo orden de canalización:

FunctionInvocation → ChatMiddleware → ChatTelemetry → RawChatClient

Si tiene middleware de chat personalizado que supone que se ejecutó solo una vez por invocación del agente (encapsulando todo el bucle de llamada de herramienta), actualícelo para que sea seguro para la ejecución repetida. El middleware de chat ahora se invoca para cada solicitud LLM individual, incluidas las solicitudes que envían los resultados de la herramienta al modelo.

Además, ChatTelemetry ahora es una capa independiente de ChatMiddleware en la canalización, que se ejecuta más cerca de RawChatClient.

🔴 El tiempo de ejecución público kwargs se divide en cubos explícitos

PR:#4581

El agente de Python público y las API de chat ya no tratan el reenvío público generalizado **kwargs como el principal mecanismo de datos en tiempo de ejecución. Los valores en tiempo de ejecución ahora se dividen por propósito:

  • Utilice function_invocation_kwargs para los valores que solo deben ver las herramientas o el middleware de funciones.
  • Se usa client_kwargs para kwargs de cliente y la configuración de middleware de nivel cliente.
  • Acceda a los datos de la herramienta o del entorno de ejecución a través de FunctionInvocationContext (ctx.kwargs y ctx.session).
  • Definir herramientas con un parámetro de contexto insertado en lugar de **kwargs; los parámetros de contexto insertados no se muestran en el esquema que ve el modelo.
  • Al delegar en un subagente como una herramienta, use agent.as_tool(propagate_session=True) si el agente secundario debe compartir la sesión del llamante.

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",
    },
)

Si implementa métodos run() o get_response() públicos personalizados, agregue function_invocation_kwargs y client_kwargs a esas firmas. En el caso de las herramientas, prefiera un parámetro anotado como FunctionInvocationContext — puede llamarse ctx, context o cualquier otro nombre anotado. Si proporciona un esquema o modelo de entrada explícito, también se reconoce un parámetro denominado ctx que es sin formato y sin anotar. El mismo objeto de contexto está disponible para el middleware de función, y es donde la función en tiempo de ejecución kwargs y el estado de sesión ahora están activos. Las definiciones de herramientas que todavía confían solo en **kwargs utilizan una ruta de compatibilidad heredada y se eliminarán.


python-1.0.0rc4 / python-1.0.0b260311 (11 de marzo de 2026)

Notas de la versión:python-1.0.0rc4

🔴 Las integraciones de Azure AI ahora tienen como objetivo azure-ai-projects GA 2.0

PR:#4536

Las integraciones de Azure AI de Python ahora asumen la superficie de disponibilidad general 2.0 azure-ai-projects .

  • El intervalo de dependencias admitido ahora es azure-ai-projects>=2.0.0,<3.0.
  • foundry_features la funcionalidad de "passthrough" se quitó de la creación del agente de Azure AI.
  • El comportamiento de la versión preliminar ahora usa allow_preview=True en los clientes y proveedores admitidos.
  • Se quitaron las correcciones de compatibilidad beta/GA mixtas, por lo que se actualizaron los nombres de importaciones y tipos a la superficie del SDK de disponibilidad general 2.0.

🔴 Los controladores de herramientas de Copilot de GitHub ahora usan ToolInvocation / ToolResult y Python 3.11+

PR:#4551

agent-framework-github-copilot ahora realiza un seguimiento de github-copilot-sdk>=0.1.32.

  • Los controladores de herramientas reciben un ToolInvocation dataclass en lugar de un dict sin procesar.
  • Devuelve ToolResult mediante campos de snake_case como result_type y text_result_for_llm.
  • El agent-framework-github-copilot paquete ahora requiere Python 3.11 y versiones posteriores.

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 de marzo de 2026)

Notas de la versión:python-1.0.0rc3

🔴 Proveedor de habilidades finalizado en base a código definido Skill / SkillResource

PR:#4387

Las aptitudes del agente de Python ahora admiten objetos Skill y SkillResource definidos por código junto con las aptitudes basadas en archivos, y la superficie del proveedor público está estandarizada en SkillsProvider.

  • Si sigue importando la versión preliminar o interna FileAgentSkillsProvideranterior, cambie a SkillsProvider.
  • La búsqueda de recursos basada en archivos ya no depende de referencias entre comillas inversas en SKILL.md; los recursos se detectan desde el directorio de habilidades.

Si tenía código interno o de vista previa que importaba FileAgentSkillsProvider, cambie a la interfaz pública actual.

from agent_framework import Skill, SkillResource, SkillsProvider

python-1.0.0rc2 / python-1.0.0b260226 (26 de febrero de 2026)

Notas de la versión:python-1.0.0rc2

🔴Los flujos de trabajo declarativos reemplazan InvokeTool con InvokeFunctionTool

PR:#3716

Los flujos de trabajo declarativos de Python ya no usan el tipo de acción anterior InvokeTool . Reemplácelo por InvokeFunctionTool y registre los invocables de Python por 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 de febrero de 2026)

Lanzamiento:agent-framework-core y agent-framework-azure-ai se promueven a 1.0.0rc1. Todos los demás paquetes actualizados a 1.0.0b260219.

🔴 Control unificado de credenciales de Azure en todos los paquetes

PR:#4088

Los parámetros ad_token, ad_token_provider y get_entra_auth_token y los helpers se han reemplazado por un parámetro unificado credential en todos los paquetes de Python relacionados con Azure. El nuevo enfoque usa azure.identity.get_bearer_token_provider para el almacenamiento en caché y la actualización automáticas de tokens.

Clases afectadas:AzureOpenAIChatClient, , AzureOpenAIResponsesClient, AzureOpenAIAssistantsClientAzureAIClient, AzureAIAgentClientAzureAIProjectAgentProviderAzureAIAgentsProviderAzureAISearchContextProvider, , PurviewClient, , PurviewPolicyMiddleware, . PurviewChatPolicyMiddleware

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(),
    ...
)

El credential parámetro acepta TokenCredential, AsyncTokenCredentialo un proveedor de tokens invocable. El almacenamiento en caché de tokens y la actualización se controlan automáticamente.


🔴 Jerarquía de excepciones de Python rediseñada

PR:#4082

La familia plana ServiceException se ha reemplazado por ramas de excepciones con ámbito de dominio en una sola AgentFrameworkException raíz. Esto proporciona a los autores de llamadas destinos precisos except y semántica clara de errores.

Nueva jerarquía:

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

Se quitaron excepciones:ServiceException, , ServiceInitializationError, ServiceResponseExceptionServiceContentFilterException, ServiceInvalidAuthErrorServiceInvalidExecutionSettingsErrorServiceInvalidRequestErrorServiceInvalidResponseErrorAgentExecutionExceptionAgentInvocationErrorAgentInitializationErrorAgentSessionException, , ChatClientInitializationErrorCheckpointDecodingError, .

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
    ...

Nota:

Los errores de validación de inicialización ahora usan excepciones integradas en ValueError/TypeError lugar de excepciones personalizadas. Las excepciones de Agent Framework están reservadas para errores de nivel de dominio.


🔴 Estado del proveedor limitado por source_id

PR:#3995

Los hooks de proveedor ahora reciben un diccionario de estado con ámbito delimitado al proveedor state.setdefault(provider.source_id, {}) en lugar del estado de sesión completo. Esto significa que las implementaciones del proveedor que anteriormente accedían al estado anidado a través de state[self.source_id]["key"] deben ahora acceder state["key"] directamente.

Además, InMemoryHistoryProvider el valor predeterminado source_id ha cambiado de "memory" a "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")

🔴 Alineación de escritura de mensajes de chat/agente (run frente al get_response)

PR:#3920

Las implementaciones de cliente get_response de chat ahora reciben Sequence[Message]de forma coherente . agent.run(...) sigue siendo flexible (str, Content, Messageo secuencias de esas) y normaliza las entradas antes de llamar a los clientes de chat.

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] configuración genérica quitada para el paso a través del esquema

PR:#3907

Las rutas de acceso de herramientas basadas en esquemas ya no se basan en el comportamiento genérico anterior FunctionTool[Any] . Use FunctionTool directamente y proporcione un modelo base pydantic o esquemas explícitos cuando sea necesario (por ejemplo, con @tool(schema=...)).

Before:

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

After:

placeholder: FunctionTool = FunctionTool(...)

🔴 Configuración de Pydantic reemplazada por TypedDict + load_settings()

PRs:#3843, #4032

La pydantic-settingsclase basada en AFBaseSettings se ha reemplazado por un sistema de configuración ligero basado en funciones mediante TypedDict y load_settings(). La pydantic-settings dependencia se quitó por completo.

Todas las clases de configuración (por ejemplo, OpenAISettings, , AzureOpenAISettingsAnthropicSettings) ahora TypedDict son definiciones y se accede a los valores de configuración a través de la sintaxis del diccionario en lugar del acceso a atributos.

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"]

Importante

Agent Framework no carga automáticamente valores de .env archivos. Debe optar explícitamente por la carga de .env mediante alguna de las siguientes maneras:

  • Llamar load_dotenv() desde el paquete python-dotenv al inicio de tu aplicación
  • Pasar env_file_path=".env" a load_settings()
  • Configurar variables de entorno directamente en tu Shell o IDE

load_settings El orden de resolución es: anulaciones explícitas → valores de .env archivo (cuando se proporciona env_file_path) → variables de entorno → valores predeterminados. Si especifica env_file_path, el archivo debe existir o se generará un FileNotFoundError.


🟡 Corrección de la transferencia y serialización del historial del flujo de trabajo del modelo de razonamiento

PR:#4083

Corrige varios errores al usar modelos de razonamiento (por ejemplo, gpt-5-mini, gpt-5.2) en flujos de trabajo de varios agentes. Los elementos de razonamiento de la API de respuestas ahora se serializan correctamente y solo se incluyen en el historial cuando function_call también está presente, lo que impide errores de API. El contenido de razonamiento cifrado/oculto ahora se emite correctamente y se corrige el formato del campo summary. También service_session_id se borra en la transferencia para evitar la filtración de estado entre agentes.


🟡 Se ha añadido Bedrock a core[all] y se han corregido los valores predeterminados de elección de herramientas.

PR:#3953

Amazon Bedrock ahora está incluido en los agent-framework-core[all] extras y está disponible a través de la agent_framework.amazon interfaz de importación diferida. El comportamiento de elección de herramientas también se ha corregido: los valores de opción de herramienta no establecidos ahora permanecen sin establecer para que los proveedores usen sus valores predeterminados de servicio, mientras que se conservan los valores establecidos explícitamente.

from agent_framework.amazon import BedrockClient

🟡 AzureAIClient advirtió sobre modificaciones no compatibles del tiempo de ejecución

PR:#3919

En el momento de este cambio, AzureAIClient registró una advertencia cuando el tiempo de ejecución tools o structured_output difiere de la configuración en tiempo de creación del agente. Esa superficie de Python se ha quitado desde entonces. Para el código de Python actual, use FoundryChatClient cuando necesite una configuración de herramienta/en tiempo de ejecución propiedad de la aplicación, o OpenAIChatClient para escenarios directos de la API de respuestas que necesitan sobrescrituras dinámicas.


🟡 workflow.as_agent() ahora usa por defecto el historial local cuando los proveedores no están configurados

PR:#3918

Cuando workflow.as_agent() se crea sin context_providers, ahora agrega InMemoryHistoryProvider("memory") de forma predeterminada. Si se proporcionan explícitamente proveedores de contexto, esa lista se conserva sin cambios.

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

🟡 Contexto de trazabilidad de OpenTelemetry propagado a solicitudes MCP

PR:#3780

Cuando se instala OpenTelemetry, el contexto de seguimiento (por ejemplo, W3C traceparent) se inserta automáticamente en las solicitudes MCP a través de params._meta. Esto permite el rastreo distribuido de extremo a extremo en las llamadas de agente a servidores MCP. No se necesitan cambios de código: se trata de un comportamiento aditivo que se activa cuando existe un contexto de intervalo válido.


🟡 Compatibilidad con flujos de trabajo duraderos para Azure Functions

PR:#3630

El agent-framework-azurefunctions paquete ahora admite la ejecución Workflow de gráficos en Azure Durable Functions. Pase un workflow parámetro a AgentFunctionApp para automatizar el registro de entidades de agente, funciones de actividad y puntos de conexión 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

Admite patrones fan-out/fan-in, shared state y human-in-the-loop con tiempo de espera configurable y rechazo automático al expirar.


python-1.0.0b260212 (12 de febrero de 2026)

Notas de la versión:python-1.0.0b260212

🔴 Hosted*Toolclases reemplazadas por métodos de cliente get_*_tool()

PR:#3634

Las clases de herramientas hospedadas se quitaron en favor de los métodos de fábrica con ámbito de cliente. Esto hace que la disponibilidad de las herramientas sea explícita por el proveedor.

Clase quitada 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()]

🔴 Canalización del proveedor de sesión o contexto finalizada (AgentSession, context_providers)

PR:#3850

Se completó la migración de la sesión de Python y del proveedor de contexto. AgentThread y se quitaron los tipos de proveedor de contexto antiguos.

  • 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= los patrones se reemplazan por 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)

🔴 Modelo de punto de comprobación y comportamiento de almacenamiento refactorizado

PR:#3744

Se rediseñaron los elementos internos de los puntos de control, lo que afecta a la compatibilidad de los puntos de comprobación persistentes y a las implementaciones de almacenamiento personalizadas:

  • WorkflowCheckpoint ahora almacena objetos activos (la serialización se produce en el almacenamiento de puntos de control)
  • FileCheckpointStorage ahora usa la serialización pickle
  • workflow_id se quitó y previous_checkpoint_id se agregó
  • Se eliminaron los hooks de punto de control obsoletos

Si persisten los puntos de control entre versiones, vuelva a generar o migre los artefactos de puntos de control existentes antes de reanudar los procesos de trabajo.


🟡 Puntos de conexión del proyecto surgieron por primera vez a través de AzureOpenAIResponsesClient

PR:#3814

Esta funcionalidad de versión preliminar originalmente permitía AzureOpenAIResponsesClient conectarse a los puntos de conexión del proyecto Foundry. La guía actual de Python usa FoundryChatClient para la inferencia del proyecto Foundry o FoundryAgent para los agentes Foundry administrados por el servicio en lugar de la eliminada 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(),
)

🔴 El middleware call_next ya no acepta context

PR:#3829

La continuación del middleware ahora no toma ningún argumento. Si el middleware sigue llamando a call_next(context), actualízalo a 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 de febrero de 2026)

Notas de la versión:python-1.0.0b260210

🔴 Métodos de factoría de flujo de trabajo quitados de WorkflowBuilder

PR:#3781

register_executor() y register_agent() se han quitado de WorkflowBuilder. Todos los métodos del generador (add_edge, add_fan_out_edges, add_fan_in_edges, add_chain, add_switch_case_edge_group, add_multi_selection_edge_group) y start_executor ya no aceptan nombres de cadena, requieren instancias de ejecutor o agente directamente.

Para el aislamiento de estado, envuelva la instanciación del ejecutor/agente y la construcción de flujos de trabajo dentro de un método auxiliar para que cada llamada genere instancias nuevas.

WorkflowBuilder con ejecutores

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 con agentes

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()

Aislamiento de estado con métodos auxiliares

En el caso de los flujos de trabajo que necesitan un estado aislado por invocación, encapsula la construcción en un método auxiliar:

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 renombrado a Agent, ChatMessage renombrado a Message

PR:#3747

Los tipos principales de Python se han simplificado quitando el prefijo redundante Chat . No se proporcionan alias de compatibilidad con versiones anteriores.

Antes Después
ChatAgent Agent
RawChatAgent RawAgent
ChatMessage Message
ChatClientProtocol SupportsChatGetResponse

Actualizar importaciones

Before:

from agent_framework import ChatAgent, ChatMessage

After:

from agent_framework import Agent, Message

Actualizar referencias de tipo

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")])

Nota:

ChatClient, ChatResponse, ChatOptions y ChatMessageStoreno se les cambia el nombre con este cambio.


🔴 Actualizaciones en la revisión de tipos de API en todos los modelos de respuesta/mensaje

PR:#3647

Esta versión incluye una limpieza amplia e importante de las API auxiliares y de escritura de mensajes o respuestas.

  • Role y FinishReason son ahora NewType contenedores sobre str con RoleLiteral/FinishReasonLiteral para los valores conocidos. Tratarlos como cadenas (sin .value uso).
  • Message la construcción se estandariza en Message(role, contents=[...]); las cadenas en contents se convierten automáticamente en contenido en texto.
  • ChatResponse y AgentResponse constructores ahora se centran en messages= (una sola Message o secuencia); se eliminó el uso del constructor heredado text= de las respuestas.
  • ChatResponseUpdate y AgentResponseUpdate ya no aceptan text=; use contents=[Content.from_text(...)].
  • Se simplificaron los nombres de auxiliares de combinación de actualizaciones.
  • try_parse_value se quitó de ChatResponse y AgentResponse.

Cambio de nombre del método auxiliar

Antes Después
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(...)

Actualización de la construcción de la respuesta

Before:

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

After:

from agent_framework import AgentResponseUpdate, Content

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

Reemplazar try_parse_value por try/except en .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}")

🔴 Modelo run/get_response unificado y ResponseStream uso

PR:#3379

Las APIs de Python se consolidaron en torno a agent.run(...) y client.get_response(...), con el streaming representado por 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)

🔴 Cambio de nombre del tipo de protocolo o contexto principal

PRs:#3714, #3717

Antes Después
AgentRunContext AgentContext
AgentProtocol SupportsAgentRun

Actualice las importaciones y escriba las anotaciones en consecuencia.


🔴 Se ha cambiado el nombre del parámetro de continuación de middleware a call_next

PR:#3735

Las firmas de middleware ahora deben usarse call_next en lugar de 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)

🔴 Nombres typeVar estandarizados (TNameNameT)

PR:#3770

El código base ahora sigue un estilo de nomenclatura TypeVar coherente donde se usa el sufijo T .

Before:

TMessage = TypeVar("TMessage")

After:

MessageT = TypeVar("MessageT")

Si mantiene contenedores personalizados en torno a los genéricos del framework, alinee los nombres de TypeVar locales con la nueva convención para evitar cambios innecesarios en las anotaciones.


🔴 Cambios en la salida y en el streaming del flujo de trabajo como agente

PR:#3649

workflow.as_agent() se actualizó el comportamiento para alinear la salida y el streaming con los patrones de respuesta del agente estándar. Revise a los consumidores de flujo de trabajo como agente que dependen del manejo de salida/actualización heredados y actualícelos al flujo actual AgentResponse/AgentResponseUpdate.


🔴 Los métodos de Fluent Builder se mueven a parámetros de constructor

PR:#3693

Los métodos fluidos de configuración única en los 6 generadores (WorkflowBuilder, SequentialBuilder, ConcurrentBuilder, GroupChatBuilder, MagenticBuilder, HandoffBuilder) se han migrado a parámetros de constructor. Los métodos fluentes que eran la única ruta de configuración de un parámetro se eliminan en favor de los argumentos del constructor.

WorkflowBuilder

set_start_executor(), with_checkpointing(), y with_output_from() se eliminan. En su lugar, use parámetros de constructor.

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() y with_intermediate_outputs() se quitan. En su lugar, use parámetros de constructor.

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

Se quitan participants(), register_participants(), with_orchestrator(), with_termination_condition(), with_max_rounds(), with_checkpointing() y with_intermediate_outputs(). En su lugar, use parámetros de constructor.

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() y with_intermediate_outputs() se quitan. En su lugar, use parámetros de constructor.

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() y with_termination_condition() se quitan. En su lugar, use parámetros de constructor.

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()
)

Cambios de validación

  • WorkflowBuilder ahora requiere start_executor como argumento de constructor (previamente establecido a través del método fluent)
  • SequentialBuilder, ConcurrentBuilder, GroupChatBuilder, y MagenticBuilder ahora requieren participants o participant_factories en tiempo de construcción — no pasar ninguno genera un ValueError

Nota:

HandoffBuilder ya se aceptó participants/participant_factories como parámetros de constructor y no se cambió en este sentido.


🔴 Eventos de flujo de trabajo integrados en un único WorkflowEvent con type discriminador

PR:#3690

Todas las subclases de eventos de flujo de trabajo individuales se han reemplazado por una sola clase genérica WorkflowEvent[DataT] . En lugar de utilizar isinstance() verificaciones para identificar los tipos de eventos, ahora se utiliza la event.type cadena literal (por ejemplo, "output", "request_info", "status"). Esto sigue el mismo patrón que la consolidación de clases Content de python-1.0.0b260123.

Clases de eventos quitadas

Las subclases de eventos exportadas siguientes ya no existen:

Clase anterior Nuevo event.type valor
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"

Actualizar importaciones

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

Actualizar comprobaciones de tipo de evento

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}")

Streaming con 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}")

Anotaciones de tipo

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

Nota:

WorkflowEvent es genérico (WorkflowEvent[DataT]), pero para colecciones de eventos mixtos, use WorkflowEvent[Any] o unparameterized WorkflowEvent.


🔴 workflow.send_responses* quitado; usar workflow.run(responses=...)

PR:#3720

send_responses() y send_responses_streaming() se quitaron de Workflow. Continúe con los flujos de trabajo en pausa pasando las respuestas directamente a 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 cambia el nombre a State; las API de estado de flujo de trabajo son sincrónicas.

PR:#3667

Las API de estado ya no requieren awaity la nomenclatura se normalizó:

Antes Después
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

🔴 Los generadores de orquestaciones se han movido a agent_framework.orchestrations

PR:#3685

Los generadores de orquestaciones ahora están en un espacio de nombres de paquete dedicado.

Before:

from agent_framework import SequentialBuilder, GroupChatBuilder

After:

from agent_framework.orchestrations import SequentialBuilder, GroupChatBuilder

🟡 Respuestas en segundo plano de ejecución prolongada y tokens de continuación

PR:#3808

Ahora se admiten respuestas de fondo para ejecuciones de agentes de Python a través de options={"background": True} y 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})

🟡 Tipos de vista previa del proveedor de sesión o contexto agregados en paralelo

PR:#3763

Los nuevos tipos de canalización de sesión y contexto se han introducido junto con las API heredadas para la migración incremental, incluidas SessionContext y BaseContextProvider.


🟡 El streaming del intérprete de código ahora incluye deltas de código incrementales

PR:#3775

El intérprete de código en streaming ahora muestra las actualizaciones de código delta en el contenido transmitido para que las UIs puedan representar progresivamente el código generado.


🟡 @tool admite el control explícito de esquemas.

PR:#3734

Las definiciones de herramientas ahora pueden usar el control explícito del esquema cuando la salida de esquema inferida necesita personalización.


python-1.0.0b260130 (30 de enero de 2026)

Notas de la versión:python-1.0.0b260130

🟡 ChatOptions y ChatResponse/AgentResponse ahora son genéricos con respecto al formato de respuesta

PR:#3305

ChatOptions, ChatResponsey AgentResponse ahora son tipos genéricos parametrizados por el tipo de formato de respuesta. Esto permite una mejor inferencia de tipos cuando se usan salidas estructuradas con 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!)

Sugerencia

Se trata de una mejora no importante. El código existente sin parámetros de tipo sigue funcionando. No es necesario especificar los tipos del fragmento de código anterior para las opciones y la respuesta; se muestran aquí para mayor claridad.


🟡 BaseAgent compatibilidad agregada para el SDK del agente de Claude

PR:#3509

El SDK de Python ahora incluye una BaseAgent implementación para el SDK del agente de Claude, lo que permite el uso basado en adaptadores de primera clase en Agent Framework.


python-1.0.0b260128 (28 de enero de 2026)

Notas de la versión:python-1.0.0b260128

🔴 AIFunction se ha cambiado el nombre a FunctionTool y @ai_function se ha cambiado a @tool

PR:#3413

Se ha cambiado el nombre de la clase y el decorador para mayor claridad y coherencia con la terminología del sector.

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)

🔴 Patrón de fábrica agregado a GroupChat y Magentic; Cambio de nombre de la API

PR:#3224

Se ha agregado el generador de participantes y el generador de orquestadores al chat grupal. También incluye el cambio de nombre:

  • 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 se ha cambiado el nombre a GitHub

PR:#3486

Nombres de clase y paquete actualizados para usar mayúsculas y minúsculas correctas.

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 de enero de 2026)

Notas de la versión:python-1.0.0b260127

🟡 BaseAgent Compatibilidad agregada para el SDK de Copilot de GitHub

PR:#3404

El SDK de Python ahora incluye una BaseAgent implementación para las integraciones del SDK de Copilot de GitHub.


python-1.0.0b260123 (23 de enero de 2026)

Notas de la versión:python-1.0.0b260123

🔴 Tipos de contenido simplificados para una sola clase con constructores de clasemethod

PR:#3252

Sustituyó todos los tipos de contenido antiguos (derivados de BaseContent) por una única clase Content con métodos de clase para crear tipos específicos.

Referencia de migración completa

Tipo anterior Nuevo método
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(...)

Métodos nuevos adicionales (sin predecesor directo):

  • Content.from_text_reasoning(...) — Para contenido de razonamiento y pensamiento
  • Content.from_hosted_vector_store(...) — Para referencias de almacén vectorial
  • Content.from_usage(...) — Para obtener información sobre el uso o el token
  • Content.from_mcp_server_tool_call(...) / Content.from_mcp_server_tool_result(...) — Para herramientas de servidor MCP
  • Content.from_code_interpreter_tool_call(...) / Content.from_code_interpreter_tool_result(...) — Para el intérprete de código
  • Content.from_image_generation_tool_call(...) / Content.from_image_generation_tool_result(...) — Para la generación de imágenes

Comprobación de tipos

En lugar de isinstance() comprobaciones, use la type propiedad :

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)

Ejemplo básico

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")

🔴 Tipos de anotación simplificados a Annotation y TextSpanRegion TypedDicts

PR:#3252

Se han reemplazado los tipos de anotación basados en clases por definiciones más TypedDict sencillas.

Tipo anterior Nuevo tipo
CitationAnnotation (clase) Annotation (TypedDict con type="citation")
BaseAnnotation (clase) Annotation (TypedDict)
TextSpanRegion (clase con SerializationMixin) TextSpanRegion (TypedDict)
Annotations (alias de tipo) Annotation
AnnotatedRegions (alias de tipo) 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"
}

Nota:

Dado que Annotation y TextSpanRegion ahora son TypedDict, los crea como diccionarios en lugar de instancias de clase.


🔴 response_format errores de validación ahora visibles para los usuarios

PR:#3274

ChatResponse.value y AgentResponse.value ahora generan ValidationError cuando se produce un error en la validación del esquema, en lugar de devolver None de forma silenciosa.

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)

🔴 Lógica de ejecución de AG-UI simplificada; Correcciones en el cliente MCP y Anthropic

PR:#3322

Se ha simplificado la run firma y el comportamiento del método en 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
)

🟡 El cliente antrópico ahora admite response_format salidas estructuradas

PR:#3301

Ahora puede usar el análisis de salida estructurada con clientes de Anthropic a través de response_format, de forma similar a OpenAI y los clientes de Azure.


🟡 Configuración de Azure AI expandida (reasoning, rai_config)

PRs:#3403, #3265

Se amplió el soporte de Azure AI con soporte para la configuración de razonamiento y rai_config durante la creación del agente.


python-1.0.0b260116 (16 de enero de 2026)

Notas de la versión:python-1.0.0b260116

🔴 create_agent se ha cambiado el nombre a as_agent

PR:#3249

Se ha cambiado el nombre del método para mayor claridad en su propósito.

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 se ha cambiado el nombre a executor_id

PR:#3166

Se ha cambiado el nombre de la propiedad para la coherencia de la 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 admite la continuidad de sesión administrada por el servicio

PR:#3136

AG-UI ahora mantiene la identidad de la conversación gestionada por el servicio (por ejemplo, sesiones o subprocesos gestionados por Foundry) para preservar la continuidad multiturno.


python-1.0.0b260114 (14 de enero de 2026)

Notas de la versión:python-1.0.0b260114

🔴 Orquestaciones refactorizadas

PR:#3023

Amplia refactorización y simplificación de las orquestaciones en los flujos de trabajo del Agent Framework:

  • Chat en grupo: divida el ejecutor del orquestador en un agente dedicado y basado en funciones (BaseGroupChatOrchestrator, GroupChatOrchestrator, AgentBasedGroupChatOrchestrator). Simplificada a una topología de estrella con un modelo de difusión.
  • Handoff: Se ha eliminado la compatibilidad con single-tier, el coordinador y el ejecutor personalizado. Se ha movido al modelo de transmisión con HandoffAgentExecutor.
  • Secuencial y concurrente: mecanismo simplificado de información de solicitud para confiar en subflujos de trabajo a través de AgentApprovalExecutor y 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]
)

🔴 Opciones introducidas como TypedDict y Generic

PR:#3140

Las opciones ahora se tipifican usando TypedDict para mejorar la seguridad de tipos y la auto-compleción en el IDE.

📖 Para obtener instrucciones de migración completas, consulte la Guía de Opciones Tipadas.

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 quitado; context_provider a forma singular; middleware debe ser una lista

PR:#3139

  • display_name parámetro eliminado de los agentes
  • context_providers (plural, lista de aceptación) cambiado a context_provider (singular, solo 1 permitido)
  • middleware ahora requiere una lista (ya no acepta una sola instancia)
  • AggregateContextProvider quitado del código (use la implementación de ejemplo si es necesario)

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* se ha cambiado el nombre a AgentResponse*

PR:#3207

AgentRunResponse y AgentRunResponseUpdate se cambiaron el nombre a AgentResponse y AgentResponseUpdate.

Before:

from agent_framework import AgentRunResponse, AgentRunResponseUpdate

After:

from agent_framework import AgentResponse, AgentResponseUpdate

🟡 Se añadió tiempo de ejecución de flujo de trabajo declarativo para flujos de trabajo definidos en YAML.

PR:#2815

Se ha agregado un entorno de ejecución basado en grafos para ejecutar flujos de trabajo YAML declarativos, lo que permite la orquestación multiagente sin código en tiempo de ejecución personalizado.


🟡 Mejoras de carga y confiabilidad de MCP

PR:#3154

Las integraciones de MCP obtuvieron un comportamiento mejorado ante la pérdida de conexión, compatibilidad con la paginación en la carga y opciones para controlar la representación.


🟡 Foundry A2ATool ahora admite conexiones sin una dirección URL de destino

PR:#3127

A2ATool ahora puede resolver las conexiones A2A respaldadas por Foundry a través de metadatos de conexión del proyecto incluso cuando no está configurada una dirección URL de destino directa.


python-1.0.0b260107 (7 de enero de 2026)

Notas de la versión:python-1.0.0b260107

No hay cambios significativos en esta versión.


python-1.0.0b260106 (6 de enero de 2026)

Notas de la versión:python-1.0.0b260106

No hay cambios significativos en esta versión.


Tabla de resumen

Lanzamiento Notas de lanzamiento Tipo Cambio PR
1.0.0 Solo solicitud de incorporación de cambios 🔴 Interrupción Message(..., text=...) Se ha eliminado por completo la construcción; cree mensajes de texto con contents=[...] en su lugar #5062
1.0.0 Solo solicitud de incorporación de cambios 🟡 Mejora Los paquetes de Python publicados (agent-framework, agent-framework-core, agent-framework-openai, agent-framework-foundry) ya no requieren --pre; los conectores beta todavía sí lo requieren. #5062
1.0.0 Solo solicitud de incorporación de cambios 🔴 Interrupción Las inserciones de Python se han movido a agent_framework.foundry; use agent-framework-foundry, FoundryEmbeddingClient, y FOUNDRY_MODELS_* configuraciones en lugar del paquete quitado agent-framework-azure-ai. #5056
1.0.0 Solo solicitud de incorporación de cambios 🔴 Interrupción workflow.run() ahora usa explícitamente function_invocation_kwargs / client_kwargs, con destino global o por ejecutador determinado por los identificadores de ejecutador #5010
1.0.0 Solo solicitud de incorporación de cambios 🟡 Mejora GitHubCopilotAgent ahora invoca hooks de proveedor de contexto before_run / after_run e incluye el contexto de aviso agregado por el proveedor. #5013
1.0.0 Solo solicitud de incorporación de cambios 🟡 Mejora La salida estructurada de Python ahora acepta asignaciones de esquema JSON como response_format, con JSON analizado mostrado en response.value. #5022
1.0.0rc6 Solo solicitud de incorporación de cambios 🔴 Interrupción Se eliminaron las interfaces de compatibilidad obsoletas de Azure/OpenAI; use los clientes de OpenAI líderes del proveedor o los clientes de Python de Foundry en su lugar. #4990
1.0.0rc6 Solo solicitud de incorporación de cambios 🔴 Interrupción Refactorización líder del proveedor: dividir agent-framework-openai, agent-framework-foundry, y agent-framework-foundry-local; cambiar el nombre de los clientes de OpenAI; mover Foundry a agent_framework.foundry; declarar obsoletas las rutas de compatibilidad de Azure AI y Assistants. #4818
1.0.0rc6 Solo solicitud de incorporación de cambios 🔴 Interrupción agent-framework-core ahora es intencionadamente delgado; instale paquetes de proveedor explícitos, como agent-framework-openai o agent-framework-foundry, e instale mcp manualmente herramientas de MCP en instalaciones mínimas o use el agent-framework metapaquete para obtener una experiencia predeterminada más amplia. #4904
1.0.0rc6 Solo solicitud de incorporación de cambios 🔴 Interrupción Ahora, los clientes genéricos agent_framework.openai prefieren señales de enrutamiento explícitas; OpenAI permanece en OpenAI cuando OPENAI_API_KEY se establece y los escenarios de Azure deben pasar entradas explícitas de enrutamiento de Azure como credential o azure_endpointy, a continuación, configurar api_version #4925
1.0.0rc5 / 1.0.0b260318 N/A (programado) 🔴 Interrupción El entorno de ejecución público de kwargs se divide en function_invocation_kwargs y client_kwargs; las herramientas ahora utilizan FunctionInvocationContext / ctx.session #4581
1.0.0rc4 / 1.0.0b260311 Notas 🔴 Interrupción Las integraciones de Azure AI ahora tienen como objetivo azure-ai-projects 2.0 GA; foundry_features se quitó y allow_preview es la versión preliminar de participación voluntaria. #4536
1.0.0rc4 / 1.0.0b260311 Notas 🔴 Interrupción La integración de GitHub Copilot ahora usa ToolInvocation / ToolResult; agent-framework-github-copilot requiere Python 3.11+ #4551
1.0.0rc3 / 1.0.0b260304 Notas 🔴 Interrupción El proveedor de habilidades agrega código definido por Skill / SkillResource; se deben actualizar las importaciones anteriores FileAgentSkillsProvider y las referencias de recursos de comilla inversa. #4387
1.0.0rc2 / 1.0.0b260226 Notas 🔴 Interrupción Los flujos de trabajo declarativos reemplazan InvokeTool por InvokeFunctionTool y WorkflowFactory.register_tool() #3716
1.0.0rc1 / 1.0.0b260219 Notas 🔴 Interrupción Control unificado de credenciales de Azure en paquetes de Azure #4088
1.0.0rc1 / 1.0.0b260219 Notas 🔴 Interrupción Jerarquía de excepciones de Python rediseñada en AgentFrameworkException #4082
1.0.0rc1 / 1.0.0b260219 Notas 🔴 Interrupción El estado del proveedor ahora está en el ámbito de source_id #3995
1.0.0rc1 / 1.0.0b260219 Notas 🔴 Interrupción Las implementaciones personalizadas get_response() deben aceptar Sequence[Message] #3920
1.0.0rc1 / 1.0.0b260219 Notas 🔴 Interrupción FunctionTool[Any] se ha eliminado la interfaz de paso directo de esquema #3907
1.0.0rc1 / 1.0.0b260219 Notas 🔴 Interrupción Configuraciones movidas de AFBaseSettings / pydantic-settings a TypedDict + load_settings() #3843, #4032
1.0.0rc1 / 1.0.0b260219 Notas 🟡 Mejora Arreglo de transferencia del flujo de trabajo del modelo de razonamiento y serialización del historial #4083
1.0.0rc1 / 1.0.0b260219 Notas 🟡 Mejora Bedrock agregado a core[all]; valores predeterminados de elección de herramienta corregidos #3953
1.0.0rc1 / 1.0.0b260219 Notas 🟡 Mejora AzureAIClient advierte sobre sobrescrituras en tiempo de ejecución no compatibles #3919
1.0.0rc1 / 1.0.0b260219 Notas 🟡 Mejora workflow.as_agent() inserta el historial local cuando los proveedores no están configurados #3918
1.0.0rc1 / 1.0.0b260219 Notas 🟡 Mejora El contexto de seguimiento de OpenTelemetry se propaga a las solicitudes MCP. #3780
1.0.0rc1 / 1.0.0b260219 Notas 🟡 Mejora Se ha agregado compatibilidad con flujos de trabajo duraderos para Azure Functions #3630
1.0.0b260212 Notas 🔴 Interrupción Hosted*Toolclases eliminadas; crear herramientas alojadas a través de métodos del clienteget_*_tool() #3634
1.0.0b260212 Notas 🔴 Interrupción Canalización del proveedor de sesión o contexto finalizada: AgentThread quitada, use AgentSession + context_providers #3850
1.0.0b260212 Notas 🔴 Interrupción Refactorización del modelo de punto de control/almacenamiento (workflow_id quitado, previous_checkpoint_id agregado, comportamiento de almacenamiento cambiado) #3744
1.0.0b260212 Notas 🟡 Mejora AzureOpenAIResponsesClient se puede crear a partir del punto de conexión del proyecto Foundry o AIProjectClient #3814
1.0.0b260212 Notas 🔴 Interrupción La continuación del middleware ya no acepta context; actualice call_next(context) a call_next() #3829
1.0.0b260210 Notas 🔴 Interrupción send_responses() / send_responses_streaming() quitado; usar workflow.run(responses=...) #3720
1.0.0b260210 Notas 🔴 Interrupción SharedState State→ ; las API de estado de flujo de trabajo son sincrónicas y se ha cambiado el nombre del campo de estado de punto de comprobación. #3667
1.0.0b260210 Notas 🔴 Interrupción Los generadores de orquestaciones se han movido al agent_framework.orchestrations paquete #3685
1.0.0b260210 Notas 🟡 Mejora Se agregaron respuestas en segundo plano y compatibilidad con continuation_token a las respuestas del agente de Python. #3808
1.0.0b260210 Notas 🟡 Mejora Tipos de vista previa de sesión y contexto agregados en paralelo (SessionContext, BaseContextProvider) #3763
1.0.0b260210 Notas 🟡 Mejora Las actualizaciones del intérprete de código de streaming ahora incluyen deltas de código incremental #3775
1.0.0b260210 Notas 🟡 Mejora @tool el decorador agrega compatibilidad explícita con el control de esquemas #3734
1.0.0b260210 Notas 🔴 Interrupción register_executor() / register_agent() eliminado de WorkflowBuilder; use instancias directamente, métodos auxiliares para aislar el estado #3781
1.0.0b260210 Notas 🔴 Interrupción ChatAgent, Agent → , ChatMessageMessage, RawChatAgentRawAgent, ChatClientProtocolSupportsChatGetResponse #3747
1.0.0b260210 Notas 🔴 Interrupción Revisión de la API de tipos: Role/FinishReason cambios de tipo, ajuste del constructor de respuesta/actualización, cambio de nombre del asistente a from_updates, y eliminación de try_parse_value #3647
1.0.0b260210 Notas 🔴 Interrupción APIs unificadas en torno a run/get_response y ResponseStream #3379
1.0.0b260210 Notas 🔴 Interrupción AgentRunContext se ha cambiado de nombre a AgentContext #3714
1.0.0b260210 Notas 🔴 Interrupción AgentProtocol se ha cambiado de nombre a SupportsAgentRun #3717
1.0.0b260210 Notas 🔴 Interrupción Se ha cambiado el nombre del parámetro de middleware next a call_next #3735
1.0.0b260210 Notas 🔴 Interrupción Nomenclatura de TypeVar estandarizada (TNameNameT) #3770
1.0.0b260210 Notas 🔴 Interrupción Comportamiento de salida o flujo del workflow como agente alineado con el flujo de respuesta actual del agente #3649
1.0.0b260210 Notas 🔴 Interrupción Los métodos de Fluent Builder se han trasladado a parámetros del constructor en 6 constructores #3693
1.0.0b260210 Notas 🔴 Interrupción Eventos de flujo de trabajo unificados en único WorkflowEvent con type discriminador; isinstance()event.type == "..." #3690
1.0.0b260130 Notas 🟡 Mejora ChatOptions / ChatResponse / AgentResponse formato genérico de respuesta #3305
1.0.0b260130 Notas 🟡 Mejora BaseAgent compatibilidad agregada para integraciones del SDK de Claude Agent #3509
1.0.0b260128 Notas 🔴 Interrupción AIFunctionFunctionTool, @ai_function@tool #3413
1.0.0b260128 Notas 🔴 Interrupción Patrón de fábrica para GroupChat/Magentic; with_standard_managerwith_manager, participant_factoriesregister_participant #3224
1.0.0b260128 Notas 🔴 Interrupción GithubGitHub #3486
1.0.0b260127 Notas 🟡 Mejora BaseAgent Compatibilidad agregada para las integraciones del SDK de Copilot de GitHub #3404
1.0.0b260123 Notas 🔴 Interrupción Tipos de contenido consolidados en una sola Content clase con métodos de clase #3252
1.0.0b260123 Notas 🔴 Interrupción response_format ahora se generan errores de validación ValidationError #3274
1.0.0b260123 Notas 🔴 Interrupción AG-UI lógica de ejecución simplificada #3322
1.0.0b260123 Notas 🟡 Mejora El cliente de Anthropic agrega response_format soporte para salidas estructuradas #3301
1.0.0b260123 Notas 🟡 Mejora Configuración de Azure AI ampliada con soporte de reasoning y rai_config. #3403, #3265
1.0.0b260116 Notas 🔴 Interrupción create_agentas_agent #3249
1.0.0b260116 Notas 🔴 Interrupción source_executor_idexecutor_id #3166
1.0.0b260116 Notas 🟡 Mejora AG-UI admite la continuidad de sesión/subproceso administrada por el servicio #3136
1.0.0b260114 Notas 🔴 Interrupción Orquestaciones refactorizadas (GroupChat, Handoff, Secuencial, Simultáneo) #3023
1.0.0b260114 Notas 🔴 Interrupción Opciones como TypedDict y Generic #3140
1.0.0b260114 Notas 🔴 Interrupción display_name quitado; context_providerscontext_provider (singular); middleware debe ser una lista #3139
1.0.0b260114 Notas 🔴 Interrupción AgentRunResponse / AgentRunResponseUpdate se ha cambiado el nombre a AgentResponse/AgentResponseUpdate #3207
1.0.0b260114 Notas 🟡 Mejora Tiempo de ejecución de flujo de trabajo declarativo agregado para flujos de trabajo definidos por YAML #2815
1.0.0b260114 Notas 🟡 Mejora Mejoras de carga y confiabilidad de MCP (control de pérdida de conexión, paginación, controles de representación) #3154
1.0.0b260114 Notas 🟡 Mejora Foundry A2ATool admite conexiones sin una dirección URL de destino explícita #3127
1.0.0b260107 Notas No hay cambios significativos
1.0.0b260106 Notas No hay cambios significativos

Pasos siguientes