La API de Prompt

Fecha de publicación: 20 de mayo de 2025; última actualización: 21 de septiembre de 2025

Explicación Web Extensiones Estado de Chrome Intención
GitHub Prueba de origen En Prueba de origen Chrome 138 Ver Intención de experimentar

Con la API de Prompt, puedes enviar solicitudes en lenguaje natural a Gemini Nano en el navegador.

Existen muchas formas de usar la API de Prompt. Por ejemplo, podrías crear lo siguiente:

  • Búsqueda potenciada por IA: Responde preguntas basadas en el contenido de una página web.
  • Feeds de noticias personalizados: Crea un feed que clasifique dinámicamente los artículos con categorías y permite que los usuarios filtren ese contenido.
  • Filtros de contenido personalizados Analizar artículos de noticias y ocultar o desenfocar automáticamente el contenido según los temas definidos por el usuario
  • Creación de eventos de calendario Desarrolla una extensión de Chrome que extraiga automáticamente los detalles de los eventos de las páginas web para que los usuarios puedan crear entradas de calendario en pocos pasos.
  • Extracción de contactos sin interrupciones. Crea una extensión que extraiga información de contacto de sitios web, lo que facilitará que los usuarios se comuniquen con una empresa o agreguen detalles a su lista de contactos.

Estas son solo algunas posibilidades, y nos emociona ver lo que crearás.

Revisa los requisitos de hardware

Existen los siguientes requisitos para los desarrolladores y los usuarios que operan funciones con estas APIs en Chrome. Es posible que otros navegadores tengan requisitos de funcionamiento diferentes.

Las APIs de Language Detector y Translator funcionan en Chrome en computadoras de escritorio. Estas APIs no funcionan en dispositivos móviles. Las APIs de Prompt, Summarizer, Writer, Rewriter y Proofreader funcionan en Chrome cuando se cumplen las siguientes condiciones:

  • Sistema operativo: Windows 10 o 11; macOS 13 o versiones posteriores (Ventura y versiones posteriores); Linux; o ChromeOS (a partir de la plataforma 16389.0.0) en dispositivos Chromebook Plus Las APIs que usan Gemini Nano aún no son compatibles con Chrome para Android, iOS y ChromeOS en dispositivos que no son Chromebook Plus.
  • Almacenamiento: Al menos 22 GB de espacio libre en el volumen que contiene tu perfil de Chrome
  • GPU: Estrictamente más de 4 GB de VRAM
  • Red: Datos ilimitados o una conexión no medida

El tamaño exacto de Gemini Nano puede variar a medida que el navegador actualiza el modelo. Para determinar el tamaño actual, visita chrome://on-device-internals.

Usa la API de Prompt

La API de Prompt usa el modelo Gemini Nano en Chrome. Si bien la API está integrada en Chrome, el modelo se descarga por separado la primera vez que un origen usa la API. Antes de usar esta API, acepta la Política de Uso Prohibido de IA Generativas de Google.

Para determinar si el modelo está listo para usarse, llama a LanguageModel.availability().

const availability = await LanguageModel.availability();

Antes de que se pueda descargar el modelo, debe haber una interacción del usuario, como un clic, una presión o una pulsación de tecla.

Si la respuesta fue downloadable o downloading, el modelo y las APIs están disponibles, pero debes descargarlos antes de poder usar las funciones. El usuario debe interactuar con la página (por ejemplo, hacer clic, presionar o tocar) para que se permita la descarga.

Para descargar y crear una instancia del modelo, llama a la función create().

const session = await LanguageModel.create({
  monitor(m) {
    m.addEventListener('downloadprogress', (e) => {
      console.log(`Downloaded ${e.loaded * 100}%`);
    });
  },
});

Si la respuesta a availability() fue downloading, escucha el progreso de la descarga y avísale al usuario, ya que la descarga puede tardar.

Parámetros del modelo

