Entrada

Road to IA

Modelo de IA y errores

Cuando especifiqué que el modelo de IA de Gemini que quería que usara mi API es “gemini-1.5-flash” me daba en la consola del navegador este error:

1
RESPONSE: {"error":"[GoogleGenerativeAI Error]: Error fetching from https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent: [404 Not Found] models/gemini-1.5-flash is not found for API version v1beta, or is not supported for generateContent. Call ListModels to see the list of available models and their supported methods."}

Lo importante toda esa línea es este cachito models/gemini-1.5-flash is not found for API version v1beta que significa:

“Estás usando un modelo que ya no existe o no está disponible con ese endpoint”

Sólo hay que cambiar el modelo que estas usando por el que te interes. Se pueden ver en este enlace Modelos de IA de Gemini (Google)

El día que se escribe esto ha salido Gemini 3 y tiene estas opciones:

image

Si pinchas en alguna de las tarjetas Gemini 3 Flash por ejemplo, hay que fijarse en:

image

Lo defines aquí en ´model: ´:

1
2
3
const model = genAI.getGenerativeModel({
      model: "gemini-3-flash-preview",
    });

Por supuesto en hay que importar la librería de Gemini en el archivo al principio y generar en el hosting de la API una variable de entorno con la API KEY de Gemini.

1
2
3
4
5
6
7
import { GoogleGenerativeAI } from "@google/generative-ai";

const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
.
.
.

La API KEY se consigue en → https://aistudio.google.com/


Peticiones desde CLI web

Como lo que realmente estoy progrmando es una API la cual recibe una pregunta/consulta y devuelve la respuesta, si visitas el archivo .js de la IA de la API, como no le has pasado ninguna pregunta te devuelve:

image

Se pueden usar herramientas como Jetpack para hacer peticiones, pero también se pueden hacer desde la consola del navegador.

Abres la consola de Chrome y haces la petición en la línea de comandos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
fetch("https://project-c4tfr43.vercel.app/api/chat", {
  method: "POST",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    question: "sessionStorage"
  })
})
.then(async res => {
  const text = await res.text();
  console.log("STATUS:", res.status);
  console.log("RESPONSE:", text);
});

Si lo ejecutamos nos devolverá, dependiendo de si encuentra la IA respuesta o no, un

  • ‘STATUS’: 200 si ok, 400 si no se encuentra, 500 si hay fallo del servidor…
  • ‘RESPONSE’: la respuesta de la IA ´{“answer”:”sessionStorage es una interfaz de JavaScript que permite almacenar datos…´ o si no ha podido generar la respuesta porque no hay datos en la web sacará ´{“answer”:”No tengo información sobre eso en el blog.”}´

Errores de petición por bloqueo de Cloudflare, pero si pegas la url del JSON sí se ve.

Estaba pasando una cosa curiosa y es que el código de la IA funcionaba con lo más básico y hacía la petición, por otra parte si pegabas la URL del JSON ‘https://jorgerosa.dev/data/busqueda.json’ en el navegador se veía el JSON perfecto.

Lo que estaba pasando es que Cloudflare está bloqueando la petición desde Vercel (bot protection)

¿Por qué ocurre?

Tu flujo actual:

1
Vercel (serverless) → fetch → jorgerosa.dev

Pero Cloudflare detecta:

  • request desde servidor (no navegador)
  • sin cookies
  • sin JS challenge

Resultado:

1
403 + HTML (challenge page)

Y luego:

1
JSON.parse("<!DOCTYPE html>...")

¿Por qué en el navegador SÍ funciona?

Porque:

  • ejecuta JS
  • pasa el challenge de Cloudflare
  • tiene headers reales de navegador

Vercel no puede hacer esto.

¿Cuál es la solución?

Hacer un archivo dentro de la propia API para que ésta no tenga que pedirle a Cloudflare el JSON. Por ejemplo

  API/
   └ api.js
  data/
   └ posts.json

La desventaja de esto es que cada vez que cree una entrada nueva el JSON de la api de IA no va a tener esa última, así que habrá que actualizar la “base de conocimiento” de la IA.

URLs de Vercel

En el panel ‘Overview’ del proyecto de Vercel aparecen dos URLs

image

La que nos interesa para programar y probar el proyecto es la Domains es la URL “oficial”

La de Deployment es la URL del último deploy así que va cambiando cada vez que hacemos uno nuevo, ésta sirve para:

  • testing
  • rollback
  • ver versiones antiguas

Logs de Vercel

Si en nuestro código del API ponemos console.log(...) estos mensajes no saldrán en el navegador, ya que se ejecutan en Vercel.

Para verlos tenemos que loguearnos en Vercel, ir al proyecto, y en el menú de la izquierda pinchar en ‘Logs’

image


Diccionario de términos

RAG (Retrieval Augmented Generation)

La Generación Aumentada por Recuperación es una técnica de IA que conecta los modelos de lenguaje (LLM) con fuentes de datos externas fiables, mejorando la precisión y actualizando la información sin reentrenar el modelo. Reduce alucinaciones al buscar documentos específicos (PDFs, bases de datos) para contextualizar la respuesta.

LLM (Large Language Model)

Es una IA avanzada entrenada con volúmenes masivos de texto para comprender, resumir, traducir, predecir y generar lenguaje humano. Basados en redes neuronales transformadoras, aprenden patrones para responder preguntas y crear contenido, siendo ejemplos clave ChatGPT, GPT-4, Llama y Gemini.

Token

Unidad mínima de información — palabra, parte de una palabra, número o símbolo— que un modelo de lenguaje utiliza para procesar y generar texto. Los modelos no leen palabras completas, sino que dividen el texto en estos fragmentos (tokenización) para calcular la siguiente pieza más probable. Generalmente, 100 tokens equivalen aproximadamente a 75 palabras.

MCP (Model Context Protocol)

Es un estándar abierto desarrollado por Anthropic en 2024 que permite a los modelos de lenguaje grandes (LLM) conectarse de forma estandarizada a fuentes de datos, herramientas y servicios externos. Actúa como un puente universal que soluciona la limitación de los modelos de IA de tener conocimiento estático, permitiéndoles acceder a información en tiempo real y realizar acciones como reservar citas o consultar bases de datos.

A diferencia de técnicas como RAG, que se centran en la recuperación pasiva de información, el MCP está diseñado para la interacción activa, permitiendo que la IA ejecute tareas complejas y tome decisiones basadas en datos externos dinámicos. Esto estandariza la integración, eliminando la necesidad de crear APIs personalizadas para cada nueva herramienta y facilitando el desarrollo de agentes de IA autónomos.

image

Esta entrada está licenciada bajo CC BY 4.0 por el autor.

© 2026 eliotjorge. Algunos derechos reservados.