Skip to content
This page has been auto-translated and may contain errors.View in English

Ejecutar el código localmente ​

Esta página te ayuda a poner en funcionamiento un proyecto extraído de Intro to AI Agents en tu computadora: un servidor Express que se comunica con tu proveedor de IA, y un frontend Vite que abres en el navegador. Nada más adelante en el curso depende de esto, y la versión de Scrimba sigue funcionando hagas o no esta configuración.

Lo que necesitas primero ​

Una versión LTS compatible de Node.js. Se recomienda Node 24, y Node 22 también funciona. Verifica qué tienes:

bash
$ node --version
v24.18.0

Si dice "command not found", instala la versión marcada LTS desde nodejs.org.

npm. Node incluye npm, y las descargas de Scrimba son proyectos npm. Verifica que esté disponible:

bash
$ npm --version
11.18.0
JunoLo que necesitas primero Instala la versión de Node.js marcada como LTS desde nodejs.org y obtendrás npm incluido, así que ambos comandos de arriba deberían mostrar un número de versión.

Si alguno dice "command not found", ese es el único problema, e instalar Node lo soluciona todo.

JunoLo que necesitas primero Node 24 es la recomendación y Node 22 funciona. El proyecto carga su archivo .env con un cargador integrado en Node, y se detiene con un mensaje que menciona Node 20.12 si ese cargador no existe.

Ese número explica el mensaje; no es una versión que debas instalar. Node 20 ya no recibe actualizaciones de seguridad, así que si gestionas varias versiones de Node, establece este proyecto en 24 y continúa.

JunoLo que necesitas primero El archivo environment.js generado importa loadEnvFile desde node:process. En una versión de Node sin esto, la validación lanza "Local environment loading requires Node.js 20.12 or newer." en lugar de continuar con variables vacías.

Esto importa porque la alternativa te engañaría: las variables en blanco llegan al proveedor como una clave faltante, y el síntoma apuntaría a tus credenciales en lugar de tu entorno de ejecución. Aquí, ese mensaje siempre significa cambiar Node, no .env.

Abre la carpeta del proyecto ​

Abre una terminal en la carpeta extraída que contiene package.json:

bash
$ cd path-to-your-downloaded-project

Echa un vistazo a lo que hay ahí. Los archivos exactos varían según la lección. package.json siempre está ahí y lista los comandos que espera el proyecto; las lecciones de aplicación también incluyen archivos como server.js, environment.js, y vite.config.js.

JunoAbre la carpeta del proyecto Usa cd para entrar en la carpeta extraída que contiene package.json. Todos los comandos en esta página se ejecutan desde ahí.

Cuando un comando dice que falta un archivo, verifica en qué carpeta está tu terminal antes de cambiar cualquier otra cosa.

JunoAbre la carpeta del proyecto Abre package.json antes de ejecutar cualquier cosa. Su bloque scripts te dice qué comandos espera este proyecto, lo que es mejor que adivinar.

Ver server.js y vite.config.js lado a lado también vale la pena notar: este proyecto ejecuta un servidor Express y un servidor de desarrollo Vite juntos, que es cómo la clave de API se mantiene fuera de la página.

JunoAbre la carpeta del proyecto El código fuente del curso usa pnpm, pero el paso de empaquetado de Scrimba elimina el lock de pnpm y los archivos del workspace y reescribe los scripts para llamar a npm, así que start se convierte en concurrently --raw "npm run --silent server" "npm run --silent client".

Trabaja con el paquete descargado usando npm tal como está, en lugar de recrear el workspace del código fuente alrededor de él.

Instala y ejecuta ​

En Scrimba, AI_URL, AI_KEY, y AI_MODEL se almacenan en tu configuración de cuenta, y Scrimba los inyecta en el proyecto en ejecución. Por eso no hay archivo .env en la versión del navegador: no es necesario ahí, y sería un mal lugar para guardar una clave en un editor compartido de todas formas. En tu máquina nada los inyecta, así que un archivo .env hace ese trabajo.

Instala las dependencias del proyecto descargado, luego ejecútalo:

bash
$ npm install
$ npm start

En la primera ejecución, environment.js nota que faltan los valores requeridos, crea .env junto a package.json, y detiene el servidor Express con un mensaje que incluye estas líneas:

text
Missing environment variables: AI_KEY, AI_MODEL, AI_URL.
Created .env with the required variable names. Complete it, then restart the app.

Es posible que Vite siga ejecutándose, así que presiona Ctrl+C para detenerlo antes de editar el nuevo archivo. El archivo .env generado tiene una línea vacía por variable y una línea de puerto comentada al final:

dotenv
AI_KEY=
AI_MODEL=
AI_URL=
# PORT=3001

Rellena tus valores reales directamente después de cada =, sin espacios alrededor:

dotenv
AI_KEY=tu-clave-api-aqui
AI_MODEL=gpt-5.4-nano
AI_URL=https://api.openai.com/v1
# PORT=3001

Estos son los mismos valores que pusiste en las variables de entorno de Scrimba. Si los necesitas de nuevo, ve a provider setup. Deja la línea # PORT=3001 como está; el proyecto usa el puerto 3001 a menos que lo cambies.

