Arquitectura técnica — Enterprise AI Platform (MVP)¶
1. Idea central¶
Una plataforma común de IA en Azure que:
- Expone agentes y APIs a través de Azure API Management
- Orquesta con Microsoft Foundry / Agent Service
- Integra datos vía REST (Finanzas estructurado) y MCP (RR.HH. documental + opcional proveedores)
- Aplica gobierno: Entra ID, RBAC, Key Vault, reglas determinísticas, auditoría, observabilidad
Las apps Finance y HR son clientes de la plataforma; no son silos de IA.
Estado as-built (Finance DEV): portal + API en Container Apps, reglas + HITL + DI + Foundry agent con guardrails, Entra apps creadas, APIM opt-in en Terraform. HR sigue planificado.
Guía de onboarding: getting-started.md · Identidad: entra-apim-finance.md.
1b. Runtime Finance (como está desplegado)¶
flowchart TB
subgraph Browser
UI["finance-web<br/>HITL · PDF · Chat · i18n"]
end
subgraph ACA["Container Apps · mexicocentral"]
WEB["ca-eai-finance-web-dev"]
API["ca-eai-finance-api-dev"]
MCP["ca-eai-mcp-sup-dev"]
end
subgraph Platform
APIM["APIM Developer<br/>enable_apim"]
ENTRA["Entra SPA + API"]
FOUNDRY["Foundry eai-finance-agent v3"]
end
subgraph PaaS
SQL[(Azure SQL)]
BLOB[(Blob invoices)]
DI[Document Intelligence]
AI[App Insights]
end
UI --> WEB
WEB -->|"proxy /api/finance<br/>Bearer"| APIM
WEB -.->|"si APIM off"| API
APIM --> API
ENTRA --> UI
ENTRA --> APIM
API --> SQL
API --> BLOB
API --> DI
API --> FOUNDRY
FOUNDRY -->|"function tools"| API
FOUNDRY -.-> MCP
MCP --> SQL
API --> AI
WEB --> AI
Proxy Next: el navegador no llama al FQDN del API directamente; usa rutas /api/finance/*. El servidor reenvía a APIM_GATEWAY_URL o FINANCE_API_BASE_URL, con Authorization y x-correlation-id.
PDF: el visor hace GET autenticado y muestra un blob URL (no depende de HEAD).
Chat: chat_guardrails en API → Foundry + tool loop local (SQL) si el mensaje está en dominio AP.
2. Diagrama lógico (Mermaid)¶
flowchart TB
subgraph Apps["Aplicaciones de negocio"]
FIN["Finance App<br/>Next.js"]
HR["HR App<br/>Next.js"]
end
subgraph Platform["Plataforma Empresarial IA"]
APIM["Azure API Management<br/>Gateway · Auth · Policies · Correlation"]
FOUNDRY["Microsoft Foundry<br/>Finance Agent · HR Agent"]
RULES["Rule Engine<br/>determinístico"]
AUDIT["Audit Service<br/>SQL + App Insights"]
end
subgraph SecObs["Gobierno"]
ENTRA["Microsoft Entra ID"]
KV["Key Vault"]
AI["App Insights + Log Analytics"]
end
subgraph FinanceDomain["Dominio Finanzas"]
BLOB_F["Blob Storage<br/>facturas PDF"]
DI["Document Intelligence"]
PROC["Invoice Processor<br/>Function / ACA"]
SQL["Azure SQL<br/>suppliers · POs · invoices · rules · audit"]
API_F["Finance API<br/>REST tools"]
MCP_S["MCP Suppliers<br/>opcional"]
end
subgraph HRDomain["Dominio RR.HH."]
BLOB_H["Blob Storage<br/>políticas PDF"]
SEARCH["Azure AI Search<br/>RAG"]
MCP_H["MCP Server HR"]
API_H["HR API"]
end
FIN --> APIM
HR --> APIM
APIM --> FOUNDRY
APIM --> API_F
APIM --> API_H
ENTRA --> APIM
ENTRA --> FIN
ENTRA --> HR
KV --> API_F
KV --> MCP_H
FOUNDRY --> AI
API_F --> AI
AUDIT --> SQL
AUDIT --> AI
FIN --> BLOB_F
BLOB_F --> PROC
PROC --> DI
PROC --> FOUNDRY
FOUNDRY -->|REST vía APIM| API_F
FOUNDRY -->|MCP| MCP_S
API_F --> SQL
API_F --> RULES
RULES --> SQL
MCP_S --> SQL
FOUNDRY -->|MCP| MCP_H
MCP_H --> SEARCH
SEARCH --> BLOB_H
API_H --> MCP_H
3. Flujo end-to-end — Finanzas¶
sequenceDiagram
actor U as Finance.User / Reviewer
participant App as Finance App
participant APIM as APIM
participant Blob as Blob Storage
participant Proc as Invoice Processor
participant DI as Document Intelligence
participant Agent as Invoice / Finance Agent
participant REST as Finance API tools
participant MCP as MCP Suppliers
participant Rules as Rule Engine
participant Audit as Audit Store
U->>App: Sube factura PDF
App->>APIM: POST /api/finance/invoices
APIM->>Blob: Guarda PDF
APIM->>Audit: InvoiceUploaded + correlationId
Blob->>Proc: Evento / trigger
Proc->>DI: Analyze invoice
DI-->>Proc: Campos extraídos
Proc->>Audit: InvoiceDataExtracted
Proc->>Agent: Start Invoice execution
Agent->>MCP: validate_supplier()
MCP-->>Agent: VALID / INVALID
Agent->>REST: get_purchase_order()
REST-->>Agent: PO data
Agent->>REST: validate_invoice_amount() / check_duplicate()
Agent->>Rules: evaluate_finance_policy()
Rules-->>Agent: FIN-00x PASS/FAIL (determinístico)
alt Excepción
Agent->>Audit: HumanReviewRequested
U->>App: Aprueba / Rechaza
App->>APIM: POST approve/reject
APIM->>Audit: HumanDecision
else Sin excepción
Agent->>Audit: Approved automático
end
4. Flujo end-to-end — RR.HH.¶
sequenceDiagram
actor U as HR.User
participant App as HR App
participant APIM as APIM
participant Agent as HR Agent
participant MCP as MCP HR Server
participant Search as Azure AI Search
U->>App: "¿Política de trabajo remoto?"
App->>APIM: POST /api/hr/chat
APIM->>Agent: Chat + user context
Agent->>MCP: search_hr_policy / get_policy
MCP->>Search: Hybrid / semantic query
Search-->>MCP: Chunks + source
MCP-->>Agent: Contenido + citas
Agent-->>App: Respuesta + fuente documental
5. Separación LLM vs determinístico¶
| Capacidad | Responsable | Motivo |
|---|---|---|
| Extraer campos de PDF | Document Intelligence + validación | Especializado / estable |
| Explicar resultado al usuario | LLM (Finance Agent) | Lenguaje natural |
| Chat y clasificación no crítica | LLM | UX |
| Reglas FIN-001…FIN-005 | Rule Engine (código + SQL) | No negociable |
| Aprobar/rechazar por política | Reglas + HITL | Compliance |
| Acceso a datos | Tools REST/MCP únicamente | El LLM no toca DB |
6. Modelo de seguridad (MVP)¶
flowchart LR
User --> Entra
Entra -->|OIDC token| App
App -->|Bearer + scopes| APIM
APIM -->|validate-jwt| Backend
Backend -->|Managed Identity| SQL
Backend -->|Managed Identity| Blob
Backend -->|Managed Identity| KV
Agent -->|function tools en host API| Backend
Autenticación (Entra) vs autorización (app/APIM): ver entra-apim-finance.md.
| Control | Estado MVP |
|---|---|
| Login portal MSAL | Implementado (demo si no hay client id) |
| JWT en APIM | Implementado cuando enable_apim=true |
| Grupos Reviewer/User | Creados; assignment required = opcional |
| Solo Reviewer aprueba HITL | Hecho (API JWT groups + APIM 403 + UI) |
| Acceso portal User|Reviewer | Hecho (AccessDenied + APIM + API middleware) |
| ACA API solo vía APIM | Hecho (DEV) — ingress IP allowlist = IPs públicas APIM; FQDN ACA → 403. external_enabled=false requiere VNet (CAE + APIM); hoy ambos sin VNet |
Aislamiento de agentes - Finance Agent: solo tools finance (REST + MCP suppliers opcional). - HR Agent: solo tools MCP HR / Search (futuro). - Instructions Foundry + guardrails API + scopes APIM.
Modelo enterprise futuro: VNET, Private Endpoints, APIM internal (external_enabled=false), OpenAI privado, Private DNS.
7. Modelo de datos (resumen)¶
SQL (Finanzas + auditoría funcional)
Suppliers, PurchaseOrders, Invoices, InvoiceLines, BusinessRules, RuleExecutions, AgentExecutions, ToolExecutions, HumanDecisions, TokenUsage (FinOps).
Blob
invoices/, hr-policies/.
AI Search
Índice hr-policies con chunks, metadata (source, policy_type, page).
Detalle de tablas: ver data-model.md.
8. Decisiones arquitectónicas (ADRs cortos)¶
| ID | Decisión | Elección MVP | Alternativa descartada |
|---|---|---|---|
| ADR-01 | Gateway | Azure APIM Developer | App Gateway solo (sin políticas API) |
| ADR-02 | Orquestación agentes | Foundry Agent Service | LangChain self-host completo |
| ADR-03 | Backend | Python FastAPI | .NET / Node (válidos, unificar en uno) |
| ADR-04 | Compute | Container Apps | AKS (overkill) |
| ADR-05 | Eventos invoice | Function + Blob trigger (simple) | Durable / Service Bus (fase 2) |
| ADR-06 | Reglas | Motor propio SQL/código | LLM decide (prohibido) |
| ADR-07 | HR tools | MCP Server real | Solo REST (no demostraría MCP) |
| ADR-08 | IaC | Terraform | Portal manual |
| ADR-09 | Foundry | Un proyecto, dos agentes | Dos proyectos (más complejo) |
9. Riesgos¶
| Riesgo | Impacto | Mitigación |
|---|---|---|
| Foundry Agent / MCP en preview en región | Alto | Marcar preview; fallback: orquestación FastAPI + tools OpenAI function calling |
| Cuota OpenAI insuficiente | Alto | Pedir aumento temprano; cachear demos |
| APIM costo / lead time | Medio | Empezar con APIs públicas + Entra; APIM en iteración 3 |
| Document Intelligence calidad en PDFs ficticios | Medio | Plantillas claras + post-validación de schema |
| Scope creep (Power BI, VNET, multi-agent) | Alto | Criterio de éxito del prompt como contrato |
10. Componente a implementar primero¶
- Contratos + modelo SQL + Rule Engine + Audit (sin Azure aún, Docker SQL opcional)
- Finance API (upload mock → extract mock → rules → HITL)
- MCP HR + documentos
- Frontends demo
- Wiring Azure (DI, Search, Foundry, APIM) + Terraform
Ver backlog.md y iteration-plan.md.