How to Build an AI Agent
How to Build an AI Agent
s01

O Loop do Agente

Ferramentas e Execucao

Bash is All You Need

84 LOC1 ferramentasSingle-tool agent loop
The minimal agent kernel is a while loop + one tool

s01 > s02 > s03 > s04 > s05 > s06 | s07 > s08 > s09 > s10 > s11 > s12

"Um loop e Bash e tudo de que você precisa" -- uma ferramenta + um loop = um agente.

Problema

Um modelo de linguagem pode raciocinar sobre código, mas não pode tocar o mundo real -- não consegue ler arquivos, executar testes ou verificar erros. Sem um loop, cada chamada de ferramenta requer que você copie e cole manualmente os resultados de volta. Você se torna o loop.

Solução

+--------+      +-------+      +---------+
|  User  | ---> |  LLM  | ---> |  Tool   |
| prompt |      |       |      | execute |
+--------+      +---+---+      +----+----+
                    ^                |
                    |   tool_result  |
                    +----------------+
                    (loop until stop_reason != "tool_use")

Uma condição de saída controla todo o fluxo. O loop continua até o modelo parar de chamar ferramentas.

Como Funciona

  1. O prompt do usuário se torna a primeira mensagem.
messages.append({"role": "user", "content": query})
  1. Envie mensagens + definições de ferramentas para o LLM.
response = client.messages.create(
    model=MODEL, system=SYSTEM, messages=messages,
    tools=TOOLS, max_tokens=8000,
)
  1. Anexe a resposta do assistente. Verifique stop_reason -- se o modelo não chamou uma ferramenta, terminamos.
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason != "tool_use":
    return
  1. Execute cada chamada de ferramenta, colete resultados, anexe como uma mensagem de usuário. Volte ao passo 2.
results = []
for block in response.content:
    if block.type == "tool_use":
        output = run_bash(block.input["command"])
        results.append({
            "type": "tool_result",
            "tool_use_id": block.id,
            "content":messages.append({"role": "user", output,
        })
 "content": results})

Montado em uma função:

def agent_loop(query):
    messages = [{"role": "user", "content": query}]
    while True:
        response = client.messages.create(
            model=MODEL, system=SYSTEM, messages=messages,
            tools=TOOLS, max_tokens=8000,
        )
        messages.append({"role": "assistant", "content": response.content})

        if response.stop_reason != "tool_use":
            return

        results = []
        for block in response.content:
            if block.type == "tool_use":
                output = run_bash(block.input["command"])
                results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": output,
                })
        messages.append({"role": "user", "content": results})

Esse é o agente inteiro em menos de 30 linhas. Tudo mais neste curso é construído em cima -- sem mudar o loop.

O Que Mudou

ComponenteAntesDepois
Loop do agente(nenhum)while True + stop_reason
Tools(nenhum)bash (uma ferramenta)
Mensagens(nenhum)Lista acumulativa
Fluxo de controle(nenhum)stop_reason != "tool_use"

Experimente

python agents/s01_agent_loop.py
  1. Crie um arquivo chamado hello.py que imprima "Hello, World!"
  2. Liste todos os arquivos Python neste diretório
  3. Qual é o branch atual do git?
  4. Crie um diretório chamado test_output e escreva 3 arquivos nele