--- title: Shared State description: Create a two-way connection between your UI and agent state. icon: "lucide/Repeat" --- ## What is shared state? Agentic Copilots maintain a shared state that seamlessly connects your UI with the agent's execution. This shared state system allows you to: - Display the agent's current progress and intermediate results - Update the agent's state through UI interactions - React to state changes in real-time across your application ## When should I use this? Use shared state when you want to facilitate collaboration between your agent and the user. Updates flow both ways — the agent's outputs are automatically reflected in the UI, and any inputs the user updates in the UI are automatically reflected in the agent's execution. ## Reading agent state Subscribe a component to the agent's state with `useAgent`. Any time the agent mutates its state — for example via a tool call — the hook fires and your UI re-renders with the new values. The returned `agent.state` is just a plain object. Read it like any other piece of React state and render the parts you care about — agent-written notes, structured outputs, progress indicators, anything the agent has put there. ## Writing agent state The same `agent` object exposes a `setState` setter. Calling it from a UI event handler pushes the new value into shared state, and the agent reads it back on its next turn — so the UI's writes visibly steer the model. This is what makes the channel two-way: the UI doesn't just observe the agent, it can hand the agent fresh inputs (preferences, selections, partial work) without going through the chat thread. ## Rendering shared state in the UI Because `agent.state` is plain React data, the UI layer is whatever you'd normally build. The demo on this page wires the agent's outputs into a small card component and feeds user edits back through `setState`. ## Streaming partial state updates By default, agent state only updates *between* node transitions, so a long-running tool call appears as one big burst at the end. State streaming forwards a specific tool argument straight into a state key *as it's being generated*, so the UI can watch the answer assemble token-by-token. See **[State streaming](/shared-state/streaming)** for the full walkthrough, including the corresponding `useAgent` subscription on the frontend. ## Read-only context When the value is **UI-owned** and the agent should read it but never write it back — current user, selected record, scroll position — reach for `useAgentContext` instead of full shared state. It publishes values as a one-way UI → agent channel that auto-unregisters on unmount. See **[Agent read-only context](/shared-state/agent-readonly)** for the full pattern.