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.