ArquitecturaAgentes

Agentes — Flujo y Funcionalidad

Guía completa de los agentes que se ejecutan dentro de MatrixAI cuando escribes una descripción en lenguaje natural y el sistema genera un modelo. No hace falta haber leído los contratos técnicos.

~40 min de lectura📖 28 secciones🔒 Solo miembros
Vista general del pipeline de agentes de MatrixAI
Pipeline completo de agentes — del prompt al modelo ejecutable

1. ¿Qué es un agente en MatrixAI?

En MatrixAI, un agente es un componente pequeño y especializado que hace exactamente una cosa. No hay un agente grande que lo controle todo: hay varios agentes en cadena, cada uno con una responsabilidad concreta y con permisos acotados.

Ningún agente puede saltarse los contratos del lenguaje. Las propuestas que generan los agentes pasan siempre por el parser, los verificadores, el sandbox y el sistema de trazas. Un agente puede proponer, pero no puede aprobar su propia propuesta.
TipoQué haceEjemplos
**Generadores**Proponen artefactos (`.semantic`, `.mxai`)PromptAgent`, `LLMProposalAgent`, `ArchitectAgent
**Verificadores**Validan que los artefactos cumplen las reglasPlannerVerifier`, `VerifierAgent`, `SafetyAgent
**Explicadores**Interpretan y comunican resultadosAuditorAgent`, `OptimizerAgent

2. El flujo completo de principio a fin

Cuando escribes un prompt como «clasifica emails como spam, normal o urgente», MatrixAI ejecuta este pipeline:

Prompt humano
    |
PromptAgent (determinista) o LLMProposalAgent (con IA externa)
    |
.semantic — un borrador estructurado del modelo
    |
PromptSupervisor — ¿se puede construir un modelo real con esto?
    |
ArchitectAgent — convierte el plan en .mxai
    |
MathematicalAgent — traduce reglas if/then a matemáticas
    |
PlannerVerifier — valida el plan completo
    |
.mxai — el modelo declarativo final
    |
Parser — convierte .mxai en IR (representación interna)
    |
VerifierAgent — valida la IR
    |
SafetyAgent — comprueba que no hay acciones reales sin sandbox
    |
PythonBackendCompiler — compila el modelo a Python ejecutable
    |
Runtime / Entrenamiento / API / Auditoría
La clave del diseño: hay dos caminos de entrada (determinista y con LLM), pero ambos desembocan en el mismo PromptSupervisor. La IA externa puede proponer, pero la aceptación final es siempre determinista.

Una analogía sencilla

Imagina que quieres construir un puente. PromptAgent es el arquitecto que interpreta el encargo del cliente. ArchitectAgent dibuja los planos. MathematicalAgent hace los cálculos estructurales. PlannerVerifier y VerifierAgent son los inspectores técnicos. SafetyAgent es la inspección de seguridad. AuditorAgent explica al cliente qué decisiones se tomaron. Ningún arquitecto puede aprobar sus propios planos.

3. PromptAgent — El punto de entrada determinista

Archivo: matrixai/agents/prompt.py

El PromptAgent convierte tu descripción en lenguaje natural en el primer artefacto estructurado: un archivo .semantic. Lo hace sin llamar a ningún LLM externo. Es completamente determinista.

PasoQué ocurre
1. Normalizar promptLimpia el texto, detecta el idioma, identifica palabras clave de dominio
2. Elegir plantillaSelecciona la plantilla más adecuada para el dominio detectado
3. Inferir el modeloExtrae proyecto, modo, entidad, campos, objetivos y thresholds
4. Extraer reglasIdentifica frases tipo «si X entonces Y» como reglas
5. Emitir `.semantic`Archivo estructurado con toda la información extraída
6. Registrar la trazaDocumenta cada decisión tomada durante la síntesis
PlantillaModoEntidadCuándo se usa
emailClasificaciónEmailCuando el prompt habla de correos o bandeja de entrada
pharmacyRiesgoOrderCuando el prompt habla de dispensación o farmacia
fall_riskRiesgoPatientCuando el prompt habla de riesgo clínico o caídas
generic_riskRiesgoSignalFallback para cualquier prompt de riesgo no reconocido
generic_classificationClasificaciónItemFallback para cualquier prompt de clasificación no reconocido
Limitación conocida: para dominios muy específicos o poco comunes, el agente caerá en la plantilla genérica. Para estos casos, conectar un proveedor LLM externo mejora significativamente la calidad de la propuesta.

Ejemplo de salida

# Prompt de entrada:
"Un sistema que clasifique emails entrantes como urgentes, normales o spam,
usando el asunto, el remitente y la puntuación de confianza"

# .semantic producido:
PROJECT EmailClassifier
INTENT classify incoming emails
MODE classification
ENTITY Email
FIELDS subject, sender, confidence_score
GOAL classify_incoming_email
ACTION send_response IF urgency > 0.85

4. LLMProposalAgent — Cuando se conecta una IA externa

