Modelo React Agent especializado en Microsoft Graph

1. Componentes principales y propósito
- Objetivo del agente: ofrecer respuestas técnicas y operativas sobre Microsoft Graph (autenticación, permisos, OData, integración con Teams/SharePoint/OneDrive, throttling, etc.) con soporte de herramientas RAG y de feedback humano.
- Elementos clave en el fichero:
- Carga de herramientas (
graph_tools) desde el registroagent_tools. - Prompt del sistema (
microsoft_graph_prompt) que define la persona y las reglas de respuesta. - Creación del agente React mediante
create_react_agent(...)conmodel,toolsyprompt. - Helpers de invocación (
_invoke_agent_with_fallback) para llamar al agente por distintos caminos. - Normalización de salida (
_extract_text_from_response) para obtener texto legible desde distintas formas de respuesta.
- Carga de herramientas (
2. Carga de herramientas y RAG
- Qué hace:
graph_tools = list(agent_tools.get("microsoft_graph_agent", [])) + [request_human_feedback_tool]recopila:- herramientas de recuperación (RAG) específicas para Graph (p. ej.
MicrosoftGraphKnowledgeBase), - utilidades de búsqueda, y
- una herramienta de human-in-the-loop (
request_human_feedback_tool).
- herramientas de recuperación (RAG) específicas para Graph (p. ej.
- Por qué importa: estas herramientas permiten que el agente:
- cite documentación oficial y fragmentos (RAG),
- ejecute búsquedas estructuradas o llamadas a indexadores,
- solicite validación humana cuando la respuesta requiere revisión.
- Efecto en el comportamiento: el agente puede invocar herramientas durante su razonamiento (acciones del tipo tool-call) y debe integrar las respuestas de las herramientas en su output final.
3. Prompt y diseño de la personalidad del agente
- SystemMessage (prompt):
- Define dominio, alcance y restricciones (p. ej. rechazar ayuda para accesos no autorizados).
- Indica estilo: práctico, pedagógico y en el idioma del usuario.
- Señala cuándo usar RAG: “When the user asks for citations … consult the RAG tools”.
- MessagesPlaceholder: permite inyectar el historial de conversación (
messages) en el prompt al invocar el agente, manteniendo contexto. - Consecuencia práctica: el prompt guía al modelo para:
- priorizar reproducibilidad y seguridad,
- estructurar respuestas (ej.: incluir permisos mínimos, ejemplos de OData, snippets REST),
- y citar fuentes cuando se usan herramientas RAG.
4. Creación del agente React y su runtime
create_react_agent(...):model: LLM seleccionado porget_model("Deepseek").tools: lista de herramientas que el agente puede invocar.prompt: plantilla con SystemMessage + placeholder.name: identificador del agente.
- Qué es un “React agent” en este contexto: un agente que puede razonar y ejecutar acciones (invocar herramientas) en un ciclo de pensamiento-actuación, integrando resultados de herramientas en su respuesta final.
- Capacidades habilitadas:
- llamadas a RAG para obtener citas,
- ejecución de acciones (p. ej. construir requests, validar scopes),
- orquestación de pasos (planificar flujo de integración, devolver snippets).
- Limitaciones operativas: la calidad depende del prompt, la cobertura de las herramientas y la latencia/fiabilidad del modelo y de las herramientas externas.
5. Invocación robusta y manejo de respuestas
_invoke_agent_with_fallback(agent, question)intenta varias vías para llamar al agente:agent.invoke({"messages":[HumanMessage(content=question)]})— invocación con historial.agent.invoke(question)— invocación directa.agent.run(question)— si el agente exponerun.agent.ainvoke(question)— si el agente exponeainvoke(manejo asíncrono conasyncio.runo loop manual).
- Por qué es útil: cubre distintas implementaciones de agentes y entornos (sincrónico/asíncrono), aumentando resiliencia frente a APIs heterogéneas.
_extract_text_from_response(resp):- Normaliza distintas formas de respuesta (dict con
messages, lista, objeto concontent) y devuelve una cadena. - Maneja errores y registra excepciones para depuración.
- Normaliza distintas formas de respuesta (dict con
- Errores y logging: cada intento captura excepciones y las registra con
logging.debug, devolviendo un fallback legible si todo falla.
6. Buenas prácticas, extensibilidad y pruebas
- Seguridad y gobernanza: el prompt obliga a rechazar prácticas inseguras; además, las herramientas RAG deben usarse para citar documentación oficial cuando se dan recomendaciones de seguridad o permisos.
- Diseño de respuestas útiles para Graph:
- incluir API_SNIPPET (ej. ejemplo HTTP con
Authorization: Bearer $TOKEN), - detallar flow de autenticación (delegated vs application),
- listar permisos mínimos y explicar por qué son mínimos.
- incluir API_SNIPPET (ej. ejemplo HTTP con
- Testing y validación:
- pruebas unitarias del helper
_invoke_agent_with_fallbacksimulando distintos tipos de agente (mock objects). - tests de integración que verifiquen que las herramientas RAG devuelven citas y que el agente las incorpora en el formato esperado.
- pruebas unitarias del helper
- Extensiones prácticas:
- añadir un cache para resultados RAG frecuentes (evita llamadas repetidas a la misma doc).
- instrumentar métricas (latencia de herramientas, tasa de uso de
request_human_feedback_tool). - exponer un modo debug que incluya el plan de pensamiento del agente (si la plataforma lo permite) para auditoría.
- Ejemplo de flujo de uso en producción:
- Usuario pregunta: “¿Qué scopes necesito para leer correos en nombre de una app?”
- Agente consulta RAG (
MicrosoftGraphKnowledgeBase) para citar la documentación de Microsoft sobre scopes. - Agente devuelve: diagnóstico breve; API_SNIPPET con
client_credentials; lista de permisos mínimos; recomendaciones de seguridad; y referencias citadas.
Resumen ejecutivo (qué aporta este diseño)
- Robustez: fallback de invocación y normalización de respuestas hacen el agente tolerante a variaciones de runtime.
- Precisión y trazabilidad: uso de herramientas RAG y prompt que exige citas permite respuestas fundamentadas.
- Seguridad y buenas prácticas: el prompt impone restricciones y prioridades (reproducibilidad, privacidad).
- Flexibilidad operativa: el agente puede integrarse en pipelines (CLI, servicios web, grafos de agentes) y extenderse con nuevas herramientas.







