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

Ejecutar el curso de Vercel AI SDK localmente ​

Usa esta página para ejecutar el agente de soporte al cliente extraído del curso de Vercel AI SDK en tu computadora y obtener una respuesta con tu propia clave de OpenAI y el proyecto de Supabase que construiste en el curso. Un servidor Node ejecuta todo el proyecto: sirve la página de chat y responde sus preguntas, para que tus claves permanezcan en ese servidor y nunca lleguen al navegador. Una cosa diferencia esto del editor de Scrimba: Node no lee .env por sí solo, así que el script de inicio necesita una bandera.

Lo que necesitas primero ​

Instala una versión LTS compatible de Node.js. Se recomienda Node 24 e incluye npm.

Verifica que ambos comandos funcionen. Tus números de versión pueden ser diferentes:

bash
$ node --version
v24.18.0
$ npm --version
11.18.0

También necesitas tres valores:

  • una clave de API de OpenAI, en una cuenta con facturación configurada, porque OpenAI genera cada respuesta;
  • la URL de tu proyecto de Supabase, que se muestra en el diálogo Connect del proyecto;
  • la clave secreta de ese proyecto, que comienza con sb_secret_, en Settings > API Keys.

Usa el proyecto de Supabase del curso. El agente busca los documentos de ayuda de Scrimba almacenados allí a través de la función match_documents del proyecto. Si ya no tienes ese proyecto, el servidor aún necesita una URL de Supabase y una clave secreta para iniciarse, y los valores de un proyecto nuevo funcionarán. Solo las preguntas sobre Scrimba usan Supabase, así que las preguntas generales aún obtienen respuestas de búsqueda web, mientras que las preguntas sobre Scrimba no encuentran nada que buscar.

La clave heredada service_role también funciona hasta que Supabase la retire, previsto para finales de 2026. Ver Claves de API de Supabase.

JunoLo que necesitas primero Verifica que node --version y npm --version ambos impriman una versión. Luego recopila tres cosas: tu clave de OpenAI, la URL de tu proyecto de Supabase y la clave secreta de ese proyecto.

Usa el proyecto de Supabase que construiste en el curso; uno nuevo no tiene documentos que el agente pueda buscar.

JunoLo que necesitas primero La facturación importa porque cada pregunta cuesta solicitudes de OpenAI. Una pregunta general toma una: el modelo busca en la web y responde en la misma solicitud. Una pregunta sobre Scrimba toma tres: una para elegir la base de conocimiento, una para convertir la pregunta en un embedding para Supabase, y una para escribir la respuesta.
JunoLo que necesitas primeroconfig.js construye el cliente de Supabase con la clave secreta, así que la llamada a match_documents omite completamente Row Level Security. Eso es seguro solo porque el cliente existe en el servidor; Supabase también rechaza una clave secreta enviada desde un navegador.

Instala los paquetes ​

Abre una terminal en la carpeta extraída, la que contiene package.json y server.js, e instala las versiones exactas de paquetes que usó el curso:

bash
$ cd path-to-your-extracted-project
$ npm ci
added 94 packages, and audited 95 packages in 4s

npm también reporta algunas vulnerabilidades en esos paquetes. No impiden que el proyecto se ejecute en tu computadora. No ejecutes npm audit fix; actualiza paquetes contra los que se escribió el código del curso.

JunoInstala los paquetes Ejecuta npm ci en la carpeta con package.json. Termina diciendo cuántos paquetes agregó.

Si npm dice que solo puede instalar con un package-lock.json existente, estás en la carpeta incorrecta.

JunoInstala los paquetesnpm ci instala desde package-lock.json, no desde los rangos en package.json, así que obtienes el AI SDK, cliente de Supabase y versiones de Express que usó el curso en lugar de las más nuevas que los rangos permiten.
JunoInstala los paquetespackage.json solicita ai ^5.0.29; el lockfile fija 5.0.43, con @ai-sdk/openai 2.0.30. npm ci se niega a ejecutarse cuando los dos archivos no coinciden, así que una dependencia editada falla aquí, no a mitad de una pregunta.