Algunas lecciones posteriores añaden líneas opcionales como GITHUB_TOKEN= al archivo generado. El servidor puede iniciarse sin ellas e imprime ○ Optional environment not configured: GITHUB_TOKEN. Sin un token de GitHub, las solicitudes a GitHub usan el límite de tasa anónima más bajo.

Nunca hagas commit de tu archivo .env

Si pones este proyecto en Git, lista .env en un .gitignore en la carpeta del proyecto antes de tu primer commit. Una clave subida a un repositorio público es una clave que tienes que revocar, y los scrapers automatizados la encuentran en minutos. node_modules también pertenece ahí, porque es grande y npm install la reconstruye:

txt
.env
node_modules

.env.example es el archivo que es seguro hacer commit, porque contiene texto de marcador en lugar de tu clave. El manual de Git cubre el hábito más amplio en ignoring files and good habits.

Reinicia el proyecto después de guardar .env:

bash
$ npm start

Node carga el archivo a través del environment.js generado. El vite.config.js descargado llama a loadEnv de Vite, así que Vite lee el mismo archivo cuando configura el proxy navegador-a-servidor. No necesitas instalar dotenv ni editar server.js.

npm start ejecuta dos procesos a la vez: el servidor Express que mantiene tu clave de API y hace solicitudes de modelo, y el servidor de desarrollo Vite que sirve el frontend. Verás salida de ambos intercalada en la misma terminal. Una verificación de entorno marcada y ambas líneas de dirección significan que funcionó:

text
Environment check:
✓ AI_KEY: configured
✓ AI_MODEL: gpt-5.4-nano
✓ AI_URL: https://api.openai.com/v1
OpenSwap server running at http://localhost:3001

  VITE v6.4.3  ready in 214 ms

  ➜  Local:   http://localhost:5173/

Abre la URL de Vite, no la de Express. El frontend es con lo que interactúas, y envía sus llamadas de API a Express detrás de escenas.

Detén ambos con Ctrl+C.

JunoInstala y ejecuta Ejecuta npm install una vez, luego npm start. El primer inicio crea .env y se detiene; presiona Ctrl+C, rellena los tres valores que usas en Scrimba, guarda, e inicia de nuevo.

Cuando veas las marcas de verificación de la verificación de entorno y la dirección de Vite, abre esa dirección. Si usas Git, crea el .gitignore antes de tu primer commit, no después.

JunoInstala y ejecuta Lo único que cambia fuera de Scrimba es que nada suministra los valores de entorno, así que .env hace un trabajo que era invisible antes. El environment.js generado crea el archivo con los nombres correctos y lo carga para Express.

Vite es un proceso separado y puede sobrevivir al primer fallo del servidor, por lo que detienes todo el comando con Ctrl+C y lo reinictas después de rellenar los valores.

JunoInstala y ejecuta El servidor carga secretos a través de loadEnvFile integrado de Node, mientras que Vite llama a loadEnv solo para configurar su proxy. El navegador no recibe la clave: llama a rutas /api relativas, y Express es dueño de la solicitud del proveedor.

Si una clave llega a un repositorio, eliminar el archivo en un commit posterior no la elimina; permanece legible en el historial. Revocarla en el proveedor e emitir una nueva es la única solución real, por lo que el .gitignore viene primero.

Cómo se encuentran los dos servidores ​

Tu código frontend llama a rutas como /api/swaps, sin hostname ni puerto. Esto funciona por el proxy en vite.config.js:

js
import { defineConfig, loadEnv } from "vite";

export default defineConfig(({ mode }) => {
  const env = loadEnv(mode, process.cwd(), "");
  const port = env.PORT || process.env.PORT || 3001;

  return {
    server: {
      hmr: false,
      watch: {
        ignored: ["**/*"],
      },
      proxy: {
        "/api": {
          target: `http://localhost:${port}`,
        },
      },
    },
  };
});

Cualquier cosa que comience con /api se reenvía a Express. Por eso el código frontend nunca necesita saber en qué puerto está el backend, y es también por qué no tienes errores de origen cruzado en desarrollo.

Los playgrounds del curso intencionalmente desactivan el comportamiento de recarga automática de Vite para que un guardado no pueda borrar la salida actual mientras trabaja en una lección. Actualiza el navegador manualmente cuando quieras cargar un cambio.

JunoCómo se encuentran los dos servidores Usa la dirección de Vite, usualmente http://localhost:5173, en tu navegador. Las llamadas que comienzan con /api se pasan al servidor Express para ti, así que nunca abres el puerto 3001 directamente.

Después de editar un archivo, actualiza el navegador tú mismo; la página no se recarga automáticamente.

JunoCómo se encuentran los dos servidores El proxy de Vite asigna solicitudes relativas /api a Express en el puerto desde .env, u 3001 cuando no se establece puerto. Eso mantiene el frontend independiente del puerto del backend y evita una configuración de origen cruzado separada durante el desarrollo.
JunoCómo se encuentran los dos servidores Ambos procesos resuelven PORT independientemente desde el mismo .env: Node antes de que Express escuche, y Vite mientras construye el destino del proxy. Una línea # PORT comentada cuenta como sin establecer, así que ambas recurren a 3001 juntas.

