ai-agents-for-beginners

Explorando Microsoft Agent Framework

Agent Framework

Introducción

Esta lección cubrirá:

Objetivos de aprendizaje

Después de completar esta lección, sabrás cómo:

Ejemplos de Código

Los ejemplos de código para Microsoft Agent Framework (MAF) se pueden encontrar en este repositorio bajo los archivos xx-python-agent-framework y xx-dotnet-agent-framework.

Entendiendo Microsoft Agent Framework

Framework Intro

Microsoft Agent Framework (MAF) es el marco unificado de Microsoft para construir agentes de IA. Ofrece la flexibilidad para abordar la amplia variedad de casos de uso agenticos vistos en entornos de producción e investigación incluyendo:

Para entregar agentes de IA en producción, MAF también incluye características para:

Microsoft Agent Framework también se enfoca en ser interoperable mediante:

Veamos cómo estas características se aplican a algunos de los conceptos centrales de Microsoft Agent Framework.

Conceptos clave de Microsoft Agent Framework

Agentes

Agent Framework

Creando agentes

La creación de agentes se realiza definiendo el servicio de inferencia (Proveedor LLM), un conjunto de instrucciones para que el agente de IA siga, y un nombre asignado:

agent = AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent( instructions="You are good at recommending trips to customers based on their preferences.", name="TripRecommender" )

Lo anterior usa Azure OpenAI pero los agentes pueden ser creados usando una variedad de servicios incluyendo Microsoft Foundry Agent Service:

AzureAIAgentClient(async_credential=credential).create_agent( name="HelperAgent", instructions="You are a helpful assistant." ) as agent

APIs de OpenAI Responses, ChatCompletion

agent = OpenAIResponsesClient().create_agent( name="WeatherBot", instructions="You are a helpful weather assistant.", )
agent = OpenAIChatClient().create_agent( name="HelpfulAssistant", instructions="You are a helpful assistant.", )

o MiniMax, que provee una API compatible con OpenAI con grandes ventanas de contexto (hasta 204K tokens):

agent = OpenAIChatClient(base_url="https://api.minimax.io/v1", api_key=os.environ["MINIMAX_API_KEY"], model_id="MiniMax-M3").create_agent( name="HelpfulAssistant", instructions="You are a helpful assistant.", )

o agentes remotos usando el protocolo A2A:

agent = A2AAgent( name=agent_card.name, description=agent_card.description, agent_card=agent_card, url="https://your-a2a-agent-host" )

Ejecutando agentes

Los agentes se ejecutan usando los métodos .run o .run_stream para respuestas sin transmisión o con transmisión respectivamente.

result = await agent.run("What are good places to visit in Amsterdam?")
print(result.text)
async for update in agent.run_stream("What are the good places to visit in Amsterdam?"):
    if update.text:
        print(update.text, end="", flush=True)

Cada ejecución del agente también puede tener opciones para personalizar parámetros como max_tokens usados por el agente, herramientas que el agente puede llamar, e incluso el propio modelo usado para el agente.

Esto es útil en casos donde se requieren modelos o herramientas específicas para completar la tarea de un usuario.

Herramientas

Las herramientas pueden definirse tanto al definir el agente:

def get_attractions( location: Annotated[str, Field(description="The location to get the top tourist attractions for")], ) -> str: """Get the top tourist attractions for a given location.""" return f"The top attractions for {location} are." 


# Al crear un ChatAgent directamente