La función params() te informa sobre los parámetros del modelo de lenguaje. El objeto tiene los siguientes campos:

  • defaultTopK: Es el valor predeterminado de top-K.
  • maxTopK: Es el valor del top-K máximo.
  • defaultTemperature: Es la temperatura predeterminada.
  • maxTemperature: Es la temperatura máxima.
await LanguageModel.params();
// {defaultTopK: 3, maxTopK: 128, defaultTemperature: 1, maxTemperature: 2}

Crea una sesión

Una vez que la API de Prompt pueda ejecutarse, crearás una sesión con la función create().

Cada sesión se puede personalizar con topK y temperature usando un objeto de opciones opcional. Los valores predeterminados de estos parámetros se devuelven desde LanguageModel.params().

const params = await LanguageModel.params();
// Initializing a new session must either specify both `topK` and
// `temperature` or neither of them.
const slightlyHighTemperatureSession = await LanguageModel.create({
  temperature: Math.max(params.defaultTemperature * 1.2, 2.0),
  topK: params.defaultTopK,
});

El objeto de opciones opcional de la función create() también toma un campo signal, que te permite pasar un AbortSignal para destruir la sesión.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const session = await LanguageModel.create({
  signal: controller.signal,
});

Agrega contexto con instrucciones iniciales

Con las instrucciones iniciales, puedes proporcionar al modelo de lenguaje contexto sobre las interacciones anteriores, por ejemplo, para permitir que el usuario reanude una sesión almacenada después de reiniciar el navegador.

const session = await LanguageModel.create({
  initialPrompts: [
    { role: 'system', content: 'You are a helpful and friendly assistant.' },
    { role: 'user', content: 'What is the capital of Italy?' },
    { role: 'assistant', content: 'The capital of Italy is Rome.' },
    { role: 'user', content: 'What language is spoken there?' },
    {
      role: 'assistant',
      content: 'The official language of Italy is Italian. [...]',
    },
  ],
});

Cómo restringir las respuestas con un prefijo

Puedes agregar un rol de "assistant", además de los roles anteriores, para explicar las respuestas anteriores del modelo. Por ejemplo:

const followup = await session.prompt([
  {
    role: "user",
    content: "I'm nervous about my presentation tomorrow"
  },
  {
    role: "assistant",
    content: "Presentations are tough!"
  }
]);

En algunos casos, en lugar de solicitar una respuesta nueva, es posible que desees completar previamente parte del mensaje de respuesta del rol de "assistant". Esto puede ser útil para guiar al modelo de lenguaje a usar un formato de respuesta específico. Para ello, agrega prefix: true al mensaje final del rol "assistant". Por ejemplo:

const characterSheet = await session.prompt([
  {
    role: 'user',
    content: 'Create a TOML character sheet for a gnome barbarian',
  },
  {
    role: 'assistant',
    content: '```toml\n',
    prefix: true,
  },
]);

Agrega la entrada y la salida esperadas

La API de Prompt tiene capacidades multimodales y admite varios idiomas. Configura las modalidades y los idiomas de expectedInputs y expectedOutputs cuando crees tu sesión.

  • type: Se espera modalidad.
    • En el caso de expectedInputs, puede ser text, image o audio.
    • En el caso de expectedOutputs, la API de Prompt solo permite text.
  • languages: Es un array para establecer el idioma o los idiomas esperados. La API de Prompt acepta "en", "ja" y "es". La compatibilidad con otros idiomas está en desarrollo.
    • Para expectedInputs, establece el idioma de la instrucción del sistema y uno o más idiomas esperados de la instrucción del usuario.
    • Establece uno o más idiomas expectedOutputs.
const session = await LanguageModel.create({
  expectedInputs: [
    { type: "text", languages: ["en" /* system prompt */, "ja" /* user prompt */] }
  ],
  expectedOutputs: [
    { type: "text", languages: ["ja"] }
  ]
});

