Crea tu Primer Agente de IA Durable con Vercel Eve (Guía para Principiantes)
Una guía para principiantes sobre Vercel Eve. Genera un agente de IA durable como archivos planos, añade una herramienta, conéctalo a Slack y Discord, cambia a modelos open source…
26 min de lectura

Vercel acaba de lanzar Eve, y la forma más fácil de describirlo es «Next.js, pero para agentes». En lugar de un único objeto de configuración gigante que tienes que mantener en la cabeza, cada parte de tu agente tiene su propio archivo. Las instrucciones viven en un archivo. Las herramientas viven en una carpeta. Los canales (Slack, Discord, una interfaz web) viven en otra. Eve lee esa estructura de carpetas y la convierte en un agente en ejecución que funciona en local, sirve HTTP y mantiene una conversación viva a lo largo de muchos turnos.
He construido agentes con varios frameworks distintos, y lo que me convenció aquí es lo poca ceremonia que hay. Puedes leer un proyecto de Eve completo con solo mirar el árbol de directorios. Eso es todo. Sin registro que mantener sincronizado, sin archivo de cableado que quede desactualizado.
En esta guía generaremos un agente desde cero, le daremos una herramienta, lo conectaremos tanto a Slack como a Discord, cambiaremos el modelo Claude por defecto por uno open source y después lo desplegaremos, ya sea en Vercel o en tu propio VPS con Dokploy. Al final tendrás un asistente funcional con el que tu equipo podrá hablar.
Eve está en beta
Eve está actualmente en beta bajo los términos beta de Vercel, así que las APIs y el comportamiento pueden cambiar antes de la disponibilidad general. Fija una versión en package.json si estás construyendo algo que te importa, y vuelve a consultar la documentación cuando actualices.
Qué es Eve realmente
Eve es un framework para construir agentes durables como archivos ordinarios en un proyecto TypeScript. «Durable» es la palabra que importa. Una sesión de Eve no es una petición y una respuesta. Puede emitir progreso en streaming mientras trabaja, llamar a herramientas y subagentes, pausarse para pedir aprobación a un humano, reanudarse cuando llega la respuesta y mantener el estado entre turnos. Internamente se apoya en el Workflow SDK open source para hacer las sesiones reanudables y resistentes a fallos, para que tu código pueda centrarse en el trabajo en lugar de la fontanería.
Así se ve un proyecto pequeño:
my-agent/
├── package.json
└── agent/
├── agent.ts # picks the model, runtime config
├── instructions.md # who the agent is, how it behaves
├── tools/ # typed functions the model can call
│ └── get_weather.ts
├── skills/ # longer procedures, loaded on demand
│ └── plan_a_trip.md
└── channels/ # Slack, Discord, web, etc.
└── slack.tsLa ubicación de un archivo dice qué hace, y su ruta suele darle su nombre. Coloca agent/tools/get_weather.ts en su sitio y Eve descubre una herramienta llamada get_weather. Renombra el archivo y el nombre de la herramienta lo acompaña. Ese es todo el modelo mental.
instructions.mdle dice al agente quién es y cómo comportarse (el system prompt siempre activo)agent.tselige el modelo y establece las opciones de ejecucióntools/contiene funciones tipadas que el modelo puede llamarskills/contiene procedimientos más largos que el modelo solo carga cuando son útileschannels/conecta el agente con clientes HTTP, Slack, Discord y cualquier otro lugar donde la gente le hable
Empieza solo con instructions.md y agent.ts. Añade las demás carpetas cuando de verdad las necesites.
Requisitos previos
Antes de generar nada, asegúrate de tener:
- Node 24 o superior (Eve fija un runtime de Node moderno)
- npm, que se incluye con Node
- Una credencial de modelo: ya sea una clave de Vercel AI Gateway (
AI_GATEWAY_API_KEY), un proyecto de Vercel vinculado para OIDC, o una clave directa de proveedor comoANTHROPIC_API_KEY
El scaffold usa por defecto anthropic/claude-sonnet-4.6 enrutado a través del Vercel AI Gateway. Si omites la credencial, la terminal de desarrollo lo señala y te guía para pegar una clave con su comando /model, así que no te quedarás atascado.
Paso 1: Genera tu primer agente
npx puede ejecutar eve init sin instalar nada antes:
npx eve@latest init my-agentEse comando crea el proyecto, instala las dependencias, inicializa Git, arranca el servidor de desarrollo y abre una interfaz de terminal interactiva. Escribe un mensaje y verás el bucle del modelo ejecutándose en tiempo real.
Un par de cosas que conviene saber:
- Pasa
--channel-web-nextjssi quieres que se genere una app de chat web junto al agente eve initretiene la terminal, así que pulsaCtrl+Cpara recuperar tu shell antes de empezar a editar archivos- Para añadir Eve a un proyecto que ya tienes, ejecuta
eve init .desde una carpeta que tenga unpackage.jsony aún no tenga archivosagent/. Añadeeve,aiyzodsin tocar el resto
Si prefieres conectarlo a mano, instala las tres dependencias y declara un engine de Node 24:
npm install eve@latest ai zod{
"engines": {
"node": "24.x"
}
}Después escribe los dos archivos que Eve necesita. agent/instructions.md:
You are a concise assistant. Use tools when they are available.Y agent/agent.ts:
import { defineAgent } from "eve";
export default defineAgent({
model: "anthropic/claude-sonnet-4.6",
});Incluso con este tamaño el agente ya puede hacer trabajo real, porque el arnés por defecto incluye herramientas de archivos, shell, web y delegación desde el primer momento.
Dejar que un agente de codificación haga la configuración
Si usas Claude Code, Cursor o una herramienta similar, pásale este prompt: «Configura un agente eve: lee la documentación de eve (incluida en node_modules/eve/docs una vez instalado eve), genera el scaffold con npx eve@latest init <name>, añade una herramienta tipada en agent/tools/get_weather.ts, ejecútalo con npm run dev, luego crea una sesión, haz streaming de ella y envía un mensaje de seguimiento». Una vez instalado eve, la documentación completa vive localmente en node_modules/eve/docs/, así que el modelo no tiene que adivinar una API que no conoce.
Paso 2: Dale una herramienta al agente
Una herramienta es una acción tipada que el agente puede llamar: consultar una API, ejecutar una query, escribir un archivo. El nombre del archivo se convierte en el nombre de herramienta que ve el modelo, y tiene que ser snake_case. Crea agent/tools/get_weather.ts:
import { defineTool } from "eve/tools";
import { z } from "zod";
// The model sees this tool as `get_weather`, from the filename.
export default defineTool({
description: "Get the current weather for a city.",
inputSchema: z.object({ city: z.string().min(1) }),
async execute({ city }) {
return { city, condition: "Sunny", temperatureF: 72 };
},
});Las piezas de una herramienta:
- Un slug de nombre de archivo dentro de
agent/tools/, que es el nombre que ve el modelo - Una
descriptionescrita para el modelo, que le dice qué hace la herramienta - Un
inputSchema, un esquema de Zod (pasaz.object({})si no hay entrada) - Una función
execute(input, ctx), síncrona o asíncrona, que hace el trabajo
Las herramientas se ejecutan en el runtime de tu app con acceso completo a process.env, no dentro del sandbox, así que pueden importar código compartido desde lib/ y leer tus secretos directamente. Una cosa a tener en cuenta: un paso que se interrumpe a mitad de ejecución se vuelve a ejecutar al reanudar, así que haz que los efectos secundarios como cargos o emails sean idempotentes, o protégelos detrás de una aprobación (más sobre esto abajo).
Paso 3: Ejecútalo y envía un mensaje
Una app generada con el scaffold tiene un script dev:
npm run devSi conectaste Eve a mano y no tienes script dev, ejecuta el binario con npx eve dev en su lugar. En ambos casos llegas a la interfaz de terminal. Escribe «¿Qué tiempo hace en Brooklyn?» y verás las llamadas ocurrir en orden: la llamada a get_weather, luego su resultado, luego la respuesta.
Toda app de Eve también expone la misma API HTTP estable. Inicia una sesión durable con curl:
curl -X POST http://127.0.0.1:3000/eve/v1/session \
-H 'content-type: application/json' \
-d '{"message":"What is the weather in Brooklyn?"}'La respuesta te devuelve dos cosas que reutilizarás: un continuationToken en el cuerpo para reanudar la conversación, y una cabecera x-eve-session-id que identifica la ejecución. Conéctate al stream con el id de sesión:
curl http://127.0.0.1:3000/eve/v1/session/<sessionId>/streamEl stream es NDJSON. Para esta ejecución verás session.started, actions.requested (la llamada a la herramienta), action.result, message.completed (la respuesta) y session.completed. Para continuar la conversación, envía un mensaje de seguimiento con el token:
curl -X POST http://127.0.0.1:3000/eve/v1/session/<sessionId> \
-H 'content-type: application/json' \
-d '{"continuationToken":"<token>","message":"Now do Queens."}'Ese es el hola mundo. Un bot del tiempo no le sirve a nadie, así que hagamos que sea accesible donde la gente realmente trabaja.
Paso 4: Conecta el agente a Slack
Un canal es el adaptador entre una plataforma y tu agente. Normaliza los mensajes entrantes, posee el token de reanudación para esa superficie y decide cómo se entregan las respuestas. El canal de Slack responde a @mentions y mensajes directos, contesta en hilos, muestra indicadores de escritura y convierte las peticiones de human-in-the-loop en botones de Slack.
La parte buena: las credenciales pasan por Vercel Connect, que gestiona tanto el token de bot saliente como la verificación del webhook entrante. No hay ningún SLACK_BOT_TOKEN ni SLACK_SIGNING_SECRET que tengas que vigilar.
Primero, configura un cliente de Connect y apunta su trigger a la ruta de Slack de Eve:
npm install -g vercel@latest && export FF_CONNECT_ENABLED=1
vercel connect create slack --triggers
vercel connect detach <uid> --yes
vercel connect attach <uid> --triggers --trigger-path /eve/v1/slack --yesEl paso create aprovisiona un destino en la ruta por defecto de Connect; después detach/attach lo reapunta a /eve/v1/slack, que es donde Eve realmente escucha. El flag --triggers activa las suscripciones a eventos de Slack; sin él, Slack nunca entrega los eventos app_mention ni message.im.
Ahora añade el canal. O lo generas con eve channels add slack, o escribes agent/channels/slack.ts a mano:
import { connectSlackCredentials } from "@vercel/connect/eve";
import { slackChannel } from "eve/channels/slack";
export default slackChannel({
credentials: connectSlackCredentials("slack/my-agent"),
});connectSlackCredentials devuelve el token de bot y el verificador de webhook, manteniendo la rotación de tokens y la verificación de peticiones dentro de Connect en lugar de en tu código. Despliega cuando el trigger y el archivo de canal estén listos:
VERCEL_USE_EXPERIMENTAL_FRAMEWORKS=1 vercel deploy --prodEse flag permite que la CLI de Vercel reconozca a Eve como framework durante el build.
Incorporar el contexto del hilo
Por defecto el canal te da la mención que lo activó, pero no las respuestas anteriores del hilo. Si quieres que el agente lea lo que se dijo antes de ser llamado, carga los mensajes previos y devuélvelos como context:
import { defaultSlackAuth, loadThreadContextMessages, slackChannel } from "eve/channels/slack";
import { connectSlackCredentials } from "@vercel/connect/eve";
export default slackChannel({
credentials: connectSlackCredentials("slack/my-agent"),
async onAppMention(ctx, message) {
const auth = defaultSlackAuth(message, ctx);
const prior = await loadThreadContextMessages(ctx.thread, message, {
since: "last-agent-reply",
});
if (prior.length === 0) return { auth };
const transcript = prior
.map((m) => `${m.isMe ? "you" : (m.user ?? "user")}: ${m.markdown}`)
.join("\n");
return { auth, context: [`Recent thread messages since your last reply:\n\n${transcript}`] };
},
});Usar since: "last-agent-reply" significa que menciones repetidas en un mismo hilo solo inyectan lo nuevo, así que no vuelves a alimentar todo el historial en cada turno.
Avisa a la gente de que está hablando con un bot
Eve no añade por ti un aviso de «soy una IA». Dependiendo de dónde estén tus usuarios, puede que estés legalmente obligado a revelar que están hablando con un sistema automatizado. Incorpóralo en tu instructions.md o en las respuestas del canal.
Paso 5: Conecta el agente a Discord
Discord funciona a través de HTTP Interactions: comandos de barra, componentes de mensaje y modales. Discord impone un plazo de tres segundos para confirmar un comando, así que el canal verifica la firma, confirma de inmediato y ejecuta el trabajo real en segundo plano. No tienes que pensar en nada de eso; está resuelto.
El agent/channels/discord.ts mínimo:
import { discordChannel } from "eve/channels/discord";
export default discordChannel();Discord necesita tres variables de entorno:
DISCORD_PUBLIC_KEY=... # verifies the signature headers
DISCORD_APPLICATION_ID=... # edits the deferred response, sends followups
DISCORD_BOT_TOKEN=... # proactive messages, fallback, typing indicatorsLa ruta es POST /eve/v1/discord por defecto. Pega esa URL pública en el campo Interactions Endpoint URL de tu aplicación de Discord en el Developer Portal.
Registrar los comandos es cosa tuya, no del canal. Una opción de tipo string llamada message coincide con la extracción de prompt por defecto de Eve:
curl -X PUT "https://discord.com/api/v10/applications/$DISCORD_APPLICATION_ID/commands" \
-H "Authorization: Bot $DISCORD_BOT_TOKEN" -H "Content-Type: application/json" \
-d '[{"name":"ask","description":"Ask the eve agent","type":1,
"options":[{"name":"message","description":"What should the agent do?","type":3,"required":true}]}]'Usa comandos de guild durante el desarrollo; se propagan mucho más rápido que los globales. Aquí tienes un canal algo más completo que decide la autenticación por comando y publica la respuesta:
import { discordChannel } from "eve/channels/discord";
export default discordChannel({
onCommand: (ctx, interaction) => ({
auth: {
principalId: interaction.user.id,
principalType: "user",
authenticator: "discord",
attributes: { channel_id: interaction.channelId, guild_id: interaction.guildId ?? "" },
},
}),
events: {
"message.completed"(eventData, channel, ctx) {
if (eventData.finishReason === "tool-calls") return;
if (eventData.message) channel.discord.post(eventData.message);
},
},
});Una limitación a tener en cuenta: los archivos adjuntos entrantes no están soportados hoy en el canal de Discord, mientras que Slack sí los gestiona. Si tu agente necesita leer archivos subidos, piensa en usar Slack o un canal web.
Lo que me gusta es que la misma lógica de agente sirve a ambas plataformas. Tu herramienta get_weather no sabe ni le importa si la pregunta vino de Slack, Discord, la terminal o un navegador. Escribe el comportamiento una vez, expónlo en todas partes.
Paso 6: Usa modelos open source en lugar de Claude
El modelo por defecto es Claude Sonnet, pero no estás casado con él. En los últimos años aprendimos por las malas que un modelo del que dependes puede quedar obsoleto o desaparecer de un día para otro, así que poder cambiar importa. Eve convierte el modelo en una sola línea de configuración.
Tienes dos opciones de enrutado.
Gateway (id de texto)
Un id de modelo en forma de string se enruta a través del Vercel AI Gateway. Cambia el valor y ya estás usando otro modelo, sin más cambios:
import { defineAgent } from "eve";
export default defineAgent({
// any model the gateway exposes
model: "moonshotai/kimi-k2.6",
});Esto funciona en Vercel con OIDC de proyecto, o en cualquier otro sitio con AI_GATEWAY_API_KEY definida. El Gateway es el camino con menos configuración: una clave, muchos modelos, y es fácil hacer A/B entre un modelo rápido y barato y uno más potente.
Proveedor directo
Para saltarte el Gateway por completo, instala el paquete del AI SDK de tu proveedor, pasa un objeto de modelo y define la clave de ese proveedor. Esto funciona muy bien con endpoints compatibles con OpenAI que sirven modelos open source:
npm install @ai-sdk/openaiimport { createOpenAI } from "@ai-sdk/openai";
import { defineAgent } from "eve";
const provider = createOpenAI({
baseURL: "https://openrouter.ai/api/v1",
apiKey: process.env.OPENROUTER_API_KEY,
});
export default defineAgent({
model: provider("z-ai/glm-5.1"),
});Apunta la baseURL a OpenRouter, Together, Groq o tu propio endpoint autoalojado, y estarás ejecutando un modelo abierto con el mismo código de agente.
¿Qué modelo abierto deberías elegir? Modelos como GLM-5.2, Kimi K2.6 y Qwen 3.6 se mantienen bien en trabajo agéntico de llamadas a herramientas por una fracción del coste de los modelos frontera. Profundicé en las ventajas e inconvenientes en mi guía de los mejores LLMs open source para reemplazar a Claude, así que consúltala si vas a elegir uno para una carga de trabajo real. La versión corta: enruta modelos baratos y rápidos a los turnos simples y guarda los caros para los problemas difíciles. Eve te permite hacer exactamente eso, incluso por subagente.
Enrutado de modelos por tarea
Como el modelo es solo configuración, puedes ejecutar subagentes en modelos distintos. Un subagente de investigación podría usar un modelo barato de contexto largo mientras el agente raíz se queda con algo más potente. Construyes la skill una vez y la enrutas donde tenga sentido.
Paso 7: Añade herramientas de servicios externos con conexiones
Más allá de las herramientas que escribes, Eve puede incorporar herramientas de servidores MCP externos y documentos OpenAPI. Estas viven en agent/connections/, y el modelo nunca ve la URL ni las credenciales: descubre las herramientas y las llama por su nombre.
Una conexión al servidor MCP de Linear se ve así:
import { defineMcpClientConnection } from "eve/connections";
export default defineMcpClientConnection({
url: "https://mcp.linear.app/sse",
description: "Linear workspace: issues, projects, cycles, and comments.",
auth: {
getToken: async () => ({ token: process.env.LINEAR_API_TOKEN! }),
},
});Para cualquier cosa que toque dinero, borre datos o envíe mensajes, protégela detrás de una aprobación. Los helpers de eve/tools/approval te dan never(), once() (pregunta la primera vez en una sesión) y always() (pregunta cada vez). El mismo flujo de pausa y reanudación que impulsa las herramientas human-in-the-loop se encarga de ello.
Paso 8: Despliégalo
Ya tienes un agente funcionando. Ahora necesita vivir en algún sitio. Eve se ejecuta igual en local, en Vercel y en un host de Node normal, así que pasar a producción es casi todo mecánico.
Opción A: Desplegar en Vercel
eve build compila el agente y escribe la salida del host. En Vercel eso es el bundle de Build Output en .vercel/output, más los artefactos compilados en .eve/. Después despliega con la CLI o haciendo push a un proyecto conectado a Git:
vercel deployAntes de esa primera petición de producción, recorre esta checklist corta:
- Define una credencial de modelo y cualquier secreto de autenticación de rutas en el entorno de despliegue, nunca en el código
- Sustituye el
placeholderAuth()del scaffold por una política de autenticación real (Basic, JWT, OIDC o un verificador propio); una app sin configurar falla en cerrado y rechaza el tráfico del navegador, que es el comportamiento seguro por defecto - Confirma que el backend del sandbox coincide con el entorno (
vercel()en Vercel,defaultBackend()en cualquier otro sitio)
Una vez desplegado, la plataforma detecta Eve automáticamente y muestra una pestaña Agent Runs en la vista de Observability de tu proyecto, donde puedes explorar sesiones y leer la traza de cada conversación.
Opción B: Autoalojar en tu propio VPS
Si prefieres no atarte a la plataforma de Vercel, Eve se ejecuta como un servicio de Node normal detrás de tu propio gestor de procesos o proxy inverso:
eve build
PORT=3000 eve start --host 0.0.0.0Fuera de Vercel, Eve escribe la salida estándar de Nitro en .output/, el Workflow SDK usa su mundo local (guardando el estado en .workflow-data) y defaultBackend() elige un backend de sandbox local. Algunas cosas que conviene explicitar al autoalojar:
- Coloca
.workflow-dataen almacenamiento persistente para que el estado de las sesiones sobreviva a los reinicios - Usa un modelo de proveedor directo con
OPENAI_API_KEY/ANTHROPIC_API_KEY, o manténAI_GATEWAY_API_KEYsi aún quieres el enrutado del Gateway - Sustituye
vercelOidc()por autenticación que tu host pueda verificar - Si tu agente usa tareas programadas, asegúrate de que tu host ejecuta las tareas programadas de Nitro, o lanza el mismo trabajo desde tu propio cron
La forma más limpia que he encontrado de ejecutar un servicio de Node como este en un VPS es Dokploy, una alternativa open source y autoalojable a Vercel y Heroku. Te da despliegues basados en Git, HTTPS automático vía Traefik, gestión de variables de entorno y logs, todo desde un panel que controlas tú. Mi guía de instalación de Dokploy cubre cómo ponerlo en marcha en un servidor nuevo.
El flujo de despliegue de un agente Eve se corresponde casi exactamente con el de una app de Node normal, así que si ya has desplegado algo con Dokploy, esto te resultará familiar. Mi tutorial sobre desplegar TanStack Start en un VPS con Dokploy muestra el patrón completo (comando de build, comando de arranque, variables de entorno, dominio), y los mismos pasos aplican aquí: define el comando de build como eve build, el de arranque como eve start --host 0.0.0.0, expón el puerto y añade tus secretos de modelo y autenticación en el panel de entorno.
Por qué autoalojar el agente
Ejecutarlo en tu propio VPS significa que tus datos de conversación y credenciales se quedan en infraestructura que controlas, los costes son predecibles y no estás expuesto a cambios de precios de la plataforma. El contrapunto es que tú te encargas de los backups, el escalado y el almacenamiento persistente de .workflow-data.
Verifica el despliegue
Tomaras el camino que tomaras, haz una prueba de humo de las rutas en vivo. Primero el health, luego un turno real:
curl https://<your-app>/eve/v1/health
curl -X POST https://<your-app>/eve/v1/session \
-H 'content-type: application/json' \
-d '{"message":"Hello from production"}'También puedes manejar el despliegue en vivo con la terminal de desarrollo, lo cual viene bien para una comprobación rápida en producción:
eve dev https://<your-app>Qué construir después
El bot del tiempo era solo una forma de ver el bucle en marcha. Lo interesante es lo que pones en tools/ y skills/. Un agente de reutilización de contenido que redacta posts sociales y llama a herramientas de generación de imágenes. Un agente de investigación de leads que extrae datos de tu CRM. Un bot de triaje de soporte viviendo en tu Slack. El andamiaje es siempre el mismo, que es justo la idea: dejas de reinventar el arnés y dedicas tu tiempo a la capacidad real.
- Añade una skill en
agent/skills/para cualquier procedimiento de varios pasos que el modelo deba cargar solo cuando sea relevante - Levanta subagentes para trabajo en paralelo o especializado, cada uno con su propio modelo
- Añade tareas programadas para trabajos recurrentes como un resumen diario
- Pon un front end en Next.js delante del agente con el hook
useEveAgent
Preguntas frecuentes
¿Es Vercel Eve gratis y open source?
Sí, Eve es open source y vive en GitHub. Puedes ejecutarlo enteramente en tu propia infraestructura con tus propias claves de modelo. Las comodidades opcionales (AI Gateway, Sandbox alojado, Vercel Connect, el panel Agent Runs) son funciones de la plataforma Vercel a las que puedes adherirte, no requisitos. Está en beta, así que espera ciertos cambios.
¿Necesito una cuenta de Vercel para usar Eve?
No. Necesitas una credencial de modelo, que puede ser una clave directa de proveedor como ANTHROPIC_API_KEY u OPENAI_API_KEY. Una cuenta de Vercel facilita el AI Gateway, las credenciales de Slack vía Connect y los sandboxes alojados, pero puedes autoalojar todo en un VPS con Dokploy y nunca vincular un proyecto de Vercel.
¿Puede un agente atender Slack y Discord al mismo tiempo?
Sí. Añade tanto agent/channels/slack.ts como agent/channels/discord.ts. Las instrucciones, herramientas y skills del agente se comparten; cada canal solo adapta la entrada y salida de su plataforma. Tus herramientas no necesitan saber de qué superficie vino un mensaje.
¿Puedo usar modelos open source en lugar de Claude?
Sí. Cambia el valor de model en agent/agent.ts. Usa un id de gateway como z-ai/glm-5.1, o instala un proveedor del AI SDK y apunta su baseURL a OpenRouter, Together, Groq o un endpoint autoalojado. Mira mi comparativa de LLMs open source para elegir uno.
¿Qué significa «durable» para una sesión de Eve?
Una sesión puede emitir progreso en streaming, llamar a herramientas y subagentes, pausarse para pedir aprobación humana, reanudarse cuando llega la respuesta y mantener el estado a lo largo de muchos turnos. Está construida sobre el Workflow SDK open source, que hace las ejecuciones reanudables y resistentes a fallos. Un paso completado nunca se reejecuta; un paso interrumpido sí, así que haz que los efectos secundarios sean idempotentes.
Conclusión
Eve toma la parte de la construcción de agentes que suele ser un lío (canales, estado durable, enrutado de modelos, despliegues) y la convierte en una carpeta que puedes leer de arriba abajo. Generas el scaffold con un comando, añades una herramienta como un único archivo, apuntas un canal a Slack o Discord y eliges el modelo que encaje con el trabajo y tu presupuesto. Despliégalo en Vercel para el camino de cero configuración, o autoalójalo en un VPS con Dokploy cuando quieras ser dueño de todo el stack.
Si vienes de otro framework, el cambio casi no te cuesta nada, ya que tus herramientas y skills son TypeScript y Markdown planos que puedes llevarte a otra parte. Empieza con el hola mundo del tiempo y luego reemplázalo por algo que tu equipo usaría de verdad.
Lee la documentación de Eve

