| Crates.io | rig-ai-sdk |
| lib.rs | rig-ai-sdk |
| version | 0.1.2 |
| created_at | 2026-01-17 04:16:35.597726+00 |
| updated_at | 2026-01-17 07:33:20.210413+00 |
| description | AI SDK Data Stream Protocol adapter for rig |
| homepage | |
| repository | https://github.com/yexiyue/Stitchwork |
| max_upload_size | |
| id | 2049911 |
| size | 112,271 |
AI SDK Data Stream Protocol adapter for rig-core.
This crate provides types and utilities to work with AI SDK's streaming protocol in rig-based applications, enabling seamless integration between frontend AI SDK clients (like assistant-ui) and rig-powered backends.
The AI SDK Data Stream Protocol is a standardized format for streaming AI responses. This crate implements the protocol for use with the rig agent framework:
| Feature | Default | Description |
|---|---|---|
axum-sse |
No | Enables SSE stream conversion for Axum handlers |
[dependencies]
rig-ai-sdk = { version = "0.1", features = ["axum-sse"] }
use rig_ai_sdk::{AISdkStreamBuilder, AISdkEvent};
use futures::StreamExt;
let mut builder = AISdkStreamBuilder::new();
let mut events = vec![builder.start()];
// Stream text
for chunk in ["Hello", ", ", "world", "!"] {
events.push(builder.text_delta(chunk).unwrap());
}
events.push(builder.text_end().unwrap());
events.push(builder.finish());
events.push(builder.done());
use axum::response::sse::{Event, Sse};
use rig_ai_sdk::adapt_rig_stream_sse;
async fn chat_handler() -> Sse<impl Stream<Item = Result<Event, Infallible>>> {
let rig_stream = agent.stream_chat(prompt, history).await;
Sse::new(adapt_rig_stream_sse(rig_stream))
}
use rig_ai_sdk::{UIMessage, extract_prompt_and_history};
let messages: Vec<UIMessage> = serde_json::from_str(&body)?;
let (prompt, history) = extract_prompt_and_history(&messages)?;
// Now use with rig agent
let response = agent.run_chat(prompt, history).await?;
eventDefines [AISdkEvent] enum representing all protocol event types:
start, finish, done, abort, errortext-start, text-delta, text-endreasoning-start, reasoning-delta, reasoning-endtool-input-start, tool-input-delta, tool-input-available, tool-output-availablesource-url, source-document, filedata-{name} events for any custom datamessageTypes for receiving AI SDK messages from the frontend:
UIMessage] - Individual message with role and partsUIMessagePart] - Message parts (text, tool, file, reasoning, etc.)PartState] - Streaming state (streaming or done)DynamicToolState] - Tool lifecycle states (5.x format)convertConversion utilities between AI SDK and rig formats:
convert_messages] - Batch convert UI messages to rig messagesconvert_message] - Convert a single UI messageextract_prompt_and_history] - Split messages into prompt and historystream[AISdkStreamBuilder] for constructing streaming responses with proper state management:
let mut builder = AISdkStreamBuilder::new();
// Proper event sequencing
builder.start(); // Initialize
builder.text_start(); // Begin text block
builder.text_delta("..."); // Stream content
builder.text_end(); // End text block
builder.finish(); // Complete stream
builder.done(); // Final marker
adapter (requires axum-sse)Stream adapters for integrating rig with Axum:
adapt_rig_stream] - Convert rig stream to AI SDK eventsadapt_rig_stream_sse] - Direct Axum SSE conversionA typical AI SDK stream follows this pattern:
[start]
↓
[text-start] → [text-delta]* → [text-end]
↓
[reasoning-start] → [reasoning-delta]* → [reasoning-end]
↓
[tool-input-start] → [tool-input-delta]* → [tool-input-available]
↓
[tool-output-available]
↓
[finish] → [done]
| AI SDK Part | Rig Content |
|---|---|
Text |
UserContent::Text / AssistantContent::Text |
Reasoning |
AssistantContent::Reasoning |
File (image) |
UserContent::Image |
ToolCall |
AssistantContent::ToolCall |
DynamicTool (InputAvailable) |
AssistantContent::ToolCall |
DynamicTool (OutputAvailable) |
UserContent::ToolResult |
DynamicTool (OutputError) |
UserContent::ToolResult |
ToolResult |
UserContent::ToolResult |
MIT