Cambia el script de inicio ​

En Scrimba, el editor entregaba tus claves al servidor. En tu computadora, Node lee .env solo cuando se lo pides, y config.js detiene el servidor de inmediato si falta la clave de OpenAI. Abre package.json y cambia el script de inicio de:

json
"start": "node server.js"

a:

json
"start": "node --env-file=.env server.js"

La bandera está incorporada en Node, así que no hay nada extra que instalar.

JunoCambia el script de inicio En package.json, añade --env-file=.env al script de inicio exactamente como se muestra, y guarda el archivo. Nada más en el proyecto cambia.
JunoCambia el script de inicio Con la bandera, Node copia cada línea de .env en process.env antes de que server.js se ejecute, que es donde config.js busca las claves. Sin ella, la primera verificación en config.js detiene el servidor.
JunoCambia el script de inicio Una variable ya configurada en tu shell gana sobre el mismo nombre en .env. Un antiguo OPENAI_API_KEY exportado en tu perfil de terminal se usa en lugar del que está en el archivo.

Añade tus claves a .env ​

Crea .env junto a package.json con tus tres valores:

dotenv
OPENAI_API_KEY=tu-clave-de-api-de-openai
SUPABASE_URL=https://tu-proyecto.supabase.co
SUPABASE_SERVICE_ROLE_KEY=tu-clave-secreta-de-supabase
PORT=3000

El código aún usa el nombre heredado SUPABASE_SERVICE_ROLE_KEY; pon tu clave secreta allí sin renombrar nada. Tiene que ser la clave secreta o la clave heredada service_role, no la clave publicable, que está destinada al código del navegador y no tiene el acceso que el servidor necesita. PORT es opcional: sin él, el servidor usa 3000.

Crea .gitignore junto a package.json y añade:

txt
.env
node_modules/

Una clave que llega a un repositorio de Git permanece en su historial incluso después de que elimines el archivo. El manual de Git cubre el hábito en ignorar archivos y buenas prácticas.

Mantén la clave de Supabase en el servidor

Tu clave secreta de Supabase puede leer y cambiar todo en tu base de datos. En este proyecto solo el servidor la lee, y ese es el único lugar seguro para ella: nunca la copies en client.js, y nunca hagas commit ni compartas .env.

JunoAñade tus claves a .env Haz un archivo llamado .env junto a package.json con tus valores en las primeras tres líneas, luego lista .env en .gitignore para que Git nunca lo guarde.
JunoAñade tus claves a .env Node lee .env una vez, cuando el servidor se inicia. Después de cualquier cambio en él, detén el servidor con Ctrl+C e inicia de nuevo.
JunoAñade tus claves a .env El navegador solo habla con tu propio servidor: client.js envía la pregunta a /api/ask y recibe una respuesta y sus fuentes. Ninguna clave está en nada que el navegador descargue.

Inicia el agente y haz una pregunta ​

Inicia el servidor:

bash
$ npm start

> start
> node --env-file=.env server.js

Server listening at http://localhost:3000

Abre http://localhost:3000, o el puerto que configuraste en .env. La página Support AI Chatbot tiene un cuadro para tu pregunta y un botón Ask. Haz una pregunta sobre Scrimba, como cómo restablecer tu contraseña. La página muestra Thinking… mientras el agente trabaja, luego la respuesta. Cuando la respuesta viene de tus documentos de Supabase, View Sources debajo de ella lista los pasajes que usó, cada uno con una puntuación de similitud: OpenAI y Supabase ambos funcionan. Una pregunta general, sobre noticias por ejemplo, se responde con búsqueda web y lista páginas web en su lugar; esa solo necesita OpenAI. El capítulo de RAG explica por qué el agente busca cosas antes de responder.

Si la respuesta dice I encountered an error while processing your request using tool calling. Please try again later., la página no puede decirte por qué. La razón está en la terminal donde se ejecuta el servidor, bajo la línea [ToolBased] Error in RAG process:.

Detén el servidor con Ctrl+C.