Archivo: matrixai/agents/llm_proposal.py

PromptAgentLLMProposalAgent
**Fuente**Determinista, localLLM externo (o simulado)
**Velocidad**InstantáneoDepende del proveedor
**Calidad en dominios abiertos**Limitada a plantillasAlta
**Reproducibilidad**100% deterministaDepende del LLM
**Coste**Sin coste de APIConsume tokens
**¿Puede aprobar su propia propuesta?**NoNo

Proveedores disponibles

ProveedorEstadoPara qué sirve
DeterministicLLMProposalProviderActivo por defectoUsa el PromptAgent como simulación offline. Sin coste, completamente reproducible.
ChatCompletionsLLMProposalProviderImplementadoLlama a cualquier API compatible con el formato HTTP chat-completions.

Configuración con un LLM externo

MATRIXAI_LLM_API_KEY=tu_clave_de_api
MATRIXAI_LLM_MODEL=gpt-4o
MATRIXAI_LLM_ENDPOINT=https://api.openai.com/v1
MATRIXAI_LLM_PROVIDER_NAME=openai
MATRIXAI_LLM_CANDIDATES=3
MATRIXAI_LLM_TEMPERATURE=0.7
MATRIXAI_LLM_TIMEOUT=30
MATRIXAI_LLM_MAX_RETRIES=2
MATRIXAI_LLM_TOKEN_BUDGET=2000

# O cargados desde un archivo .env:
MATRIXAI_LLM_ENV_FILE=.env.llm

Trazabilidad de las llamadas

Cada llamada queda registrada en un LLMCallTrace con: proveedor, modelo, endpoint, hash del prompt, número de intento, latencia, HTTP status, tokens consumidos y error si lo hubo.

El guardarraíl más importante: incluso si el LLM devuelve algo que parece correcto, la salida se trata como no confiable y pasa por el PromptSupervisor antes de ser aceptada. El LLM propone; MatrixAI decide.

5. PromptSupervisor — La puerta de aceptación

Archivo: matrixai/agents/prompt_supervisor.py

El PromptSupervisor es el agente más importante del sistema. Su trabajo es uno solo: decidir si una propuesta puede convertirse en un modelo real de MatrixAI. Es completamente determinista, no importa si la propuesta vino del PromptAgent o de un LLM externo.

Check 1: architect_plan         ¿Puede convertirse el .semantic en un plan?
Check 2: planner_verifier       ¿El plan cumple reglas estructurales y objetivos?
Check 3: mathematical_rules_resolved  ¿Todas las reglas if/then están traducidas?
Check 4: parser                 ¿El .mxai puede parsearse a IR canónica?
Check 5: verifier_agent         ¿La IR cumple checks de grafo, acciones y tipos?
Check 6: safety_agent           ¿Las acciones respetan el sandbox simulate_only?
Check 7: python_compiler        ¿El backend Python puede compilar el programa?

Qué devuelve si todos los checks pasan

{
  "accepted": true,
  "semantic_text": "...",
  "plan": {},
  "mxai": "PROGRAM EmailClassifier ...",
  "compiled_python": "...",
  "checks": [
    { "name": "architect_plan", "passed": true },
    { "name": "planner_verifier", "passed": true }
  ]
}

Qué devuelve si un check falla

{
  "accepted": false,
  "checks": [
    { "name": "architect_plan", "passed": true },
    { "name": "mathematical_rules_resolved", "passed": false,
      "error": "Regla 'if priority > 0.5 or urgency > 0.8' no resuelta" }
  ]
}

6. ArchitectAgent — Del plan al modelo

Archivo: matrixai/agents/architect.py

El ArchitectAgent toma el .semantic aceptado y lo convierte en un SemanticPlan estructurado y en el archivo .mxai final.

Qué lee del .semantic

BloqueQué extrae
PROJECTNombre del proyecto
INTENTIntención del modelo en texto
MODEclassification` o `risk
ENTITYNombre de la entidad de entrada (Email, Patient, Order…)
FIELDSCampos del vector de entrada
GOALObjetivos de negocio (se pasan al GoalTranslator)
RULESReglas condicionales (se pasan al MathematicalAgent)
CONSTRAINTRestricciones del modelo
ACTION_THRESHOLDUmbral para activar acciones
ACTIONAcciones que el modelo puede ejecutar

Qué genera según el modo

ModoEstructura generada
classificationVector de entrada → `softmax_linear` → distribución `Categorical` → acción simulada → bloque de auditoría
riskVector de entrada → `sigmoid_linear` → distribución `Normal` → acción simulada → bloque de auditoría
El ArchitectAgent conserva el linaje de cada elemento: la relación entre la regla original, su traducción matemática y el nodo del grafo que la implementa. Si alguien pregunta «¿por qué el modelo hace X?», siempre se puede trazar la respuesta hasta la intención original del prompt.

7. GoalTranslator — De objetivos humanos a reglas verificables

