ag-ui-protocol / ag-ui-protocol/ag-ui

Rust ag-ui-core: ThreadId/RunId/MessageId reject non-UUID string IDs

未关闭
#2,195 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
bug SDK
主要语言
Python
星标
15.9k
派生
1.4k
平均合并
1 天 17 小时
30 天内合并 PR
163

描述

## 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:

```rust
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::("\"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.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。