JunoInicia el agente y haz una pregunta Ejecuta npm start, espera a Server listening at http://localhost:3000, y abre esa dirección. Haz una pregunta sobre Scrimba y espera la respuesta.

Si la respuesta dice que encontró un error, lee la terminal, no la página.

JunoInicia el agente y haz una pregunta La página que se abre solo muestra que Express sirve archivos. Por cada pregunta, el modelo primero elige una herramienta: la base de conocimiento, que necesita Supabase, o búsqueda web. View Sources te dice cuál eligió.
JunoInicia el agente y haz una preguntawebSearchRetrievalAgent captura cada error durante la pregunta y devuelve esa disculpa fija con estado 200, así que la página nunca ve la causa. Un error de Supabase va al modelo como el resultado de la herramienta en su lugar, así que obtienes una respuesta sin fuentes y una línea [Tool:KB] en la terminal.

Solución de problemas ​

El servidor se detiene de inmediato con Missing OPENAI_API_KEY environment variable: Node no cargó .env. Verifica que el script de inicio diga node --env-file=.env server.js y que el nombre en .env sea exactamente OPENAI_API_KEY. SUPABASE_SERVICE_ROLE_KEY is missing or invalid y SUPABASE_URL is missing or invalid significan lo mismo para esos nombres.

node: .env: not found: El script de inicio es correcto, pero no hay .env junto a package.json. Verifica que el archivo se llame exactamente .env, no .env.txt.

Invalid supabaseUrl: Must be a valid HTTP or HTTPS URL.: SUPABASE_URL tiene que ser la dirección completa del diálogo Connect, comenzando con https://.

Error: listen EADDRINUSE: address already in use :::3000: Otro programa está usando el puerto 3000, a menudo una ejecución anterior de este servidor en otra terminal. Detenlo con Ctrl+C, o configura PORT=3001 en .env, inicia de nuevo y abre http://localhost:3001.

La respuesta dice que encontró un error, y la terminal dice Incorrect API key provided: OpenAI rechazó la clave con un 401. Cópiala de nuevo de tu cuenta de OpenAI, verifica que no haya sido eliminada, luego reinicia el servidor.

La terminal dice You exceeded your current quota: La clave funciona, pero la cuenta de OpenAI no tiene crédito para gastar. Añade facturación en tu cuenta de OpenAI, luego pregunta de nuevo.

Una pregunta sobre Scrimba obtiene una respuesta sin fuentes, y la terminal muestra una línea que comienza con [Tool:KB] Error: OpenAI funciona, pero Supabase no devolvió los documentos del curso. Verifica que la URL y la clave secreta provengan del mismo proyecto, que la clave sea la clave secreta o service_role en lugar de la publicable, y que el proyecto aún tenga los documentos del curso y su función match_documents.

La terminal dice que el modelo gpt-4o no está disponible: OpenAI detiene gpt-4o el 14 de enero de 2027, y nombra gpt-6-luna como su reemplazo. Cambia ANSWERING_MODEL en constants.js al reemplazo en la página de depreciaciones de OpenAI. Deja EMBEDDING_MODEL_NAME como text-embedding-3-small: los documentos en Supabase fueron incrustados con él, y un modelo de embedding diferente encuentra coincidencias pobres sin ningún error.

JunoSolución de problemas Observa dónde aparece el error. Si el servidor se detiene justo después de npm start, el problema está en package.json o .env. Si la página responde con una disculpa, la razón está en la terminal del servidor.
JunoSolución de problemas Los fallos vienen en orden: carga de Node en .env, verificación de URL de Supabase, puerto, luego OpenAI en cada pregunta, luego Supabase dentro de la herramienta de base de conocimiento. Arregla el primero que encuentres.
JunoSolución de problemas Los errores de inicio provienen de config.js, que verifica cada variable y construye ambos clientes tan pronto como server.js lo carga, así que detienen el proceso. Los errores durante una pregunta son capturados y registrados, así que el servidor se mantiene en funcionamiento mientras arreglas .env; reinícialo para cargar el cambio.