llmsdk_provider/language_model/
content.rs1use serde::{Deserialize, Serialize};
9
10use crate::json::JsonValue;
11use crate::shared::{FileData, ProviderMetadata, ProviderOptions};
12
13use super::prompt::{FilePart, TextPart};
14
15#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
19#[serde(tag = "type", rename_all = "kebab-case")]
20pub enum Content {
21 Text(TextPart),
23 Reasoning(ReasoningPart),
25 Custom {
27 kind: String,
29 #[serde(
31 default,
32 rename = "providerOptions",
33 skip_serializing_if = "Option::is_none"
34 )]
35 provider_options: Option<ProviderOptions>,
36 },
37 ReasoningFile {
39 data: FileData,
41 #[serde(rename = "mediaType")]
43 media_type: String,
44 #[serde(
46 default,
47 rename = "providerOptions",
48 skip_serializing_if = "Option::is_none"
49 )]
50 provider_options: Option<ProviderOptions>,
51 },
52 File(FilePart),
54 ToolApprovalRequest(ToolApprovalRequest),
56 Source(Source),
58 ToolCall(super::prompt::ToolCallPart),
60 ToolResult(ToolResult),
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
66pub struct ReasoningPart {
67 pub text: String,
69 #[serde(
71 default,
72 rename = "providerOptions",
73 skip_serializing_if = "Option::is_none"
74 )]
75 pub provider_options: Option<ProviderOptions>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
80#[serde(tag = "sourceType", rename_all = "kebab-case")]
81pub enum Source {
82 Url {
84 id: String,
86 url: String,
88 #[serde(default, skip_serializing_if = "Option::is_none")]
90 title: Option<String>,
91 #[serde(
93 default,
94 rename = "providerMetadata",
95 skip_serializing_if = "Option::is_none"
96 )]
97 provider_metadata: Option<ProviderMetadata>,
98 },
99 Document {
101 id: String,
103 #[serde(rename = "mediaType")]
105 media_type: String,
106 title: String,
108 #[serde(default, skip_serializing_if = "Option::is_none")]
110 filename: Option<String>,
111 #[serde(
113 default,
114 rename = "providerMetadata",
115 skip_serializing_if = "Option::is_none"
116 )]
117 provider_metadata: Option<ProviderMetadata>,
118 },
119}
120
121#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
123pub struct ToolApprovalRequest {
124 #[serde(rename = "approvalId")]
126 pub approval_id: String,
127 #[serde(rename = "toolCall")]
129 pub tool_call: super::prompt::ToolCallPart,
130 #[serde(
132 default,
133 rename = "providerMetadata",
134 skip_serializing_if = "Option::is_none"
135 )]
136 pub provider_metadata: Option<ProviderMetadata>,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
141pub struct ToolResult {
142 #[serde(rename = "toolCallId")]
144 pub tool_call_id: String,
145 #[serde(rename = "toolName")]
147 pub tool_name: String,
148 pub output: ToolResultOutput,
150 #[serde(default, skip_serializing_if = "Option::is_none")]
157 pub preliminary: Option<bool>,
158 #[serde(
160 default,
161 rename = "providerMetadata",
162 skip_serializing_if = "Option::is_none"
163 )]
164 pub provider_metadata: Option<ProviderMetadata>,
165}
166
167#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
172#[serde(tag = "type", rename_all = "kebab-case")]
173pub enum ToolResultOutput {
174 Text {
176 value: String,
178 #[serde(
180 default,
181 rename = "providerOptions",
182 skip_serializing_if = "Option::is_none"
183 )]
184 provider_options: Option<ProviderOptions>,
185 },
186 Json {
188 value: JsonValue,
190 #[serde(
192 default,
193 rename = "providerOptions",
194 skip_serializing_if = "Option::is_none"
195 )]
196 provider_options: Option<ProviderOptions>,
197 },
198 ExecutionDenied {
200 #[serde(default, skip_serializing_if = "Option::is_none")]
202 reason: Option<String>,
203 #[serde(
205 default,
206 rename = "providerOptions",
207 skip_serializing_if = "Option::is_none"
208 )]
209 provider_options: Option<ProviderOptions>,
210 },
211 ErrorText {
213 value: String,
215 #[serde(
217 default,
218 rename = "providerOptions",
219 skip_serializing_if = "Option::is_none"
220 )]
221 provider_options: Option<ProviderOptions>,
222 },
223 ErrorJson {
225 value: JsonValue,
227 #[serde(
229 default,
230 rename = "providerOptions",
231 skip_serializing_if = "Option::is_none"
232 )]
233 provider_options: Option<ProviderOptions>,
234 },
235 Content {
237 value: Vec<ToolOutputPart>,
239 },
240}
241
242#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
244#[serde(tag = "type", rename_all = "kebab-case")]
245pub enum ToolOutputPart {
246 Text {
248 text: String,
250 #[serde(
252 default,
253 rename = "providerOptions",
254 skip_serializing_if = "Option::is_none"
255 )]
256 provider_options: Option<ProviderOptions>,
257 },
258 File {
260 data: FileData,
262 #[serde(rename = "mediaType")]
264 media_type: String,
265 #[serde(default, skip_serializing_if = "Option::is_none")]
267 filename: Option<String>,
268 #[serde(
270 default,
271 rename = "providerOptions",
272 skip_serializing_if = "Option::is_none"
273 )]
274 provider_options: Option<ProviderOptions>,
275 },
276 Custom {
278 #[serde(
280 default,
281 rename = "providerOptions",
282 skip_serializing_if = "Option::is_none"
283 )]
284 provider_options: Option<ProviderOptions>,
285 },
286}