Deixe o agente funcionar sozinho sem bloqueá-lo.
「Fire and forget — the agent doesn't block while the command runs.」
A dor de bloquear chamadas
A ferramenta bash no S02 é síncrona: subprocess.run(..., timeout=120). A execução de um comando como npm install leva 90 segundos e todo o loop do agente fica travado por 90 segundos. O usuário olha para o terminal, sem saber se ele está desligado ou funcionando.
Solução para s08: Forneça ao agente uma ferramenta background_run. Ele retorna imediatamente um task_id e o comando é executado em outro thread. O agente continua fazendo loop e fazendo outras coisas; quando a tarefa BG for concluída, os resultados serão adicionados à fila de notificação.
def executar(self, comando: str) -> str: task_id = str(uuid.uuid4())[:8] self.tasks[task_id] = {"status":"em execução", ...} thread = threading.Thread(target=self._execute, args=(task_id, comando), daemon=True) thread.start() retornar f"Tarefa em segundo plano {task_id} iniciada" # Retornar imediatamente
Como devolver o resultado ao agente?
A chave é uma fila thread-safe: quando o thread bg é concluído, ele é anexado à fila; antes de cada chamada LLM pelo thread principal a fila é drenada e a notificação de conclusão é inserida nas mensagens como mensagens do usuário.
def agent_loop(mensagens): while Verdadeiro: # Drenar notificações de BG antes de cada chamada do LLM notificações = BG.drain_notifications() Notificações if: mensagens.append({ "função": "usuário", "content": f"<background-results>{notif_text}</background-results>", }) resposta=cliente.messages.create(...) ...Dessa forma, o agente gera uma tarefa BG na enésima rodada. Quando a tarefa for concluída na rodada N+3, a próxima chamada LLM trará automaticamente os resultados - o modelo saberá quando vir o bloco
<background-results>: "Ah, essa tarefa foi concluída, vou continuar."Demonstração da linha do tempo
O widget a seguir permite simular: o thread principal funciona a cada segundo (simulando a batida do ciclo do agente); você pode gerar a tarefa BG a qualquer momento. Observe como as duas pistas se encontram no “ponto de drenagem”.
Quais comandos devem ser colocados em segundo plano?
Nem todos os comandos devem ser colocados em segundo plano. Existem dois critérios:
- Demora: a execução síncrona em poucos segundos é mais simples, eliminando a necessidade de manter filas.
- Importância do resultado: Se o resultado for usado imediatamente na próxima etapa (como
cat file.txtimediatamente seguido porgrep), o plano de fundo não terá sentido - você ainda terá que esperar por ele.