5 puntos por GN⁺ 1 일 전 | 1 comentarios | Compartir por WhatsApp
  • 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 con create(), y se puede continuar o bifurcar el contexto con initialPrompts, append() y clone()
  • La entrada puede recibir text, image, audio y la salida por ahora solo admite text; prompt() devuelve una respuesta completa y promptStreaming() 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 en prompt() o promptStreaming()
    • 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-model
    • chrome://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
  • params() devuelve defaultTopK, maxTopK, defaultTemperature y maxTemperature
  • Al inicializar una nueva sesión, topK y temperature deben especificarse ambos o omitirse ambos
  • create() puede recibir un AbortSignal en el campo signal para cancelar la sesión

Contexto y composición de prompts

  • Con initialPrompts se 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, user y assistant
  • Si al último mensaje de assistant se le da prefix: 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

Modalidades de entrada y salida, y soporte multilingüe

  • Al crear la sesión, expectedInputs y expectedOutputs permiten establecer el formato e idioma esperados de entrada y salida
  • El type de expectedInputs admite text, image y audio
  • El type de expectedOutputs actualmente 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

Salida estructurada y restricciones

  • Se puede usar salida estructurada pasando un JSON Schema en responseConstraint de prompt() o promptStreaming()
  • La función relacionada puede consultarse en structured output
  • En el ejemplo se usa un esquema booleano para hacer que responda solo true o false sobre 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 responseConstraint a session.measureContextUsage(), se puede medir cuánto contexto consumen las restricciones
  • Con la opción omitResponseConstraintInput se 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 un ReadableStream
  • Tanto prompt() como promptStreaming() aceptan signal como 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.contextUsage y session.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 contextoverflow de la sesión
  • Si ni siquiera borrando el historial se pueden asegurar suficientes tokens, prompt() o promptStreaming() fallan con QuotaExceededError, y no se elimina nada
    • requested: número de tokens ocupados por la entrada
    • contextWindow: 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 un AbortSignal en el campo signal
  • 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

Rendimiento y feedback

1 comentarios

 
GN⁺ 1 일 전
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

    • Esto se siente como el Soylent de la comunicación escrita
      Tiene todo el valor nutritivo, pero sin mucho sabor especial
    • De verdad me entusiasma una herramienta así. Podría quitarle a internet sus calorías vacías y reducir mucho el uso de las plataformas populares actuales
      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
    • En YouTube ya existe algo parecido, y yo uso DeArrow
      Esta extensión busca reducir el sensacionalismo mediante crowdsourcing, aunque sospecho que algunos de los principales contribuidores podrían ser bots con LLM
    • Parece una idea interesante y vale la pena explorarla
      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
    • Soy PM de las built-in AI APIs de Chrome, y esta idea de de-snarkifier realmente me encanta y parece despertar interés amplio
      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 actual
  • Yo 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/

    • Me da curiosidad cómo ven los casos de uso objetivo de esta API en el corto y largo plazo
      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
    • Felicidades por tu retiro
  • 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

    • Esta es una descarga única que comparten todos los sitios que usan la Prompt API
      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
    • Tal vez la próxima gran tendencia sea una suscripción premium de software que ya te venda varias 5090 instaladas
    • Si fueran modelos MoE, los expertos podrían traerse por red solo cuando hagan falta mediante HTTP range query
      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
    • Espero que nunca llegue un mundo donde los sistemas operativos metan de forma confiable modelos preinstalados
    • Está muy bien
      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

    • Gemini Nano-1: 46% MMLU, 1.8B
    • Gemini Nano-2: 56% MMLU, 3.25B
    • Gemma4 E2B: 60.0% MMLU, 2.3B
    • Gemma4 E4B: 69.4% MMLU, 4.5B
      Fuente:
    • https://huggingface.co/google/gemma-4-E2B-it
    • https://android-developers.googleblog.com/2024/10/gemini-nano-experimental-access-available-on-android.html
    • No conozco la situación interna actual, pero cuando yo estaba en ese equipo metíamos los modelos pequeños más recientes de Google en Chrome con mucha rapidez
      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
    • La Prompt API usa el modelo disponible en el 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

    • Parece demasiado trabajo para la recompensa
      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
    • La generación de tokens con modelos pequeños casi no tiene valor
  • 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

    • Los Foundation Models de Apple se ven bien en la documentación, pero cuando lo revisas aparece una limitación de ventana de contexto de 4k
      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

    • La fragmentación en pruebas es de verdad el problema central
      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