Events
Every event has a type. Three built-in types (llm_call, log, tool_call) feed specific dashboard features; any other string is a custom event that shows up verbatim in the run timeline.
Envelope:
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | Yes | Client-generated. Format evt_<region>_<32 hex>. |
type |
string | Yes | llm_call, log, tool_call, or custom. |
ts |
string (ISO 8601, UTC) | Yes | Client timestamp, millisecond precision. |
data |
object | Yes | Type-specific payload. |
llm_call
A single call to a language model. Feeds total cost, latency, model mix, cache utilisation.
| Field | Type | Required | Description |
|---|---|---|---|
provider |
string | Yes | anthropic, openai, gemini, bedrock, mistral, cohere. |
model |
string | Yes | Provider-specific identifier, e.g. claude-opus-4-7, gpt-5. |
input_tokens |
integer | Yes | Tokens billed as input. |
output_tokens |
integer | Yes | Tokens billed as output. |
cached_input_tokens |
integer | No | Provider's cache-read rate. |
cache_creation_input_tokens |
integer | No | Provider's cache-write rate (Anthropic prompt caching). |
mode |
string | No | chat, completion, embedding, image, audio. Default chat. |
latency_ms |
integer | No | Wall-clock latency. |
{
"id": "evt_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b7",
"type": "llm_call",
"ts": "2026-05-15T14:32:02.456Z",
"data": {
"provider": "anthropic",
"model": "claude-opus-4-7",
"input_tokens": 1200,
"cached_input_tokens": 800,
"cache_creation_input_tokens": 0,
"output_tokens": 340,
"mode": "chat",
"latency_ms": 4500
}
}
log
A free-form log line. Rendered inline in the run timeline.
| Field | Type | Required | Description |
|---|---|---|---|
message |
string | Yes | The log text. |
level |
string | No | debug, info, warn, error. Default info. |
Additional keys are preserved verbatim under data and shown in the dashboard expand view.
{
"id": "evt_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b8",
"type": "log",
"ts": "2026-05-15T14:32:03.001Z",
"data": {
"message": "Routed to billing department",
"level": "info",
"ticket_id": "T-12345"
}
}
tool_call
A call from the agent to an external tool, function, or API.
| Field | Type | Required | Description |
|---|---|---|---|
tool |
string | Yes | Tool name. |
args |
object | No | Arguments passed. |
result |
object or string | No | Tool return value. |
latency_ms |
integer | No | Wall-clock latency. |
success |
boolean | No | Default true. |
error |
string | No | Error message if success is false. |
{
"id": "evt_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3b9",
"type": "tool_call",
"ts": "2026-05-15T14:32:03.500Z",
"data": {
"tool": "search_knowledge_base",
"args": {"query": "invoice not received", "limit": 5},
"result": {"hits": 3, "top_score": 0.91},
"latency_ms": 120,
"success": true
}
}
Custom types
Any other type string is accepted. data is stored verbatim and rendered under the supplied type label.
{
"id": "evt_eu_018f3a2b9c1d7e8fa4b9c2d7e8f1a3ba",
"type": "guardrail_check",
"ts": "2026-05-15T14:32:04.100Z",
"data": {
"policy": "no_pii_in_output",
"passed": true,
"matches": []
}
}
Deduplication
The events table enforces global uniqueness on id. Retries are safe; re-sending an event with the same id is a no-op. The batch response distinguishes accepted from duplicate:
{ "accepted": 2, "duplicates": 1 }
accepted: 0 means every event in the batch was already stored.