LangGraph y chat¶
Fuente del diagrama: docs/diagrams/guias-plugins-ai-agents-langgraph-01.mermaid en cortex-docs.
flowchart TB
subgraph panel [Panel React]
Chat[AgentChatWidget]
end
subgraph transport [Canal chat]
WS["WS /api/v1/ws message ai-agents"]
end
subgraph plugin [cortex_plugin_ai_agents]
Handler[ws_handler]
Graph[LangGraph Agent]
LLM[LLM Gemini free tier]
end
subgraph tools [Herramientas servidor]
MCP[McpToolRegistry in-process]
Core[core_hello]
Plug[tools de plugins activos]
end
Chat --> WS --> Handler --> Graph
Graph --> LLM
Graph --> MCP
MCP --> Core
MCP --> Plug Leyenda: WS = canal de chat del panel; MCP = tools en el servidor (registry in-process, no el browser). Estado: Implementado (beta).
Canal de chat (WebSocket)¶
El chat en Admin → Automatización → Agentes IA (/admin/agent) usa WebSocket como canal en tiempo real:
| Pieza | Valor |
|---|---|
| Ruta | WS /api/v1/ws |
| Namespace | ai-agents |
| Comandos | chat, tools.list |
| Respuestas | chat.reply, tools.list.reply, error |
En desarrollo local el panel Vite (:5175) debe proxyar /api con WebSocket (ws: true en framework/web-shadcn/vite.config.ts). Sin eso el badge queda en Disconnected.
MCP no es el transporte del panel: el runtime Python carga tools desde McpToolRegistry in-process. POST /mcp queda para agentes externos.
Requisitos¶
- API en
:8000y panel en:5175(o despliegue con proxy WS). - Credencial con secreto en Configuración → Automatización → Credenciales.
- Conectores MCP en Configuración → Automatización → Conectores.
- Agente con
credential_id,model,systemy opcionalmentesource. - Redis 8+ o Redis Stack (opcional; si falla,
MemorySaveren memoria).
Checklist local¶
- En
.env:NVIDIA_KEY=...y/oGEMINI_KEY=...; opcionalmenteOPENAI_KEY/ANTHROPIC_KEY UV_CACHE_DIR=/tmp/uv-cache uv run cortex-apinpm run dev:web-shadcn- Abrir
/admin/agent→ badge Connected - Enviar un mensaje en el chat
- Botón MCP → lista tools (
core_hello,ai_agents_list, …)
El agente demo (id 1) usa model: meta/llama-3.1-8b-instruct (NVIDIA Build) y credential_id: 4.
Variables de entorno¶
| Variable | Descripción | Default |
|---|---|---|
REDIS_URL | URL Redis para checkpoints LangGraph | redis://localhost:6379/0 |
AI_AGENTS_THREAD_TTL_MINUTES | TTL de hilos de conversación (minutos) | 10080 (7 días) |
INTERNAL_API_URL | Base URL para cliente MCP HTTP (agentes externos) | http://127.0.0.1:8000 |
NVIDIA_KEY | API key NVIDIA Build (dev) | — |
GEMINI_KEY | API key Gemini (dev) | — |
OPENAI_KEY | API key OpenAI (dev) | — |
ANTHROPIC_KEY | API key Anthropic (dev) | — |
Copia .env.example a .env. No commits de .env.
Si Redis no está disponible, el plugin usa MemorySaver (los hilos se pierden al reiniciar el proceso).
Flujo¶
- El panel envía mensajes por WebSocket (
namespace: ai-agents, tipochat). - Payload:
{ "message", "agentId", "threadId?" }. - El grafo ReAct resuelve LLM desde agente + credencial, carga tools desde el registry MCP in-process y persiste el hilo.
- Respuesta:
{ "text", "threadId" }— el cliente guardathreadIdensessionStorage.
Proveedores soportados¶
credential.provider | Cliente LangChain | Modelos de ejemplo |
|---|---|---|
openai | ChatOpenAI | gpt-4o, gpt-4o-mini |
anthropic | ChatAnthropic | claude-sonnet-4, claude-3-5-sonnet-latest |
gemini | ChatGoogleGenerativeAI | gemini-2.5-flash-lite, gemini-flash-lite-latest |
nvidia | ChatOpenAI + base_url NVIDIA | meta/llama-3.1-8b-instruct, meta/llama-3.3-70b-instruct |
Si el secreto está vacío, el chat responde con MISSING_CREDENTIAL_SECRET.
Tools MCP¶
El grafo descubre tools al iniciar cada invocación desde los conectores MCP activos.
| Campo | Uso |
|---|---|
name | Etiqueta en la UI |
slug | Prefijo de tools externas (github_list_repos) |
url | Vacío = MCP interno de Cortex. URL = servidor MCP HTTP remoto |
enabled | Solo los activos aportan tools |
token | Bearer opcional para el servidor remoto |
El conector Cortex (slug cortex, url vacía) viene activo por defecto. Nombres internos: {namespace}_{action} (snake_case).