Es posible que recibas una "NotSupportedError" DOMException si el modelo encuentra una entrada o salida no admitida.

Capacidades multimodales

Con estas capacidades, puedes hacer lo siguiente:

  • Permite a los usuarios transcribir mensajes de audio enviados en una aplicación de chat.
  • Describe una imagen subida a tu sitio web para usarla en un subtítulo o texto alternativo.

Consulta la demostración de Mediarecorder Audio Prompt para usar la API de Prompt con entrada de audio y la demostración de Canvas Image Prompt para usar la API de Prompt con entrada de imagen.

Adjunta mensajes

La inferencia puede tardar un tiempo, en especial cuando se usan instrucciones con entradas multimodales. Puede ser útil enviar instrucciones predeterminadas con anticipación para completar la sesión, de modo que el modelo pueda comenzar a procesar la información.

Si bien los initialPrompts son útiles en la creación de sesiones, el método append() se puede usar además de los métodos prompt() o promptStreaming() para proporcionar instrucciones contextuales adicionales después de que se crea la sesión.

Por ejemplo:

const session = await LanguageModel.create({
  initialPrompts: [
    {
      role: 'system',
      content:
        'You are a skilled analyst who correlates patterns across multiple images.',
    },
  ],
  expectedInputs: [{ type: 'image' }],
});

fileUpload.onchange = async () => {
  await session.append([
    {
      role: 'user',
      content: [
        {
          type: 'text',
          value: `Here's one image. Notes: ${fileNotesInput.value}`,
        },
        { type: 'image', value: fileUpload.files[0] },
      ],
    },
  ]);
};

analyzeButton.onclick = async (e) => {
  analysisResult.textContent = await session.prompt(userQuestionInput.value);
};

La promesa que devuelve append() se cumple una vez que se valida, procesa y agrega la instrucción a la sesión. La promesa se rechaza si no se puede agregar el mensaje.

Pasa un esquema JSON

Agrega el campo responseConstraint al método prompt() o promptStreaming() para pasar un esquema JSON como valor. Luego, puedes usar la salida estructurada con la API de Prompt.

En el siguiente ejemplo, el esquema JSON garantiza que el modelo responda con true o false para clasificar si un mensaje determinado trata sobre cerámica.

const session = await LanguageModel.create();

const schema = {
  "type": "boolean"
};

const post = "Mugs and ramen bowls, both a bit smaller than intended, but that
happens with reclaim. Glaze crawled the first time around, but pretty happy
with it after refiring.";

const result = await session.prompt(
  `Is this post about pottery?\n\n${post}`,
  {
    responseConstraint: schema,
  }
);
console.log(JSON.parse(result));
// true

Tu implementación puede incluir un esquema de JSON o una expresión regular como parte del mensaje que se envía al modelo. Esto usa parte de la cuota de entrada. Puedes medir cuánta cuota de entrada usará pasando la opción responseConstraint a session.measureInputUsage().

Puedes evitar este comportamiento con la opción omitResponseConstraintInput. Si lo haces, te recomendamos que incluyas algunas instrucciones en la instrucción:

const result = await session.prompt(`
  Summarize this feedback into a rating between 0-5. Only output a JSON
  object { rating }, with a single property whose value is a number:
  The food was delicious, service was excellent, will recommend.
`, { responseConstraint: schema, omitResponseConstraintInput: true });

Genera un prompt para el modelo

Puedes solicitarle al modelo que use las funciones prompt() o promptStreaming().

Salida no transmitida

Si esperas un resultado breve, puedes usar la función prompt(), que devuelve la respuesta una vez que está disponible.

// Start by checking if it's possible to create a session based on the
// availability of the model, and the characteristics of the device.
const { defaultTemperature, maxTemperature, defaultTopK, maxTopK } =
  await LanguageModel.params();

const available = await LanguageModel.availability();

