5 pontos por GN⁺ 1 일 전 | 1 comentários | Compartilhar no WhatsApp
  • Uma API web para enviar solicitações em linguagem natural ao Gemini Nano integrado ao Chrome, podendo ser usada para tarefas como perguntas e respostas, classificação, filtragem de conteúdo, extração de agenda e extração de contatos
  • Antes do uso, é necessário baixar o modelo separadamente, e ela só funciona quando os requisitos de execução são atendidos, como SO compatível, espaço de armazenamento e memória de GPU ou CPU
  • A sessão é preparada com create() após verificar a disponibilidade com LanguageModel.availability(), e o contexto pode ser continuado ou ramificado com initialPrompts, append() e clone()
  • A entrada pode receber text, image e audio, enquanto a saída atualmente suporta apenas text; prompt() retorna uma resposta completa e promptStreaming() retorna uma resposta em streaming
  • Inclui saída estruturada baseada em responseConstraint, gerenciamento da janela de contexto, política de permissões e processamento multimodal, oferecendo um modelo de execução para lidar com IA on-device dentro do navegador

Visão geral

  • Funciona como uma API para enviar solicitações em linguagem natural ao Gemini Nano integrado ao Chrome, permitindo usos como perguntas e respostas em páginas web, classificação de artigos, filtragem de conteúdo, extração de agenda e extração de contatos
  • Embora a API esteja embutida no Chrome, o modelo exige download separado, e antes do primeiro uso é preciso verificar a Política de usos proibidos para IA generativa do Google
  • Antes de usar IA generativa, recomenda-se consultar o People + AI Guidebook
  • As tipagens TypeScript podem ser obtidas pelo pacote @types/dom-chromium-ai
  • Desenvolvedores de Chrome Extensions precisam remover a permissão expirada de origin trial aiLanguageModelOriginTrial

Hardware e requisitos de execução

  • A Prompt API, a Summarizer API, a Writer API, a Rewriter API e a Proofreader API só funcionam no Chrome quando certas condições são atendidas
  • Os sistemas operacionais compatíveis são Windows 10/11, macOS 13+, Linux e ChromeOS; no ChromeOS, o suporte existe em dispositivos Chromebook Plus com Platform 16389.0.0 ou superior
  • Chrome para Android, iOS e ChromeOS em dispositivos que não sejam Chromebook Plus ainda não oferecem suporte às APIs baseadas em Gemini Nano
  • É necessário ter pelo menos 22 GB de espaço livre no volume onde está o perfil do Chrome
  • O modelo pode ser executado por GPU ou CPU
    • A GPU precisa de mais de 4 GB de VRAM
    • A CPU precisa de 16 GB ou mais de RAM e 4 ou mais núcleos de CPU
    • A Prompt API com entrada de áudio exige GPU
  • A rede precisa ser uma conexão não limitada ou não tarifada por consumo apenas durante o download inicial do modelo
    • Depois disso, o uso do modelo não requer conexão de rede
    • Ao usar o modelo, os dados não são enviados ao Google nem a terceiros
  • O tamanho do modelo pode variar conforme as atualizações do navegador, e o tamanho atual pode ser verificado em chrome://on-device-internals
  • Se, após o download, o espaço livre cair para menos de 10 GB, o modelo é removido do dispositivo e baixado novamente quando os requisitos voltarem a ser atendidos

Primeiros passos e preparação do modelo

  • A disponibilidade pode ser verificada com LanguageModel.availability()
  • É preciso passar para availability() as mesmas opções que serão usadas depois em prompt() ou promptStreaming()
    • Alguns modelos podem não suportar determinadas modalidades ou idiomas, então a correspondência das opções é importante
  • O download do modelo e a criação da sessão começam com create() após a confirmação de user activation
  • Durante o download, é preciso receber eventos de progresso para informar o usuário sobre o andamento
  • Em localhost, as APIs de IA integradas podem ser usadas ativando flags do Chrome
    • chrome://flags/#optimization-guide-on-device-model
    • chrome://flags/#prompt-api-for-gemini-nano-multimodal-input
    • Depois disso, é necessário usar Relaunch ou reiniciar o Chrome
    • Em caso de erro, é possível consultar a solução de problemas no localhost

