s01
O Loop do Agente
Ferramentas e ExecucaoBash 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
- O prompt do usuário se torna a primeira mensagem.
messages.append({"role": "user", "content": query})
- Envie mensagens + definições de ferramentas para o LLM.
response = client.messages.create(
model=MODEL, system=SYSTEM, messages=messages,
tools=TOOLS, max_tokens=8000,
)
- 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
- 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
| Componente | Antes | Depois |
|---|---|---|
| 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
Crie um arquivo chamado hello.py que imprima "Hello, World!"Liste todos os arquivos Python neste diretórioQual é o branch atual do git?Crie um diretório chamado test_output e escreva 3 arquivos nele