El GoalTranslator convierte los objetivos de negocio escritos en lenguaje natural (los bloques GOAL del .semantic) en reglas concretas y verificables que el PlannerVerifier puede comprobar.

Objetivo humanoRegla generadaParámetro
minimize_false_alertsaction_threshold_minUmbral mínimo de 0.85
minimize_false_repliesaction_threshold_minUmbral mínimo de 0.85
maximize_precisionaction_threshold_minUmbral mínimo de 0.85
maximize_safetyaction_threshold_minUmbral mínimo de 0.90
maximize_recallaction_threshold_maxUmbral máximo de 0.75
minimize_latencygraph_nodes_maxMáximo 6 nodos en el grafo
minimize_fall_incidentsdistribution_requiredSe exige distribución `Normal`
classify_incoming_emaildistribution_requiredSe exige distribución `Categorical`

Ejemplo práctico

Si en el prompt escribes «quiero minimizar las falsas alarmas», el GoalTranslator genera una regla: «el umbral para activar cualquier acción debe ser igual o superior a 0.85». El PlannerVerifier comprueba que el modelo efectivamente tiene ese umbral. Si no lo tiene, la propuesta es rechazada antes de convertirse en .mxai. Esto es lo que significa que MatrixAI sea declarativo en un sentido fuerte: describes los objetivos, y el sistema comprueba que el modelo los cumple.

8. MathematicalAgent — De reglas a matemáticas

Archivo: matrixai/agents/mathematical.py

El MathematicalAgent convierte las reglas condicionales del tipo «si X entonces Y» en expresiones matemáticas continuas. Este paso es esencial porque las reglas discretas no son diferenciables (no se pueden usar en entrenamiento) y no son auditables de la misma manera.

¿Por qué convertir reglas a matemáticas?

Una regla como si riesgo > 0.8 entonces alertar tiene un salto brusco exactamente en 0.8 — de «no alertar» a «alertar». Esto crea problemas en el entrenamiento (el gradiente es cero en casi todas partes) y en la auditoría. La solución es sigmoid(20 * (riesgo - 0.8)): una función continua que se comporta de manera similar pero con una transición suave alrededor del umbral.

Regla originalExpresión generadaTipo
si x > umbral entonces acciónsigmoid(20 * (x - umbral))Umbral suave
si x < umbral entonces acciónsigmoid(20 * (umbral - x))Umbral invertido
si a > x y b > y entonces acciónsigmoid(a - x) * sigmoid(b - y)AND probabilístico
si a > x o b > y entonces acciónsigmoid(a-x) + sigmoid(b-y) - sigmoid(a-x)*sigmoid(b-y)OR probabilístico
clasificar x en a, b, csoftmax([score_a, score_b, score_c])Multiclase
puntuacion = 0.6 * a + 0.4 * bExpresión simbólicaSuma ponderada
agregar a, b usando mean/max/minmean(a, b)` / `max(a, b)` / `min(a, b)Agregación
normalizar x al rango [0, 10]scale(x, 0, 10)Normalización
elegir el mejor de candidatosargmax(scores)Selección
Si el MathematicalAgent encuentra una regla que no encaja en ningún patrón, la marca como unresolved. El PromptSupervisor bloquea la aceptación si quedan reglas sin resolver.
{
  "check": "mathematical_rules_resolved",
  "passed": false,
  "error": "Regla 'if patient.history matches pattern X' no resuelta — patrón de texto no soportado"
}

9. PlannerVerifier — Validar antes de construir

CategoríaQué comprueba
ProyectoIdentificador válido (sin caracteres especiales)
ModoDebe ser `classification` o `risk`
Vector de entradaNombre válido, al menos 2 campos, sin duplicados
FuncionesCada función tiene nombre, output declarado y expresión
DistribucionesClasificación → `Categorical`, Riesgo → `Normal`
GrafoNodos y edges coherentes, sin nodos declarados y no conectados
AccionesEn el grafo, política `simulate_only`, umbral en [0, 1]
AuditoríaCadena empieza en vector de entrada y termina en acción

10. VerifierAgent — Validar el modelo ya construido

El VerifierAgent valida la IR del modelo ya parseado. Trabaja sobre el MatrixAIProgram — la representación interna después de parsear el .mxai.

El PlannerVerifier trabaja sobre el plan semántico (antes del .mxai). El VerifierAgent trabaja sobre la IR canónica (después de parsear el .mxai). Son dos representaciones distintas y los errores que detecta cada uno son distintos.
CheckQué comprueba
`GRAPH` no vacíoEl modelo tiene al menos un nodo
Nodos declaradosCada nodo mencionado en el grafo está definido
Acciones en el grafoLas acciones están conectadas al grafo
Operadores de acciónSolo se usan `>`, `>=`, `<`, `<=`
Condiciones de acciónLa fuente de cada condición está declarada en el vector de entrada
Acciones con políticaToda acción tiene una política de ejecución
Distribuciones con sourceToda distribución indica de dónde lee su valor
`AUDIT EXPLAIN` en el grafoEl bloque de auditoría está conectado
Grafo acíclicoNo hay dependencias circulares
Tipos P2Los tipos de campos y expresiones son consistentes

