Nota · claude-code

Parei de colar chaves de API no chat do meu agente de IA

Toda chave colada no chat de um agente de IA volta para o modelo a cada mensagem seguinte. Criei um plugin pequeno que entrega a chave ao agente sem que a conversa jamais a veja.

Acontece no meio de algo que está dando certo. O agente ligou o serviço novo, os testes estão verdes, e aí ele para: "Cole aqui sua chave da OpenAI que eu coloco no .env."

Você cola. E agora essa chave faz parte da conversa. Ela fica gravada no histórico em disco e vai junto com cada mensagem que o agente manda ao modelo pelo resto da sessão. Se a sessão é registrada ou rastreada em algum lugar, ela está lá também.

Fiz isso mais vezes do que gostaria de admitir e tive que revogar senhas várias vezes. Então criei um pluginzinho para o Claude Code que dá ao agente outro jeito de pedir.

1.00

O agente pede, uma janela abre ao lado do prompt e a chave entra por ali.

Uma janela que a conversa não vê

Agora, quando o agente precisa de uma chave, ele não pede no chat. Ele abre uma janelinha ao lado do prompt, diz quais chaves precisa e para quê, e espera.

Eu colo a chave ali. O plugin escreve direto no arquivo onde ela tem que morar, normalmente o .env, e fecha. O agente recebe uma mensagem curta de volta: os nomes das chaves que foram salvas. Os valores, nunca.

1.00

As duas chaves entraram. A janela mostra pontinhos e o tamanho, nunca a chave.

Parece pouca coisa. Na prática muda o ritmo do trabalho: o agente segue em frente e a chave não aparece no chat nem uma vez.

O arquivo muda, o chat não

1.00

O .env antes e depois. As linhas que já existiam ficam onde estavam, as chaves novas vão para o fim. (Valores de exemplo.)

O arquivo recebe o valor real. Se a chave já existia, a linha dela é atualizada no lugar. Se é nova, entra no fim. O resto do arquivo fica intocado.

E se o agente ler o arquivo depois?

Essa parte eu não tinha previsto. Tirar a chave do chat é fácil. Difícil é mantê-la fora quando, dois passos depois, o agente roda um cat .env e o conteúdo do arquivo volta para a conversa.

Então o plugin também vigia tudo que entra na sessão. Qualquer chave que ele salvou aparece para o agente só como uma etiqueta com o nome dela. Ele também reconhece o formato das chaves mais comuns (OpenAI, GitHub, AWS, Slack, Google e mais algumas), mesmo as que nunca passaram pela janela.

1.00

À esquerda, o arquivo no disco. À direita, o que o agente vê quando lê esse mesmo arquivo.

O programa que usa a chave lê o arquivo de verdade. O agente só enxerga os nomes.

A surpresa: o agente não consegue me esperar

Eu achava que o agente ia pedir, esperar eu colar e continuar. Não dá. Um plugin tem poucos segundos para responder, e uma pessoa colando uma chave leva mais que isso.

Então o agente pede e para. Quando aperto Salvar, o próprio plugin manda uma mensagem curta que acorda o agente, e ele continua como se tivesse esperado. Do meu lado parece um passo só. Por baixo são dois.

O que mudei depois de uma tarde usando

Na primeira versão eu abria a janela com um comando que listava os nomes das chaves. Testando, percebi que até os nomes iam parar no chat. Vazamento pequeno, mas vazamento. Hoje o comando recebe só o arquivo e todo o resto acontece dentro da janela.

A janela não consegue esconder o que você digita, como um campo de senha faria. Por isso existe um botão que lê a chave da área de transferência e preenche sem nunca mostrá-la. Outro botão pega um bloco inteiro de chaves copiadas e preenche todas de uma vez.

1.00

Se você aperta Salvar com uma chave ainda vazia, a janela diz qual falta.

O que ele não protege

Ele protege a conversa. Se outra coisa grava tudo o que o agente faz, como uma ferramenta de rastreamento, isso fica fora do alcance dele. E ele roda num sistema de plugins que ainda é novo, então as coisas podem mudar.

O código é aberto e está no GitHub: github.com/gcamara/secret-vault. Se você usa o Claude Code, instalar é uma linha:

/plugin install secret-vault --marketplace gcamara/secret-vault

Fiquei curioso para saber como outras pessoas lidam com isso. Quando o seu agente precisa de um segredo, onde você coloca?

Algo a acrescentar, ou uma parte de que você discorda? Me responda.

Responder por e-mail