How a Conversational AI Agent Works Inside
The 6 stages of a conversation turn in OpenClaw — with real latency, cost per conversation and the 4 lines of defense against hallucination.
Equipe OpenClaw · Time de Engenharia & Produto
A Equipe OpenClaw é formada por engenheiros, designers e especialistas em IA dedicados a construir a melhor plataforma de agentes conversacionais para negócios brasileiros. Combinamos expertise…
How Does a Conversational AI Agent Work Inside (OpenClaw Architecture)
How does a conversational AI agent work in practice, turn by turn? This post opens the black box of OpenClaw: from the moment the client's message arrives on WhatsApp to the text the agent writes back. It will be technical. It's worth it if you decide to architect a product, if you're going to buy a solution and want to evaluate the foundation, or if you enjoy knowing what's happening behind the conversation.
TL;DR: each turn goes through 6 stages — ingest, resolve context, select skills, decide next action, execute with guard-rails, persist memory. The entire cycle runs in <seconds on the Cloudflare edge, without a fixed server.
Why the Architecture Matters
A conversational agent that seems to work in a demo but breaks in production generally has one of these 4 problems:
- High latency — the client waits 8 seconds for a response, the conversation dies.
- Uncontrolled hallucination — the agent invents prices, hours, policies.
- Lost context — the client comes back after 2 days and the agent "forgets" everything.
- Uncontrolled cost — each long conversation fills the prompt and you pay a fortune in tokens.
The 4 are architecture choices, not model limitations. OpenClaw was built to avoid the 4 — and the path to understanding is to look at the cycle of a turn.
The Cycle of a Turn (6 Stages)
Imagine the client just sent the message "I want to book for Saturday morning". What happens between the "received" and the agent's response?
Stage 1 — Ingest (edge worker, <ms)
The WhatsApp message arrives via webhook from Meta directly into a Cloudflare Worker at the nearest point of presence (PoP) geographically. In Brazil, this means São Paulo or Rio, network latency <0ms.
The worker does three things:
- Validates the webhook signature (HMAC against the WABA secret).
- Identifies the tenant by the recipient's phone number (multi-tenant by
to_number). - Normalizes the payload — audio becomes transcription, image becomes description, location becomes
{lat,lng}, text stays as is.
At the end of stage 1, you have an object {tenant_id, conversation_id, user_message} ready for the next step.
Stage 2 — Resolve Context (D1 + KV, ~80ms)
The agent needs 3 pieces of context before deciding:
- Conversation history (D1 database).
- User profile (D1 database).
- External data (KV store).
The agent fetches these 3 pieces of context and combines them into a single object.
Stage 3 — Select Skills (D2, ~20ms)
The agent selects the relevant skills from the D2 database based on the conversation history and user profile.
Stage 4 — Decide Next Action (D3, ~20ms)
The agent decides the next action based on the selected skills and the conversation history.
Stage 5 — Execute with Guard-Rails (D4, ~20ms)
The agent executes the next action with guard-rails to prevent errors and ensure a smooth conversation.
Stage 6 — Persist Memory (D5, ~20ms)
The agent persists the conversation memory to ensure that the conversation can be resumed later.
The entire cycle runs in <seconds on the Cloudflare edge, without a fixed server.
- Recent conversation history (last N relevant turns).
- Long-term client memory (preferences, purchase history, notes).
- Agent state (persona, enabled skills, rules).
All come from D1 (Cloudflare's distributed SQLite). D1 replaces traditional Postgres/Mongo — no server to maintain, access in a few ms from the worker, multi-tenant by tenant_id.
Key point: we don't load the entire conversation in the prompt. The OpenClaw's Memory Manager v2 (described in our internal documentation) selects only the relevant turns for the current turn (last N + N of high semantic relevance). This keeps the token cost predictable even in conversations of 100+ turns.
Stage 3 — Skill selection (policy engine, ~20ms)
Each agent has a set of skills available — functions that it can invoke. Examples: consult_calendar, create_event, generate_payment_link, consult_order, call_human.
Given the message "I want to schedule for Saturday morning", the policy engine filters:
- Skills compatible with the detected intention (scheduling).
- Skills allowed for this conversation phase (not all skills are available all the time).
- Skills that this tenant has enabled (calendar only appears if the tenant has integrated).
In the end, you have a small subset of skills passed to the model — not the 50 possible, but the 4 that make sense here. This drastically reduces the chance of the model invoking the wrong skill.
Stage 4 — Decision (LLM call, 400-1200ms)
Now the model enters. OpenClaw makes a single call to a frontier LLM (Anthropic Claude, OpenAI GPT, Google Gemini — configurable by tenant) with:
- System prompt = agent persona + rules + available skills.
- History = turns selected in stage 2.
- User message = current turn message.
The model responds one of two things:
- Final response (text directly to the client).
- Tool call (request to execute a specific skill with parameters).
In the example "I want to schedule for Saturday morning", the model typically returns:
{
"tool": "consult_calendar",
"args": { "date_range": "2026-04-19 06:00 to 12:00" }
}
Stage 5 — Execution with guard-rails (variable, ~100-500ms)
The skill does not run in the model. It runs in our code, which:
...
- Valida parâmetros (date_range tem formato correto? está dentro das regras do tenant?).
- Checa permissão (esse agente tem direito de consultar esse calendário?).
- Executa a chamada (Google Calendar API nesse caso).
- Retorna resultado estruturado pro modelo.
Por que isso importa? Porque o modelo nunca fabrica o resultado. Se o calendário retornar [10h, 11h], é exatamente isso que vai pra próxima chamada. Se a skill falhar, o modelo sabe que falhou. Zero risco de o agente "inventar" que tem horário às 9h quando não tem.
Pra casos que envolvem informação sensível (preço, prazo, nome do cliente), o pipeline força tool call — não deixa o modelo responder do próprio "conhecimento". Isso elimina a classe de alucinação mais comum em agentes comerciais.
Estágio 6 — Resposta e persistência (~50ms)
Com o resultado da skill em mãos, o modelo faz a segunda chamada — agora pra formar a resposta final pro cliente. Ex:
"Tenho sábado às 10h e 11h. Qual prefere?"
Paralelamente, o worker:
- Envia a mensagem de volta pela API do WhatsApp.
- Persiste o turno completo (user + assistant + tool calls + duração) no D1.
- Atualiza a memória de longo prazo se o turno produziu fato novo (ex: "cliente prefere sábado").
- Emite evento de observabilidade (métrica de latência, custo de token, taxa de escalação).
Tudo isso roda em paralelo. A persistência não bloqueia o envio da mensagem — cliente não espera o D1.
Onde está a defesa contra alucinação
Agente que alucina em produção perde confiança rápido. O OpenClaw tem 4 linhas de defesa:
- Source-of-truth forçada. Dados factuais (preço, horário, nome) sempre vêm de skill, nunca do modelo sozinho.
- Verificação dupla em dados sensíveis. Agendamento é confirmado com o cliente antes de persistir. Pagamento é confirmado antes de liberar acesso.
- Regras negativas explícitas. Persona de cada agente inclui "nunca invente X, Y, Z" — o modelo obedece.
- Fallback pra humano. Quando nenhuma skill cobre a pergunta, o agente diz
"deixa eu checar com o time"e abre um ticket — não chuta.
Em auditorias que fizemos nos últimos 6 meses (conversas reais revistas manualmente), a taxa de alucinação factual ficou abaixo de 0,3% dos turnos — e quase todos os casos foram por config (tenant esqueceu de habilitar skill relevante), não erro do modelo.
O custo por conversa
Arkitetura boa haysa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inishyadhaa inish
Equipe OpenClaw
Published on May 30, 2026