El check de grafo acíclico

Un grafo con ciclos significaría dependencias circulares (A depende de B, B depende de A), lo que haría la ejecución infinita o indefinida. MatrixAI lo rechaza siempre.

11. SafetyAgent — El guardia de seguridad

ReglaQué verifica
Sin acciones realesNinguna acción puede ejecutar código fuera del sandbox simulado
Exige política simuladaTodas las acciones deben tener `POLICY simulate_only`
Rechaza llamadas externasLas llamadas deben ser `simulated.*`, no HTTP, SQL u otras

Para acciones reales se requiere: archivo .mxact explícito, flag --allow-real-actions, variable MATRIXAI_ALLOW_REAL_ACTIONS=true y clave HMAC de firma.

Mensajes de seguridad

"Acción 'send_email' tiene executor_kind=real pero POLICY no es real_with_approval"
"Acción 'update_db' llama a 'database.write' fuera del espacio simulated.*"

12. AuditorAgent — La explicación para humanos

El AuditorAgent no valida ni genera modelos. Su trabajo es convertir el resultado de una ejecución en una explicación que cualquier persona pueda entender.

Qué explica

  • Si no se activó ninguna acción: por qué no, qué valores se evaluaron, qué umbral no se alcanzó
  • Si una acción quedó activa: qué valor desencadenó la acción, desde qué fuente, con qué umbral
  • Si una acción quedó inactiva: qué condición no se cumplió y por cuánto
  • Que la ejecución fue simulada: texto explícito de que no ocurrió ningún efecto real
  • Qué nodos se evaluaron: la traza completa del recorrido del dato por el grafo
Resultado de la evaluación:

El modelo clasificó este email como "urgent" con una probabilidad de 0.94.

Factores que influyeron en la clasificación:
- El score del remitente (0.95) superó el umbral de confianza (0.85)
- El asunto del email activó señales de urgencia con intensidad 0.91

Acción propuesta: send_priority_response
- Estado: SIMULADA — no se ha enviado ningún email real
- Umbral de activación: 0.85
- Valor observado: 0.94 (umbral superado)

Nodos evaluados: Email → EmailScoring → UrgencyClassifier → Categorical → Action
En entornos donde la IA toma decisiones sobre personas (riesgo médico, crédito, farmacia), no basta con saber el resultado: es necesario poder explicarlo a un auditor o al propio afectado. El AuditorAgent hace posible esa explicación sin que el revisor necesite saber leer el .mxai.

13. OptimizerAgent — Sugerencias de mejora

El OptimizerAgent analiza el modelo y sugiere mejoras. Solo sugiere: no modifica el modelo por su cuenta.

TipoCuándo se activaQué propone
merge_linear_activationsoftmax_linear` seguido de `sigmoid_thresholdFusionar las dos operaciones en una
cache_embeddingVector con fan-out a más de dos nodosCalcular el embedding una vez y reutilizarlo
prune_isolated_nodesNodos declarados fuera del `GRAPH`Eliminar nodos no conectados
simplify_graphMás de 7 nodosRevisar si hay nodos intermedios innecesarios
annotate_expressionFunción con `kind == "unknown"`La expresión no fue reconocida; añadir anotación
review_fan_inNodo recibe entradas de 3+ nodosRevisar si la alta convergencia es intencional

Ejemplo de informe

Informe OptimizationReport para EmailClassifier:

[SUGERENCIA] merge_linear_activation
  Nodo: UrgencyClassifier -> sigmoid_threshold
  softmax_linear + sigmoid_threshold puede fusionarse
  Impacto esperado: reducción ~15% en tiempo de inferencia

[SUGERENCIA] simplify_graph
  Nodos actuales: 9 (umbral recomendado: 7)
  Revisar si 'IntermediateScore' y 'NormalizedScore' pueden fusionarse

Sin cambios aplicados. Todas las sugerencias son informativas.

14. Qué ocurre después de los agentes

.mxai aceptado
    |
Runtime interpretado — ejecuta el modelo sin compilar, para pruebas rápidas
    |
PythonBackendCompiler — compila a Python puro para ejecución autónoma
    |
DifferentiablePythonCompiler — versión entrenable del modelo
    |
BackendContractAnalyzer — analiza la portabilidad a distintos backends
    |
Entrenamiento (P4/P5) — ajusta los parámetros con datos reales
    |
Servidor HTTP (P6) — sirve el modelo como API REST
    |
Studio (P6.5) — interfaz visual para explorar el modelo
La fuente de verdad nunca cambia: los agentes proponen y verifican, pero la fuente de verdad siempre es el .mxai, el .mxtrain, el ParameterSet, los manifiestos, las métricas y las trazas.

15. Referencia rápida

