Summary
In the Rust ag-ui-core, the ID newtypes (ThreadId, RunId, MessageId, AgentId) are strict Uuid wrappers: both FromStr and the derived Deserialize hard-fail on any string that isn't a syntactically valid UUID. But the AG-UI protocol (and the TypeScript @ag-ui/core) treat these IDs as plain strings. So any agent/server whose thread/run/message IDs are not bare UUIDs cannot interoperate through the Rust SDK.
Reproduction (verified against ag-ui-core = "0.1.0")
Parsing a non-UUID ID as a ThreadId fails both ways:
use ag_ui_core::types::ids::ThreadId;
use std::str::FromStr;
// LangGraph-style run id, or any composite id
ThreadId::from_str("lc_run--1234"); // Err(uuid::Error)
serde_json::from_str::<ThreadId>("\"mytool:host:9c1b...\""); // Err: "UUID parsing failed: invalid length"
Impact
Any server that emits non-UUID thread/run IDs — LangGraph (lc_run--…), or tools that use composite/namespaced IDs — cannot round-trip RUN_STARTED/RUN_FINISHED/TEXT_MESSAGE_* events through the Rust SDK, because every such event carries a typed ThreadId/MessageId. The TS SDK has no such restriction.
Note
A fix authored by @MikeSchirtzinger already exists on the server-crate branch (#972), but it's entangled in that large, unmerged PR. I'm opening a focused, standalone PR that extracts just the ids.rs fix (round-trip fidelity for arbitrary strings) rebased onto current main, so it can land independently. Credit for the fix is Mike's; the PR only decouples it.
Summary
In the Rust
ag-ui-core, the ID newtypes (ThreadId,RunId,MessageId,AgentId) are strictUuidwrappers: bothFromStrand the derivedDeserializehard-fail on any string that isn't a syntactically valid UUID. But the AG-UI protocol (and the TypeScript@ag-ui/core) treat these IDs as plain strings. So any agent/server whose thread/run/message IDs are not bare UUIDs cannot interoperate through the Rust SDK.Reproduction (verified against
ag-ui-core = "0.1.0")Parsing a non-UUID ID as a
ThreadIdfails both ways:Impact
Any server that emits non-UUID thread/run IDs — LangGraph (
lc_run--…), or tools that use composite/namespaced IDs — cannot round-tripRUN_STARTED/RUN_FINISHED/TEXT_MESSAGE_*events through the Rust SDK, because every such event carries a typedThreadId/MessageId. The TS SDK has no such restriction.Note
A fix authored by @MikeSchirtzinger already exists on the server-crate branch (#972), but it's entangled in that large, unmerged PR. I'm opening a focused, standalone PR that extracts just the
ids.rsfix (round-trip fidelity for arbitrary strings) rebased onto currentmain, so it can land independently. Credit for the fix is Mike's; the PR only decouples it.