API de Prompt
(developer.chrome.com)- Una API web para enviar solicitudes en lenguaje natural a Gemini Nano integrado en Chrome, útil para tareas como preguntas y respuestas, clasificación, filtrado de contenido, extracción de horarios y extracción de contactos
- Antes de usarla, es necesario descargar el modelo por separado, y solo funciona si se cumplen las condiciones de ejecución como SO compatible, espacio de almacenamiento y memoria de GPU o CPU
- Las sesiones se preparan verificando primero la disponibilidad con
LanguageModel.availability()y luego concreate(), y se puede continuar o bifurcar el contexto con initialPrompts,append()yclone() - La entrada puede recibir text, image, audio y la salida por ahora solo admite text;
prompt()devuelve una respuesta completa ypromptStreaming()devuelve una respuesta en streaming - Incluye salida estructurada basada en
responseConstraint, gestión de ventana de contexto, política de permisos y procesamiento multimodal, ofreciendo un modelo de ejecución para manejar IA on-device dentro del navegador
Descripción general
- Funciona como una API para enviar solicitudes en lenguaje natural a Gemini Nano integrado en Chrome, y puede usarse para casos como preguntas y respuestas en páginas web, clasificación de artículos, filtrado de contenido, extracción de horarios y extracción de contactos
- Aunque Chrome incluya la API, el modelo requiere una descarga separada, y antes del primer uso se debe revisar la Política de usos prohibidos de IA generativa de Google
- Antes de usar IA generativa, se recomienda consultar la People + AI Guidebook
- El tipado para TypeScript puede obtenerse con el paquete @types/dom-chromium-ai
- Los desarrolladores de Chrome Extensions deben eliminar el permiso vencido de origin trial
aiLanguageModelOriginTrial
Hardware y condiciones de ejecución
- Prompt API, Summarizer API, Writer API, Rewriter API y Proofreader API requieren cumplir ciertas condiciones para funcionar en Chrome
- Los sistemas operativos compatibles son Windows 10/11, macOS 13+, Linux y ChromeOS; en ChromeOS, solo se admite en dispositivos Chromebook Plus con Platform 16389.0.0 o superior
- Chrome para Android, iOS y ChromeOS en dispositivos que no sean Chromebook Plus todavía no admiten APIs basadas en Gemini Nano
- Se requieren al menos 22 GB de espacio libre en el volumen donde está el perfil de Chrome
- El modelo puede ejecutarse con GPU o CPU
- La GPU requiere más de 4 GB de VRAM
- La CPU requiere 16 GB o más de RAM y 4 o más núcleos de CPU
- Prompt API con entrada de audio requiere GPU
- La red solo necesita una conexión sin límite o no medida durante la descarga inicial del modelo
- Después, el uso del modelo no requiere conexión de red
- Los datos usados por el modelo no se envían a Google ni a terceros
- El tamaño del modelo puede variar según las actualizaciones del navegador, y el tamaño actual puede consultarse en
chrome://on-device-internals - Si después de la descarga el espacio libre baja a menos de 10 GB, el modelo se elimina del dispositivo y se volverá a descargar cuando se cumplan de nuevo las condiciones
Inicio de uso y preparación del modelo
- La disponibilidad puede comprobarse con
LanguageModel.availability() - A
availability()se le deben pasar las mismas opciones que luego se usarán enprompt()opromptStreaming()- Algunos modelos pueden no admitir ciertas modalidades o idiomas, así que es importante que las opciones coincidan
- La descarga del modelo y la creación de la sesión comienzan con
create()después de verificar la user activation - Si el modelo se está descargando, se deben recibir eventos de progreso para informar al usuario del estado de la descarga
- En localhost, se puede usar la API de IA integrada activando flags de Chrome
chrome://flags/#optimization-guide-on-device-modelchrome://flags/#prompt-api-for-gemini-nano-multimodal-input- Después es necesario hacer Relaunch o reiniciar Chrome
- Si hay errores, puede consultarse la solución de problemas en localhost
Creación de sesión y configuración básica
- La sesión se crea con
LanguageModel.create() - En Prompt API para Chrome Extensions, se pueden ajustar por sesión topK y temperature como opciones
- Los valores predeterminados y máximos pueden consultarse con
LanguageModel.params() - Esta función solo aplica en Chrome Extensions o al usar el sampling parameters origin trial
- Los valores predeterminados y máximos pueden consultarse con
params()devuelvedefaultTopK,maxTopK,defaultTemperatureymaxTemperature- Al inicializar una nueva sesión,
topKytemperaturedeben especificarse ambos o omitirse ambos create()puede recibir unAbortSignalen el camposignalpara cancelar la sesión
Contexto y composición de prompts
- Con
initialPromptsse puede incluir el contexto de una conversación previa para retomar una sesión guardada después de reiniciar el navegador - El arreglo de prompts puede incluir roles
system,useryassistant - Si al último mensaje de
assistantse le daprefix: true, se puede prellenar parte de la respuesta para inducir un formato de salida específico- Por ejemplo, se puede prellenar la cadena de inicio de un bloque de código TOML para fijar el formato de salida
- Después de crear la sesión, puede agregarse contexto adicional por adelantado con
append()- A diferencia de
initialPrompts, permite acumular contexto incluso después de crear la sesión append()se resuelve después de validar, procesar y agregar el prompt- Si el prompt no puede agregarse, la promise será rechazada
- A diferencia de
Modalidades de entrada y salida, y soporte multilingüe
- Al crear la sesión,
expectedInputsyexpectedOutputspermiten establecer el formato e idioma esperados de entrada y salida - El
typedeexpectedInputsadmitetext,imageyaudio - El
typedeexpectedOutputsactualmente solo permite text - Los idiomas se configuran con el arreglo
languages, y Prompt API acepta"en","ja"y"es"- El soporte para más idiomas está en desarrollo
- En la entrada se puede incluir el idioma del system prompt y uno o más idiomas de user prompt
- En la salida se puede incluir uno o más idiomas de salida
- Si se encuentra una entrada o salida no compatible, puede producirse una DOMException
"NotSupportedError"
Entrada multimodal
- Puede usarse para tareas como transcripción de audio o generación de descripciones, captions y alt text de imágenes
- Demos relacionadas
- La entrada de audio admite los siguientes tipos
- La entrada visual admite los siguientes tipos
- En el ejemplo, se ingresan juntos un
Blobde imagen y unHTMLCanvasElementpara comparar dos materiales visuales, y luego se recibe una respuesta de voz del usuario medianteAudioBuffer
Salida estructurada y restricciones
- Se puede usar salida estructurada pasando un JSON Schema en
responseConstraintdeprompt()opromptStreaming() - La función relacionada puede consultarse en structured output
- En el ejemplo se usa un esquema booleano para hacer que responda solo
trueofalsesobre si una publicación está relacionada con cerámica - Al implementar, también se puede incluir JSON Schema o expresiones regulares como parte del mensaje, y en ese caso se usa parte de la context window
- Si se pasa la opción
responseConstraintasession.measureContextUsage(), se puede medir cuánto contexto consumen las restricciones - Con la opción
omitResponseConstraintInputse puede evitar este comportamiento- En ese caso, se recomienda incluir dentro del prompt instrucciones sobre el formato de salida deseado
Forma de ejecución de prompts
- Si se espera una respuesta corta, se puede usar
prompt()para recibir el resultado completo de una sola vez - Si se espera una respuesta larga, se puede usar
promptStreaming()para recibir resultados parciales en streaming promptStreaming()devuelve unReadableStream- Tanto
prompt()comopromptStreaming()aceptansignalcomo segundo argumento para cancelar un prompt en ejecución
Gestión de sesiones
- Cada sesión mantiene el contexto de la conversación, y las interacciones anteriores se reflejan en respuestas posteriores
- Cada sesión tiene un número máximo de tokens procesables, y el uso actual y el límite pueden consultarse con
session.contextUsageysession.contextWindow - Si una nueva solicitud excede la ventana de contexto, se elimina la parte más antigua de la conversación, excluyendo el system prompt, por pares de pregunta-respuesta para liberar espacio
- Esta situación puede detectarse con el evento
contextoverflowde la sesión - Si ni siquiera borrando el historial se pueden asegurar suficientes tokens,
prompt()opromptStreaming()fallan con QuotaExceededError, y no se elimina nadarequested: número de tokens ocupados por la entradacontextWindow: número de tokens que estaban disponibles
- Para más detalles, puede consultarse session management
Clonado y finalización de sesiones
- Con
clone()se puede copiar una sesión existente para crear una bifurcación de la conversación - La sesión clonada conserva el contexto existente y los prompts iniciales
clone()también puede recibir unAbortSignalen el camposignal- Si la sesión ya no se necesita, se pueden liberar recursos con
destroy() - Una vez destruida, la sesión ya no puede usarse y cualquier ejecución en curso también se interrumpe
- Como la creación de sesiones puede tomar tiempo, puede ser mejor mantener una sesión si se planea enviar prompts con frecuencia
Política de permisos y restricciones del entorno de ejecución
- De forma predeterminada, Prompt API solo puede usarse en el window de nivel superior y en iframes del mismo origin
- A los iframes cross-origin se les puede delegar acceso con el atributo
allow="language-model"de Permission Policy - Actualmente Prompt API no puede usarse en Web Workers
- Esto se debe a que es complejo determinar el documento responsable de verificar el estado de permissions policy para cada worker
Demos y material de referencia
- Demos de aplicaciones web
- También se ofrece una extensión demo para pruebas en Chrome Extensions
Rendimiento y feedback
- Prompt API para la web todavía está en desarrollo activo
- Para un rendimiento óptimo, conviene consultar las buenas prácticas de session management
- Canales para feedback de implementación
1 comentarios
Comentarios en Hacker News
Esta API parece perfecta para una idea de de-snarkifier en la que llevo mucho tiempo pensando
Las redes sociales pueden ser intelectualmente estimulantes y útiles para aprender, pero también es muy fácil que uno termine metido, sin querer, en peleas ideológicas y guerras de insultos. Pelear emocionalmente con desconocidos en internet es casi un desperdicio de capital humano
Con una API así, parece posible hacer una extensión de navegador que, antes de mostrar una publicación, suavice solo las expresiones agresivas o sarcásticas, mientras preserva intacta la información factual. Incluso podría ir más lejos y hacer que, cuanto más agresivo sea el tono, más ridículo o incompetente suene
Entonces quien lee queda protegido de los ataques personales de extraños, y quien escribe también pierde el incentivo de comportarse con grosería. Si todos usaran un filtro así, ya no habría razón para competir por ver quién es más cruel
Tiene todo el valor nutritivo, pero sin mucho sabor especial
Lo que yo quiero es eliminar por completo los titulares clickbait y los anuncios, y ver solo títulos secos y basados en hechos
Para cualquier tema, me basta con un artículo central y unos pocos comentarios sustanciales; el resto casi siempre es ruido que no quiero ver
El estado actual de las redes sociales está tan mal que casi no las uso, y HN era la única excepción, pero hasta aquí parece que vamos en una dirección parecida por la saturación de IA. Aun así, termino desperdiciando unas horas cada dos semanas, y quisiera cortar incluso eso por completo
Idealmente, me gustaría que el 98% del contenido se filtrara o resumiera hasta desaparecer, y que con el tiempo internet se volviera algo que solo uso cuando busco algo de forma intencional. Básicamente, quiero quitarle gran parte de la carga de entretenimiento a internet y redirigir ese tiempo y energía al mundo real y a fuentes de alta calidad como los libros
Esta extensión busca reducir el sensacionalismo mediante crowdsourcing, aunque sospecho que algunos de los principales contribuidores podrían ser bots con LLM
Dicho eso, estas cosas son impredecibles cuando chocan con la realidad, e incluso si funcionan bien, es muy probable que terminen operando de una forma bastante distinta a la imaginada al principio
No me pude contener y armé rápido un prototipo de Snarknada, mientras evaluaba tanto patrones de baja latencia como posibilidades de precisión
Justamente por esto creo que on-device es lo correcto para este tipo de uso. Si quisieras suavizar un feed entero de scroll infinito con una API en la nube, el costo en tokens sería tan alto que para un desarrollador sería imposible de sostener. Además, es totalmente comprensible que la gente no quiera enviar su feed personal o sus DM a un servidor de terceros solo para ajustarles el tono
Si esto se mueve al dispositivo, la Semantic Mutation de alta frecuencia podría volverse viable por primera vez tanto en costos como técnicamente. Si alguien lo construye con más seriedad que mi prototipo de PM de juguete y se topa con puntos concretos de fricción, me encantaría escucharlo. Ayuda a priorizar el roadmap
[1]: Si usas agentes de código (Cursor, Claude Code, etc.), recomiendo apuntar a https://www.npmjs.com/package/built-in-ai-skills-md-agent-md. Muchos modelos fueron entrenados con el namespace
window.ai, que ya quedó obsoleto, así que este archivo de habilidades ayuda a que usen correctamente la API actualYo lideré el trabajo de diseño de esta API, y antes de retirarme también dejé escrito un texto con las consideraciones de diseño relacionadas
https://domenic.me/builtin-ai-api-design/
Y también si, al construir algo así, los navegadores intentan alinearse entre sí de manera práctica, no necesariamente a nivel W3C, para mantener puntos en común. Al final, esta industria es bastante pequeña
Esto sí funciona en la práctica, y yo ya lo lancé para local inference
En tareas livianas de LLM, como búsqueda, me sirvió como una especie de ollama para gente con pocos recursos. La mayor ventaja es que es gratis, protege la privacidad, y casi no exige nada del usuario, así que es una buena forma de darle inferencia local a personas no técnicas
Pero la experiencia real de usuario no es buena. El tamaño de descarga del modelo es varios órdenes de magnitud mayor que el del navegador mismo, y todo eso tiene que completarse antes de recibir el primer token
Parece difícil resolver esto hasta que los sistemas operativos ofrezcan de forma estable modelos ya integrados, y APIs de este tipo puedan conectarse a ellos
El problema mayor es que en la mayoría de las PCs comunes el modelo es demasiado pequeño y lento. Intenté reescribir en tiempo real el texto de una aventura de texto de Infocom, pero por ahora es demasiado lento en muchas PCs como para que sea práctico
Sería parecido a cómo bittorrent recibe fragmentos de archivos desde múltiples hosts. Las capas compartidas todavía habría que descargarlas, pero el tiempo hasta el primer token podría hacerse proporcional al tamaño activo y no al tamaño total
Claro, eso ya no sería inferencia completamente offline, pero para una funcionalidad web del navegador quizá eso no sea una consideración central
Pero si el modelo es mucho más grande que el navegador y hay que descargarlo antes del primer token, me pregunto si eso significa una descarga diferida. Si el primer usuario que lo invoca tiene que esperar en ese momento a que termine la descarga, la experiencia de usuario suena bastante terrible
También me pregunto si Chrome muestra algo como un cuadro de estado de descarga para reducir la confusión, y cuánto espacio en disco ocupa
A simple vista, parece que esto usa Gemini Nano, pero Gemma 4 E2B/E4B se ve mucho mejor, así que por ahora quizá convenga más distribuir una versión cuantizada como extensión
Fuente:
Si Gemma 4 o su equivalente en Gemini Nano todavía no están en Chrome, esperaría que entren pronto
Y esta publicación fue actualizada por última vez el 2025-09-21, y para entonces ya era Gemini Nano 3
Dice que la Prompt API funciona enviando solicitudes en lenguaje natural a Gemini Nano dentro del navegador
En Edge probablemente sería Phi4
Esto también parece una buena manera de hacer que un script JS malicioso les cargue generación de tokens a visitantes desprevenidos
También sería interesante ver si es posible una especie de descentralización útil, fragmentando prompts más grandes y enviándolos a múltiples navegadores, con cada uno procesando solo una parte pequeña, usando un patrón de subagentes o algo parecido a RLM
La infraestructura técnica y de negocio se volvería enormemente compleja, y si de verdad quieres descargar prompts en el navegador del usuario, no sería mejor simplemente usar bien la Chrome API. Además, es discutible cuántos casos realmente significativos habría para descargar prompts del lado del servidor hacia modelos tan limitados
Y si de verdad quisieras hacerlo, WebGPU ya existe desde hace tiempo
Esto parece un paso hacia una Model API de verdad, pero por ahora sigue siendo un paso pequeño
También recuerda a Foundation Models de Apple
Muchas integraciones de IA se enfocan en comunicación textual o estilo de chat, pero en realidad también hay mucho software que se beneficiaría en interfaces no textuales
Al final, creo que el sistema operativo y el navegador deberían ofrecer una API que gestione modelos, para que las apps puedan acceder tanto a modelos on-device como remotos mediante una interfaz simple
Sería excelente que esto se estandarizara de forma multiplataforma, y como también tendría que incluir móvil, en la práctica parece que Apple y Google serían quienes realmente podrían empujarlo. Meta podría seguir después o incluso moverse primero
La clave es que no debería estar atado a un modelo promocionado en particular
Las apps deberían poder consultar y elegir el modelo adecuado
(1) https://developer.apple.com/documentation/foundationmodels
Aunque claro, todavía está en una etapa temprana
https://github.com/mozilla/standards-positions/issues/1067
Nosotros lo estamos usando para resúmenes retrospectivos de hackdays
https://remotehack.space/previous-hacks/
Es un script pequeño que lee feeds RSS y genera resúmenes en el cuerpo del texto, y encaja bastante bien con un sitio estático. Algún día me gustaría ampliarlo para hacer también otras preguntas sobre el mismo contenido
Un LLM local accesible desde el navegador es bueno en términos de privacidad, pero si cada navegador conecta esta API a un modelo distinto, la pesadilla de pruebas podría empeorar aún más que ahora
Al final, es probable que la mayoría de las implementaciones se alineen con Gemini Nano, así que también me pregunto si esto empujará todavía más a los usuarios hacia Chrome
En la práctica, los prompts no son agnósticos al modelo, así que un prompt afinado cuidadosamente para Gemini Nano 3 v2025 podría degradarse silenciosamente en el modelo del lado de Gecko. Pero la API ni siquiera ofrece detección de capacidades para hacer bifurcaciones
Eso es peor incluso que WebGL, donde al menos podías consultar si había soporte para extensiones. Lanzar funcionalidades que dependen de la calidad de prompts de un modelo cuyo nombre y versión están ocultos detrás del navegador es como publicar software cuyo comportamiento depende del diccionario que el usuario tenga instalado
Tengo entendido que Gemini Nano, a diferencia de Gemma, no tiene pesos abiertos
No sé si alguien ya lo hizo, pero me gustaría intentar volcar los pesos del modelo