AgenteTipoEntradaSalidaDeterminista
PromptAgentGeneradorTexto libre`.semantic` + traza
LLMProposalAgentGeneradorTexto libre`.semantic` (propuesta)Depende del proveedor
PromptSupervisorPuertaPrompt / `.semantic`SupervisionReportSiempre sí
ArchitectAgentGenerador.semanticSemanticPlan` + `.mxai
GoalTranslatorTraductorGoals en textoVerificationRule
MathematicalAgentTraductorReglas if/thenExpresiones matemáticas
PlannerVerifierVerificadorSemanticPlanPlanVerificationResult
VerifierAgentVerificador`MatrixAIProgram` (IR)VerificationResult
SafetyAgentVerificadorMatrixAIProgramErrores/warnings de seguridad
AuditorAgentExplicadorResultado de runtimeTexto humano
OptimizerAgentExplicadorMatrixAIProgramOptimizationReport

Los 7 checks del PromptSupervisor

#CheckQué bloquea si falla
1architect_planEl `.semantic` no puede convertirse en plan
2planner_verifierEl plan no cumple reglas estructurales u objetivos
3mathematical_rules_resolvedQuedan reglas if/then sin traducir
4parserEl `.mxai` tiene errores de sintaxis
5verifier_agentLa IR no cumple los contratos de grafo, tipos o acciones
6safety_agentHay acciones que no respetan el sandbox simulate_only
7python_compilerEl modelo no puede compilarse a Python ejecutable

Variables de entorno para LLM externo

VariableQué controla
MATRIXAI_LLM_API_KEYClave de autenticación del proveedor
MATRIXAI_LLM_MODELModelo a usar (ej. `gpt-4o`, `claude-3-5-sonnet`)
MATRIXAI_LLM_ENDPOINTURL base de la API
MATRIXAI_LLM_PROVIDER_NAMENombre del proveedor (para trazas)
MATRIXAI_LLM_CANDIDATESNúmero de propuestas a generar
MATRIXAI_LLM_TEMPERATURECreatividad (0 = determinista, 1 = creativo)
MATRIXAI_LLM_TIMEOUTSegundos de espera máxima por llamada
MATRIXAI_LLM_MAX_RETRIESReintentos ante fallos de red
MATRIXAI_LLM_TOKEN_BUDGETLímite de tokens por llamada
MATRIXAI_LLM_ENV_FILERuta a un archivo `.env` con las variables anteriores
Parte 2
Referencia CLI y API REST
Cada agente mapeado al comando CLI exacto y al endpoint HTTP que lo invoca, lo inspecciona o lo depura. Úsalo junto a la Parte 1 cuando necesites saber exactamente qué escribir.

16. Mapa general: agente → comando → endpoint

AgenteCLI principalEndpoint Studio
PromptAgentmatrixai promptPOST /api/analyze
LLMProposalAgentmatrixai propose`POST /api/analyze` (con LLM)
PromptSupervisormatrixai supervise-prompt`POST /api/analyze` (automático)
ArchitectAgentmatrixai architectPOST /api/analyze
MathematicalAgentmatrixai mathematize`POST /api/analyze` (interno)
PlannerVerifiermatrixai validate-plan`POST /api/analyze` (interno)
VerifierAgentmatrixai validate`POST /api/analyze` (interno)
SafetyAgentmatrixai permissions`POST /api/analyze` (interno)
AuditorAgent`matrixai run` (salida auditada)POST /api/studio/run-executive
OptimizerAgentmatrixai optimize`POST /api/analyze` (interno)
El endpoint /api/analyze ejecuta el pipeline completo de agentes en secuencia. Los agentes individuales no tienen endpoints propios. Cuando el body incluye mxai_text directamente (en lugar de prompt), el pipeline salta el PromptAgent y empieza desde el parser.

17. PromptAgent — CLI y API

CLI

# Forma básica: ver el .mxai en pantalla
matrixai prompt "clasifica emails como spam, normal o urgente"

# Guardar el .mxai generado
matrixai prompt "clasifica emails como spam, normal o urgente" -o email.mxai

# Ver el .semantic intermedio que generó el PromptAgent
matrixai prompt "clasifica emails como spam, normal o urgente" --semantic

# Leer la descripción desde un fichero
cat mi_descripcion.txt | matrixai prompt - -o modelo.mxai

# Resultado completo como JSON (incluye .semantic, .mxai, traza y checks)
matrixai prompt "clasifica emails como spam, normal o urgente" --json

# Si el modelo generado no es lo que esperabas:
matrixai prompt "mi descripción" --semantic -o borrador.semantic
# ... editar borrador.semantic ...
matrixai supervise-prompt "mi descripción" --proposal borrador.semantic

API REST (Studio — puerto 8080)

curl -X POST http://localhost:8080/api/analyze \
  -H "Content-Type: application/json" \
  -d '{"prompt": "clasifica emails como spam, normal o urgente"}'

