![]()
Hasta este punto en el curso has construido agentes que se ejecutan en tu portátil, dentro de un notebook, impulsados por az login y un puñado de variables de entorno. Esa es exactamente la manera correcta de aprender. No es la forma adecuada de ejecutar un agente del que miles de clientes dependen a las 3 a.m.
Esta lección trata sobre la brecha entre “funciona en mi máquina” y “funciona, de forma fiable y asequible, en producción”. Cerramos esa brecha usando Microsoft Foundry y el Microsoft Foundry Agent Service, y lo hacemos construyendo un agente real de soporte al cliente que tiene herramientas, recuperación, memoria, evaluación y monitoreo.
Esta lección cubrirá:
Después de completar esta lección, sabrás cómo:
Esta lección asume que has completado las lecciones anteriores y que estás cómodo con:
También necesitarás:
az login).requirements.txt.Un agente prototipo y un agente de producción comparten el mismo ciclo principal — razonar, llamar herramientas, responder. Lo que cambia es todo lo que está alrededor de ese ciclo. El modelo representa quizás el 20 % de un agente en producción; el otro 80 % es el esqueleto operacional.
| Preocupación | Prototipo | Producción |
|---|---|---|
| Hospedaje | Se ejecuta en tu notebook | Se ejecuta como un servicio alojado, versionado y desplegado progresivamente |
| Identidad | Tu token de az login |
Identidad gestionada con RBAC con alcance |
| Estado | En memoria, perdido al reiniciar | Externalizado (almacén de hilos, servicio de memoria) |
| Fallos | Ves el traceback | Reintentos, soluciones alternativas, buzón de mensajes fallidos, alertas |
| Costo | “Son unos cuantos centavos” | Rastreado por solicitud, enrutado, almacenado en caché, presupuestado |
| Calidad | Evalúas visualmente la salida | Evaluado automáticamente antes de cada lanzamiento |
| Confianza | Apruebas cada acción | Política + humano en el bucle para acciones riesgosas |
Ten esta tabla en mente. Cada sección a continuación corresponde a una de estas filas.
Hay tres patrones que usarás, a menudo en combinación.
El objeto agente vive dentro del proceso de tu aplicación. Tu código llama directamente al proveedor del modelo; el ciclo de razonamiento se ejecuta en tu servicio. Esto es lo que se ha hecho en todas las lecciones anteriores.
El agente está registrado como un recurso en Microsoft Foundry. Foundry hospeda el ciclo de razonamiento, almacena hilos, hace cumplir la seguridad de contenido y RBAC, y hace visible el agente en el portal de Foundry. Tu aplicación se convierte en un cliente ligero que crea hilos y lee respuestas.
Varios agentes (y herramientas) se componen en un grafo con control explícito de flujo — pasos secuenciales, ramificaciones, nodos de aprobación humana y puntos de control duraderos que pueden pausar y reanudar. Esta es la capacidad de Workflows del Microsoft Agent Framework aplicada a escala de implementación.
flowchart TB
subgraph P1[Alojado en el cliente]
A1[Proceso de tu aplicación] --> M1[Proveedor del modelo]
end
subgraph P2[Agente alojado]
A2[Cliente ligero] --> F2[Servicio de agente Foundry]
F2 --> M2[Modelo + Herramientas + Almacén de hilos]
end
subgraph P3[Flujo de trabajo del agente]
A3[Orquestador] --> S1[Agente de triaje]
S1 --> S2[Agente resolutor]
S2 --> H[Nodo de aprobación humana]
H --> S3[Agente de acción]
end
Implementar un agente no es un push de una sola vez. Es un ciclo, y se parece mucho a un ciclo de lanzamiento de software porque eso es exactamente lo que es.
flowchart LR
Create[Crear / Autor] --> Version[Versión]
Version --> Evaluate[Evaluar sin conexión]
Evaluate -->|pasa la puerta| Deploy[Implementar alojado]
Evaluate -->|falla la puerta| Create
Deploy --> Observe[Observar en línea]
Observe --> Improve[Recopilar fallas]
Improve --> Create
Deploy --> Retire[Retirar versión antigua]
La idea clave, tomada de Lección 10: la evaluación fuera de línea es una puerta, no un detalle menor. Una nueva versión del agente no se lanza a menos que supere tus umbrales de evaluación. La observabilidad en línea alimenta luego los fallos reales de producción hacia tu conjunto de pruebas fuera de línea. Ese es todo el ciclo.
Escalar un agente es diferente de escalar una API web sin estado, debido a que cada solicitud puede desencadenar múltiples llamadas costosas a modelos y herramientas. Cuatro técnicas soportan la mayor parte de la carga.
Manejo de solicitudes sin estado. No mantengas estado por usuario en la memoria de tu proceso. Persiste los hilos de conversación en el almacén de hilos de Foundry o en un servicio de memoria para que cualquier instancia pueda manejar cualquier solicitud. Esto permite escalar horizontalmente — agregar instancias, sin sesiones pegajosas.
Enrutamiento de modelo. No todas las solicitudes necesitan tu modelo más capaz (y más caro). Enruta solicitudes simples — clasificación de intención, respuestas factuales cortas — a un modelo pequeño y rápido, y reserva el modelo grande para razonamiento genuino. El Model Router de Foundry puede hacer esto por ti, o puedes implementar un clasificador ligero tú mismo. Construirás la versión DIY en el laboratorio.
Almacenamiento en caché de respuestas. Muchas consultas de soporte son casi duplicados (“¿cómo restablezco mi contraseña?”). Almacena en caché respuestas a preguntas comunes y sírvelas sin consultar el modelo. Incluso una tasa modesta de aciertos en caché reduce significativamente costo y latencia.
Concurrencia y retropresión. Los proveedores de modelos tienen límites de tasa. Limita tu concurrencia, usa reintentos con retroceso exponencial y falla de forma elegante (una respuesta en cola de “estamos en ello” supera un error 500).
flowchart LR
Q[Consulta del usuario] --> C{¿Coincidencia en caché?}
C -->|sí| R[Devolver respuesta en caché]
C -->|no| Router{¿Complejidad?}
Router -->|simple| SLM[Modelo pequeño]
Router -->|complejo| LLM[Modelo grande]
SLM --> Out[Respuesta]
LLM --> Out
Out --> Store[Caché + traza]
No puedes operar lo que no puedes ver. Como se cubrió en la Lección 10, el Microsoft Agent Framework emite trazas OpenTelemetry nativamente — cada llamada al modelo, invocación de herramienta y paso de orquestación se convierte en un span. En producción exportas esos spans a Microsoft Foundry (o cualquier backend compatible con OTel) para que puedas:
from agent_framework.observability import get_tracer
tracer = get_tracer()
with tracer.start_as_current_span("support_request") as span:
span.set_attribute("customer.tier", "enterprise")
span.set_attribute("routed.model", "gpt-5-nano")
# la ejecución del agente se traza automáticamente dentro de este span
Atributos como customer.tier y routed.model son los que convierten una pared de trazas en preguntas respondibles (“¿se están enroutando los clientes empresariales al modelo pequeño con demasiada frecuencia?”).
El costo en agentes de producción está dominado por los tokens. Tres palancas, en orden de impacto:
Las puertas de evaluación y el control de costos son la misma disciplina vista desde dos ángulos: la evaluación te dice el piso de calidad, el enrutamiento y almacenamiento en caché te mantienen lo más cerca posible al costo de ese piso.
Gobernanza. Los Agentes Hospedados heredan RBAC, seguridad de contenido y registro de auditoría de Foundry. Da a cada agente una identidad gestionada con el menor privilegio necesario — acceso solo lectura a la base de conocimiento, acceso con alcance a la API de tickets, nada más.
Humano en el bucle. Algunas acciones son demasiado importantes para automatizarse completamente — emitir un reembolso, eliminar una cuenta, escalar a un equipo legal. El Microsoft Agent Framework soporta herramientas que requieren aprobación: el agente propone la acción, la ejecución se detiene, un humano aprueba o rechaza, y el flujo de trabajo se reanuda. Viste el primitivo en Lección 6; aquí lo implementas.
MCP en producción. MCP permite que tu agente consuma herramientas externas mediante una interfaz estándar. En producción, trata cada servidor MCP como un límite no confiable: fija la versión del servidor, ejecútalo con una identidad con alcance, valida sus salidas y nunca le expongas secretos. Un servidor MCP es una dependencia, y las dependencias se parchean, auditán y limitan en tasa.
flowchart TB
subgraph Dev[Arquitectura de Desarrollo]
D1[Cuaderno] --> D2[Marco de Agentes]
D2 --> D3[Proveedor de Modelo]
D2 --> D4[Herramientas locales]
end
subgraph Deploy[Arquitectura de Despliegue]
E1[Pipeline de CI] --> E2[Puerta de Evaluación]
E2 -->|aprobar| E3[Servicio de Agentes Foundry]
E3 --> E4[Agente alojado versionado]
end
subgraph Run[Arquitectura de Tiempo de Ejecución]
F1[Aplicación cliente] --> F2[Agente alojado]
F2 --> F3[Enrutador de Modelos]
F2 --> F4[Búsqueda Azure AI RAG]
F2 --> F5[Servicio de memoria]
F2 --> F6[Herramientas MCP]
F2 --> F7[OTel -> rastreo Foundry]
F2 --> F8[Aprobación humana]
end
Esos tres diagramas — desarrollo, implementación, tiempo de ejecución — muestran el mismo agente en tres etapas de su vida. El laboratorio que sigue te guía para construirlo.
Abre code_samples/16-python-agent-framework.ipynb y sigue todo el proceso. Armarás un agente de soporte al cliente Contoso con todas las preocupaciones de producción conectadas:
El notebook está organizado de modo que cada preocupación de producción sea una sección autónoma y ejecutable. El núcleo es el manejador de solicitudes con enrutamiento y almacenamiento en caché:
async def handle_support_request(query: str, customer_id: str) -> str:
# 1. Servir desde la caché cuando podamos.
cached = response_cache.get(normalize(query))
if cached:
return cached
# 2. Enrutar según la complejidad para controlar el costo.
model = "gpt-5-nano" if is_simple(query) else "gpt-5-mini"
# 3. Ejecutar el agente dentro de un span de traza para observabilidad.
with tracer.start_as_current_span("support_request") as span:
span.set_attribute("routed.model", model)
span.set_attribute("customer.id", customer_id)
response = await support_agent.run(query, model=model)
# 4. Cachear y devolver.
response_cache.set(normalize(query), response.text)
return response.text
La puerta de evaluación que protege un lanzamiento se ve así:
async def evaluation_gate(agent, test_cases, threshold: float = 0.8) -> bool:
passed = 0
for case in test_cases:
result = await agent.run(case["input"])
if score_response(result.text, case["expected"]) >= 0.8:
passed += 1
pass_rate = passed / len(test_cases)
print(f"Evaluation pass rate: {pass_rate:.0%} (gate: {threshold:.0%})")
return pass_rate >= threshold # desplegar solo si la puerta pasa
Lee cada línea — el notebook mantiene los primitivos deliberadamente pequeños para que nada quede oculto tras una llamada a framework.
La puerta de evaluación anterior se ejecuta offline contra tu objeto agente. Una vez que el agente está implementado como Hosted Agent, necesitas una verificación adicional, aún más económica: ¿realmente responde el punto final desplegado?
Implementar “con éxito” solo prueba que el plano de control aceptó la definición — no prueba que el agente responda. Una dependencia faltante, un enrutamiento incorrecto del modelo o una conexión expirada pueden dejar un despliegue con luz verde que no devuelve nada. Una prueba básica (smoke test) detecta eso en segundos, en cada despliegue, sin el costo de una evaluación completa.
Este repositorio incluye una canalización de prueba básica lista para usar construida sobre la Acción GitHub AI Smoke Test:
tests/lesson-16-smoke-tests.json contiene prompts y afirmaciones para el agente de soporte Contoso (respuestas basadas en política, consulta de pedidos, mantenerse en tema y continuidad en hilos multi-turno). Catálogos para agentes de otras lecciones viven junto a este — ver tests/README.md..github/workflows/smoke-test.yml inicia sesión con Azure OIDC y envía cada prompt al endpoint Responses del agente, fallando el trabajo ante cualquier afirmación no cumplida.- name: Smoke-test hosted agent
uses: JFolberth/ai-smoketest@v1
with:
project_endpoint: $
agent_name: ContosoSupportAgent
tests_file: tests/lesson-16-smoke-tests.json
Ejecútalo desde la pestaña Actions una vez que tu agente esté desplegado, suministrando el endpoint de tu proyecto Foundry y el nombre del agente. La identidad federada necesita el rol Azure AI User en el ámbito del proyecto Foundry. Piensa en las capas como una pirámide: las pruebas de humo (¿alcanzable y responde?) se ejecutan en cada despliegue, la evaluación sin conexión (¿suficiente para enviar?) se ejecuta antes de la promoción, y la evaluación en línea (¿cómo está funcionando en el campo?) se ejecuta continuamente.
Pon a prueba tu comprensión antes de continuar con la tarea.
1. Aproximadamente, ¿qué porcentaje de un agente en producción es “el modelo” y qué es el resto?
2. ¿Cuándo elegirías un Agente Hospedado en lugar de un agente alojado en el cliente?
3. ¿Por qué un agente escalable debe ser sin estado en la memoria de su propio proceso?
4. ¿Qué problema resuelve el enrutamiento del modelo, y cómo se relaciona con la evaluación?
5. ¿Qué es una “puerta de evaluación” y dónde se sitúa en el ciclo de vida?
6. ¿Por qué un servidor MCP debe tratarse como un límite no confiable en producción?
7. ¿Qué cambio único suele tener el mayor impacto en el costo de un agente en producción, y por qué?
8. ¿Qué papel juegan los atributos de span como customer.tier y routed.model en la observabilidad?
Toma el agente de atención al cliente del laboratorio y refuérzalo para un escenario específico: un agente de soporte de facturación de suscripciones para una empresa SaaS.
Tu entrega debe:
get_subscription_status, get_invoice y issue_credit (los créditos mayores a $50 requieren aprobación humana).Escribe un párrafo breve (en una celda markdown) explicando qué regla de enrutamiento de modelos elegiste y cómo la validarías con tráfico real. No hay una única respuesta correcta — serás evaluado sobre si las preocupaciones de producción están conectadas de manera coherente.
En esta lección moviste un agente de prototipo a producción con Microsoft Foundry:
La siguiente lección toma el camino opuesto: en lugar de escalar agentes hacia la nube, los bajarás a una sola máquina de desarrollo para ejecutarlos completamente localmente.
Construcción de Agentes de Uso de 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.