Show the work as it happens
Normally a tool call is atomic from the UI’s point of view: the agent decides what to write, and your interface only sees the result once the call finishes. For a tool that produces a large document that means a long pause followed by everything snapping into place at once. Predictive state updates remove the wait. You project a streaming tool argument onto a field of the agent’s state, so as the model generates the argument token by token, that state field fills in live. A document the agent is writing appears in the editor as it is typed, not after.Predictive state relies on a Flow with custom state (
Flow[AgentState]). It projects a streaming tool argument onto a state field, so there is no equivalent for a bare Crew.How it compares to Shared State
Both patterns read the agent’s state from the frontend, but they solve different problems:
Reach for predictive state when you want an optimistic, in-flight preview of what the agent is producing. Reach for Shared State when the user needs to edit that state back.
Walkthrough
This assumes you already have a Crew or Flow served over AG-UI and a CopilotKit frontend wired up. If not, start with the Frontend Overview.1
Define a Flow with custom state
Predictive state projects a tool argument onto a state field, so your Flow needs a typed state field to receive it. Add the field you want to stream into to your
CopilotKitState subclass.2
Map a state field to a tool argument
Call The key is
copilotkit_predict_state before you start streaming the completion. It tells the runtime to project the named tool argument onto the named state field: as the write_document call streams its document argument, the document state field updates live.copilotkit_predict_state({ "<state_field>": {"tool_name": ..., "tool_argument": ...} }). Without it, the frontend would only see document once the tool call completed. With it, the partial argument streams onto the field while the agent is still generating.Serve the Flow with add_crewai_flow_fastapi_endpoint(...) as shown in the Frontend Overview.3
Read the predicted state on the frontend
On the frontend, read the field with The
useAgent and subscribe to state changes. Because the backend is projecting the streaming argument onto document, this component re-renders as the agent types.document field fills in progressively as the agent generates the write_document call, so the editor updates in real time rather than snapping in at the end.Related
Shared State
Read and write the agent’s state two-way.
Agentic Generative UI
Render live agent state as it changes.
Tool-Based Generative UI
Map agent tool calls to components.