# Respuesta:
# { "ok": true, "semantic_text": "...", "mxai": "PROGRAM EmailClassifier ...",
#   "pipeline_stages": [
#     { "name": "prompt_agent", "ok": true },
#     { "name": "architect",    "ok": true },
#     { "name": "verifier",     "ok": true },
#     { "name": "safety",       "ok": true },
#     { "name": "compiler",     "ok": true }
#   ],
#   "supervision_source": "deterministic" }

18. LLMProposalAgent — CLI y API

# Variables de entorno necesarias
export MATRIXAI_LLM_API_KEY=tu_clave_de_api
export MATRIXAI_LLM_MODEL=gpt-4o
export MATRIXAI_LLM_ENDPOINT=https://api.openai.com/v1
export MATRIXAI_LLM_PROVIDER_NAME=openai
export MATRIXAI_LLM_CANDIDATES=3
export MATRIXAI_LLM_TEMPERATURE=0.7

# Con LLM externo (requiere variables de entorno configuradas)
matrixai propose "sistema de evaluación de riesgo hipotecario" \
  --provider chat-completions-compatible --max-candidates 3

# Modo determinista (sin LLM, usa PromptAgent como stand-in)
matrixai propose "sistema de evaluación de riesgo hipotecario" \
  --provider deterministic --max-candidates 2

# Comprobar qué modo está activo en el servidor:
curl http://localhost:8080/api/studio/status
# { "ok": true, "llm_mode": { "active": true, "provider": "openai", "model": "gpt-4o" } }
# Si "active": false → el servidor usa DeterministicLLMProposalProvider (fallback)

19. PromptSupervisor — CLI y API

# Supervisar un .semantic generado previamente o editado a mano
matrixai supervise-prompt "descripción original del modelo" \
  --proposal mi_modelo.semantic

# Ver todos los checks en JSON
matrixai supervise-prompt "descripción original del modelo" \
  --proposal mi_modelo.semantic --json

# Leer el resultado del PromptSupervisor programáticamente
matrixai prompt "clasifica emails" --json | python3 -c "
import json, sys
data = json.load(sys.stdin)
print('Aceptado:', data.get('accepted', 'N/A'))
for check in data.get('checks', []):
    estado = '✓' if check['passed'] else '✗'
    print(f'  {estado} {check["name"]}')
    if not check['passed']:
        print(f'    ERROR: {check.get("error", "")}')
"
# Cuando un check falla, los siguientes aparecen con "skipped": true
# { "ok": false, "pipeline_stages": [
#     { "name": "architect_plan",              "ok": true  },
#     { "name": "mathematical_rules_resolved", "ok": false,
#       "error": "Regla 'if category matches pattern X' no resuelta" },
#     { "name": "parser",         "ok": false, "skipped": true }
#   ] }

20. ArchitectAgent — CLI y API

# Convertir un .semantic existente en .mxai
matrixai architect mi_modelo.semantic -o mi_modelo.mxai

# Flujo típico: generar el .semantic primero, luego arquitectar
matrixai prompt "evalúa el riesgo de caída de pacientes" --semantic -o riesgo.semantic
matrixai architect riesgo.semantic -o riesgo_caida.mxai

# Studio: ejecutar sobre un .mxai ya existente
curl -X POST http://localhost:8080/api/studio/run-executive \
  -H "Content-Type: application/json" \
  -d '{
    "mxai": "PROGRAM RiskAssessment ...",
    "input_json": "{"age": 75, "balance_score": 0.3}",
    "mxai_name": "RiskAssessment"
  }'

21. MathematicalAgent — CLI y API

# Traducir desde un fichero de reglas
matrixai mathematize reglas_negocio.txt

# Desde stdin (una regla directa)
echo "si riesgo > 0.8 entonces alertar" | matrixai mathematize -

# Múltiples reglas
cat << 'EOF' | matrixai mathematize -
si historial_impagos > 0.6 entonces rechazar
si ingresos < 15000 y deuda > 0.5 entonces revision
si score_credito > 0.7 o garantia > 100000 entonces aprobar
clasificar solicitud en aprobada, revision, rechazada
EOF

# Salida esperada (ejemplo):
# si riesgo > 0.75 entonces protocolo
#   -> sigmoid(20 * (riesgo - 0.75))   [kind: sigmoid_threshold]
#
# si edad > 80 y balance < 0.4 entonces urgente
#   -> sigmoid(20*(edad-80)) * sigmoid(20*(0.4-balance))   [kind: sigmoid_and]

22. PlannerVerifier — CLI y API

# Validar un .semantic antes de arquitectar
matrixai validate-plan mi_modelo.semantic --json

# Flujo completo de validación pre-generación:
matrixai prompt "mi descripción" --semantic -o borrador.semantic
matrixai validate-plan borrador.semantic
matrixai architect borrador.semantic -o modelo.mxai
matrixai validate modelo.mxai

# Interpretar la salida:
matrixai validate-plan mi_modelo.semantic --json | python3 -c "
import json, sys
result = json.load(sys.stdin)
if result.get('ok'): print('Plan válido')
else:
    for e in result.get('errors', []):   print(f'  ERROR: {e}')
    for w in result.get('warnings', []): print(f'  WARN:  {w}')
