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")]
96 thought_signature: Option<String>,
97 #[serde(default, skip_serializing_if = "Option::is_none")]
98 provider_metadata: Option<ProviderMetadata>,
99 },
100 ToolResult {
102 tool_call_id: String,
103 tool_name: String,
104 result: Value,
105 #[serde(default, skip_serializing_if = "Option::is_none")]
107 is_error: Option<bool>,
108 #[serde(default, skip_serializing_if = "Option::is_none")]
110 preliminary: Option<bool>,
111 #[serde(default, skip_serializing_if = "Option::is_none")]
113 dynamic: Option<bool>,
114 #[serde(default, skip_serializing_if = "Option::is_none")]
116 provider_metadata: Option<ProviderMetadata>,
117 },
118
119 File {
125 data: FileData,
126 media_type: String,
127 #[serde(default, skip_serializing_if = "Option::is_none")]
128 provider_metadata: Option<ProviderMetadata>,
129 },
130
131 ReasoningStart {
133 id: String,
134 #[allow(unused)]
136 provider_metadata: Option<ProviderMetadata>,
137 },
138 ReasoningDelta {
139 id: String,
140 delta: String,
141 #[allow(unused)]
143 provider_metadata: Option<ProviderMetadata>,
144 },
145 ReasoningEnd {
146 id: String,
147 #[allow(unused)]
149 provider_metadata: Option<ProviderMetadata>,
150 },
151
152 ResponseMetadata {
155 id: Option<String>,
156 timestamp: Option<String>,
157 model_id: Option<String>,
158 },
159
160 Source {
162 id: String,
163 source_type: String,
164 url: Option<String>,
165 title: Option<String>,
166 #[serde(default, skip_serializing_if = "Option::is_none")]
167 provider_metadata: Option<ProviderMetadata>,
168 },
169
170 Raw { raw_value: Value },
172}