agent = ChatAgent( chat_client=OpenAIChatClient(), instructions="You are a helpful assistant", tools=[get_attractions]

y también al ejecutar el agente:


result1 = await agent.run( "What's the best place to visit in Seattle?", tools=[get_attractions] # Herramienta proporcionada solo para esta ejecución )

Hilos de agente

Los hilos de agente se usan para manejar conversaciones de múltiples turnos. Los hilos pueden crearse de dos maneras:

Para crear un hilo, el código se ve así:

# Crear un nuevo hilo.
thread = agent.get_new_thread() # Ejecutar el agente con el hilo.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)

Luego puedes serializar el hilo para almacenarlo para su uso posterior:

# Crear un nuevo hilo.
thread = agent.get_new_thread() 

# Ejecutar el agente con el hilo.

response = await agent.run("Hello, how are you?", thread=thread) 

# Serializar el hilo para almacenamiento.

serialized_thread = await thread.serialize() 

# Deserializar el estado del hilo después de cargarlo desde el almacenamiento.

resumed_thread = await agent.deserialize_thread(serialized_thread)

Middleware de agente

Los agentes interactúan con herramientas y LLMs para completar las tareas del usuario. En ciertos escenarios, queremos ejecutar o rastrear interacciones entre estos. El middleware de agente nos permite hacer esto a través de:

Middleware de función

Este middleware nos permite ejecutar una acción entre el agente y una función/herramienta que llamará. Un ejemplo de cuándo se usaría esto es cuando quieres hacer algún registro sobre la llamada a la función.

En el código siguiente next define si se debe llamar al siguiente middleware o a la función real.

async def logging_function_middleware(
    context: FunctionInvocationContext,
    next: Callable[[FunctionInvocationContext], Awaitable[None]],
) -> None:
    """Function middleware that logs function execution."""
    # Pre-procesamiento: Registrar antes de la ejecución de la función
    print(f"[Function] Calling {context.function.name}")

    # Continuar al siguiente middleware o ejecución de función
    await next(context)

    # Post-procesamiento: Registrar después de la ejecución de la función
    print(f"[Function] {context.function.name} completed")

Middleware de chat

Este middleware nos permite ejecutar o registrar una acción entre el agente y las solicitudes entre el LLM.

Esto contiene información importante como los mensajes que se envían al servicio de IA.

async def logging_chat_middleware(
    context: ChatContext,
    next: Callable[[ChatContext], Awaitable[None]],
) -> None:
    """Chat middleware that logs AI interactions."""
    # Preprocesamiento: Registrar antes de la llamada a IA
    print(f"[Chat] Sending {len(context.messages)} messages to AI")

    # Continuar al siguiente middleware o servicio de IA
    await next(context)

    # Postprocesamiento: Registrar después de la respuesta de IA
    print("[Chat] AI response received")

Memoria de agente

Como se cubrió en la lección Memoria Agentica, la memoria es un elemento importante para permitir que el agente opere sobre diferentes contextos. MAF ofrece varios tipos diferentes de memorias:

Almacenamiento en memoria

Esta es la memoria almacenada en los hilos durante el tiempo de ejecución de la aplicación.

# Crear un nuevo hilo.
thread = agent.get_new_thread() # Ejecutar el agente con el hilo.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)

Mensajes persistentes

Esta memoria se usa para almacenar el historial de conversaciones a través de diferentes sesiones. Se define usando la chat_message_store_factory:

from agent_framework import ChatMessageStore

# Crear una tienda de mensajes personalizada
def create_message_store():
    return ChatMessageStore()

agent = ChatAgent(
    chat_client=OpenAIChatClient(),
    instructions="You are a Travel assistant.",
    chat_message_store_factory=create_message_store
)

Memoria dinámica

Esta memoria se añade al contexto antes de que los agentes se ejecuten. Estas memorias pueden almacenarse en servicios externos como mem0:

from agent_framework.mem0 import Mem0Provider

# Usando Mem0 para capacidades avanzadas de memoria
memory_provider = Mem0Provider(
    api_key="your-mem0-api-key",
    user_id="user_123",
    application_id="my_app"
)

agent = ChatAgent(
    chat_client=OpenAIChatClient(),
    instructions="You are a helpful assistant with memory.",
    context_providers=memory_provider
)

Observabilidad de agente

La observabilidad es importante para construir sistemas agenticos confiables y mantenibles. MAF se integra con OpenTelemetry para proveer trazabilidad y métricas para mejor observabilidad.

from agent_framework.observability import get_tracer, get_meter

tracer = get_tracer()
meter = get_meter()
with tracer.start_as_current_span("my_custom_span"):
    # hacer algo
    pass
counter = meter.create_counter("my_custom_counter")
counter.add(1, {"key": "value"})

Flujos de trabajo

MAF ofrece flujos de trabajo que son pasos predefinidos para completar una tarea e incluyen agentes de IA como componentes en esos pasos.

Los flujos de trabajo están compuestos por diferentes componentes que permiten un mejor control del flujo. Los flujos de trabajo también permiten orquestación multi-agente y puntos de control para guardar estados de flujo de trabajo.

Los componentes principales de un flujo de trabajo son:

Ejecutores

Los ejecutores reciben mensajes de entrada, realizan las tareas asignadas, y luego producen un mensaje de salida. Esto mueve el flujo de trabajo hacia la finalización de la tarea más grande. Los ejecutores pueden ser agentes de IA o lógica personalizada.

Aristas

Las aristas se usan para definir el flujo de mensajes en un flujo de trabajo. Estos pueden ser:

Aristas Directas - Conexiones simples uno a uno entre ejecutores:

from agent_framework import WorkflowBuilder

builder = WorkflowBuilder()
builder.add_edge(source_executor, target_executor)
builder.set_start_executor(source_executor)
workflow = builder.build()

Aristas Condicionales - Se activan después de que se cumple cierta condición. Por ejemplo, cuando no hay habitaciones de hotel disponibles, un ejecutor puede sugerir otras opciones.

Aristas de tipo switch-case - Dirigen mensajes a diferentes ejecutores basado en condiciones definidas. Por ejemplo, si un cliente de viaje tiene acceso prioritario sus tareas serán manejadas a través de otro flujo de trabajo.

Aristas Fan-out - Envían un mensaje a múltiples destinos.

Aristas Fan-in - Recogen múltiples mensajes de diferentes ejecutores y los envían a un único destino.

Eventos

Para proporcionar mejor observabilidad en los flujos de trabajo, MAF ofrece eventos incorporados para la ejecución incluyendo:

Patrones avanzados de MAF

Las secciones anteriores cubren los conceptos clave de Microsoft Agent Framework. A medida que construyas agentes más complejos, aquí hay algunos patrones avanzados a considerar:

Alojando agentes LangChain / LangGraph en Microsoft Foundry

Microsoft Agent Framework es interoperable entre frameworks — no estás limitado a agentes escritos con MAF. Si ya tienes un agente construido con LangChain o LangGraph, puedes ejecutarlo como un agente alojado en Microsoft Foundry para que Foundry gestione el runtime, las sesiones, el escalado, la identidad y los puntos finales de protocolo por ti, mientras la lógica de tu agente permanece en LangGraph.

Esto se hace con el paquete langchain_azure_ai.agents.hosting, que expone un grafo compilado de LangGraph sobre los mismos protocolos que usan los agentes alojados de Foundry.

1. Instala el extra de hosting:

pip install -U "langchain-azure-ai[hosting]>=1.2.4" azure-identity

El extra hosting instala las bibliotecas de protocolo de Foundry: azure-ai-agentserver-responses (el endpoint compatible con OpenAI /responses) y azure-ai-agentserver-invocations (el endpoint genérico /invocations).

2. Elige un protocolo de hosting:

Protocolo Clase Host Endpoint Uso recomendado
Responses ResponsesHostServer /responses Quieres chat compatible con OpenAI, streaming, historial de respuestas y gestión de conversaciones — el predeterminado recomendado para agentes conversacionales.
Invocations InvocationsHostServer /invocations Necesitas una forma JSON personalizada, un endpoint estilo webhook o procesamiento no conversacional.

Debido a que la API Responses es la principal API para desarrollo de agentes en Foundry, empieza con ResponsesHostServer para la mayoría de agentes.

3. Configura variables de entorno (az login primero para que DefaultAzureCredential pueda autenticarse):

export FOUNDRY_PROJECT_ENDPOINT="https://<resource>.services.ai.azure.com/api/projects/<project>"
export FOUNDRY_MODEL_NAME="gpt-5-mini"

Cuando el agente luego se ejecute como agente alojado en Foundry, la plataforma inyectará FOUNDRY_PROJECT_ENDPOINT automáticamente.

4. Expón un agente LangGraph sobre el protocolo Responses:

import os

from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain_azure_ai.agents.hosting import ResponsesHostServer

_AZURE_AI_SCOPE = "https://ai.azure.com/.default"


def build_chat_model() -> ChatOpenAI:
    project_endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"].rstrip("/")
    deployment = os.environ.get("FOUNDRY_MODEL_NAME", "gpt-5-mini")
    credential = DefaultAzureCredential()
    project = AIProjectClient(endpoint=project_endpoint, credential=credential)
    openai_client = project.get_openai_client()
    token_provider = get_bearer_token_provider(credential, _AZURE_AI_SCOPE)

    # ChatOpenAI aquí apunta al endpoint compatible con OpenAI (Respuestas) del proyecto Foundry.
    return ChatOpenAI(
        model=deployment,
        base_url=str(openai_client.base_url),
        api_key=token_provider,
    )


def main() -> None:
    graph = create_agent(build_chat_model(), tools=[])
    port = int(os.environ.get("PORT", "8088"))
    ResponsesHostServer(graph).run(port=port)


if __name__ == "__main__":
    main()

Ejecútalo localmente con python main.py, luego envía una solicitud Responses a http://localhost:8088/responses.

Comportamientos clave:

Una versión ejecutable de este ejemplo está en code-samples/14-langchain-hosted-agent.py. Para la guía completa (protocolo Invocations, esquemas de solicitud personalizados y solución de problemas), consulta Host LangGraph agents as Foundry hosted agents.

Ejemplos de Código

Los ejemplos de código para Microsoft Agent Framework están disponibles en este repositorio bajo los archivos xx-python-agent-framework y xx-dotnet-agent-framework.

¿Tienes más preguntas sobre Microsoft Agent Framework?

Únete al Microsoft Foundry Discord para encontrarte con otros aprendices, asistir a horas de oficina y resolver tus dudas sobre agentes de IA.

Lección anterior

Memoria para agentes de IA

Próxima lección

Construyendo agentes para uso en computadora (CUA)


Descargo de responsabilidad: Este documento ha sido traducido utilizando el servicio de traducción automática Co-op Translator. Aunque nos esforzamos por la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o inexactitudes. El documento original en su idioma nativo debe considerarse la fuente autorizada. Para información crítica, se recomienda una traducción profesional humana. No somos responsables de cualquier malentendido o interpretación errónea que surja del uso de esta traducción.