"

23. VerifierAgent — CLI y API

# Validar el .mxai (ejecuta el VerifierAgent sobre la IR)
matrixai validate email_classifier.mxai

# Lint: errores + advertencias (más detallado que validate)
matrixai lint email_classifier.mxai

# Lint estricto para CI/CD (falla si hay cualquier advertencia)
matrixai lint email_classifier.mxai --strict

# Ver la IR que valida el VerifierAgent
matrixai parse email_classifier.mxai

# Verificar tipos (sistema de tipos P2)
matrixai typecheck email_classifier.mxai

# Ejemplo de error de validate:
# ERROR: Nodo 'EmailScoring' referenciado en GRAPH pero no declarado
# ERROR: Acción 'send_reply' usa operador 'contains' — solo: >, >=, <, <=
# WARN:  Nodo 'TempScore' declarado fuera del GRAPH (nodo aislado)

# Integración CI:
# - run: |
#     matrixai validate email_classifier.mxai
#     matrixai lint email_classifier.mxai --strict
#     matrixai typecheck email_classifier.mxai

24. SafetyAgent — CLI y API

# Ver qué permisos necesita el modelo y si respeta el sandbox
matrixai permissions email_classifier.mxai

# Salida (modelo simulado correctamente):
# Acciones declaradas:
#   - send_reply
#     Política:   simulate_only ✓
#     Llamada:    simulated.email.send ✓
#     Sandbox:    OK — no requiere permisos reales

# Salida (violación de seguridad):
# ERROR: Acción 'update_database'
#   Política:   real_execution ✗ — requiere sandbox o contrato .mxact
#   Llamada:    database.write ✗ — fuera del espacio simulated.*

# Para acciones reales (requiere contrato y habilitación explícita):
matrixai validate-actions contrato.mxact email_classifier.mxai
matrixai dry-run-action contrato.mxact email_classifier.mxai \
  --contract-name EnviarRespuesta \
  --input '{"subject": "URGENTE", "urgency_score": 0.92}'
matrixai execute-action contrato.mxact email_classifier.mxai \
  --contract-name EnviarRespuesta --allow-real-actions \
  --signing-key $MATRIXAI_ACTION_SIGNING_KEY \
  --input '{"subject": "URGENTE", "urgency_score": 0.92}'

25. AuditorAgent — CLI y API

CLI

# Ejecutar el modelo — la salida ya incluye la explicación del AuditorAgent
matrixai run email_classifier.mxai \
  --params runs/v1/params.best.json \
  --input '{"subject": "URGENTE: sistema caído", "sender_score": 0.95, "body_length": 90}'

# Clasificación: urgent (probabilidad: 0.94)
# Factores: sender_score (0.95) superó umbral 0.85
# Acción: send_priority_response — SIMULADA (no se envió ningún email real)
# Nodos: Email → EmailScoring → UrgencyClassifier → Categorical → Action

matrixai run email_classifier.mxai --params runs/v1/params.best.json \
  --input entrada.json --json | python3 -c "
import json, sys
result = json.load(sys.stdin)
print('Resultado:', result.get('result'))
for factor in result.get('influential_factors', []):
    print(f'  - {factor}')
"

API REST

# Studio — análisis ejecutivo de un modelo existente
curl -X POST http://localhost:8080/api/studio/run-executive \
  -H "Content-Type: application/json" \
  -d '{
    "mxai": "PROGRAM EmailClassifier ...",
    "input_json": "{"subject": "URGENTE: sistema caído", "sender_score": 0.95}",
    "mxai_name": "EmailClassifier"
  }'

# Studio — simular un caso guiado
curl -X POST http://localhost:8080/api/studio/simulate \
  -H "Content-Type: application/json" \
  -d '{
    "case_id": "fall-risk",
    "input_values": { "age": 78, "balance_score": 0.28, "previous_falls": 2 }
  }'

# Producción — predicción con trazabilidad
curl -X POST http://localhost:8000/predict \
  -H "Authorization: Bearer $MATRIXAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"age": 78, "balance_score": 0.28, "previous_falls": 2}'

26. OptimizerAgent — CLI y API

# Ver las sugerencias del OptimizerAgent
matrixai optimize email_classifier.mxai

# [SUGERENCIA] merge_linear_activation
#   Nodo: UrgencyClassifier -> sigmoid_threshold
#   softmax_linear + sigmoid_threshold puede fusionarse
#   Impacto: ~15% reducción en tiempo de inferencia

# Como JSON para procesamiento automático:
matrixai optimize email_classifier.mxai --json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for s in data.get('suggestions', []):
    print(f'  [{s["kind"]}] {s["description"]}')
"

# Via API Studio (sugerencias en la respuesta de /api/analyze):
curl -X POST http://localhost:8080/api/analyze \
  -H "Content-Type: application/json" \
  -d '{"mxai_text": "PROGRAM EmailClassifier ..."}'