Criação da sessão e configurações básicas

  • As sessões são criadas com LanguageModel.create()
  • Na Prompt API para Chrome Extensions, é possível ajustar topK e temperature por sessão como opções
    • Os valores padrão e máximos podem ser verificados com LanguageModel.params()
    • Esse recurso só se aplica a Chrome Extensions ou ao uso do origin trial de sampling parameters
  • params() retorna defaultTopK, maxTopK, defaultTemperature e maxTemperature
  • Ao inicializar uma nova sessão, topK e temperature devem ser ambos informados ou ambos omitidos
  • create() aceita um AbortSignal no campo signal para cancelar a sessão

Contexto e composição de prompts

  • initialPrompts permite inserir o contexto de conversas anteriores para retomar uma sessão salva após reiniciar o navegador
  • O array de prompts pode incluir os papéis system, user e assistant
  • Se a última mensagem assistant receber prefix: true, é possível pré-preencher parte da resposta para induzir um formato de saída específico
    • No exemplo, a string inicial de um bloco de código TOML é inserida antecipadamente para fixar o formato da saída
  • Após a criação da sessão, é possível inserir contexto adicional antecipadamente com append()
    • Diferentemente de initialPrompts, o contexto pode continuar sendo acumulado depois da criação da sessão
    • append() é concluído depois que o prompt é validado, processado e adicionado
    • Se o prompt não puder ser adicionado, a promise é rejeitada

Modalidades de entrada e saída e suporte multilíngue

  • Ao criar a sessão, expectedInputs e expectedOutputs definem os formatos e idiomas esperados de entrada e saída
  • O type de expectedInputs suporta text, image e audio
  • O type de expectedOutputs atualmente permite apenas text
  • Os idiomas são definidos no array languages, e a Prompt API aceita "en", "ja" e "es"
    • O suporte a outros idiomas está em desenvolvimento
    • No lado da entrada, é possível incluir o idioma do system prompt e um ou mais idiomas dos prompts do usuário
    • No lado da saída, é possível incluir um ou mais idiomas de saída
  • Ao encontrar uma entrada ou saída não compatível, pode ocorrer uma DOMException "NotSupportedError"

Entrada multimodal

Saída estruturada e restrições

  • É possível usar saída estruturada passando um JSON Schema em responseConstraint de prompt() ou promptStreaming()
  • O recurso relacionado pode ser consultado em structured output
  • No exemplo, um schema booleano é usado para fazer o modelo responder apenas true ou false sobre se a publicação é relacionada à cerâmica
  • Na implementação, também é possível incluir JSON Schema ou regex como parte da mensagem; nesse caso, isso consumirá parte da janela de contexto
  • Se responseConstraint for passado para session.measureContextUsage(), é possível medir quanto das restrições consome do contexto
  • O uso da opção omitResponseConstraintInput evita esse comportamento
    • Nesse caso, recomenda-se incluir no prompt instruções sobre o formato de saída desejado

Forma de execução dos prompts

  • Quando se espera uma resposta curta, use prompt() para receber o resultado completo de uma vez
  • Quando se espera uma resposta longa, use promptStreaming() para receber resultados parciais em streaming
  • promptStreaming() retorna um ReadableStream
  • Tanto prompt() quanto promptStreaming() aceitam signal como segundo argumento para interromper o prompt em execução

Gerenciamento de sessão

  • Cada sessão mantém o contexto da conversa, e interações anteriores influenciam respostas posteriores
  • Cada sessão tem um número máximo de tokens processáveis, e o uso atual e o limite podem ser verificados por session.contextUsage e session.contextWindow
  • Se uma nova solicitação ultrapassar a janela de contexto, o início da conversa, exceto o system prompt, será removido em pares de pergunta e resposta para liberar espaço
  • Essa situação pode ser detectada pelo evento contextoverflow da sessão
  • Se mesmo apagando o histórico não for possível liberar tokens suficientes, prompt() ou promptStreaming() falhará com QuotaExceededError, e nada será removido
    • requested: número de tokens ocupados pela entrada
    • contextWindow: número de tokens disponíveis
  • Mais detalhes podem ser consultados em session management

