Workflow · Question answering
Chat with the agent
A shared trace library is only useful if people can interrogate it. The assistant lets a signed-in user ask questions in plain language — "what did we decide about the auth rewrite?" — and get a streamed answer grounded in traces they are actually allowed to read.
Goal, trigger, and result
Goal: answer questions across the trace library without manually opening traces one by one. Trigger: a message in the assistant's conversation view. What enters: the question and the user's sign-in. What leaves: a streamed answer that cites real traces; the conversation itself is saved so it can be continued later.
One turn, end to end
The web app never talks to the model itself. It relays each message to the assistant service, which first confirms the sign-in with the platform, then runs a model equipped with tools — ways to search traces, list them, look up accounts and projects, and open a specific trace. Every tool call is made as the asking user, so the assistant can never surface a trace the user couldn't open themselves. Only one turn runs per conversation at a time; a second message while one is streaming is politely refused.
sequenceDiagram
autonumber
actor User as Signed-in user
participant Web as Web app
participant Asst as Assistant service
participant API as Platform API
participant Store as Metadata store
participant LLM as Language model
User->>Web: ask a question
Web->>Asst: relay the message (with the user's sign-in)
Asst->>API: confirm the sign-in
API-->>Asst: who this is and where they belong
Asst->>Asst: load or create the conversation
Asst->>LLM: prompt + available tools
loop as many lookups as the model needs
LLM-->>Asst: call a tool (search · list · look up · open trace)
alt search or open a trace
Asst->>API: run the tool as the asking user
API-->>Asst: matching traces / conversation excerpts
(only what this user may read)
else look up accounts, projects, agents
Asst->>Store: direct metadata lookup
Store-->>Asst: matching records
end
Asst->>LLM: tool results
end
LLM-->>Asst: final answer tokens
Asst-->>User: streamed answer, citing traces
Asst->>API: persist the turn (appended in the background)
What makes this trustworthy
Three design choices carry the weight. Permission flows through every call: the assistant holds no credentials of its own, so its answers are bounded by the asker's access — two users asking the same question can legitimately get different answers. Grounding is mechanical, not hoped-for: the model cannot quote a conversation it hasn't fetched through a tool in that turn. And conversations are durable: each turn is appended to an ordered, idempotent log, so refreshing or returning days later continues exactly where things left off, and a failed save is retried without duplicating entries.