message.received and message.sent events, stores each conversation, and grades every reply your agent sends.
Early access: the Flow team connects Observe to your app by hand. Observe reads your app with a key of the same mode, so a test key shows test conversations (sandbox and simulated contacts). Live conversations need your account enabled for production.
What you do
- Make a test key just for Observe in the Flow Messaging dashboard’s Keys page, so you can revoke it alone.
- Sign in to Observe and add your agent: choose Flow Messaging and paste that key. Paste it only into the Observe page, never into a chat with an AI assistant. If Observe isn’t on for you yet, write to the Flow team at samyak@flow.engineer or prabal@flow.engineer.
- Talk to your agent (the sandbox from your phone, or simulated contacts from a script). Each conversation appears in the Observe dashboard within seconds, and each reply gets its verdict shortly after.
Optional: see the inside of each turn
Conversations and grades need nothing more. To also see what your agent did between the person’s message and its reply (model calls, tools, errors, retries, timings), send your agent’s OpenTelemetry traces to Observe and tag each turn with the Flow ids of the message it answers:
Set them on any span of the turn’s trace. Observe then links the trace to the conversation and shows its steps under the reply. Do not set
flow.user_message or flow.agent_reply here: Observe already has the messages from Flow Messaging.
Set up the exporter as on Send traces from any agent, with your trace key (otk_test_... for a test app), then wrap each turn in a span:
agent.turn (model and tool calls) join the same trace. If your framework starts its own traces instead, see Traces from agent frameworks.
- Only Flow’s ids are accepted here: a value that is not a
conv_...ormsg_...id is ignored, and the trace is kept but not linked to a conversation. - A trace often arrives before Observe has read the message from your event log. It is linked a few seconds later, when the message arrives.
- You do not need
reply_tofor Observe: it pairs each reply with the message before it. (reply_toshows your reply as an inline quote of the person’s message on channels that support quotes; use it only if you want that look.)