HMR y la observación de archivos se deshabilitan intencionalmente, así que los cambios necesitan una actualización manual del navegador.

Cuando el puerto 3001 está en uso ​

Si algo más en tu máquina ya usa el puerto 3001, Express falla al iniciar con EADDRINUSE. Abre .env, quita el # de la línea # PORT=3001 al final (o añade la línea si no está), y cambia el número:

dotenv
PORT=3101

Luego detén el proyecto con Ctrl+C y ejecuta npm start de nuevo. Ese es el único cambio que necesitas. server.js lee PORT para decidir dónde escuchar, y Vite lee el mismo valor antes de configurar su proxy.

El puerto del frontend se comporta diferente. Si 5173 está ocupado, Vite se mueve al siguiente puerto libre e imprime esa dirección en su lugar, así que lee la línea Local: en lugar de escribir localhost:5173 de memoria. Para elegir el puerto del frontend tú mismo, pásalo a Vite:

bash
$ npm run client -- --port 5180

El bare -- le dice a npm que pase el flag después de él a Vite en lugar de tratarlo como una opción de npm.

JunoCuando el puerto 3001 está en uso Si ves EADDRINUSE, abre .env, cambia # PORT=3001 a PORT=3101 (la # se quita), e reinicia. El frontend recoge el nuevo puerto del backend automáticamente.

Para el frontend en sí, solo abre la dirección que imprime Vite.

JunoCuando el puerto 3001 está en uso Express y el proxy de Vite leen PORT del mismo .env, así que cambiar ese valor mantiene ambos sincronizados.

El frontend de Vite tiene su propio puerto: sube desde 5173 cuando ese está ocupado, y npm run client -- --port 5180 lo establece directamente.

JunoCuando el puerto 3001 está en uso Express no tiene fallback: listen en un puerto ocupado lanza un error, así que el backend necesita un PORT explícito. Vite en este proyecto no establece strictPort, así que se mueve hacia arriba por sí solo.

Los cambios de puerto del backend pertenecen a .env, los cambios de puerto del frontend son argumentos de CLI de Vite, y el proxy sigue al backend porque lee el mismo valor. Nada codifica un destino.

Si algo no funciona ​

EADDRINUSE significa que el puerto ya está en uso. Ve la sección de arriba.

Missing environment variables: seguido de nombres significa que esas líneas en .env aún están vacías, o el archivo no se guardó. Rellérnalas e reinicia.

Un error de credenciales faltantes o autenticación significa que AI_KEY no llega al código, o el proveedor lo rechazó. Verifica que tu archivo se llama exactamente .env y no .env.txt, que está en la misma carpeta que package.json, que el valor está rellenado, y que reiniciaste el servidor después de editarlo.

"Local environment loading requires Node.js 20.12 or newer." Tu Node es demasiado antiguo para el cargador de .env integrado del proyecto. Instala el lanzamiento LTS actual, Node 24, desde nodejs.org, luego ejecuta npm start de nuevo. No necesitas dotenv.

Un error de modelo no encontrado usualmente significa que AI_MODEL y AI_URL no coinciden, por ejemplo un ID de modelo de OpenAI contra la URL de OpenRouter. Cambia las tres variables juntas cuando cambies proveedores.

Las llamadas de API devuelven 404 desde el frontend sugiere que Express no está ejecutándose o está en un puerto diferente del que espera el proxy. Mira tu terminal: deberías ver tanto la línea de Express como la de Vite. Si solo Vite se inició, Express se estrelló, y la razón estará justo encima.

La instalación se completa pero npm start no puede encontrar un paquete. Ejecuta npm install de nuevo e incluye la salida completa cuando pidas ayuda. La descarga incluye package-lock.json, así que pnpm y una configuración de workspace no están involucradas.

Todo se ve correcto y aún falla. Llévalo al Discord del curso, con lo que ejecutaste y lo que regresó. Los problemas de configuración casi siempre son específicos de una máquina, y alguien probablemente ya haya tropezado con la tuya.

JunoSi algo no funciona Comienza con el texto de error exacto y encuéntralo en la lista de arriba. Los errores de puerto apuntan a un puerto en uso, los errores de variable faltante y autenticación apuntan a .env, y un 404 del frontend usualmente significa que Express no está ejecutándose.

Reinicia con npm start después de cada cambio a .env.

JunoSi algo no funciona Trata la configuración como tres puntos de control: dependencias instaladas, ambos procesos ejecutándose, y las tres variables de IA coincidiendo en un proveedor y modelo.

El primer punto de control que falla te dice en qué capa buscar, así que arregla ese antes de tocar cualquier cosa después.

JunoSi algo no funciona Lee fallos por límite: npm resuelve paquetes, environment.js carga credenciales, Express es dueño del tráfico del proveedor, y Vite proxifica solicitudes de API del navegador.

Verifica el límite justo antes del fallido en lugar de cambiar varios niveles a la vez.