Documentação oficial desta página · v0.20.6
Plugins de Provedor de Navegador
Criar um plugin de provedor de navegador
Plugins de provedor de navegador registram um backend de navegador na nuvem que atende às
chamadas de ferramenta browser_* no modo nuvem (navegar, clicar, tirar captura de tela, …). Os
provedores embutidos — Browserbase, Browser Use e Firecrawl — são todos entregues como plugins em
plugins/browser/<name>/. Você pode adicionar um novo, ou sobrescrever um dos que vêm de fábrica,
largando um diretório ao lado deles.
Backends de navegador são um dos vários plugins de backend que o Hermes suporta. Os outros (com as próprias ABCs) são Plugins de Busca na Web (que esta ABC espelha de propósito), Geração de Imagem, Geração de Vídeo, Provedores de Memória, Motores de Contexto, Fontes de Segredo e Provedores de Modelo. Plugins gerais de ferramenta/hook/CLI estão em Criar um plugin do Hermes.
Como as peças se encaixam
Um provedor de navegador não implementa a navegação. Ele implementa o ciclo de vida da
sessão: criar uma sessão de navegador remota, devolver uma URL de websocket CDP e derrubar a
sessão. A pilha de navegador do próprio Hermes (agent-browser + tools/browser_tool.py) se conecta
a qualquer URL CDP que você devolver e dirige a página a partir dali — todo provedor ganha o conjunto
completo de ferramentas browser_* de graça.
O provedor ativo é escolhido por browser.cloud_provider no config.yaml; o dispatcher em
tools/browser_tool.py é uma consulta pura ao registro, sem condicionais por provedor.
Descoberta
O Hermes procura backends de navegador em três lugares:
- Embutido —
<repo>/plugins/browser/<name>/(carregado automaticamente comkind: backend) - Usuário —
~/.hermes/plugins/browser/<name>/(habilitação opcional viaplugins.enabledouhermes plugins enable <name>) - Pip — pacotes que declaram um entry point
hermes_agent.plugins
O register(ctx) de cada plugin chama ctx.register_browser_provider(...), que coloca a instância
no registro em agent/browser_registry.py.
Estrutura de diretórios
plugins/browser/my-backend/
├── __init__.py # entry point register()
├── provider.py # subclasse de BrowserProvider
└── plugin.yaml # Manifesto com kind: backend e provides_browser_providers
plugin.yaml:
name: browser-my-backend
version: 1.0.0
description: "Meu backend de navegador na nuvem. Requer MY_BACKEND_API_KEY."
author: voce
kind: backend
provides_browser_providers:
- my-backend
__init__.py:
from plugins.browser.my_backend.provider import MyBackendProvider
def register(ctx) -> None:
ctx.register_browser_provider(MyBackendProvider())
A ABC BrowserProvider
Implemente agent.browser_provider.BrowserProvider. Três métodos de ciclo de vida mais a
identidade:
from agent.browser_provider import BrowserProvider
class MyBackendProvider(BrowserProvider):
@property
def name(self) -> str:
return "my-backend" # o valor de configuração de browser.cloud_provider
@property
def display_name(sel### `get_setup_schema()` — a linha no seletor do `hermes tools` {#getsetupschema-the-hermes-tools-picker-row}
"""Só verificação barata — variável de ambiente presente, dependência importável.
SEM chamadas de rede: roda na hora de registrar a ferramenta e a cada
repintura de `hermes tools`."""
return bool(os.environ.get("MY_BACKEND_API_KEY"))
def create_session(self, task_id: str) -> dict:
"""Cria uma sessão de navegador remota; devolve o contrato de metadados da sessão."""
session = my_api.create_browser(...)
return {
"session_name": f"my-backend-{task_id}", # nome único de sessão do agent-browser
"bb_session_id": session.id, # ID de sessão do provedor (para limpeza)
"cdp_url": session.cdp_ws_url, # URL de websocket CDP
"features": {"stealth": True}, # flags de recurso que você habilitou
}
def close_session(self, session_id: str) -> bool:
"""Encerra pelo ID de sessão do provedor. Em caso de erro, registre no log e devolva
False — nunca levante exceção, para o laço de limpeza do dispatcher seguir em frente."""
...
def emergency_cleanup(self, session_id: str) -> None:
"""Desmontagem de melhor esforço a partir de handlers de atexit/sinal. Não pode levantar exceção."""
...
O contrato de metadados da sessão
create_session() precisa devolver pelo menos session_name, bb_session_id, cdp_url e
features. Duas esquisitices que vale conhecer:
bb_session_idé um nome de chave legado, mantido literalmente por compatibilidade retroativa comtools/browser_tool.py— ele guarda o ID de sessão do seu provedor, independentemente do fornecedor. Não renomeie.create_session()pode levantar exceção —ValueErrorpara credenciais faltando,RuntimeErrorpara falhas de rede/API. O dispatcher mostra isso ao usuário. Isso é diferente declose_session/emergency_cleanup, que nunca podem levantar exceção.
Uma chave opcional external_call_id dá suporte à cobrança do gateway gerenciado.
get_setup_schema() — a linha no seletor do hermes tools
Sobrescreva este método para aparecer como opção de primeira classe no seletor de Automação de Navegador, com prompts de chave de API e um hook de instalação:
def get_setup_schema(self) -> dict:
return {
"name": "My Backend",
"badge": "paid",
"tag": "Navegador na nuvem com stealth e proxies",
"env_vars": [
{"key": "MY_BACKEND_API_KEY",
"prompt": "Chave de API do My Backend",
"url": "https://mybackend.example"},
],
"post_setup": "agent_browser", # garante que o Chromium local esteja instalado (o próprio agent-browser resolve via npx)
}
Pelo padrão do projeto para backends de ferramenta: se um backend não pode ser escolhido e
configurado pelo hermes tools, ele não está pronto — "defina esta variável de ambiente na mão"
não é uma integração.
Como os usuários configuram
browser:
cloud_provider: my-backend
Implementações de referência
Os três provedores que vêm de fábrica em plugins/browser/ são os exemplos canônicos, em ordem
crescente de complexidade: firecrawl (o mais simples), browser_use e browserbase (flags de
recurso de stealth/proxy/keep-alive, com degradação suave quando os recursos pagos não estão
disponíveis). Copie o mais próximo do seu caso.
Checklist
-
nameestá em minúsculas e é estável (é um valor de configuração que os usuários escrevem) -
is_available()não faz nenhuma chamada de rede -
create_session()devolve o contrato de metadados completo (com o nome de chavebb_session_idintacto) -
close_session()/emergency_cleanup()nunca levantam exceção -
get_setup_schema()expõe as suas variáveis de ambiente para ohermes toolsconseguir configurar o backend -
plugin.yamldeclarakind: backend+provides_browser_providers