Expand description
Turning a stream of events into materialised state.
Consuming AG-UI is not “read a response”. The agent sends deltas — a message
opens, text arrives a fragment at a time, tool arguments accumulate as
unparseable JSON fragments, state moves by RFC 6902 patch. Applier is the
state machine that folds all of that back into something a UI can draw:
a message list, a JSON state document, reasoning text, activities.
It is a plain synchronous struct. No async, no runtime, no I/O — feed it events from anywhere.
use ag_ui::client::apply::Applier;
use ag_ui::{Event, TextMessageRole};
let mut applier = Applier::new();
for event in [
Event::run_started("thread-1", "run-1"),
Event::text_message_start("msg-1", TextMessageRole::Assistant),
Event::text_message_content("msg-1", "Hello, "),
Event::text_message_content("msg-1", "world"),
Event::text_message_end("msg-1"),
Event::run_finished_success("thread-1", "run-1"),
] {
applier.apply(&event)?;
}
assert_eq!(applier.messages().len(), 1);
assert_eq!(applier.text_of("msg-1"), Some("Hello, world"));§What it does not do
The applier is tolerant: an orphan TEXT_MESSAGE_CONTENT opens a message
rather than failing, because a half-drawn conversation beats a blank screen.
Catching the producer’s mistake is crate::client::verify’s job, and
crate::client::Session runs both. The one thing the applier refuses to do
quietly is corrupt state: a patch that does not apply is an error.
Structs§
- Applier
- The materialised view of a run.
- Message
Change - Which message changed, and how.
- Reasoning
Change - Which reasoning message changed, and how.
- Subagent
- One subagent invocation the run has announced, as the applier tracks it.
- Subagent
Change - Which subagent changed, and how.
Enums§
- Changed
- What one event changed.
- Message
Change Kind - What happened to a message.
- Reasoning
Change Kind - What happened to a reasoning message.
- Subagent
Change Kind - What happened to a subagent invocation.
- Subagent
Status - Where a subagent invocation stands.