Navegação em portais
As regras que o agent segue ao operar um navegador: o ciclo de snapshot e ref, o que ele enxerga (e o que não enxerga), e como ele reage a erro, modal e sessão expirada.
Quando um agent tem qualquer tool de browser, a plataforma injeta no system prompt dele uma nota de navegação. Esta página descreve o que essa nota manda o agent fazer — para você entender o comportamento que vai observar nas sessions, e escrever o system prompt do seu agent sem contradizê-la.
A nota é condicional: agent sem tool de browser não a recebe, e cada linha que cita uma tool específica só entra se aquela tool estiver no toolset. Um subagent readonly, que perde browser_click/browser_type/browser_login, não lê instrução sobre elas.
#O que o agent enxerga
A percepção da página é textual. Cada ação devolve um snapshot da árvore de acessibilidade — papéis, nomes e referências de elementos —, não uma imagem.
| Tool | O que devolve | Invalida os refs anteriores |
|---|---|---|
browser_navigate | Snapshot da página carregada | Sim (troca de página) |
browser_back | Snapshot da página anterior | Sim (troca de página) |
browser_click | Snapshot pós-clique | Só se o clique carregar outra página |
browser_type | Snapshot pós-digitação (submit opcional) | Só se o submit navegar |
browser_select | Snapshot pós-seleção | Só se a seleção navegar |
browser_snapshot | Snapshot da página atual | Não |
browser_scroll | Snapshot pós-rolagem | Não |
browser_wait | Snapshot depois do texto/estado esperado | Não |
browser_read | Texto filtrado por role/region | Não |
browser_screenshot | Confirmação de que a imagem foi guardada como artifact | Não |
Duas consequências que valem repetir:
- O agent não vê a captura de tela.
browser_screenshotexiste para o humano que audita a session: a imagem vai para o artifact store e o modelo recebe só a confirmação. A nota proíbe explicitamente concluir qualquer coisa "olhando" uma captura. browser_readé a leitura barata. Ela não invalida referências, então o agent extrai um valor de uma região sem repuxar a página inteira nem perder o alvo em que ia clicar.
O snapshot cobre a página inteira, não apenas a área visível, e é cortado quando estoura o orçamento de caracteres — o corte aparece como … (N nós omitidos). Nesse caso a nota manda focar a leitura numa região em vez de rolar atrás do resto.
#Referências de elemento e staleness
O agent age por ref, nunca por seletor CSS. Um ref tem a forma e12@v3: o identificador do elemento mais a geração em que ele foi emitido. Elementos dentro de um iframe ganham prefixo de frame (f1e12@v3) e se usam do mesmo jeito.
A geração é da página, não da ação (ver D112). Ela avança quando a página navega — e só então. Enquanto o agent permanece na mesma página, os refs que ele já tem continuam válidos depois de digitar, clicar ou selecionar; é isso que permite preencher um formulário inteiro num browser_batch só.
Isso não afrouxa a segurança, porque as duas falhas possíveis são fechadas e distintas:
| Código | Significado | O que o agent faz |
|---|---|---|
browser.stale_ref | A página navegou; o ref é da página anterior | Usa um ref do snapshot que veio junto do erro — não repete a chamada. |
browser.ref_not_found | Mesma página, mas o elemento saiu do DOM (re-render, modal fechado) | Reencontra o elemento no snapshot que veio junto do erro. |
browser.invalid_ref | Formato de ref inválido | Copia o ref exatamente como está no snapshot. |
browser.session_lost | O navegador reiniciou; estado perdido | Re-navega a partir da última URL conhecida e refaz o login, se havia. |
Por que a distinção importa: numa página nova o navegador reinicia a numeração de refs (e1, e2, …), então um ref antigo casaria outro elemento — daí a geração. Dentro da mesma página o número nunca é reaproveitado, então um ref cujo elemento morreu simplesmente não resolve. Em nenhum dos casos o agent aciona o elemento errado.
Falha de ação devolve o snapshot atual junto da mensagem. Sem observação nova, um agent tende a repetir a mesma chamada e queimar turnos; com o estado na mesma resposta, o turno seguinte já escolhe um ref que existe.
#Modais, banners e sessão expirada
Três situações interrompem fluxos de portal em produção, e a nota trata as três nominalmente:
- Banner de cookie e modal interceptam clique. Diante de
dialog/alertdialog/banner, o agent resolve o overlay antes de mirar o alvo real. Em escolha de privacidade, ele recusa os não-essenciais. - Modal no meio do fluxo (aviso de expiração, confirmação, tour) é tratado como interrupção: o agent resolve e retoma o passo interrompido, sem reiniciar a tarefa.
- Portais deslogam sozinhos. Se o conteúdo esperado sumiu ou a tela de login reapareceu, o agent trata como sessão expirada e confirma o estado antes de seguir — em vez de reportar que o dado não existe.
#Depois de uma falha: adaptar, não repetir
A regra mais importante da nota: ação que falhou não se repete igual. O agent relê o estado e muda de abordagem — outro elemento com o mesmo papel, o menu em vez do atalho, a URL direta em vez do fluxo.
Isso vale para a falha de tool e vale para o silêncio: clique sem efeito é sinal de overlay ou de ref velho, não convite para clicar de novo.
Para browser_login a distinção é mais fina e está detalhada em Login em portal: "recusado pelo portal" é resultado (a credencial não presta, o agent para), enquanto captcha pendente ou estouro de orçamento não provam nada sobre a credencial (o agent tira um snapshot e tenta de novo).
#Lote de ações
browser_batch roda várias ações numa chamada, sem round-trip ao modelo entre passos. A nota o restringe a sequência já conhecida — tipicamente preencher N campos e submeter.
O limite que o agent respeita: todo ref do lote vem do snapshot que ele já tem, e vale por todos os passos enquanto nenhum passo navegar. Digitar N campos e clicar em enviar numa chamada só é exatamente o uso previsto. Assim que um passo navega (navigate, back, ou um clique que carrega outra página), os refs anteriores morrem e os passos seguintes que os usarem falham com browser.stale_ref — o agent faz uma chamada nova depois de ver o snapshot novo. Um passo também não pode usar um ref que só nasce depois de outro passo mudar a página. Em página imprevisível, a nota manda voltar para uma ação por vez.
Quando nenhum passo do lote dá certo, a resposta inclui o estado atual da página — o agent não fica sem informação nova para decidir o próximo turno.
#Credenciais
browser_login recebe apenas um credentialId. Usuário e senha são resolvidos e digitados dentro do perímetro do navegador e nunca chegam ao modelo, ao log ou ao event log. A nota reforça a proibição do outro lado: o agent não pede, não escreve e não repete uma senha — nem quando a página pede.
Os ids disponíveis chegam ao agent numa seção própria do system prompt, montada a partir dos vaults da session. Ver Vaults.
#Quando a nota não basta: a skill de navegação
A nota cabe no prompt de toda session com browser, então ela é curta de propósito. O procedimento longo — reconhecimento de página, formulário com campos que mudam a estrutura, paginação de resultados, extração fiel de valores, tabela de recuperação por tipo de erro e critérios de quando pedir ajuda — vive numa skill de fábrica, navegacao-de-portal, versionada no repositório da plataforma.
Skills são carregadas sob demanda: só o índice (nome + descrição) ocupa espaço no prompt, e o corpo entra quando o agent abre a skill. Anexe-a a agents de portal quando a tarefa for mais longa que "abrir uma página e ler um valor". Ver Skills.