Engenharia
Com Funciona un Agent de IA Conversacional per Dentro
Engenharia
12 min read
29 de maig del 2026

Com Funciona un Agent de IA Conversacional per Dentro

Els 6 estadis de un torn de conversa a OpenClaw — amb latència real, cost per conversa i les 4 línies de defensa contra alucinació.

Equipe OpenClaw

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…


Comentaris sobre l'arquitectura d'un Agent de IA Conversacional per Dentro (OpenClaw)

Comentaris sobre com funciona un agent de IA conversacional en la pràctica, torn a torn. Aquest post obre la caixa preta del OpenClaw: del moment que la missatge del client arriba al WhatsApp fins al text que l'agent escriu de tornada. Serà tècnic. És valent si decideu arquitectura de producte, si voleu comprar una solució i voleu avaluar el fons, o si us agrada saber què està passant per darrere de la conversa.

TL;DR: cada torn passa per 6 etapes — ingest, resol context, selecciona habilitats, decideix la pròxima acció, executa amb guard-rails, persisteix memòria. Tot el cicle roda en <segons a l'edge de Cloudflare, sense servidor fix.


Per què l'arquitectura importa

Agent conversacional que sembla funcionar en un demo però quebrar en producció generalment té un dels 4 problemes:

  1. Latència alta — client espera 8 segons per resposta, conversa mor.
  2. Alucinació no controlada — agent inventa preu, horari, política.
  3. Context perdut — client torna després de 2 dies i agent "oblida" tot.
  4. Cust descontrolat — cada conversa llarga enllena el prompt i vos pagareu una fortuna en tokens.

Els 4 són eleccions d'arquitectura, no limitacions del model. L'OpenClaw fou construït per evitar els 4 — i el camí per entendre és mirar el cicle d'un torn.


El cicle d'un torn (6 etapes)

Imagineu que el client acaba de enviar el missatge "vull marcar per dissabte de matinada". Què passa entre el "rebut" i la resposta de l'agent?

Etapa 1 — Ingest (edge worker, <ms)

El missatge del WhatsApp arriba via webhook de Meta directament en un Cloudflare Worker al punt de presència (PoP) més proper geogràficament. Al Brasil, això significa São Paulo o Rio, latència de xarxa <0ms.

El treballador fa tres coses:

  1. Valida la signatura del webhook (HMAC contra secret de la WABA).
  2. Identifica el lloguer pel número de telèfon del receptor (multi-lloguer per to_number).
  3. Normalitza el payload — àudio vira transcripció, imatge vira descripció, localització vira {lat,lng}, text queda com està.

Al final de l'etapa 1 teniu un objecte {tenant_id, conversa_id, missatge_usuari} preparat per al pas següent.

Etapa 2 — Resol context (D1 + KV, ~80ms)

L'agent necessita de 3 peces de context abans de decidir:

  1. Conversa anterior: què va passar en la conversa anterior?
  2. Dades de l'usuari: què s'ha registrat sobre l'usuari?
  3. Dades de la conversa: què s'ha registrat sobre la conversa?

L'agent utilitza aquests tres elements per decidir la pròxima acció.

Etapa 3 — Selecciona habilitats (D1 + KV, ~80ms)

L'agent necessita seleccionar les habilitats adequades per respondre al missatge de l'usuari. Aquestes habilitats poden incloure:

  1. Text a text: respondre amb un text.
  2. Text a àudio: respondre amb un àudio.
  3. Text a imatge: respondre amb una imatge.

L'agent utilitza les dades de la conversa i les dades de l'usuari per seleccionar les habilitats adequades.

Etapa 4 — Decideix la pròxima acció (D1 + KV, ~80ms)

L'agent necessita decidir la pròxima acció per respondre al missatge de l'usuari. Aquesta acció pot incloure:

  1. Respondre amb un text: respondre amb un text.
  2. Respondre amb un àudio: respondre amb un àudio.
  3. Respondre amb una imatge: respondre amb una imatge.

L'agent utilitza les dades de la conversa i les dades de l'usuari per decidir la pròxima acció.

Etapa 5 — Executa amb guard-rails (D1 + KV, ~80ms)

L'agent necessita executar la pròxima acció amb guard-rails per evitar errors. Aquests guard-rails poden incloure:

  1. Validació de dades: validar les dades de la conversa i les dades de l'usuari.
  2. Limitacions de recursos: limitar els recursos utilitzats per la conversa.
  3. Seguretat: garantir la seguretat de la conversa.

L'agent utilitza els guard-rails per evitar errors i garantir la seguretat de la conversa.

Etapa 6 — Persisteix memòria (D1 + KV, ~80ms)

L'agent necessita persistir la memòria de la conversa per recordar les accions realitzades. Aquesta memòria pot incloure:

  1. Dades de la conversa: les dades de la conversa.
  2. Dades de l'usuari: les dades de l'usuari.
  3. Accions realitzades: les accions realitzades per l'agent.

L'agent utilitza la memòria per recordar les accions realitzades i garantir la continuïtat de la conversa.

Al final del cicle d'un torn, l'agent ha realitzat les accions necessàries per respondre al missatge de l'usuari i ha persistit la memòria de la conversa.

  • Històric recent de la conversa (últims N turnos rellevants).
  • Memòria de llarg termini del client (preferències, històric de compra, anotacions).
  • Estat del agent (persona, habilitats, regles).

