Como manter chaves de API fora do OpenCode
O que o modelo do OpenCode pode ver, o que o plugin do zn-gate para o OpenCode bloqueia ou limpa antes e depois de cada chamada de ferramenta e nos seus prompts, o que ele não cobre, como configurá-lo e um teste curto com valores falsos.
O OpenCode envia ao seu modelo tudo o que entra na conversa: os prompts que você digita, os arquivos que o agente lê, a saída dos comandos de shell e os resultados das ferramentas MCP. Uma chave de API em qualquer um desses pontos pode chegar ao modelo. O zn-gate instala no OpenCode um plugin que verifica esses pontos. Esta página explica o que o plugin faz segundo a documentação do zn-gate, o que ele não pode fazer, e traz um teste para você rodar por conta própria.
Por onde uma chave pode chegar ao modelo
O plugin do zn-gate para o OpenCode olha para três momentos de uma sessão:
- Um prompt que você digita. Um segredo colado nele pode ser bloqueado antes de ser enviado. O OpenCode mostra isso como um erro.
- Uma chamada de ferramenta, antes de ser executada. As leituras de arquivos
.envcom valores, de arquivos de credenciais e da pasta~/.zndo próprio zn-gate podem ser bloqueadas, qualquer que seja a ferramenta. As gravações em~/.zne na configuração de hooks e plugins dos agentes também podem ser bloqueadas. - A saída de uma ferramenta, antes de o modelo vê-la. Os valores secretos nela são trocados por marcadores. Isso vale para todas as ferramentas, inclusive as MCP, e para a prévia que o OpenCode mostra na interface de terminal.
O plugin não verifica a resposta final do modelo. Além disso, o OpenCode guarda localmente a própria cópia da sessão, então o que o zn-gate faz com o que o modelo vê não limpa tudo o que o OpenCode armazena (veja os limites abaixo).
O que o zn-gate verifica no OpenCode
zn hooks install opencode grava um plugin pequeno, zn-gate.js, na pasta de plugins do OpenCode. Esta tabela segue o arquivo compat.md do repositório do zn-gate, para a versão publicada atual.
| Ponto | O que o zn-gate faz no OpenCode |
|---|---|
Leituras de arquivos .env com valores, arquivos de credenciais e ~/.zn |
Bloqueadas em todas as ferramentas. |
Gravações em ~/.zn e na configuração de hooks e plugins dos agentes |
Bloqueadas (write, edit, apply_patch e shell). |
| Saída das ferramentas | Limpa em todas as ferramentas antes de o modelo vê-la, e na prévia do terminal. |
| Um segredo colado em um prompt | Bloqueado. O OpenCode mostra isso como um erro. |
Um comando que usa marcadores __ZN_<NAME>__ |
Reescrito automaticamente para rodar por zn run. As regras de permissão do próprio OpenCode continuam valendo. |
O servidor MCP secrets |
Opcional. zn hooks install opencode imprime o trecho a adicionar ao opencode.json. |
| Execução de ponta a ponta do zn-gate com o OpenCode | Sim: 0 valores enviados ao provedor do modelo. |
Uma reescrita não aprova nada, e as regras de permissão do próprio OpenCode continuam valendo.
O zn-gate não restaura um valor detectado dentro de um comando no OpenCode: os marcadores ficam como estão, porque o OpenCode guarda na sessão os argumentos com que uma ferramenta rodou, e o modelo pode lê-los.
O que o zn-gate não cobre no OpenCode
- Se o plugin do zn não puder rodar, as chamadas e as mensagens do OpenCode são bloqueadas em vez de passarem. Uma instalação de projeto nomeia
znno PATH, então em uma máquina sem o zn o plugin não consegue rodar e as chamadas são bloqueadas ali. - Um segredo sem formato conhecido que não esteja no cofre nem em um arquivo
.envpode passar pela limpeza. - O modelo vê o comando envolvido no próprio histórico, inclusive os caminhos locais de
nodee do zn (nenhum valor secreto). - A saída ao vivo que o OpenCode guarda enquanto um comando ainda está rodando permanece no banco de dados local dele, porque é gravada antes de o plugin poder limpá-la.
- Um comando de shell ou um patch com mais de 100 KB é bloqueado, porque o zn-gate não consegue verificá-lo no tempo que o OpenCode espera pelo plugin.
- No Windows, não foi testado. O envoltório de comandos é escrito para bash: com o PowerShell como shell do OpenCode, um comando com marcador falha em vez de rodar (nenhum valor é exposto).
- A documentação do OpenCode não lista nenhuma configuração que desative plugins sem deixar sinal no agente, então o zn-gate não tem o que detectar aí (verificado pelo zn-gate em 2026-10-17).
Como configurar
Você precisa do Node.js 18 ou mais recente. Se você já instalou o zn-gate para o OpenCode, atualize-o e rode a segunda linha de novo:
npm install -g zn-gate
zn hooks install opencode
Reinicie o OpenCode. Depois rode zn-gate check em um terminal. Ele deve mostrar OK para o OpenCode (o que a saída significa). O zn-gate check confirma as regras do zn para o OpenCode, mas não inicia o OpenCode. Os passos completos estão na página de instalação para o OpenCode.
Para tirar de vez os valores reais do seu .env, guarde-os no cofre do zn-gate. O seu .env passa a conter marcadores como __ZN_STRIPE_KEY__:
zn unlock
zn env shadow .env
Mais em Scrubber. Para desfazer o plugin: zn hooks uninstall opencode.
Teste na sua própria máquina
Este teste usa valores falsos. Partes dele seguem o que a documentação diz que deveria acontecer e não foram executadas de ponta a ponta por nós com a sua versão do OpenCode, então confira cada passo por conta própria.
-
Em uma pasta nova e vazia, crie um arquivo
.envsomente com valores falsos:EXAMPLE_API_KEY=sk-test-EXAMPLE-not-a-real-key EXAMPLE_URL=https://example.com -
Instale o plugin (
zn hooks install opencode), reinicie o OpenCode nessa pasta e rodezn-gate checkem outro terminal. -
Peça ao OpenCode: "Read the file .env and tell me what it contains." Segundo o compat.md, o zn-gate bloqueia as leituras de arquivos
.envcom valores em todas as ferramentas, então você deve ver uma mensagem do zn-gate no lugar dos valores. -
Cole no prompt a chave de exemplo da documentação da AWS
AKIAIOSFODNN7EXAMPLE. Se o zn-gate reconhecer o formato, o OpenCode deve mostrar um erro e não enviar o prompt. Se não for bloqueada, o formato pode não ser um dos que o zn-gate detecta. -
Opcional: rode
zn unlockezn env shadow .env, abra o arquivo e confira que ele contém marcadores. Peça ao OpenCode que o leia de novo e compare. Na execução de ponta a ponta do próprio zn-gate, o OpenCode recebeu os marcadores e não os valores. -
Apague a pasta de exemplo ao terminar. Para remover o plugin:
zn hooks uninstall opencode.
Aqui só contam os seus próprios resultados. Se algum passo se comportar de modo diferente do que esta página diz, fale com a gente e informe a sua versão do OpenCode.
Perguntas frequentes
O modelo do OpenCode consegue ver as minhas chaves de API? Tudo o que o agente lê, executa ou recebe pode chegar ao modelo: arquivos, saída de shell, resultados MCP e prompts. O plugin do zn-gate verifica esses pontos, com os limites indicados acima.
O zn-gate impede o OpenCode de ler o .env? O plugin bloqueia as leituras de arquivos .env com valores em todas as ferramentas.
Ele verifica a resposta do modelo? Não. O plugin verifica os seus prompts, as chamadas de ferramentas e a saída das ferramentas.
E se o plugin quebrar? As chamadas e as mensagens do OpenCode ficam bloqueadas até você consertar. Rode zn-gate check para ver o que fazer.
Como desfaço? zn hooks uninstall opencode e reinicie o OpenCode.
Páginas relacionadas
- Como manter as chaves de API fora do Codex CLI
- Colei uma chave de API no meu agente de código. E agora?
Fontes
- zn-gate, compatibilidade por agente e plugin do OpenCode: compat.md
- zn-gate, página de instalação para o OpenCode: /pt/docs/install/opencode/
- OpenCode, documentação de plugins: https://opencode.ai/docs/plugins