FleetQ
Centro de control de misiones para agentes de IA: más de 200 herramientas MCP para gestionar agentes, experimentos, flujos de trabajo, equipos, habilidades, aprobaciones, presupuestos y más.
Documentación
FleetQ — Plataforma de Orquestación de Agentes de IA de Código Abierto
Centro de control autoalojado para agentes de IA. Construye, ejecuta y supervisa sistemas autónomos multiagente con un constructor visual de DAG, aprobaciones con intervención humana, integración con servidores MCP y registro de auditoría completo. Funciona con Claude, GPT-4o, Gemini, Ollama, Codex, Claude Code y cualquier LLM compatible con OpenAI.
Palabras clave: agentes de IA · orquestación de agentes · servidor MCP · Protocolo de Contexto de Modelo · alternativa a LangGraph · alternativa a CrewAI · n8n para IA · agentes Claude · flujo de trabajo LLM · agentes autónomos · marco de agentes · automatización de IA · autoalojado
☁️ ¿Prefieres la versión gestionada? Prueba FleetQ Cloud — sin configuración, plan gratuito. ⭐ ¿Te gusta el proyecto? Dale una estrella en GitHub — ayuda a que otros encuentren FleetQ.
Tabla de Contenidos
- ¿Por qué FleetQ?
- Conceptos Clave
- Capturas de Pantalla
- Características
- Casos de Uso
- Cómo se compara FleetQ
- Inicio Rápido
- Autenticación
- Configuración
- Acceso a Hosts SSH
- Arquitectura
- Servidor MCP (675+ herramientas)
- Stack Tecnológico
- Contribuciones
- Registro de Cambios
¿Por qué FleetQ?
La mayoría de los marcos de agentes te dan un cuaderno de Python. FleetQ te da una plataforma de producción.
- 🧩 675+ herramientas MCP en 45 dominios — cada característica está expuesta a través del Protocolo de Contexto de Modelo, por lo que cualquier LLM (Claude Desktop, Cursor, ChatGPT, agentes locales) puede manejar la plataforma programáticamente. Nuevo en 1.27: interfaces web para capacidades previamente sin interfaz (sesiones de agentes, claves de firma de versiones, monitores de deriva y evaluación, transmisiones, suites de pruebas, importación CSV); ocho canales de chat salientes como controladores de primera clase; el Volante de IA Agéntica (conjunto de evaluación auto-creciente + monitores de deriva/producción); autonomía gobernada por políticas (políticas por agente versionadas + reproducción); orquestación consciente de costos y métricas de Retorno sobre Gasto Cognitivo (ROCS).
- 🔁 Flujos de trabajo DAG visuales con 8 tipos de nodos (agente, condicional, tarea humana, interruptor, bifurcación dinámica, hacer-mientras, compensación, subflujo) — sin código de pegamento en Python.
- 👥 Equipos multiagente con roles de coordinador/trabajador/revisor, puntuación de control de calidad ponderada y validación cruzada.
- 🛡️ Gobernanza de Acciones del Mundo Real — llamadas de herramientas del asistente, escrituras de integraciones y envíos de git pasan por una política de riesgo por nivel (automático / preguntar / rechazar para bajo / medio / alto). Las aprobaciones se ejecutan automáticamente. Registro de auditoría adjunto.
- 💰 Controles de presupuesto con un libro mayor de créditos real, bloqueo pesimista y pausa automática en caso de gasto excesivo — no solo contadores de tokens.
- 🧠 Evolución de agentes — el LLM analiza el historial de ejecución y propone cambios de configuración que apruebas con un clic.
- ⚙️ BYOK + LLMs locales — Anthropic, OpenAI, Google, además de Ollama, LM Studio, vLLM, Codex, Claude Code. Cero dependencia de proveedor.
- 🔒 Grado de producción — aislamiento de inquilinos, bóveda de credenciales cifrada, webhooks HMAC, protecciones SSRF, interruptores de circuito, registro de auditoría.
- 📊 Observabilidad OpenTelemetry — códigos de error estructurados (canónicos gRPC), propagación de plazos, trazado distribuido. Interfaz Jaeger a un comando de distancia. Puntos finales de colector OTLP por equipo para observabilidad BYO.
- 📈 Gráfico de equipo en vivo — visualización de fuerza dirigida con Cytoscape.js de agentes, humanos y equipos. Actualizaciones en tiempo real a través de Laravel Reverb WebSockets.
- 🏠 Autoalojado o en la nube — licencia AGPLv3 amigable con MIT, se ejecuta en Docker Compose, o usa FleetQ Cloud.
Conceptos Clave
| Concepto | Qué es | Cuándo usarlo |
|---|---|---|
| Agente | Una personalidad de IA configurada con rol, objetivo, historia, habilidades y acceso a herramientas | La unidad básica — un agente por tarea especializada |
| Habilidad | Un prompt de LLM reutilizable, regla, conector o llamada de cómputo GPU | Cuando varios agentes necesitan la misma capacidad |
| Experimento | Una ejecución con estado a través de un pipeline de 20 etapas (puntuación → planificación → construcción → ejecución → evaluación) | Cualquier tarea de agente no trivial con ciclo de vida |
| Equipo | Un grupo de agentes trabajando en un objetivo (secuencial, paralelo, jerárquico, adversarial, fan-out, sala de chat) | Tareas con múltiples perspectivas o cuando necesitas revisión/control de calidad |
| Flujo de trabajo | Una plantilla DAG visual (reutilizable entre experimentos) con ramificaciones, bucles, tareas humanas | Procesos recurrentes — CI/CD, pipelines de contenido, flujos de control de calidad |
| Proyecto | Un contenedor continuo (programado con cron) o de una sola vez para experimentos, con presupuesto + hitos | Iniciativas de largo plazo, trabajo de agentes programado |
| Señal | Un evento entrante (webhook, RSS, correo electrónico, informe de error, problema de GitHub) que puede activar agentes | Automatización impulsada por eventos |
| Herramienta MCP | Una acción programática que cualquier LLM puede llamar para consultar o modificar la plataforma | Exponer FleetQ a agentes externos (Claude, Cursor, etc.) |
Capturas de Pantalla
|
Panel de Control Vista general de KPIs con experimentos activos, tasa de éxito, gasto de presupuesto y aprobaciones pendientes.
|
Galería de Plantillas de Agentes Explora 14 plantillas de agentes preconstruidas en 5 categorías. Busca, filtra por categoría y despliega con un clic.
|
|
Configuración LLM del Agente Selección de proveedor y modelo por agente con cadenas de respaldo. Compatible con Anthropic, OpenAI, Google y agentes locales.
|
Evolución de Agentes Auto-mejora de agentes impulsada por IA. Analiza el historial de ejecución, propone cambios de personalidad y configuración, y aplícalos con un clic.
|
|
Ejecución de Equipos Seguimiento de progreso en vivo durante la ejecución de equipos multiagente. Cada tarea muestra su habilidad asignada, proveedor y tiempo transcurrido.
|
Salida de Tareas Expande cualquier tarea completada para inspeccionar la salida generada por IA, incluyendo respuestas JSON estructuradas.
|
|
Constructor Visual de Flujos de Trabajo Editor de flujos de trabajo basado en DAG con ramificaciones condicionales, tareas humanas, nodos de interruptor y bifurcaciones dinámicas.
|
Gestión de Herramientas Gestiona servidores MCP, herramientas integradas e integraciones externas con clasificación de riesgo y asignación por agente.
|
|
Barra Lateral de Asistente de IA Chat de IA consciente del contexto integrado en cada página con 28 herramientas integradas para consultar y gestionar la plataforma.
|
Detalle de Experimento Vista completa del ciclo de vida del experimento con línea de tiempo, tareas, transiciones, artefactos, métricas y entrega saliente.
|
|
Configuración y Webhooks Configuración global de la plataforma, claves de proveedores de IA (BYOK), conectores salientes y configuración de webhooks.
|
Manejo de Errores Las tareas fallidas muestran información detallada del error, incluyendo proveedor, tipo de error e IDs de solicitud para depuración.
|
Características
Agentes, equipos y flujos de trabajo
- Agentes de IA — rol, objetivo, historia, rasgos de personalidad, asignaciones de habilidades, cadenas de respaldo de proveedor/modelo por agente
- Plantillas de Agentes — 14 plantillas preconstruidas en 5 categorías (ingeniería, contenido, negocios, diseño, investigación)
- Evolución de Agentes — el LLM analiza el historial de ejecución, propone cambios de configuración, aprobación con un clic
- Equipos de Agentes — equipos multiagente con roles de coordinador/QA/trabajador, 7 tipos de procesos (secuencial, paralelo, jerárquico, auto-reclamo, adversarial, fan-out, sala de chat), puntuación de control de calidad ponderada
- Fase de Exploración Pre-Ejecución — llamada previa LLM económica que identifica qué conocimiento necesita el agente → búsqueda semántica dirigida en lugar de recuperación genérica
- Conciencia de Presupuesto de Pasos — el prompt del sistema del agente apunta al 80% de los pasos permitidos para el trabajo central, reservando el resto para síntesis
- Pipeline de Experimentos — máquina de estados de 20 etapas con progresión automática (puntuación → planificación → construcción → aprobación → ejecución → métricas → evaluación)
- DAG de Flujo de Trabajo Visual — 8 tipos de nodos (agente, condicional, tarea humana, interruptor, bifurcación dinámica, hacer-mientras, compensación, subflujo). Plantilla preconstruida de Ciclo de Desarrollo Web. Generador de flujos de trabajo desde lenguaje natural.
- Proyectos — proyectos de una sola vez y continuos con programación cron, límites de presupuesto, hitos, políticas de superposición
LLMs y cómputo
- BYOK — trae tus propias claves para Anthropic (Claude), OpenAI (GPT-4o), Google (Gemini)
- LLMs locales — Ollama, LM Studio, vLLM, llama.cpp a través de puntos finales compatibles con OpenAI; 17 modelos Ollama preconfigurados; protección SSRF
- Agentes locales — Codex y Claude Code como backends de ejecución (auto-detectados, costo cero)
- Puerta de enlace Portkey — opcional, plug-and-play que desbloquea 250+ proveedores de LLM con caché semántica y respaldos
- Integración GPU RunPod — invoca puntos finales serverless de RunPod o gestiona ciclos de vida completos de pods GPU como habilidades; clave API BYOK; precios spot
- Proveedores de Cómputo Conectables —
gpu_computehabilidades respaldadas por RunPod, Replicate, Fal.ai, Vast.ai - Puerta de enlace de IA — independiente del proveedor a través de PrismPHP con middleware de 6 capas (límite de velocidad, presupuesto, idempotencia, caché semántica, validación de esquema, seguimiento de uso), interruptores de circuito, cadenas de respaldo
- Caché Semántica — similitud de coseno respaldada por pgvector (umbral 0.92) caché entre equipos — reduce el gasto de LLM en prompts repetidos
Señales, disparadores, salientes
- Conectores de señales — 20+ controladores: webhook, RSS, IMAP, Slack, Discord, WhatsApp, GitHub, Linear, Jira, PagerDuty, Sentry, Datadog, ClearCue, Telegram, Matrix, Notion, Confluence, Screenpipe, Searxng, más
- Señales de informes de errores — pipeline de QA ligero con widget JS público, captura de captura de pantalla + consola + red + registro de acciones, comentarios en hilos (reportador + agente + soporte), delegación de agentes, escalamiento SLA
- Reglas de disparo — automatización impulsada por eventos con evaluador de condiciones, pruebas en seco
- Salientes multicanal — Correo electrónico (SMTP), Webhook, ntfy más ocho canales de chat como controladores de primera clase (Telegram, Slack, Discord, Microsoft Teams, Google Chat, Matrix, Signal, Supabase Realtime), cada uno con página de configuración, límite de velocidad y lista negra
- Webhooks — entrantes (HMAC-SHA256) + salientes (reintento, filtrado de eventos)
Intervención humana, presupuestos, seguridad
- Aprobaciones — bandeja de entrada con cumplimiento de SLA + escalamiento
- Tareas Humanas — esquemas de formularios integrados en nodos de flujo de trabajo
- Libro Mayor de Créditos — por experimento y por proyecto con bloqueo pesimista y pausa automática en caso de gasto excesivo
- Bóveda de Credenciales — credenciales de servicios externos cifradas con rotación, OAuth2, seguimiento de expiración, inyección por proyecto
- Herramientas SSH — verificación de huella digital TOFU (Confianza en el Primer Uso), lista blanca de comandos permitidos por herramienta, política de seguridad de comandos multicapa
- Registro de Auditoría — registro de actividad completo (spatie/activitylog), buscable y filtrable
- Aislamiento de Inquilinos — disciplina multicapa
TeamScope+BelongsToTeam+withoutGlobalScopes()
Integraciones y pipeline de desarrollo web
- Integraciones — GitHub, Slack, Notion, Airtable, Linear, Stripe, Vercel, Netlify, webhooks/encuestas genéricos con OAuth 2.0
- Pipeline autónomo de desarrollo web — los agentes pueden abrir PRs, fusionar, despachar flujos de CI, crear releases, activar despliegues en Vercel/Netlify/SSH a través de herramientas MCP
- Constructor de sitios web — sitios estáticos generados por IA con 8 tipos de widgets, controladores de despliegue Vercel + ZIP, envíos de formularios, widgets de blog/navegación/contacto
- Paquete Modo Fundador — paquete del marketplace con 6 agentes de persona (Estratega, Líder de Producto, Growth Hacker, Asesor Financiero, Gerente de Operaciones, Oficial de Riesgo), 20 habilidades de frameworks (RICE, SPIN, BANT, MEDDIC, OKRs, Shape Up, Economía Unitaria, Kano, TAM-SAM-SOM, K-Factor, NPV-IRR, RACI, Pruebas A/B, OWASP), 5 flujos de trabajo preconstruidos
- Marketplace — explora, publica, instala habilidades, agentes, flujos de trabajo y paquetes compartidos con escaneo de riesgos por IA
Superficie de API y MCP
- API REST — más de 175 endpoints bajo
/api/v1/con autenticación Sanctum, paginación por cursor, OpenAPI 3.1 generado automáticamente en/docs/api - Servidor MCP — más de 675 herramientas del Protocolo de Contexto de Modelo en 45 dominios (62 grupos de herramientas) (stdio + HTTP/SSE + OAuth2/PKCE)
- Gobernanza de acciones del mundo real — el flujo
ActionProposalcontrola las llamadas a herramientas del asistente, escrituras de integraciones y envíos a git a través de una política de riesgo por nivel con ejecución automática tras aprobación - Endpoint de descubrimiento público —
GET /.well-known/fleetqdevuelve un manifiesto de capacidades controlado por configuración para que herramientas de IA externas puedan autoconfigurarse - Gráfico de equipo en vivo — página
/team-graphcon actualizaciones en tiempo real mediante Laravel Reverb WebSockets - Errores MCP estructurados — códigos de error canónicos estilo gRPC (
UNAVAILABLE,PERMISSION_DENIED,RESOURCE_EXHAUSTED,DEADLINE_EXCEEDED,INVALID_ARGUMENT,FAILED_PRECONDITION,NOT_FOUND,INTERNAL) con sugerencias de reintento — los agentes saben cuándo reintentar vs. fallar rápido - Plazos por herramienta — parámetro opcional
deadline_msen cada herramienta MCP; los agentes pueden limitar el tiempo de reloj de pared por llamada - Trazado OpenTelemetry — exportador HTTP OTLP, Jaeger todo-en-uno vía
docker compose --profile observability up, spans para herramienta MCP → puerta de enlace de IA → proveedor de LLM - Gestión de herramientas — servidores MCP (stdio/HTTP), herramientas integradas (bash/filesystem/browser), clasificación de riesgos, asignación por agente
- Compatibilidad con clientes MCP — Claude Desktop, Claude.ai, ChatGPT Apps, Cursor, Codex, Claude Code, Gemini CLI, cualquier cliente OAuth2
Infraestructura
- Gestión de colas — Laravel Horizon con 6 colas de prioridad y autoescalado
- Pruebas — suites de pruebas de regresión para salidas de agentes con evaluación automatizada
- Directorio de trabajo por llamada — los agentes locales/puente pueden operar en un directorio de trabajo configurado por agente, con contextos de proyecto aislados
Casos de uso
FleetQ está construido para equipos que ejecutan agentes de IA en producción, no demos de juguete.
- Pipelines de desarrollo autónomos — el agente abre PR → CI se ejecuta → el agente revisor aprueba → fusión → despliegue. El humano aprueba solo ante señales de riesgo.
- Triaje de soporte al cliente — widget de reporte de errores → el agente extrae pasos de reproducción del registro de consola/red → el experimento se ejecuta → notifica al reportero con la corrección o una solución generada por el agente.
- Investigación multiagente — equipo de Estratega + Investigador + Redactor con revisor de QA. Cada paso ponderado por rúbrica de dominio.
- Operaciones de contenido programadas — el proyecto continuo se ejecuta diariamente, cada ejecución sigue un DAG: borrador → revisión → verificación SEO → publicación → programación social.
- Respuesta a incidentes — señal de PagerDuty/Sentry → regla de activación → agente de diagnóstico → aprobación humana en acción del runbook → notificación por Slack.
- Cargas de trabajo GPU — el agente llama a la habilidad
gpu_computeen RunPod serverless (Whisper, FLUX, Bark) como parte de un flujo de trabajo más amplio, con contabilidad de costos. - Desarrollo de agentes local-primero — Ollama + Codex + Claude Code auto-detectados, costo cero de API para prototipado; cambia a proveedores en la nube para producción.
- Lleva FleetQ a Claude — expón tus datos y herramientas internos como servidor MCP; Claude Desktop/ChatGPT/Cursor pueden impulsar la plataforma programáticamente.
Cómo se compara FleetQ
| FleetQ | n8n | CrewAI | LangGraph | Make.com | |
|---|---|---|---|---|---|
| Código abierto | ✅ AGPLv3 | ✅ Uso Sostenible | ✅ MIT | ✅ MIT | ❌ Propietario |
| Constructor visual de DAG | ✅ 8 tipos de nodos | ✅ (no IA-primero) | ❌ | ❌ | ✅ |
| Equipos multiagente | ✅ 7 tipos de procesos | ❌ | ✅ | ✅ (construye el tuyo) | ❌ |
| Servidor MCP (nativo) | ✅ 675+ herramientas | ❌ | ❌ | ❌ | ❌ |
| Humano en el circuito | ✅ nativo | ⚠️ solución alternativa | ⚠️ código | ⚠️ código | ⚠️ nodo de aprobación |
| Libro mayor de presupuesto + bloqueos | ✅ pesimista | ❌ | ❌ | ❌ | ❌ |
| Rastro de auditoría | ✅ cada acción | ✅ | ❌ | ❌ | ✅ |
| BYOK + LLMs locales | ✅ ambos | ⚠️ solo BYOK | ⚠️ depende | ⚠️ BYOK | ❌ |
| Autoalojado | ✅ Docker Compose | ✅ | n/a (biblioteca) | n/a (biblioteca) | ❌ |
| Evolución de agentes (automejora) | ✅ | ❌ | ❌ | ❌ | ❌ |
| Trazado OpenTelemetry | ✅ nativo | ❌ | ❌ | ⚠️ parcial | ❌ |
| Medición de crédito/uso | ✅ por equipo/proyecto | ❌ | ❌ | ❌ | por espacio de trabajo |
TL;DR — si estás construyendo sistemas de agentes de producción con LLMs y quieres flujos de trabajo visuales + MCP + supervisión humana, FleetQ es la única plataforma que lo incluye todo.
Inicio rápido (Docker)
git clone https://github.com/escapeboy/agent-fleet-o.git
cd agent-fleet
make install
Esto:
- Copiará
.env.examplea.env - Construirá e iniciará todos los servicios Docker
- Ejecutará el asistente de configuración interactivo (base de datos, cuenta de administrador, proveedor de LLM)
Visita http://localhost:8080 cuando esté completo.
Inicio rápido (Manual — Configuración web)
Requisitos: PHP 8.4+, PostgreSQL 17+, Redis 7+, Node.js 20+, Composer
git clone https://github.com/escapeboy/agent-fleet-o.git
cd agent-fleet
composer install
npm install && npm run build
cp .env.example .env
# Edit .env — set DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD, REDIS_HOST
php artisan key:generate
php artisan migrate
php artisan horizon &
php artisan serve
Luego abre http://localhost:8000 en tu navegador. La página de configuración te guiará para crear tu cuenta de administrador.
Alternativa: Ejecuta
php artisan app:installpara un asistente de configuración CLI interactivo que también siembra agentes y habilidades predeterminados.
Autenticación
- Sin verificación de correo electrónico — la edición autoalojada omite la verificación de correo por completo. Las cuentas están activas inmediatamente al registrarse.
- Usuario único — todos los usuarios registrados se unen automáticamente al espacio de trabajo predeterminado.
Modo sin contraseña (instalaciones locales)
Si estás ejecutando FleetQ localmente en tu propia máquina y no quieres ingresar una contraseña en cada visita, establece APP_AUTH_BYPASS=true en .env:
APP_AUTH_BYPASS=true # Auto-login as first user
APP_ENV=local # Required — bypass is disabled in production
Con la omisión habilitada, la aplicación te inicia sesión automáticamente en cada solicitud. Aún se muestra un enlace de cierre de sesión, pero se te volverá a iniciar sesión en la siguiente carga de página — esto es intencional.
Advertencia: Nunca establezcas
APP_AUTH_BYPASS=trueen un servidor accesible desde internet.
Configuración
Toda la configuración está en .env. Variables clave:
# Database (PostgreSQL required)
DB_CONNECTION=pgsql
DB_HOST=postgres
DB_DATABASE=agent_fleet
# Redis (queues, cache, sessions, locks)
REDIS_HOST=redis
REDIS_DB=0 # Queues
REDIS_CACHE_DB=1 # Cache
REDIS_LOCK_DB=2 # Locks
# LLM Providers -- at least one required for AI features
ANTHROPIC_API_KEY=
OPENAI_API_KEY=
GOOGLE_AI_API_KEY=
# Auth bypass -- local no-password mode (never use in production)
APP_AUTH_BYPASS=false
Se pueden configurar claves LLM adicionales en Configuración > Claves de proveedores de IA después de iniciar sesión.
Para usar modelos locales (Ollama, LM Studio, vLLM):
LOCAL_LLM_ENABLED=true
LOCAL_LLM_SSRF_PROTECTION=false # set false if Ollama is on a LAN IP (192.168.x.x)
LOCAL_LLM_TIMEOUT=180
Luego configura los endpoints en Configuración > Endpoints LLM locales.
Acceso SSH al host
Los agentes pueden ejecutar comandos en la máquina host (o cualquier servidor remoto) vía SSH usando el tipo de herramienta SSH integrado. Esto es útil para ejecutar scripts locales, interactuar con el sistema de archivos u orquestar procesos a nivel de host desde un agente.
Cómo funciona
- La plataforma almacena claves privadas SSH cifradas en la bóveda de Credenciales.
- Una herramienta SSH se configura con
host,port,username,credential_idy una lista blanca opcionalallowed_commands. - En la primera conexión a un host, la huella digital de la clave pública del servidor se almacena vía TOFU (Confianza en el primer uso). Las conexiones posteriores verifican la huella digital — una discrepancia genera un error para prevenir ataques MITM.
- Gestiona las huellas digitales de confianza vía Configuración > Huellas digitales SSH o la herramienta MCP
tool_ssh_fingerprints.
Configuración (Docker — conectando contenedor al host)
Los contenedores alcanzan la máquina host vía host.docker.internal, que está preconfigurado en docker-compose.yml vía extra_hosts: host.docker.internal:host-gateway.
Paso 1 — Habilita SSH en el host
| SO | Comando |
|---|---|
| macOS | Configuración del sistema → General → Compartir → Inicio de sesión remoto → Activado |
| Ubuntu/Debian | sudo apt install openssh-server && sudo systemctl enable --now ssh |
| Fedora/RHEL | sudo dnf install openssh-server && sudo systemctl enable --now sshd |
| Windows | Configuración → Sistema → Características opcionales → Servidor OpenSSH, luego Start-Service sshd |
Paso 2 — Genera un par de claves SSH
ssh-keygen -t ed25519 -C "fleetq-agent@local" -f ~/.ssh/fleetq_agent_key -N ""
Paso 3 — Autoriza la clave en el host
cat ~/.ssh/fleetq_agent_key.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
Paso 4 — Crea una Credencial en FleetQ
Navega a Credenciales → Nueva Credencial:
- Tipo:
SSH Key - Pega el contenido de
~/.ssh/fleetq_agent_key(clave privada)
O vía API:
curl -X POST http://localhost:8080/api/v1/credentials \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Host SSH Key",
"credential_type": "ssh_key",
"secret_data": {"private_key": "<contents of fleetq_agent_key>"}
}'
Paso 5 — Crea una herramienta SSH
Navega a Herramientas → Nueva herramienta → Integrada → SSH remoto, o vía API:
curl -X POST http://localhost:8080/api/v1/tools \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Host SSH",
"type": "built_in",
"risk_level": "destructive",
"transport_config": {
"kind": "ssh",
"host": "host.docker.internal",
"port": 22,
"username": "your-username",
"credential_id": "<credential-id>",
"allowed_commands": ["ls", "pwd", "whoami", "uname", "date", "df"]
},
"settings": {"timeout": 30}
}'
Paso 6 — Asigna la herramienta a un agente
En la página de detalle del Agente, ve a Herramientas y asigna la herramienta SSH. El agente ahora tendrá una función ssh_execute disponible durante la ejecución.
Política de seguridad de comandos
La plataforma aplica una jerarquía de seguridad multicapa para comandos bash y SSH:
- Nivel de plataforma — siempre bloqueados:
rm -rf /,mkfs,shutdown,reboot, patrones de tubería a shell - Nivel de organización — configura en Configuración → Política de seguridad o vía la herramienta MCP
tool_bash_policy - Nivel de herramienta — lista blanca
allowed_commandsen la configuración de transporte de la herramienta - Nivel de proyecto — restricciones adicionales en la configuración del proyecto
- Nivel de agente — anulaciones por agente en el pivote de la herramienta
Las capas más restrictivas siempre ganan. Un comando bloqueado a nivel de plataforma no puede desbloquearse por ninguna otra capa.
Gestión de huellas digitales SSH
Las huellas digitales de hosts de confianza se pueden ver y eliminar vía:
- API:
GET /api/v1/ssh-fingerprints/DELETE /api/v1/ssh-fingerprints/{id} - MCP:
tool_ssh_fingerprintscon acciónlistodelete
Elimina una huella digital cuando la clave SSH de un host se rota legítimamente — la siguiente conexión volverá a verificar vía TOFU.
Arquitectura
flowchart LR
subgraph Clients["Operators & external agents"]
UI["Admin UI — Livewire 4 + Alpine"]
MCPCLI["MCP clients (Claude Desktop, Cursor, Codex, Claude Code)"]
APIC["REST clients — /api/v1/* (Sanctum)"]
SIG["Inbound signals (webhook / RSS / IMAP / Slack / Telegram)"]
end
UI --> WEB
APIC --> API
MCPCLI -->|HTTP/SSE or stdio| MCP
SIG --> INGEST
subgraph App["FleetQ app (Laravel 13 / PHP 8.4)"]
WEB["Web routes (auth:web)"] --> DOM
API["/api/v1/* — Sanctum tokens"] --> DOM
MCP["AgentFleetServer — 675+ MCP tools / 62 tool groups"] --> DOM
INGEST["SignalWebhookController / IngestSignalAction"] --> TRIG["TriggerRule evaluator"]
TRIG --> DOM
DOM["Domain layer — Agent / Crew / Experiment / Workflow / Project / Approval / Budget / Tool / Credential / Skill / Outbound"]
DOM --> SM["ExperimentStateMachine (20 states)"]
SM --> EVT(("ExperimentTransitioned event"))
EVT --> STAGE["BaseStageJob + PlaybookExecutor"]
STAGE --> GATEWAY["AI Gateway (PrismPHP) — 6-layer middleware + circuit breakers"]
GATEWAY --> LLM["Providers: Anthropic / OpenAI / Google / Ollama / vLLM / Codex / Claude Code"]
STAGE --> TOOLS["ToolTranslator — MCP stdio/HTTP, bash, filesystem, browser, SSH (TOFU)"]
STAGE --> APPR["ApprovalRequest / HumanTask (auth:web inbox)"]
STAGE --> OUT["Outbound connectors — Email / Telegram / Slack / Webhook / ntfy"]
STAGE --> ARTI[("Artifact + ArtifactVersion")]
DOM --> DB[("Postgres 17 + pgvector — semantic cache, UUIDv7, JSONB+GIN")]
STAGE --> QUEUE[("Redis 7 — 6 Horizon queues, cache, locks")]
APPR --> DB
ARTI --> DB
end
subgraph Optional["Optional Docker profiles"]
REVERB["Reverb — WebSocket live team graph"]
BROWSER["browserless (Chromium)"]
SEARX["searxng"]
VOICE["voice-worker (LiveKit / Deepgram)"]
SANDBOX["bash_sidecar (sandboxed shell)"]
RELAY["fleetq-bridge relay"]
JAEGER["Jaeger — OTLP traces (--profile observability)"]
end
App -.OTLP spans.-> JAEGER
UI <-->|WebSocket| REVERB
TOOLS -.->|browser tools| BROWSER
TOOLS -.->|web search skill| SEARX
TOOLS -.->|bash skill| SANDBOX
App <-->|relay| RELAY
DOM <--> VOICE
La plataforma es un monolito único de Laravel 13 que expone tres superficies de control coiguales sobre la misma capa de dominio: la interfaz de administración Livewire, una API REST autenticada con Sanctum en /api/v1/* (~175 endpoints), y AgentFleetServer — un servidor MCP con más de 675 herramientas en 62 grupos de herramientas servidas tanto por HTTP/SSE como por stdio local. Las señales entrantes (webhook, RSS, IMAP, Slack, Telegram y el resto de los más de 20 conectores) fluyen a través de IngestSignalAction y el evaluador TriggerRule hacia la capa de dominio, donde el ExperimentStateMachine recorre un pipeline de 20 estados emitiendo eventos ExperimentTransitioned cuyos listeners despachan el siguiente BaseStageJob a las colas Redis gestionadas por Horizon. Los trabajos de etapa hablan con LLMs a través de la Puerta de enlace de IA respaldada por PrismPHP (middleware de límite de tasa, presupuesto, idempotencia, caché semántica, validación de esquema, seguimiento de uso + interruptores de circuito + respaldos de proveedores), invocan instancias Tool traducidas a llamadas de herramientas PrismPHP (MCP stdio/HTTP, bash/filesystem/browser integrados, SSH con huellas digitales TOFU), estacionan registros ApprovalRequest/HumanTask para la bandeja de entrada humano-en-el-circuito, y persisten versiones Artifact además de entregar mensajes salientes por Email/Telegram/Slack/Webhook/ntfy. Los datos de estado y de tenant viven en Postgres 17 con pgvector (caché semántica, claves primarias UUIDv7, índices JSONB+GIN); Redis 7 lleva las seis colas de Horizon, la caché de aplicación y los bloqueos de presupuesto pesimistas. Los perfiles opcionales de Docker Compose añaden Reverb para el WebSocket del gráfico de equipo en vivo, browserless para herramientas de navegador, searxng para búsqueda web, un trabajador de voz (LiveKit/Deepgram), un sidecar bash en sandbox, el relé fleetq-bridge y Jaeger para trazado OpenTelemetry vía --profile observability.
Construido con Laravel 13, Livewire 4 y Tailwind CSS. Diseño dirigido por dominio con 45 contextos delimitados — la tabla a continuación muestra los 17 dominios primarios:
| Dominio | Propósito |
|---|---|
| Agent | Configuraciones de agentes de IA, ejecución, personalidad, evolución |
| Crew | Equipos multi-agente con roles de líder/miembro |
| Experiment | Pipeline, máquina de estados, playbooks |
| Signal | Ingesta de datos entrantes |
| Outbound | Entrega multicanal |
| Approval | Revisiones con intervención humana y tareas humanas |
| Budget | Libro mayor de créditos, aplicación de costos |
| Metrics | Medición, atribución de ingresos |
| Audit | Registro de actividad |
| Skill | Definiciones reutilizables de habilidades de IA |
| Tool | Servidores MCP, herramientas integradas, clasificación de riesgos |
| Credential | Credenciales cifradas de servicios externos |
| Workflow | Constructor visual de DAG, ejecutor de grafos |
| Project | Proyectos continuos/de una sola ejecución, programación |
| Assistant | Chat de IA consciente del contexto con 28 herramientas |
| Marketplace | Intercambio de habilidades/agentes/flujos de trabajo |
| Integration | Conectores de servicios externos (GitHub, Slack, Notion, Airtable, Linear, Stripe, Generic) |
Servicios Docker
| Servicio | Propósito | Puerto |
|---|---|---|
| app | PHP 8.4-fpm | -- |
| nginx | Servidor web | 8080 |
| postgres | PostgreSQL 17 | 5432 |
| redis | Caché/Cola/Sesiones | 6379 |
| horizon | Trabajadores de cola | -- |
| scheduler | Trabajos cron | -- |
| vite | Servidor de desarrollo frontend | 5173 |
Comandos Comunes
make start # Start services
make stop # Stop services
make logs # Tail logs
make update # Pull latest + migrate
make test # Run tests
make shell # Open app container shell
O con Docker Compose directamente:
docker compose exec app php artisan tinker # REPL
docker compose exec app php artisan test # Run tests
docker compose exec app php artisan migrate # Run migrations
Banco de Pruebas de Evaluación del Modelo de Decisión
jev:eval evalúa un modelo de decisión — Jev de TypeSafe, un segundo endpoint
de System One, o un LLM de chat ordinario — contra un conjunto de datos JSONL, y jev:report
convierte las respuestas registradas en números de precisión, calibración, cobertura, latencia, costo
y determinismo. Nada en la ruta de solicitud lo llama: es una
herramienta de medición, no una dependencia de producción.
La clave API nunca toca el repositorio
TYPESAFE_API_KEY vive en 1Password y llega al proceso solo a través
de op run. .env.op (confirmado) contiene la referencia, nunca el valor:
TYPESAFE_API_KEY="op://AI Agent/Jev API Key/credential"
Los controladores de referencia siguen la misma regla — .env.op también lleva referencias
para ANTHROPIC_API_KEY, GEMINI_API_KEY / GOOGLE_AI_API_KEY y
OPENAI_API_KEY, y cada comando pasa solo los nombres que necesita a través
de docker compose run -e.
Cada comando que llama a la API se ejecuta a través de op run, que resuelve la
referencia en el proceso hijo y la enmascara en la salida. No pases
--no-masking, no op read el elemento en una variable, y no escribas el
valor en .env, un archivo compose o un fixture.
Ejecutando una evaluación de principio a fin
# 1. Build the datasets.
python3 base/scripts/jev-eval/export_next_tool_dataset.py # -> next-tool.jsonl
python3 base/scripts/jev-eval/export_routing_v2_dataset.py # -> routing-v2.jsonl + routing-v2-synth.jsonl
python3 base/scripts/jev-eval/export_domain_prefilter_dataset.py # -> domain-prefilter.jsonl
# both write into ~/jev-eval/datasets/fleetq/
# 2. Make them reachable from the container (storage/ is bind-mounted).
mkdir -p storage/app/jev-eval
cp ~/jev-eval/datasets/fleetq/*.jsonl storage/app/jev-eval/
# 3. Run the eval. The key is injected by op, by name, for this process only.
export OP_SERVICE_ACCOUNT_TOKEN=$(cat ~/.config/op/sa-token)
op run --env-file=.env.op -- docker compose run --rm -e TYPESAFE_API_KEY app \
php artisan jev:eval storage/app/jev-eval/routing-v2.jsonl --driver=jev --split=test --concurrency=8
# 4. Report on the run id the eval printed.
docker compose exec app php artisan jev:report <run-id> \
--dataset-path=storage/app/jev-eval/routing-v2.jsonl
Midiendo el determinismo — las mismas solicitudes enviadas N veces:
op run --env-file=.env.op -- docker compose run --rm -e TYPESAFE_API_KEY app \
php artisan jev:eval storage/app/jev-eval/routing-v2.jsonl --driver=jev --split=dev --repeat=3
Comparando Jev contra un modelo de chat en el mismo conjunto de datos — los controladores LLM usan la puerta de enlace de IA de la plataforma, por lo que no necesitan clave de TypeSafe:
op run --env-file=.env.op -- docker compose run --rm -e ANTHROPIC_API_KEY app \
php artisan jev:eval storage/app/jev-eval/routing-v2.jsonl --driver=haiku --split=test --team=<team-id>
--team es obligatorio: la puerta de enlace registra cada llamada en el
llm_request_logs con ámbito de inquilino, y una evaluación no tiene inquilino propio. La puerta de enlace también limita
Anthropic a 60 solicitudes por minuto en todo el proceso, por lo que los controladores LLM
publican su propio requests_per_minute y la evaluación se limita a él —
dos de estos ejecutándose a máxima capacidad en paralelo aún se privarán mutuamente.
gemini-flash y gpt-mini existen por una razón: en un conjunto de datos cuyas
etiquetas doradas fueron producidas por modelos Claude, una línea base de Anthropic está calificando su propio
trabajo. Una familia de modelos que no tuvo participación en las etiquetas es la única línea base
que significa algo allí.
Cuando la clave de Anthropic medida no está disponible, claude_cli_haiku y
claude_cli_sonnet ejecutan las mismas indicaciones a través de la CLI local de Claude Code con
sus credenciales de suscripción. No necesitan clave, ni --team ni puerta de enlace:
docker compose run --rm -v "$HOME/.claude/.credentials.json:/root/.claude/.credentials.json:ro" \
-e CLAUDE_CLI_CONCURRENCY=5 app \
php artisan jev:eval storage/app/jev-eval/topics-bg.jsonl --driver=claude_cli_sonnet --split=test
Sin Docker, los mismos comandos se ejecutan directamente:
op run --env-file=.env.op -- php artisan jev:eval ~/jev-eval/datasets/fleetq/routing-v2.jsonl --driver=jev --split=test
op run --env-file=.env.op -- php artisan jev:report
Opciones
jev:eval:
| Opción | Predeterminado | Significado |
|---|---|---|
--driver | jev | Una clave de config/decision.php: jev, jeff, haiku, sonnet, gemini-flash, gpt-mini, claude_cli_haiku, claude_cli_sonnet |
--split | test | dev, test, o all. 20/80, decidido por un hash del id del caso |
--repeat | 1 | Envía cada caso N veces; alimenta las columnas de determinismo |
--concurrency | 8 | Casos en vuelo a la vez, para controladores que admiten procesamiento por lotes |
--limit | 0 | Detente después de N casos, tomados en orden de archivo para que dos controladores sigan siendo comparables |
--team | — | Equipo bajo el cual los controladores LLM registran sus llamadas de puerta de enlace (obligatorio para haiku/sonnet) |
jev:report:
| Opción | Significado |
|---|---|
run_id... | Una o más ejecuciones; varias ponen diferentes controladores en un conjunto de tablas |
--group-by=meta.source | Divide cada tabla por una clave de metadatos del conjunto de datos |
--where=meta.source=assistant_turn | Conserva solo casos que coincidan con una clave de metadatos (se permiten valores separados por comas) |
--questions=domain | Informa solo estos ids de pregunta |
--multi-label | Califica cada caso como un CONJUNTO de etiquetas (Noul por etiqueta) en lugar de por pregunta |
--dataset-path= | El archivo del conjunto de datos; obligatorio para --group-by, --where y el análisis de variantes |
La precisión se imprime con un intervalo de Wilson del 95%, que es lo que hace legible una tabla por fuente cuando algunas fuentes tienen solo un puñado de casos.
Cada tipo de pregunta también recibe su propio bloque bajo la tabla principal:
| Tipo | Métricas adicionales |
|---|---|
| Choice | precisión top-2 (dorado dentro de las dos opciones de mayor probabilidad), precisión / recuperación / F1 por clase, pares de confusión ordenados por recuento |
| Noul | precisión, recuperación y F1 de la clase positiva en t=0.5, PR-AUC (precisión promedio), y la tasa positiva dorada impresa junto a la precisión |
| Score | MAE en el índice de nivel, y precisión binaria para nivel 0 vs nivel > 0 |
La ejecución se mantiene bajo los techos publicados de Jev (1,200 solicitudes/minuto y 250,000 tokens/segundo) por sí sola. Un caso cuyo estado más la pregunta más larga se estima por encima de 32k tokens es rechazado y registrado por id, nunca truncado — un estado acortado es un caso diferente, y calificarlo movería el número de precisión sin decirlo.
Conjuntos de datos
JSONL, un caso por línea:
{"id":"routing-006cbe1f682e","state":{...},"questions":{"domain":{"type":"choice","instructions":"...","criteria":{...}}},"gold":{"domain":"filesystem"},"meta":{"lang":"en","source":"phoenix:local_agent.tool","split":"test"}}
| Archivo | Qué mide | El dorado proviene de |
|---|---|---|
next-tool.jsonl | predicción de la siguiente herramienta dentro de un bucle de codificación | la herramienta que el agente de hecho llamó a continuación |
routing-v2.jsonl | qué dominio MCP de FleetQ maneja una solicitud | configuración, o la elección registrada de un humano |
routing-v2-synth.jsonl | la misma pregunta, en solicitudes con redacción de registro | el dominio de registro de la herramienta de la que provino una descripción |
domain-prefilter.jsonl | qué dominios pueden descartarse (multi-etiqueta) | cada dominio MCP del que el asistente extrajo una herramienta en ese turno |
next-tool.jsonl es un caso por llamada de herramienta que un agente realmente hizo dentro de una
sesión perteneciente a un experimento que alcanzó completed. El estado lleva
el resumen de la tarea y los pasos ya tomados; la respuesta dorada es la herramienta que fue
de hecho elegida a continuación. La narración propia del asistente se excluye deliberadamente — ella
rutinariamente nombra la siguiente herramienta, lo que convertiría el enrutamiento en extracción de cadenas.
Esto es comportamiento del agente, no enrutamiento de FleetQ.
routing-v2.jsonl nunca califica contra lo que un agente decidió. Cada respuesta dorada
es un hecho de configuración o una elección humana explícita ya en la base de datos:
un usuario pidió algo al asistente y este llamó a herramientas de exactamente un
dominio MCP (los turnos que abarcan dos dominios se descartan, porque el dorado sería
ambiguo); una señal se enrutó a un experimento cuyo plantilla de flujo de trabajo estaba
configurada; un humano creó un experimento y asignó un agente específico a él.
meta.source registra cuál, para que un subconjunto pueda calificarse por sí solo. Una
tarea fuente contribuye como máximo 15 casos.
routing-v2-synth.jsonl se genera a partir de las descripciones del propio registro de herramientas
para cubrir los dominios que los datos de producción nunca ejercitan. Cada caso lleva
meta.source = "synthetic" y vive en su propio archivo para que nunca se mezcle
en los números principales — califícalo por separado o no lo califiques en absoluto.
domain-prefilter.jsonl hace una pregunta diferente del enrutamiento-v2: no "cuál
dominio maneja esto" sino "qué dominios pueden descartarse" — la forma que un
prefiltro frente a un servidor MCP de 700 herramientas necesita. Un Noul por dominio, los 67
en una sola solicitud, dorado verdadero para cada dominio del que el turno extrajo una herramienta.
Los turnos multi-dominio se conservan aquí, porque un turno que abarca dos dominios es una
respuesta multi-etiqueta correcta en lugar de una ambigua. Califícalo con
jev:report --multi-label, que barre el umbral e informa el prefiltro más ajustado
que aún conserva esencialmente cada etiqueta verdadera.
Sobre los números principales de enrutamiento-v2: solo la fuente assistant_turn pertenece a
uno. Las fuentes signal_workflow y experiment_agent codifican un
hecho de configuración que el texto de la solicitud no puede respaldar — un informe de error de Sentry
se lee como un signal sea cual sea el inquilino que lo configuró para activarse — y
model_tier tiene un solo valor en cada caso donde los datos de producción pueden derivarlo.
Informa esos por fuente, nunca fusionados:
docker compose exec app php artisan jev:report <run-id> \
--dataset-path=storage/app/jev-eval/routing-v2.jsonl \
--where=meta.source=assistant_turn --questions=domain
La lista de opciones de dominio y sus descripciones de una oración se leen del
registro por base/scripts/jev-eval/mcp_domain_registry.py; agrega un grupo de herramientas y
la opción aparece por sí sola.
Actualización
make update
Esto extrae el código más reciente, reconstruye contenedores, ejecuta migraciones y limpia cachés.
Pila Tecnológica
- Framework: Laravel 13 (PHP 8.4)
- Base de datos: PostgreSQL 17
- Caché/Cola: Redis 7
- Frontend: Livewire 4 + Tailwind CSS 4 + Alpine.js
- Puerta de enlace de IA: PrismPHP
- Cola: Laravel Horizon
- Autenticación: Laravel Fortify (2FA) + Sanctum (tokens API)
- Auditoría: spatie/laravel-activitylog
- Documentación API: dedoc/scramble (OpenAPI 3.1)
- MCP: laravel/mcp (Model Context Protocol)
Contribuciones
Las contribuciones son bienvenidas. Abre un issue primero para discutir los cambios propuestos.
- Haz un fork del repositorio
- Crea una rama de características (
git checkout -b feat/my-feature) - Haz tus cambios y agrega pruebas
- Ejecuta
php artisan testpara verificar - Envía una solicitud de extracción
Consulta CONTRIBUTING.md para convenciones de codificación, estilo de confirmación y lista de verificación de PR.
Comunidad y Soporte
- Issues — Informes de errores + solicitudes de funciones
- Discusiones — Haz una pregunta o comparte lo que construiste
- Registro de cambios — Qué cambió en cada versión
- Versión en la nube — fleetq.net (nivel gratuito, sin tarjeta de crédito)
Historial de Estrellas
Si FleetQ te ahorra tiempo, una ⭐ ayuda a otros a encontrarlo. GitHub clasifica los repositorios por velocidad de estrellas.
Licencia
FleetQ Community Edition es software de código abierto con licencia GNU Affero General Public License v3.0.
Resumen de AGPLv3: Puedes autoalojar, modificar y ejecutar FleetQ gratis — incluido el uso comercial. Si ofreces FleetQ como un servicio alojado para otros, debes abrir el código fuente de tus modificaciones. ¿Preguntas? Consulta nuestro FAQ de AGPLv3.