Clonagem e encerramento da sessão

  • clone() permite copiar uma sessão existente para criar uma ramificação da conversa
  • A sessão clonada mantém o contexto existente e os prompts iniciais
  • clone() também pode receber um AbortSignal no campo signal
  • Quando a sessão não for mais necessária, destroy() pode liberar os recursos
  • Depois de destruída, a sessão não pode mais ser usada, e execuções em andamento também são interrompidas
  • Como a criação da sessão pode levar tempo, pode ser melhor mantê-la ativa se você pretende enviar prompts com frequência

Política de permissões e restrições do ambiente de execução

  • Por padrão, a Prompt API só pode ser usada em iframes com a mesma origin da window de nível superior
  • Em iframes cross-origin, o acesso pode ser delegado com o atributo allow="language-model" da Permission Policy
  • Atualmente, a Prompt API não pode ser usada em Web Workers
    • Isso acontece porque é complexo determinar qual documento é responsável por verificar o estado da permissions policy de cada worker

Demos e materiais de referência

Desempenho e feedback

1 comentários

 
GN⁺ 1 일 전
Opiniões do Hacker News
  • Esta API parece perfeita para uma ideia de de-snarkifier que venho pensando há muito tempo
    As redes sociais podem ser intelectualmente estimulantes e trazer coisas para aprender, mas é muito fácil ser sugado para brigas ideológicas e flame wars mesmo sem querer. Ficar brigando na internet com desconhecidos, desperdiçando energia emocional, é quase um desperdício de capital humano
    Com uma API dessas, daria para fazer uma extensão de navegador que, antes de mostrar um texto, suavizasse apenas expressões agressivas ou sarcásticas, preservando intactas as informações factuais. Indo além, talvez até desse para transformar um tom agressivo em algo que soasse ridículo ou incompetente
    Assim, quem lê ficaria protegido de ataques pessoais de estranhos, e quem escreve perderia o incentivo para ser rude. Se todo mundo usasse esse tipo de filtro, também deixaria de existir motivo para competir para ver quem consegue ser mais cruel

    • Isso parece uma espécie de Soylent da comunicação por texto
      Tem todo o valor nutritivo, mas sem nenhum sabor especial
    • Estou realmente animado com uma ferramenta dessas. Ela pode remover as calorias vazias da internet e reduzir bastante o uso das plataformas populares de hoje
      O que eu quero é eliminar totalmente títulos clickbait e anúncios, mostrando só títulos secos e factuais
      Para qualquer tema, um artigo central e alguns comentários realmente úteis já bastam; o resto é, em grande parte, ruído que eu não quero ver
      O estado atual das redes sociais está tão ruim que quase não uso mais nenhuma, e o HN era a única exceção, mas até aqui parece estar indo em direção parecida por causa da saturação de IA. Mesmo assim, acabo desperdiçando algumas horas a cada duas semanas, e queria cortar até isso de vez
      Idealmente, eu gostaria que 98% do conteúdo fosse filtrado ou resumido até desaparecer, e que, com o tempo, a internet fosse usada só quando eu quisesse pesquisar algo de forma intencional. Basicamente, quero remover a maior parte do aspecto de entretenimento da internet e redirecionar meu tempo e energia para a vida real e para fontes de alta qualidade, como livros
    • Já existe algo parecido no YouTube, e eu uso o DeArrow
      Essa extensão é uma ferramenta de crowdsourcing para reduzir sensacionalismo, embora eu ache que alguns dos principais contribuidores talvez sejam bots de LLM
    • Parece uma ideia interessante e vale a pena explorar
      Dito isso, esse tipo de coisa é imprevisível quando bate de frente com a realidade, e, mesmo se funcionar bem, há uma boa chance de operar de forma bem diferente da imaginada no começo
    • Sou PM das built-in AI APIs no Chrome, e gostei muito dessa ideia de de-snarkifier; parece ter um interesse bem amplo
      Não consegui me segurar e montei às pressas um protótipo chamado Snarknada, enquanto também avaliava os padrões de baixa latência e o potencial de precisão
      É exatamente por isso que acho que on-device faz sentido para esse tipo de uso. Se você tentar suavizar um feed inteiro de rolagem infinita com uma API em nuvem, o custo de tokens fica inviável para o desenvolvedor. Além disso, é natural que ninguém queira mandar seu feed pessoal ou DMs para um servidor de terceiros só para ajustar o tom
      Levando isso para dentro do dispositivo, Semantic Mutation de alta frequência pode finalmente se tornar viável em termos técnicos e de custo. Se alguém levar isso mais a sério do que meu protótipo de PM e topar com pontos concretos de atrito, eu adoraria ouvir. Isso ajuda a definir prioridades no roadmap
      [1]: Se você usa agentes de código (Cursor, Claude Code etc.), recomendo apontar para https://www.npmjs.com/package/built-in-ai-skills-md-agent-md. Muitos modelos ainda foram treinados com o namespace obsoleto window.ai, então esse arquivo de skills ajuda a fazer com que usem a API atual corretamente
  • Eu liderei o trabalho de design desta API e, antes de me aposentar, também escrevi um texto organizando as considerações de projeto relacionadas
    https://domenic.me/builtin-ai-api-design/

    • Tenho curiosidade sobre como vocês enxergam os casos de uso-alvo desta API no curto e no longo prazo
      E também queria saber se, ao criar algo assim, os navegadores tentam se alinhar na prática entre si, fora do âmbito formal do W3C, para buscar pontos em comum. No fim, esse setor é relativamente pequeno
    • Parabéns pela aposentadoria
  • Isso realmente funciona, e eu já lancei algo usando para local inference
    Em tarefas leves de LLM, como busca, deu para usar como uma espécie de ollama para quem tem pouco recurso. A maior vantagem é ser gratuito, preservar a privacidade e exigir quase nada do usuário, então é uma boa forma de levar inferência local para pessoas não técnicas
    Mas a experiência real de uso não é boa. O tamanho do download do modelo é várias ordens de magnitude maior que o próprio navegador, e tudo isso precisa terminar antes de receber o primeiro token
    Isso parece difícil de resolver antes de o sistema operacional passar a oferecer de forma confiável modelos já embutidos, aos quais APIs desse tipo possam se conectar

    • Esse é um download único compartilhado por todos os sites que usam a Prompt API
      O problema maior é que, na maioria dos PCs comuns, o modelo é pequeno demais e lento demais. Tentei reescrever em tempo real frases de um text adventure da infocom, mas hoje isso ainda é lento demais em muitos PCs para ser prático
    • Talvez a próxima grande tendência seja um premium de assinatura de software já vendido com várias 5090 instaladas
    • Em um modelo MoE, daria para buscar as camadas especialistas pela rede só quando necessário, usando HTTP range query
      Seria parecido com o BitTorrent recebendo pedaços de arquivo de vários hosts. As camadas compartilhadas ainda precisariam ser baixadas, mas o tempo até o primeiro token poderia ficar proporcional ao tamanho ativo, e não ao tamanho total
      Claro, aí já não seria inferência totalmente offline, mas, para um recurso web de navegador, isso talvez não seja a consideração principal
    • Espero que nunca cheguemos a um mundo em que sistemas operacionais passem a incluir modelos pré-instalados de forma estável
    • Muito bom
      Mas, se o modelo é muito maior que o navegador e precisa ser baixado antes do primeiro token, fico curioso se isso significa download sob demanda. Se o usuário só baixar quando fizer a primeira chamada e tiver de esperar até o fim nesse momento, a experiência parece bem terrível
      Também queria saber se o Chrome mostra algo como uma caixa de diálogo de status de download para reduzir a confusão, e quanto espaço em disco isso ocupa
  • À primeira vista, parece que isso usa Gemini Nano, mas o Gemma 4 E2B/E4B mais recente parece bem melhor, então talvez por enquanto valha mais a pena distribuir uma versão quantizada via extensão

    • 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
      Fontes:
    • https://huggingface.co/google/gemma-4-E2B-it
    • https://android-developers.googleblog.com/2024/10/gemini-nano-experimental-access-available-on-android.html
    • Não conheço a situação interna atual, mas, na época em que eu estava nesse time, colocávamos os pequenos modelos do Google mais recentes no Chrome muito rapidamente
      Se Gemma 4 ou o Gemini Nano equivalente ainda não estiver no Chrome, eu esperaria que entrasse em breve
      E este texto foi atualizado pela última vez em 2025-09-21, quando já era Gemini Nano 3
    • Isso mesmo
      Está escrito que a Prompt API funciona enviando solicitações em linguagem natural para o Gemini Nano dentro do navegador
    • A Prompt API usa o modelo disponível no navegador
      No Edge, provavelmente seria Phi4
  • Isso também parece uma boa maneira de scripts JS maliciosos empurrarem geração de tokens para visitantes desavisados
    Também seria interessante ver se dá para distribuir prompts maiores quebrando-os em partes menores entre vários navegadores, usando algum tipo de padrão de subagente ou estrutura parecida com RLM, de modo a produzir resultados úteis com esse processamento distribuído

    • Parece trabalho demais para a recompensa
      A infraestrutura técnica e de negócio também ficaria extremamente complexa; então, se a ideia é mesmo empurrar prompts para o navegador do usuário, talvez seja melhor simplesmente usar direito a Chrome API. Também é questionável em quantos casos faria sentido real descarregar prompts do servidor para modelos tão fracos
      E, se alguém realmente quisesse fazer isso, WebGPU já existe há bastante tempo
    • A geração de tokens por modelos pequenos quase não tem valor algum
  • Isso parece um passo em direção a uma Model API de verdade, mas ainda é só um passo pequeno
    Também me lembra o Foundation Models da Apple
    Muita integração de IA se concentra em comunicação textual ou estilo de chat, mas, na prática, há muito software que também se beneficiaria em interfaces não textuais
    No fim, acho que o sistema operacional e o navegador precisam oferecer APIs que gerenciem modelos, para que apps possam acessar modelos on-device e remotos por meio de uma interface simples
    Seria ótimo se isso fosse padronizado de forma multiplataforma, e precisaria incluir mobile também; então, realisticamente, Apple e Google parecem ser os atores com mais capacidade de empurrar isso. A Meta talvez venha depois, ou até se mova antes, quem sabe
    O ponto principal é que isso não deveria ser exclusivo de um modelo específico promovido por marketing
    Os apps deveriam poder consultar e escolher um modelo apropriado
    (1) https://developer.apple.com/documentation/foundationmodels

    • O Foundation Models da Apple parece bom na documentação, mas, quando você vai olhar de perto, esbarra numa janela de contexto de 4k
      Claro, ainda está bem no começo
  • https://github.com/mozilla/standards-positions/issues/1067

  • Estamos usando isso para resumos retrospectivos de hackday
    https://remotehack.space/previous-hacks/
    É um script pequeno que lê feeds RSS e gera resumos em forma de texto corrido, e combina bem com um site estático. Um dia eu gostaria de expandir isso para também fazer outras perguntas sobre o mesmo conteúdo

  • Um LLM local acessível pelo navegador é ótimo do ponto de vista de privacidade, mas, se cada navegador tiver um modelo diferente por trás dessa API, o pesadelo de testes pode ficar ainda pior do que já é hoje
    No fim, como a maioria das implementações provavelmente vai se alinhar ao Gemini Nano, também fico curioso se isso não vai empurrar ainda mais usuários para o Chrome

    • A fragmentação de testes é realmente o problema central
      Na prática, prompts não são agnósticos a modelo, então um prompt cuidadosamente ajustado para Gemini Nano 3 v2025 pode simplesmente perder desempenho no modelo do Gecko sem nenhum aviso. E a API nem sequer oferece detecção de capacidades para permitir tratamento condicional
      Isso é ainda pior do que o WebGL, que pelo menos permitia consultar suporte a extensões. Lançar uma funcionalidade que depende da qualidade de prompt de um modelo cujo nome e versão ficam escondidos atrás do navegador é quase como lançar um software cuja funcionalidade depende do dicionário instalado pelo usuário
  • Pelo que eu entendo, o Gemini Nano não tem pesos abertos como o Gemma
    A menos que alguém já tenha feito isso, eu adoraria tentar extrair os pesos do modelo