Pontos de entrada
- RPC do Gateway:
agenteagent.wait. - CLI:
openclaw agent.
Sequência de execução
- O RPC
agentvalida os parâmetros, resolve a sessão (sessionKey/sessionId), persiste os metadados da sessão e retorna{ runId, acceptedAt }imediatamente. agentCommandexecuta o turno: resolve o modelo e os padrões de thinking/verbose/trace, carrega o snapshot de Skills, chamarunEmbeddedAgente emite um fim/erro de ciclo de vida de contingência se o loop incorporado ainda não tiver emitido um.runEmbeddedAgent: serializa as execuções por meio de filas por sessão e globais, resolve o modelo e o perfil de autenticação, cria a sessão do OpenClaw, assina eventos de runtime, transmite deltas do assistente/das ferramentas, aplica o tempo limite da execução (interrompendo-a quando expira) e retorna payloads junto com metadados de uso. Para turnos do app-server do Codex, também interrompe um turno aceito que deixa de produzir progresso no app-server antes de um evento terminal.subscribeEmbeddedAgentSessionconecta eventos de runtime ao fluxoagent: eventos de ferramentas parastream: "tool", deltas do assistente parastream: "assistant"e eventos de ciclo de vida parastream: "lifecycle"(phase: "start" | "end" | "error").agent.wait(waitForAgentRun) aguarda o fim/erro do ciclo de vida de umrunIde retorna{ status: ok|error|timeout, startedAt, endedAt, error? }.
Enfileiramento e concorrência
As execuções são serializadas por chave de sessão (faixa da sessão) e, opcionalmente, por uma faixa global, evitando condições de corrida entre ferramentas e sessões. Os canais de mensagens escolhem um modo de fila (steer/followup/collect/interrupt) que alimenta esse sistema de faixas; consulte Fila de comandos. As gravações da transcrição também são protegidas por um bloqueio de gravação da sessão no arquivo da sessão. O bloqueio reconhece processos e é baseado em arquivo, portanto detecta gravadores que contornam a fila dentro do processo ou que vêm de outro processo. Os gravadores aguardam atésession.writeLock.acquireTimeoutMs (padrão de 60000 ms; substituição pela variável de ambiente OPENCLAW_SESSION_WRITE_LOCK_ACQUIRE_TIMEOUT_MS) antes de informar que a sessão está ocupada.
Por padrão, os bloqueios de gravação de sessão não são reentrantes. Um auxiliar que aninha intencionalmente a aquisição do mesmo bloqueio, preservando um único gravador lógico, deve habilitar allowReentrant: true.
Preparação da sessão e do espaço de trabalho
- O espaço de trabalho é resolvido e criado; execuções em sandbox podem ser redirecionadas para a raiz de um espaço de trabalho de sandbox.
- As Skills são carregadas (ou reutilizadas de um snapshot) e injetadas no ambiente e no prompt.
- Os arquivos de inicialização/contexto são resolvidos e injetados no prompt do sistema.
- Um bloqueio de gravação da sessão é adquirido, e o destino da transcrição da sessão é preparado antes do início do streaming. Qualquer caminho posterior de regravação, Compaction ou truncamento da transcrição deve adquirir o mesmo bloqueio antes de modificar as linhas da transcrição no SQLite.
Montagem do prompt
O prompt do sistema é criado com base no prompt-base do OpenClaw, no prompt de Skills, no contexto de inicialização e nas substituições por execução. Os limites específicos do modelo e os tokens reservados para Compaction são aplicados. Consulte Prompt do sistema para saber o que o modelo recebe.Hooks
O OpenClaw tem dois sistemas de hooks:- Hooks internos (hooks do Gateway): scripts orientados a eventos para comandos e eventos de ciclo de vida.
- Hooks de Plugin: pontos de extensão dentro do ciclo de vida do agente/das ferramentas e do pipeline do Gateway.
Hooks internos (hooks do Gateway)
agent:bootstrap: é executado durante a criação dos arquivos de inicialização, antes da finalização do prompt do sistema. Use-o para adicionar ou remover arquivos de contexto de inicialização.- Hooks de comando:
/new,/reset,/stope outros eventos de comando (consulte a documentação de Hooks).
Hooks de Plugin
Eles são executados dentro do loop do agente ou do pipeline do Gateway:
Regras de decisão dos hooks para proteções de saída/ferramentas:
before_tool_call:{ block: true }é terminal e interrompe os manipuladores de menor prioridade.{ block: false }não realiza nenhuma ação e não remove um bloqueio anterior.before_install: mesmas semânticas de terminal/nenhuma ação descritas acima. Usesecurity.installPolicy, e nãobefore_install, para decisões de permissão/bloqueio de instalação controladas pelo operador que precisem abranger os caminhos de instalação e atualização pela CLI.message_sending:{ cancel: true }é terminal e interrompe os manipuladores de menor prioridade.{ cancel: false }não realiza nenhuma ação e não remove um cancelamento anterior.
Streaming
- Os deltas do assistente são transmitidos pelo runtime do agente como eventos
assistant. - O streaming em blocos pode emitir respostas parciais em
text_endoumessage_end. - O streaming de raciocínio pode ser um fluxo separado ou bloquear respostas.
- Consulte Streaming para saber mais sobre a divisão em partes e o comportamento das respostas em blocos.
Execução de ferramentas
- Os eventos de início/atualização/fim de ferramentas são emitidos no fluxo
tool. - Os resultados das ferramentas são higienizados quanto ao tamanho e aos payloads de imagens antes do registro/emissão.
- Os envios por ferramentas de mensagens são rastreados para suprimir confirmações duplicadas do assistente.
Formatação da resposta
Os payloads finais são montados com o texto do assistente (mais o raciocínio opcional), resumos inline das ferramentas (quando o modo detalhado está habilitado e é permitido) e o texto de erro do assistente quando ocorre um erro no modelo.- O token silencioso exato
NO_REPLYé filtrado dos payloads de saída. - As duplicatas das ferramentas de mensagens são removidas da lista final de payloads.
- Se nenhum payload renderizável permanecer e uma ferramenta tiver apresentado erro, uma resposta de erro de ferramenta de contingência será emitida, a menos que uma ferramenta de mensagens já tenha enviado uma resposta visível ao usuário.
Compaction e novas tentativas
A Compaction automática emite eventos de fluxocompaction e pode acionar uma nova tentativa. Na nova tentativa, os buffers em memória e os resumos de ferramentas são redefinidos para evitar saída duplicada. Consulte Compaction.
Fluxos de eventos
lifecycle: emitido porsubscribeEmbeddedAgentSession(e, como contingência, poragentCommand).assistant: deltas transmitidos pelo runtime do agente.tool: eventos de ferramentas transmitidos pelo runtime do agente.
Tratamento de canais de chat
Os deltas do assistente são armazenados em buffer nas mensagensdelta do chat. Uma mensagem final do chat é emitida no fim/erro do ciclo de vida.
Tempos limite
Diagnóstico de sessões travadas
Com o diagnóstico ativado,diagnostics.stuckSessionWarnMs (padrão: 120000 ms) classifica sessões longas em processing sem resposta, ferramenta, status, bloqueio ou progresso de ACP observado:
- Execuções incorporadas, chamadas de modelo e chamadas de ferramenta ativas são relatadas como
session.long_running. Chamadas silenciosas de modelo com proprietário permanecem comosession.long_runningatédiagnostics.stuckSessionAbortMs, para que provedores lentos ou sem streaming não sejam sinalizados como paralisados cedo demais. - Trabalho ativo sem progresso recente é relatado como
session.stalled. Chamadas de modelo com proprietário mudam parasession.stalledao atingir ou ultrapassar o limite de cancelamento; atividade obsoleta de modelo/ferramenta sem proprietário não fica oculta como execução longa. session.stucké reservado para registros obsoletos e recuperáveis de sessão, incluindo sessões ociosas na fila com atividade obsoleta de modelo/ferramenta sem proprietário.
diagnostics.stuckSessionAbortMs é de pelo menos 5 minutos e 3 vezes o limite de aviso. Registros obsoletos de sessão liberam a fila da sessão afetada imediatamente após a aprovação das verificações de recuperação; execuções incorporadas paralisadas são canceladas e drenadas somente após o limite de cancelamento, para que o trabalho na fila seja retomado sem interromper execuções meramente lentas. A recuperação emite resultados estruturados de solicitação/conclusão; o estado de diagnóstico é marcado como ocioso somente se a mesma geração de processamento ainda for a atual, e diagnósticos repetidos de session.stuck aumentam progressivamente o intervalo enquanto a sessão permanece inalterada.
Onde as operações podem terminar antecipadamente
- Tempo limite do agente (cancelamento)
- AbortSignal (cancelamento)
- Desconexão do Gateway ou tempo limite de RPC
- Tempo limite de
agent.wait(apenas aguarda, não interrompe o agente)
Relacionado
- Ferramentas - ferramentas disponíveis para o agente
- Hooks - scripts orientados a eventos acionados por eventos do ciclo de vida do agente
- Compaction - como conversas longas são resumidas
- Aprovações de execução - controles de aprovação para comandos do shell
- Raciocínio - configuração do nível de raciocínio/pensamento