Skip to main content

ai_lib_rust/types/
events.rs

1//! Streaming events based on AI-Protocol standard_schema
2
3use serde::{Deserialize, Serialize};
4
5/// Unified streaming event enum
6#[derive(Debug, Clone, Serialize, Deserialize)]
7#[serde(tag = "event_type")]
8pub enum StreamingEvent {
9    /// Partial content delta (text streaming)
10    #[serde(rename = "PartialContentDelta")]
11    PartialContentDelta {
12        content: String,
13        #[serde(skip_serializing_if = "Option::is_none")]
14        sequence_id: Option<u64>,
15    },
16
17    /// Thinking delta (reasoning process)
18    #[serde(rename = "ThinkingDelta")]
19    ThinkingDelta {
20        thinking: String,
21        #[serde(skip_serializing_if = "Option::is_none")]
22        tool_consideration: Option<String>,
23    },
24
25    /// Tool call started
26    #[serde(rename = "ToolCallStarted")]
27    ToolCallStarted {
28        tool_call_id: String,
29        tool_name: String,
30        #[serde(skip_serializing_if = "Option::is_none")]
31        index: Option<u32>,
32    },
33
34    /// Partial tool call (arguments streaming)
35    #[serde(rename = "PartialToolCall")]
36    PartialToolCall {
37        tool_call_id: String,
38        arguments: String, // Partial JSON string
39        #[serde(skip_serializing_if = "Option::is_none")]
40        index: Option<u32>,
41        #[serde(skip_serializing_if = "Option::is_none")]
42        is_complete: Option<bool>,
43    },
44
45    /// Tool call ended
46    #[serde(rename = "ToolCallEnded")]
47    ToolCallEnded {
48        tool_call_id: String,
49        #[serde(skip_serializing_if = "Option::is_none")]
50        index: Option<u32>,
51    },
52
53    /// Metadata (usage, finish reason, etc.)
54    #[serde(rename = "Metadata")]
55    Metadata {
56        #[serde(skip_serializing_if = "Option::is_none")]
57        usage: Option<serde_json::Value>,
58        #[serde(skip_serializing_if = "Option::is_none")]
59        finish_reason: Option<String>,
60        #[serde(skip_serializing_if = "Option::is_none")]
61        stop_reason: Option<String>,
62    },
63
64    /// Final candidate (for multi-candidate scenarios)
65    #[serde(rename = "FinalCandidate")]
66    FinalCandidate {
67        candidate_index: u32,
68        finish_reason: String,
69    },
70
71    /// Stream end
72    #[serde(rename = "StreamEnd")]
73    StreamEnd {
74        #[serde(skip_serializing_if = "Option::is_none")]
75        finish_reason: Option<String>,
76    },
77
78    /// Stream error
79    #[serde(rename = "StreamError")]
80    StreamError {
81        error: serde_json::Value,
82        #[serde(skip_serializing_if = "Option::is_none")]
83        event_id: Option<String>,
84    },
85}