API de Prompt
(developer.chrome.com)- 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 comLanguageModel.availability(), e o contexto pode ser continuado ou ramificado com initialPrompts,append()eclone() - A entrada pode receber text, image e audio, enquanto a saída atualmente suporta apenas text;
prompt()retorna uma resposta completa epromptStreaming()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 emprompt()oupromptStreaming()- 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-modelchrome://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
- Os valores padrão e máximos podem ser verificados com
params()retornadefaultTopK,maxTopK,defaultTemperatureemaxTemperature- Ao inicializar uma nova sessão,
topKetemperaturedevem ser ambos informados ou ambos omitidos create()aceita umAbortSignalno camposignalpara cancelar a sessão
Contexto e composição de prompts
initialPromptspermite 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,usereassistant - Se a última mensagem
assistantreceberprefix: 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
- Diferentemente de
Modalidades de entrada e saída e suporte multilíngue
- Ao criar a sessão,
expectedInputseexpectedOutputsdefinem os formatos e idiomas esperados de entrada e saída - O
typedeexpectedInputssuportatext,imageeaudio - O
typedeexpectedOutputsatualmente permite apenastext - 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
- Pode ser usada para tarefas como transcrição de áudio ou geração de descrição de imagem, legenda e alt text
- Demos relacionadas
- A entrada de áudio suporta os seguintes tipos
- A entrada visual suporta os seguintes tipos
- No exemplo, um
Blobde imagem e umHTMLCanvasElementsão inseridos juntos para comparar dois materiais visuais, e em seguida a resposta de voz do usuário é recebida comAudioBuffer
Saída estruturada e restrições
- É possível usar saída estruturada passando um JSON Schema em
responseConstraintdeprompt()oupromptStreaming() - O recurso relacionado pode ser consultado em structured output
- No exemplo, um schema booleano é usado para fazer o modelo responder apenas
trueoufalsesobre 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
responseConstraintfor passado parasession.measureContextUsage(), é possível medir quanto das restrições consome do contexto - O uso da opção
omitResponseConstraintInputevita 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 umReadableStream- Tanto
prompt()quantopromptStreaming()aceitamsignalcomo 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.contextUsageesession.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
contextoverflowda sessão - Se mesmo apagando o histórico não for possível liberar tokens suficientes,
prompt()oupromptStreaming()falhará com QuotaExceededError, e nada será removidorequested: número de tokens ocupados pela entradacontextWindow: 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 umAbortSignalno camposignal- 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
- Demos de aplicações web
- Também é fornecida uma extensão de demonstração para testes em Chrome Extensions
Desempenho e feedback
- A Prompt API para web ainda está em desenvolvimento
- Para melhor desempenho, vale consultar as boas práticas de session management
- Canais para feedback de implementação
1 comentários
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
Tem todo o valor nutritivo, mas sem nenhum sabor especial
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
Essa extensão é uma ferramenta de crowdsourcing para reduzir sensacionalismo, embora eu ache que alguns dos principais contribuidores talvez sejam bots de LLM
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
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 corretamenteEu 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/
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
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
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
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
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
Fontes:
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
Está escrito que a Prompt API funciona enviando solicitações em linguagem natural para o Gemini Nano dentro do 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
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
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
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
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