Who writes what
Conversations and Tool Calls appear together in Agent Activity, but they are written by different services through separate pipelines.
- 01.1
Ingest does not own or receive Conversation Messages. The Runtime Communications protocol and Ingest telemetry authentication are separate boundaries with separate credentials.
- 01.2
Provider messages enter through the Communications Gateway.
- 01.3
Platform Plugins normalize and evaluate provider events.
- 01.4
Communications persists canonical inbound and outbound Conversation Messages.
- 01.5
Agent Runtimes use a versioned Communications protocol to claim inbound Deliveries and submit replies.
- 01.6
Ingest accepts only Tool Call and Tool Result telemetry from Agent Runtimes.
- 01.7
Product API routes expose Conversations and Tool Calls to authorized users.
- 01.8
The Agent Activity UI presents these records together while preserving their separate ownership.
Data flow
Two write paths converge only at the read layer.
- 02.1
Conversation path: Platform provider
- 02.2
Conversation path: Platform Plugin
- 02.3
Conversation path: Communications Gateway
- 02.4
Conversation path: Communication Deliveries and canonical Conversation Messages
- 02.5
Conversation path: Agent Runtime, exchanging claims and replies over the versioned Communications protocol
- 02.6
Telemetry path: Agent Runtime
- 02.7
Telemetry path: Ingest API
- 02.8
Telemetry path: Tool Call repository
- 02.9
Read path: Conversation reads and Tool Call reads
- 02.10
Read path: Agent Activity UI
Conversation ingestion
An inbound provider message becomes a canonical Conversation Message through the Communications path.
- 03.1
A provider message rejected by admission policy may appear in the Communications journal, but it does not become an accepted inbound Delivery or a Conversation Message.
- 03.2
A Platform Plugin receives a provider event.
- 03.3
The plugin authenticates the provider boundary where applicable.
- 03.4
It normalizes the payload into a canonical communication envelope.
- 03.5
Connection-scoped admission policies are evaluated.
- 03.6
Accepted messages create durable inbound Communication Deliveries.
- 03.7
Communications persists the canonical inbound Conversation Message.
- 03.8
The Runtime claims the Delivery through the Communications protocol.
- 03.9
The Runtime submits its reply against the source Delivery.
- 03.10
Communications persists the outbound Conversation Message and delivers it through the originating Platform Plugin.
Reply binding
A Runtime reply is bound to its source Communication Delivery, and the Runtime supplies no Platform-routing fields of its own.
- 04.1
The Runtime cannot redirect a reply to another Connection or to an arbitrary provider location. The source Delivery determines:
- 04.2
The owning Agent
- 04.3
The Communication Connection
- 04.4
The Platform
- 04.5
The channel or direct-message location
- 04.6
The thread, where one applies
- 04.7
The outbound destination
Conversation identity
A provider message is unique within (connection_id, provider_message_id), so two Connections may legitimately receive the same provider message identifier without colliding.
- 05.1
A Conversation location is identified by
(connection_id, channel_id). Achannel_idalone is insufficient because an Agent can have multiple Connections, multiple same-Platform Connections can expose identical provider channel IDs, and different providers can use overlapping identifier formats. - 05.2
Connection identity must therefore remain present in API routes, UI selection, query keys, and persistence filters.
- 05.3
A canonical Conversation Message records:
- 05.4
The
openclaw_msg_idcolumn is a legacy internal name now used for provider message identity across all Platforms. It does not indicate OpenClaw-specific behavior. - 05.5
The Agent ID
- 05.6
The Connection ID
- 05.7
Provider message identity
- 05.8
Direction:
INBOUNDorOUTBOUND - 05.9
Conversation type:
CHANNELorDM - 05.10
Session key
- 05.11
Channel or conversation ID
- 05.12
Optional thread ID
- 05.13
Optional sender ID and display name
- 05.14
Optional channel display name
- 05.15
Message content
- 05.16
Occurrence timestamp
Name enrichment
Platform Plugins may perform optional, best-effort name enrichment before canonical message persistence. Communications invokes it centrally, and it applies to supervised ingress, driver events, and provider webhooks.
- 06.1
Enrichment is not an Ingest responsibility.
- 06.2
Provider-supplied sender and location names are preferred.
- 06.3
Missing names may be resolved through credential-scoped provider lookups.
- 06.4
Lookup failure does not delay or reject an otherwise accepted message.
- 06.5
Stable provider IDs remain authoritative.
- 06.6
A duplicate delivery may fill a missing name, but must not erase an existing one.
Conversation read routes
Conversation locations are listed through GET /api/v1/organizations/{organization_id}/agents/{agent_id}/conversations/channels.
- 07.1
Messages for one Connection and channel are read through
GET /api/v1/organizations/{organization_id}/agents/{agent_id}/conversations/connections/{connection_id}/channels/{channel_id}/messages. No current route identifies a Conversation using onlyagent_idandchannel_id. - 07.2
Message reads group results into roots and replies, support date filtering, use cursor pagination, and preserve the selected Connection and channel in the route.
- 07.3
The channel-list response identifies each location using:
- 07.4
connection_id - 07.5
connection_name - 07.6
platform_key - 07.7
channel_id - 07.8
channel_name - 07.9
conversation_type
Runtime telemetry ingestion
Runtimes post Tool Call telemetry to POST /ingest/v1/agents/{agent_id}/events. The request carries only Tool Call start or pending records and Tool Result completion records; it never carries Conversation Messages, chat events, provider routing, or Communication Deliveries.
- 08.1
A Tool Call is unique within
(agent_id, external_id), and its status isPENDING,SUCCESS, orERROR. Do not treattool_namealone as Tool Call identity. - 08.2
A Tool Call event creates or idempotently updates the pending record.
- 08.3
A Tool Result uses the same Runtime invocation ID to complete the matching call.
- 08.4
Concurrent calls to the same tool remain distinct through separate external IDs.
- 08.5
A result updates a matching Tool Call regardless of its current status.
- 08.6
A result arriving before its pending Tool Call currently has no record to update and is dropped.
Tool Call reads
Tool Calls are read through GET /api/v1/organizations/{organization_id}/agents/{agent_id}/tool-calls.
- 09.1
Tool Calls use page-based pagination, while Conversation Messages use cursor pagination. The two Activity surfaces do not share one chronological persistence model.
- 09.2
Supported query controls are:
- 09.3
tool_namefilter - 09.4
statusfilter - 09.5
from_datefilter - 09.6
to_datefilter - 09.7
pagenumber - 09.8
page_sizelimit
Authentication boundaries
Human Product API reads of Conversations and Tool Calls require an authenticated user, visibility of the Organization-owned and non-deleted Agent, and effective activity.read permission. Agent Access is applied before subordinate Activity data is returned, and inaccessible or cross-Organization Agents are concealed.
- 10.1
Ingest writes authenticate with the Agent ID and the per-Agent Ingest bearer key generated during Agent start. Ingest checks Agent identity and key rather than human Membership or Agent Access.
- 10.2
Communication Delivery claims and replies use a separate Communications protocol credential against the versioned Runtime-neutral Communications API. The Ingest key does not authorize Delivery claims or provider ingress.
What Activity is not
Conversation Messages and Tool Calls are operational Activity records. Neither the Conversation write path nor Tool Call Ingest writes Domain Events to the outbox.
- 11.1
The Communications journal records content-free delivery and provider operations, and cost attribution is separate and does not derive from Conversation or Tool Call records. Activity records are not:
- 11.2
Domain Events
- 11.3
Outbox Messages
- 11.4
Event Deliveries
- 11.5
Security Audit Records
- 11.6
Communications journal entries
- 11.7
Cost or spend records
Activity in the web app
Agent Activity provides separate views for Conversations and Tool Calls.
- 12.1
Conversation locations use Connection and channel identity, Platform and Connection names distinguish otherwise similar channels, and selecting a location reads its cursor-paginated threads and replies.
- 12.2
Tool Calls can be filtered by tool, status, and date. The first page may refresh periodically while it is being observed, and results remain scoped to the selected Agent.
Where to look next
Use /guides/agents/communication-connections for Connection ownership and lifecycle, and /guides/agents/channel-access for the admission policies evaluated before a message is accepted.
- 13.1
Use
/guides/runtime-and-deploymentfor how Ingest and Communications credentials are generated at Agent start,/guides/domain-events-and-deliveryfor the separate internal event path, and/guides/costs-and-spend-attributionfor cost reporting. - 13.2
Use
/guides/agents/health-and-logswhen a message was accepted but the Runtime produced no reply.