O ciclo não mudou, apenas existem mais ferramentas
"O loop não mudou em nada, apenas adicionei coisas ao array TOOLS." - s02_tool_use.py Palavras originais.
Quantos lugares você precisa mover para adicionar uma ferramenta?
O agente de S01 conhece apenas bash. Como você mudaria para ativar também read_file / write_file / edit_file?
A primeira reação de muitas pessoas é: ciclo de mudança. errado. Não toque em uma única linha do loop. Só são necessárias três coisas:
- Escreva uma função manipuladora Python (
run_read(path, limit)). - Registre-o na tabela de mapeamento
TOOL_HANDLERS("read_file": lambda **kw: run_read(...)). - Adicione uma instrução de esquema JSON ao array
TOOLS(informando ao modelo como a ferramenta é chamada e quais parâmetros ela aceita).
Quando o loop vê um bloco tool_use, pressione block.name para pesquisar a função no mapa de despacho, execute-a e coloque a saída de volta em tool_result. Ele segue exatamente o mesmo caminho do bash.
# Mapa de despacho: nome → manipulador lambda TOOL_HANDLERS = { "bash": lambda **kw: run_bash(kw["comando"]), "read_file": lambda **kw: run_read(kw["caminho"], kw.get("limit")), "write_file": lambda **kw: run_write(kw["caminho"], kw["content"]), "edit_file": lambda **kw: run_edit(kw["caminho"], kw["old_text"], kw["new_text"]), }Veja como o despacho é roteado
O widget a seguir permite clicar em uma solicitação
tool_useque pode ser enviada por um modelo para ver como ela é roteada para uma função Python específica. Nota: block.name determina qual linha seguir.safe_path: uma linha de defesa que não pode ser omitida
Conceda ao agente direitos de acesso aos arquivos. A falha de segurança mais provável é o path escape: o modelo deveria estar funcionando em
/home/user/project/, mas acabou enviando umread_file("../../etc/passwd").Existe uma pequena função em s02 que trata disso:
def safe_path(p: str) -> Caminho: path = (WORKDIR / p).resolve() # Normalizar, resolver .. e soft links se não path.is_relative_to(WORKDIR): raise ValueError(f"Path escapa do espaço de trabalho: {p}") caminho de retornoA chave está nas duas etapas de
.resolve()+.is_relative_to()- analisar o caminho absoluto e depois verificar se ele ainda está na sandbox. Sem o primeiro,foo/../../etcpode passar; sem este último, nenhuma verificação é feita.Identifique a segurança do caminho
Os 5 caminhos a seguir são todos parâmetros
read_fileque podem ser enviados pelo modelo. Quais serão permitidos pelosafe_pathe quais serão rejeitados? Suponha queWORKDIR = /home/user/project.Não adicione ferramentas perigosas ao agente
É fácil adicionar ferramentas, mas lembre-se: Cada ferramenta adicionada é um novo limite de capacidade do modelo. Em s02,
bashjá tem uma lista negra (rm -rf /,sudo,shutdown) ewrite_filetem restrições desafe_path. Faça três perguntas a si mesmo antes de adicionar ferramentas à produção:
- Essa ferramenta pode permitir que o modelo faça coisas irreversíveis? (rm, enviar e-mail, git push)
- O que podevazar? (env vars, .ssh, cookies)
- A saída de erro será tratada como feedback de comando? (injeção imediata via saída da ferramenta)
A aula s07 adicionará uma "camada de permissão" para extrair essas decisões do código e torná-las declarativas.