Tots vénen del D1 (SQLite distribuït de Cloudflare). D1 substitueix Postgres/Mongo tradicional — sense servidor de base de dades per mantenir, accés en pocs ms a partir del treballador, multi-tenant per tenant_id.

Punt clau: a gent no carrega la conversa sencera en el prompt. El Memory Manager v2 d'OpenClaw (descrit en la nostra documentació interna) selecciona només els turnos rellevants per al turn actual (últims N + N de alta rellevància semàntica). Això manté el cost de tokens previsible fins i tot en converses de 100+ turnos.

Estadi 3 — Selecció d'habilitats (motor de polítiques, ~20ms)

Cada agent té un conjunt d' habilitats disponibles — funcions que ell pot invocar. Exemples: consultar_calendari, crear_evente, generar_enllaç_pagament, consultar_pedido, chamar_humà.

Dada la missatge "vull marcar per dissabte de matí", el motor de polítiques filtra:

  • Habilitats compatibles amb la intenció detectada (agendament).
  • Habilitats permises per aquesta fase de la conversa (no totes les habilitats estan disponibles en tot moment).
  • Habilitats que aquest client ha habilitat (calendari només apareix si el client l'ha integrat).

Al final, teniu un subconjunt petit d'habilitats passat al model — no les 50 possibles, sinó les 4 que fan sentit aquí. Això redueix dràsticament la possibilitat que el model invocar una habilitat errada.

Estadi 4 — Decisió (llamada a LLM, 400-1200ms)

Ara el model entra. OpenClaw fa una llamada única a un LLM de frontera (Anthropic Claude, OpenAI GPT, Google Gemini — configurable per client) amb:

  • Prompt de sistema = persona de l'agent + regles + habilitats disponibles.
  • Històric = turnos seleccionats en l'estadi 2.
  • Missatge de l'usuari = missatge del turn actual.

El model respon una de dues coses:

  • Resposta final (text directe per al client).
  • Llamada a tool (solicitude per executar una habilitat específica amb paràmetres).

En l'exemple "vull marcar per dissabte de matí", el model típicament retorna:

{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}

Estadi 5 — Execució amb guardrails (variable, ~100-500ms)

L'habilitat no s'executa en el model. S'executa en un codi nostre, que:

{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19 06:00 a 12:00" }
}
{
  "tool": "consultar_calendari",
  "args": { "data_range": "2026-04-19

1. **Valida paràmetres** (la data_range té el format correcte? està dintre les regles del tenant?).
2. **Checa permissió** (aquest agent té dret de consultar aquest calendari?).
3. **Executa la crida** (API de Google Calendar en aquest cas).
4. **Retorna resultat estructurat** al model.

Per què això importa? Perquè **el model mai fabrica el resultat**. Si el calendari retorna `[10h, 11h]`, és exactament això que anirà a la pròxima crida. Si la skill falla, el model sap que ha fallat. Zero risc de que l'agent "inventi" que té hora a les 9h quan no té.

Per als casos que involucren informació sensible (preu, termini, nom del client), el pipeline força `tool call` — no deixa que el model respongui del propi "coneixement". Això **elimina la classe d'alucinació** més comuna en agents comercials.

### Estadi 6 — Resposta i persistència (~50ms)

Amb el resultat de la skill a les mans, el model fa la segona crida — ara per formar la resposta final per al client. Ex:

> `"Tinc dissabte a les 10h i 11h. Qual prefereix?"`

Paral·lelament, el treballador:

1. **Envia** la missatge de tornada per l'API de WhatsApp.
2. **Persisteix** el torn complet (usuari + assistent + crides a les eines + durada) al D1.
3. **Actualitza la memòria de llarg termini** si el torn ha produït un fet nou (ex: "el client prefereix dissabte").
4. **Emet un esdeveniment d'observabilitat** (mètrica de latència, cost de token, taxa d'escalada).

Tota aquesta cosa roda en paral·lel. La persistència **no bloqueja** l'enviament de la missatge — el client no espera el D1.

---

## On està la defensa contra l'alucinació

L'agent que alucina en producció perde confiança ràpidament. L'OpenClaw té 4 línies de defensa:

1. **Font de veritat forçada.** Dades factuals (preu, hora, nom) **sempre** vénen de la skill, mai del model sol.
2. **Verificació doble en dades sensibles.** Agendament és confirmat amb el client abans de persistir. Pagament és confirmat abans de liberar accés.
3. **Regres negatives explícites.** Persona de cada agent inclou "mai inventi X, Y, Z" — el model obedeix.
4. **Fallback a l'humà.** Quan cap skill cobreix la pregunta, l'agent diu `"deixa que jo comprovi amb el equip"` i obre un tiquet — no chuta.

En auditories que hem fet els últims 6 mesos (converses reals revisades manualment), la taxa d'alucinació factual va a sota de **0,3% dels torns** — i quasi tots els casos van ser per configur (tenant va oblidar d'habilitar la skill rellevant), no error del model.

---

## El cost per conversa

Arquitectura bona és invisible fins que no miris la factura. Dada que cada torn fa 1-2 trucades de LLM + lookups en D1, el cost típic per conversa completa (10-15 torns) queda en:

Nota: He traduït "boa" a "bona" i "fatura" a "factura" per mantenir la traducció més propera al català estàndard.

<!-- [AI translation truncated at 10000 chars — admin: complete remaining content manually] -->

Equipe OpenClaw

Published on 29 de maig del 2026

Related posts