27. Flujo completo trazado con comandos

Descripción en texto
        |
        |-- CLI: matrixai prompt "descripción"
        |-- CLI: matrixai propose "descripción" --provider chat-completions-compatible
        |-- API: POST /api/analyze  { "prompt": "descripción" }
        |
        v
   PromptAgent / LLMProposalAgent (genera .semantic)
        |
        |-- Inspeccionar: matrixai prompt "..." --semantic
        |-- Editar+supervisar: matrixai supervise-prompt "..." --proposal borrador.semantic
        v
   PromptSupervisor → ArchitectAgent (genera SemanticPlan + .mxai)
        |-- Directo: matrixai architect borrador.semantic -o modelo.mxai
        v
   MathematicalAgent
        |-- Directo: matrixai mathematize reglas.txt
        v
   PlannerVerifier
        |-- Directo: matrixai validate-plan borrador.semantic
        v
   Parser → VerifierAgent
        |-- Validar:  matrixai validate modelo.mxai
        |-- Detalle:  matrixai lint modelo.mxai
        |-- Tipos:    matrixai typecheck modelo.mxai
        v
   SafetyAgent
        |-- Permisos: matrixai permissions modelo.mxai
        v
   PythonBackendCompiler
        |-- Compilar:    matrixai compile modelo.mxai -o compilado.py
        |-- Portabilidad: matrixai backend-report modelo.mxai
        v
   .mxai ACEPTADO
        |
        +-- Ejecución (AuditorAgent): matrixai run modelo.mxai --input entrada.json --params params.json
        |   API producción: POST /predict
        |   API Studio:     POST /api/studio/run-executive
        |
        +-- Optimización (OptimizerAgent): matrixai optimize modelo.mxai
        |
        +-- Entrenamiento: matrixai train modelo.mxai --training contrato.mxtrain -o runs/v1/
        |
        +-- Servicio: matrixai serve modelo.mxai --params runs/v1/params.best.json --api-key CLAVE
        |
        +-- Studio:   matrixai studio --open

28. Depurar el pipeline por agente

Check que fallaQué significaCómo investigar
architect_planEl `.semantic` no puede convertirse en plan`matrixai prompt "..." --semantic` y revisar el `.semantic` generado
planner_verifierEl plan tiene errores estructuralesmatrixai validate-plan borrador.semantic --json
mathematical_rules_resolvedQuedan reglas if/then sin traducir`matrixai mathematize reglas.txt` para ver qué se puede traducir
parserEl `.mxai` tiene errores de sintaxis`matrixai parse modelo.mxai` para localizar el error
verifier_agentLa IR no cumple los contratos`matrixai lint modelo.mxai --json` para ver todos los errores
safety_agentHay acciones fuera del sandboxmatrixai permissions modelo.mxai --json
python_compilerEl modelo no compila a Python`matrixai compile modelo.mxai` para ver el error

Script de diagnóstico completo

#!/bin/bash
# diagnostico_pipeline.sh <fichero.mxai>
MODELO=$1
echo "=== Diagnóstico del pipeline: $MODELO ==="

echo "1. Validación estructural:"
matrixai validate "$MODELO" && echo "   OK" || echo "   FALLO"

echo "2. Lint (errores + advertencias):"
matrixai lint "$MODELO" --json | python3 -c "
import json, sys
data = json.load(sys.stdin)
errors   = [d for d in data.get('diagnostics', []) if d.get('severity') == 'error']
warnings = [d for d in data.get('diagnostics', []) if d.get('severity') == 'warning']
print(f'   Errores: {len(errors)}, Advertencias: {len(warnings)}')
for e in errors: print(f'   ERROR: {e.get("message")}')
"
echo "3. Verificación de tipos:"
matrixai typecheck "$MODELO" && echo "   OK" || echo "   FALLO"

echo "4. Permisos de seguridad:"
matrixai permissions "$MODELO" --json | python3 -c "
import json, sys; data = json.load(sys.stdin)
print(f'   Estado: {data.get("safety_status", "desconocido")}')
"
echo "5. Compatibilidad de backend:"
matrixai backend-report "$MODELO" --json | python3 -c "
import json, sys; data = json.load(sys.stdin)
print(f'   differentiable_python: {data.get("compatible", "desconocido")}')
for b in data.get('blocking_issues', []): print(f'   BLOQUEANTE: {b}')
"
echo "6. Sugerencias de optimización:"
matrixai optimize "$MODELO" --json | python3 -c "
import json, sys; data = json.load(sys.stdin)
for s in data.get('suggestions', []): print(f'   -> {s.get("kind")}: {s.get("description")}')
" || echo "   Sin sugerencias"
echo "=== Diagnóstico completado ==="

# Uso:
# chmod +x diagnostico_pipeline.sh
# ./diagnostico_pipeline.sh email_classifier.mxai
Tipos de agentes y reglas de diseño de MatrixAI
Tipos de agentes, checks de verificación y las 7 reglas de oro del diseño