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,
88 #[serde(default, skip_serializing_if = "Option::is_none")]
90 provider_executed: Option<bool>,
91 #[serde(default, skip_serializing_if = "Option::is_none")]
93 dynamic: Option<bool>,
94 #[serde(default, skip_serializing_if = "Option::is_none")]
98 thought_signature: Option<String>,
99 #[serde(default, skip_serializing_if = "Option::is_none")]
101 invalid: Option<bool>,
102 #[serde(default, skip_serializing_if = "Option::is_none")]
104 error: Option<AiMuxError>,
105 #[serde(default, skip_serializing_if = "Option::is_none")]
106 provider_metadata: Option<ProviderMetadata>,
107 },
108 ToolResult {
110 tool_call_id: String,
111 tool_name: String,
112 result: Value,
113 #[serde(default, skip_serializing_if = "Option::is_none")]
115 is_error: Option<bool>,
116 #[serde(default, skip_serializing_if = "Option::is_none")]
118 preliminary: Option<bool>,
119 #[serde(default, skip_serializing_if = "Option::is_none")]
121 dynamic: Option<bool>,
122 #[serde(default, skip_serializing_if = "Option::is_none")]
124 provider_metadata: Option<ProviderMetadata>,
125 },
126
127 File {
133 data: FileData,
134 media_type: String,
135 #[serde(default, skip_serializing_if = "Option::is_none")]
136 provider_metadata: Option<ProviderMetadata>,
137 },
138
139 ReasoningStart {
141 id: String,
142 #[allow(unused)]
144 provider_metadata: Option<ProviderMetadata>,
145 },
146 ReasoningDelta {
147 id: String,
148 delta: String,
149 #[allow(unused)]
151 provider_metadata: Option<ProviderMetadata>,
152 },
153 ReasoningEnd {
154 id: String,
155 #[allow(unused)]
157 provider_metadata: Option<ProviderMetadata>,
158 },
159
160 ResponseMetadata {
163 id: Option<String>,
164 timestamp: Option<String>,
165 model_id: Option<String>,
166 },
167
168 Source {
170 id: String,
171 source_type: String,
172 url: Option<String>,
173 title: Option<String>,
174 #[serde(default, skip_serializing_if = "Option::is_none")]
175 provider_metadata: Option<ProviderMetadata>,
176 },
177
178 Raw { raw_value: Value },
180}