1use serde::{Deserialize, Serialize};
7use serde_json::Value;
8use ts_rs::TS;
9
10use crate::error::AiMuxError;
11use crate::shared::FileData;
12use crate::types::{FinishReason, ProviderMetadata, Usage, Warning};
13
14#[derive(Debug, Clone, Serialize, Deserialize, TS)]
16#[ts(export)]
17pub enum StreamPart {
18 TextStart {
21 id: String,
22 #[serde(default, skip_serializing_if = "Option::is_none")]
23 provider_metadata: Option<ProviderMetadata>,
24 },
25 TextDelta {
27 id: String,
28 delta: String,
29 #[serde(default, skip_serializing_if = "Option::is_none")]
30 provider_metadata: Option<ProviderMetadata>,
31 },
32 TextEnd {
34 id: String,
35 #[serde(default, skip_serializing_if = "Option::is_none")]
36 provider_metadata: Option<ProviderMetadata>,
37 },
38
39 StreamStart { warnings: Vec<Warning> },
42 Finish {
44 finish_reason: FinishReason,
45 usage: Usage,
46 provider_metadata: Option<ProviderMetadata>,
47 },
48 Error { error: AiMuxError },
50
51 ToolInputStart {
54 id: String,
55 tool_name: String,
56 #[serde(default, skip_serializing_if = "Option::is_none")]
58 provider_executed: Option<bool>,
59 #[serde(default, skip_serializing_if = "Option::is_none")]
61 dynamic: Option<bool>,
62 #[serde(default, skip_serializing_if = "Option::is_none")]
64 title: Option<String>,
65 #[serde(default, skip_serializing_if = "Option::is_none")]
66 provider_metadata: Option<ProviderMetadata>,
67 },
68 ToolInputDelta {
70 id: String,
71 delta: String,
72 #[serde(default, skip_serializing_if = "Option::is_none")]
73 provider_metadata: Option<ProviderMetadata>,
74 },
75 ToolInputEnd {
77 id: String,
78 #[serde(default, skip_serializing_if = "Option::is_none")]
79 provider_metadata: Option<ProviderMetadata>,
80 },
81 ToolCall {
83 tool_call_id: String,
84 tool_name: String,
85 input: Value,
86 #[serde(default, skip_serializing_if = "Option::is_none")]
88 provider_executed: Option<bool>,
89 #[serde(default, skip_serializing_if = "Option::is_none")]
91 dynamic: Option<bool>,
92 #[serde(default, skip_serializing_if = "Option::is_none")]
93 provider_metadata: Option<ProviderMetadata>,
94 },
95 ToolResult {
97 tool_call_id: String,
98 tool_name: String,
99 result: Value,
100 #[serde(default, skip_serializing_if = "Option::is_none")]
102 is_error: Option<bool>,
103 #[serde(default, skip_serializing_if = "Option::is_none")]
105 preliminary: Option<bool>,
106 #[serde(default, skip_serializing_if = "Option::is_none")]
108 dynamic: Option<bool>,
109 #[serde(default, skip_serializing_if = "Option::is_none")]
111 provider_metadata: Option<ProviderMetadata>,
112 },
113
114 File {
120 data: FileData,
121 media_type: String,
122 #[serde(default, skip_serializing_if = "Option::is_none")]
123 provider_metadata: Option<ProviderMetadata>,
124 },
125
126 ReasoningStart {
128 id: String,
129 #[allow(unused)]
131 provider_metadata: Option<ProviderMetadata>,
132 },
133 ReasoningDelta {
134 id: String,
135 delta: String,
136 #[allow(unused)]
138 provider_metadata: Option<ProviderMetadata>,
139 },
140 ReasoningEnd {
141 id: String,
142 #[allow(unused)]
144 provider_metadata: Option<ProviderMetadata>,
145 },
146
147 ResponseMetadata {
150 id: Option<String>,
151 timestamp: Option<String>,
152 model_id: Option<String>,
153 },
154
155 Source {
157 id: String,
158 source_type: String,
159 url: Option<String>,
160 title: Option<String>,
161 #[serde(default, skip_serializing_if = "Option::is_none")]
162 provider_metadata: Option<ProviderMetadata>,
163 },
164
165 Raw { raw_value: Value },
167}