Oharra
Baimena behar duzu orria atzitzeko. Direktorioetan saioa has dezakezu edo haiek alda ditzakezu.
Baimena behar duzu orria atzitzeko. Direktorioak alda ditzakezu.
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 deMessage(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 quecontents=["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-openaiyagent-framework-foundryson 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-mem0yagent-framework-ollamatodavía requieren--pre. - Si un único comando de instalación incluye algún paquete beta, mantenga
--preen 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,FoundryEmbeddingOptionsyFoundryEmbeddingSettingsdesdeagent_framework.foundry. - Instale
agent-framework-foundrypara chats de Foundry, agentes administrados por servicios, proveedores de memoria e incrustaciones. -
agent_framework.azureya no exportaAzureAIInferenceEmbeddingClient,AzureAIInferenceEmbeddingOptions,AzureAIInferenceEmbeddingSettingsoAzureAISettings. - Las incrustaciones de Foundry ahora usan
FOUNDRY_MODELS_ENDPOINT,FOUNDRY_MODELS_API_KEY,FOUNDRY_EMBEDDING_MODEL, y opcionalFOUNDRY_IMAGE_EMBEDDING_MODEL. -
FoundryChatClientyFoundryAgentsiguen usando la configuración del punto de conexión del proyecto, comoFOUNDRY_PROJECT_ENDPOINTyFOUNDRY_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_kwargsyclient_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(normalmentedictolist). - 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
modelen todas partes donde previamente usómodel_idanteriormente. -
Agent.default_optionsy por cada ejecuciónoptions={...}ahora esperan"model", no"model_id". - Los objetos de respuesta muestran
response.model, noresponse.model_id. - La configuración de OpenAI ahora usa
OPENAI_MODEL,OPENAI_CHAT_MODEL,OPENAI_CHAT_COMPLETION_MODELyOPENAI_EMBEDDING_MODEL. - La configuración de Azure OpenAI ahora usa
AZURE_OPENAI_MODEL,AZURE_OPENAI_CHAT_MODEL,AZURE_OPENAI_CHAT_COMPLETION_MODELyAZURE_OPENAI_EMBEDDING_MODEL. - Anthropic ahora usa
ANTHROPIC_CHAT_MODEL, y Foundry Local usaFOUNDRY_LOCAL_MODEL. - El paquete antropónico también agrega contenedores hospedados por el proveedor, como
AnthropicFoundryClient,AnthropicBedrockClientyAnthropicVertexClient.
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.
-
ContextProvideryHistoryProviderahora son las clases base canónicas de Python. -
BaseContextProvideryBaseHistoryProviderpermanecen temporalmente como alias en desuso para la compatibilidad, pero el nuevo código debe migrar a los nuevos nombres. -
SessionContextahora puede recopilar el middleware de función o de chat agregado por el proveedor a través deextend_middleware()y exponer la lista aplanada a través deget_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 completarun(). - 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_idooptions={"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.azureya no exportaAzureOpenAI*ni las superficies anteriores de agente/cliente/proveedorAzureAI*. - Los tipos de compatibilidad de los asistentes OpenAI de Python ya no forman parte de la superficie actual
agent_framework.openai. - Use
OpenAIChatClient,OpenAIChatCompletionClientyOpenAIEmbeddingClientpara escenarios directos de OpenAI o Azure OpenAI. - Use
FoundryChatClientpara la inferencia del proyecto Foundry yFoundryAgentpara Prompt Agents o HostedAgents. - El espacio de nombres actual
agent_framework.azureahora 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 enagent_framework.foundry.
Si va a migrar código de Python anterior, use estos reemplazos:
-
AzureOpenAIResponsesClient→OpenAIChatClient -
AzureOpenAIChatClient→OpenAIChatCompletionClient -
AzureOpenAIEmbeddingClient→OpenAIEmbeddingClient -
AzureAIAgentClient/AzureAIClient/AzureAIProjectAgentProvider/AzureAIAgentsProviderFoundryChatClient→ oFoundryAgent, en función de si la aplicación posee la definición del agente -
OpenAIAssistantsClient/OpenAIAssistantProviderOpenAIChatClient→ para el trabajo actual de OpenAI de Python oFoundryAgentsi 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 nombresagent_framework.openai. - Los clientes de Microsoft Foundry ahora se encuentran en el paquete
agent-framework-foundryy el espacio de nombresagent_framework.foundry. - Foundry Local también se expone desde
agent_framework.foundrycomoFoundryLocalClient. -
OpenAIResponsesClientse renombra aOpenAIChatClient. -
OpenAIChatClientse renombra aOpenAIChatCompletionClient. - La configuración de cliente se estandariza en
model, reemplazando parámetros anteriores comomodel_id,deployment_nameymodel_deployment_name. - Para el nuevo código de Azure OpenAI, utilice los clientes
agent_framework.openai. Los ajustes de compatibilidad anterioresAzureOpenAI*fueron eliminados posteriormente en #4990. - Para el nuevo código Foundry, use
FoundryChatClientpara la inferencia directa del proyecto,FoundryAgentpara Prompt Agents y HostedAgents, yFoundryLocalClientpara los entornos de ejecución locales. -
AzureAIClient,AzureAIProjectAgentProvider,AzureAIAgentClienty 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 enAzureAIAgentsProvider. - 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:
-
AzureOpenAIResponsesClient→OpenAIChatClient -
AzureOpenAIChatClient→OpenAIChatCompletionClient -
AzureOpenAIEmbeddingClient→OpenAIEmbeddingClient -
AzureOpenAIAssistantsClientOpenAIChatClient→ para la migración de la API de respuestas directas oFoundryAgentsi 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_name → model. 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_MODELparaOpenAIChatClient,OPENAI_CHAT_COMPLETION_MODELparaOpenAIChatCompletionClient, conOPENAI_MODELcomo reserva compartida. - Azure OpenAI ahora usa
AZURE_OPENAI_CHAT_MODELparaOpenAIChatClient,AZURE_OPENAI_CHAT_COMPLETION_MODELparaOpenAIChatCompletionClient, yAZURE_OPENAI_MODELcomo fallback compartido. - Use
azure_endpointpara las direcciones URL de recursos de Azure OpenAI, ubase_urlsi ya tiene una dirección URL completa.../openai/v1, y establezcaapi_versionpara 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, yFOUNDRY_AGENT_VERSIONpara clientes de Cloud Foundry - Uso
ANTHROPIC_CHAT_MODELpara Anthropic yFOUNDRY_LOCAL_MODELpara 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-coreahora es deliberadamente mínimo. - Si importa
agent_framework.openai, instaleagent-framework-openai. - Si importa
agent_framework.foundry, instaleagent-framework-foundrypara la inferencia del proyecto Foundry, los agentes administrados por el servicio, los proveedores de memoria y las inserciones. Se usaagent-framework-foundry-local --prepara 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, instalemcp --premanualmente. Para la compatibilidad con MCP de WebSocket, instalemcp[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_KEYestá configurado, los clientes genéricos permanecen en OpenAI a menos que pase una señal de enrutamiento explícita de Azure, comocredentialoazure_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()enOpenAIChatClient,OpenAIChatCompletionClienty 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:
-
AzureOpenAIEmbeddingClient→OpenAIEmbeddingClient -
AZURE_OPENAI_EMBEDDING_MODEL→model -
OPENAI_EMBEDDING_MODELsigue 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_kwargspara los valores que solo deben ver las herramientas o el middleware de funciones. - Se usa
client_kwargspara 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.kwargsyctx.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_featuresla 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=Trueen 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
ToolInvocationdataclass en lugar de undictsin procesar. - Devuelve
ToolResultmediante campos de snake_case comoresult_typeytext_result_for_llm. - El
agent-framework-github-copilotpaquete 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 aSkillsProvider. - 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()
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 paquetepython-dotenval inicio de tu aplicación - Pasar
env_file_path=".env"aload_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.
-
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=los patrones se reemplazan porcontext_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:
-
WorkflowCheckpointahora almacena objetos activos (la serialización se produce en el almacenamiento de puntos de control) -
FileCheckpointStorageahora usa la serialización pickle -
workflow_idse quitó yprevious_checkpoint_idse 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.
-
RoleyFinishReasonson ahoraNewTypecontenedores sobrestrconRoleLiteral/FinishReasonLiteralpara los valores conocidos. Tratarlos como cadenas (sin.valueuso). -
Messagela construcción se estandariza enMessage(role, contents=[...]); las cadenas encontentsse convierten automáticamente en contenido en texto. -
ChatResponseyAgentResponseconstructores ahora se centran enmessages=(una solaMessageo secuencia); se eliminó el uso del constructor heredadotext=de las respuestas. -
ChatResponseUpdateyAgentResponseUpdateya no aceptantext=; usecontents=[Content.from_text(...)]. - Se simplificaron los nombres de auxiliares de combinación de actualizaciones.
-
try_parse_valuese quitó deChatResponseyAgentResponse.
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
| 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 (TName → NameT)
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
-
WorkflowBuilderahora requierestart_executorcomo argumento de constructor (previamente establecido a través del método fluent) -
SequentialBuilder,ConcurrentBuilder,GroupChatBuilder, yMagenticBuilderahora requierenparticipantsoparticipant_factoriesen tiempo de construcción — no pasar ninguno genera unValueError
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_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 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)
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
AgentApprovalExecutoryAgentRequestInfoExecutor.
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_nameparámetro eliminado de los agentes -
context_providers(plural, lista de aceptación) cambiado acontext_provider(singular, solo 1 permitido) -
middlewareahora requiere una lista (ya no acepta una sola instancia) -
AggregateContextProviderquitado 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 → , ChatMessage → Message, RawChatAgent → RawAgent, ChatClientProtocol → SupportsChatGetResponse |
#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 (TName → NameT) |
#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 |
AIFunction → FunctionTool, @ai_function → @tool |
#3413 |
| 1.0.0b260128 | Notas | 🔴 Interrupción | Patrón de fábrica para GroupChat/Magentic; with_standard_manager → with_manager, participant_factories → register_participant |
#3224 |
| 1.0.0b260128 | Notas | 🔴 Interrupción |
Github → GitHub |
#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_agent → as_agent |
#3249 |
| 1.0.0b260116 | Notas | 🔴 Interrupción |
source_executor_id → executor_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_providers → context_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 | — |