if (available !== 'unavailable') {
  const session = await LanguageModel.create();

  // Prompt the model and wait for the whole result to come back.
  const result = await session.prompt('Write me a poem!');
  console.log(result);
}

Salida transmitida

Si esperas una respuesta más larga, debes usar la función promptStreaming(), que te permite mostrar resultados parciales a medida que los proporciona el modelo. La función promptStreaming() devuelve un ReadableStream.

const { defaultTemperature, maxTemperature, defaultTopK, maxTopK } =
  await LanguageModel.params();

const available = await LanguageModel.availability();
if (available !== 'unavailable') {
  const session = await LanguageModel.create();

  // Prompt the model and stream the result:
  const stream = session.promptStreaming('Write me an extra-long poem!');
  for await (const chunk of stream) {
    console.log(chunk);
  }
}

Cómo dejar de dar instrucciones

Tanto prompt() como promptStreaming() aceptan un segundo parámetro opcional con un campo signal, que te permite detener la ejecución de instrucciones.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const result = await session.prompt('Write me a poem!', {
  signal: controller.signal,
});

Administración de las sesiones

Cada sesión realiza un seguimiento del contexto de la conversación. Las interacciones anteriores se tienen en cuenta para las interacciones futuras hasta que se llena la ventana de contexto de la sesión.

Cada sesión tiene una cantidad máxima de tokens que puede procesar. Verifica tu progreso hacia este límite con lo siguiente:

console.log(`${session.inputUsage}/${session.inputQuota}`);

Obtén más información sobre la administración de sesiones.

Cómo clonar una sesión

Para conservar los recursos, puedes clonar una sesión existente con la función clone(). Se restablece el contexto de la conversación, pero la instrucción inicial permanece intacta. La función clone() toma un objeto de opciones opcional con un campo signal, que te permite pasar un AbortSignal para destruir la sesión clonada.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const clonedSession = await session.clone({
  signal: controller.signal,
});

Cómo finalizar una sesión

Llama a destroy() para liberar recursos si ya no necesitas una sesión. Cuando se destruye una sesión, ya no se puede usar y se anula cualquier ejecución en curso. Es posible que desees mantener la sesión si tienes la intención de solicitarle información al modelo con frecuencia, ya que crear una sesión puede llevar algún tiempo.

await session.prompt(
  "You are a friendly, helpful assistant specialized in clothing choices."
);

session.destroy();

// The promise is rejected with an error explaining that
// the session is destroyed.
await session.prompt(
  "What should I wear today? It is sunny, and I am choosing between a t-shirt
  and a polo."
);

Demostraciones

Creamos varias demostraciones para explorar los numerosos casos de uso de la API de Prompt. Las siguientes demostraciones son aplicaciones web:

Para probar la API de Prompt en las extensiones de Chrome, instala la extensión de demostración. El código fuente de la extensión está disponible en GitHub.

Estrategia de rendimiento

La API de Prompt para la Web aún está en desarrollo. Mientras desarrollamos esta API, consulta nuestras prácticas recomendadas sobre la administración de sesiones para obtener un rendimiento óptimo.

Política de permisos, elementos iframe y Web Workers

De forma predeterminada, la API de Prompt solo está disponible para las ventanas de nivel superior y sus elementos iframe del mismo origen. Se puede delegar el acceso a la API a iframes de origen cruzado con el atributo allow="" de la política de permisos:

<!--
  The hosting site at https://main.example.com can grant a cross-origin iframe
  at https://cross-origin.example.com/ access to the Prompt API by
  setting the `allow="language-model"` attribute.
-->
<iframe src="https://cross-origin.example.com/" allow="language-model"></iframe>

Por el momento, la API de Prompt no está disponible en los Web Workers debido a la complejidad de establecer un documento responsable para cada worker con el fin de verificar el estado de la política de permisos.

Participa y comparte tus comentarios

Tus comentarios pueden influir directamente en la forma en que creamos e implementamos versiones futuras de esta API y de todas las APIs de IA integradas.