llmsdk_provider/language_model/
prompt.rs1use serde::{Deserialize, Serialize};
8
9use crate::json::JsonValue;
10use crate::shared::{FileData, ProviderOptions};
11
12pub type Prompt = Vec<Message>;
14
15#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
20#[serde(tag = "role", rename_all = "lowercase")]
21pub enum Message {
22 System {
24 content: String,
26 #[serde(
28 default,
29 rename = "providerOptions",
30 skip_serializing_if = "Option::is_none"
31 )]
32 provider_options: Option<ProviderOptions>,
33 },
34 User {
36 content: Vec<UserPart>,
38 #[serde(
40 default,
41 rename = "providerOptions",
42 skip_serializing_if = "Option::is_none"
43 )]
44 provider_options: Option<ProviderOptions>,
45 },
46 Assistant {
48 content: Vec<AssistantPart>,
50 #[serde(
52 default,
53 rename = "providerOptions",
54 skip_serializing_if = "Option::is_none"
55 )]
56 provider_options: Option<ProviderOptions>,
57 },
58 Tool {
60 content: Vec<ToolMessagePart>,
62 #[serde(
64 default,
65 rename = "providerOptions",
66 skip_serializing_if = "Option::is_none"
67 )]
68 provider_options: Option<ProviderOptions>,
69 },
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
74#[serde(tag = "type", rename_all = "kebab-case")]
75pub enum UserPart {
76 Text(TextPart),
78 File(FilePart),
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
84#[serde(tag = "type", rename_all = "kebab-case")]
85pub enum AssistantPart {
86 Text(TextPart),
88 File(FilePart),
90 Reasoning {
92 text: String,
94 #[serde(
96 default,
97 rename = "providerOptions",
98 skip_serializing_if = "Option::is_none"
99 )]
100 provider_options: Option<ProviderOptions>,
101 },
102 ReasoningFile {
104 data: FileData,
106 #[serde(rename = "mediaType")]
108 media_type: String,
109 #[serde(
111 default,
112 rename = "providerOptions",
113 skip_serializing_if = "Option::is_none"
114 )]
115 provider_options: Option<ProviderOptions>,
116 },
117 Custom {
119 kind: String,
121 #[serde(
123 default,
124 rename = "providerOptions",
125 skip_serializing_if = "Option::is_none"
126 )]
127 provider_options: Option<ProviderOptions>,
128 },
129 ToolCall(ToolCallPart),
131 ToolResult(ToolResultPart),
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
137#[serde(tag = "type", rename_all = "kebab-case")]
138pub enum ToolMessagePart {
139 ToolResult(ToolResultPart),
141 ToolApprovalResponse(ToolApprovalResponsePart),
143}
144
145#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
147pub struct TextPart {
148 pub text: String,
150 #[serde(
152 default,
153 rename = "providerOptions",
154 skip_serializing_if = "Option::is_none"
155 )]
156 pub provider_options: Option<ProviderOptions>,
157}
158
159#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
161pub struct FilePart {
162 #[serde(default, skip_serializing_if = "Option::is_none")]
164 pub filename: Option<String>,
165 pub data: FileData,
167 #[serde(rename = "mediaType")]
169 pub media_type: String,
170 #[serde(
172 default,
173 rename = "providerOptions",
174 skip_serializing_if = "Option::is_none"
175 )]
176 pub provider_options: Option<ProviderOptions>,
177}
178
179#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
181pub struct ToolCallPart {
182 #[serde(rename = "toolCallId")]
184 pub tool_call_id: String,
185 #[serde(rename = "toolName")]
187 pub tool_name: String,
188 pub input: JsonValue,
190 #[serde(
192 default,
193 rename = "providerExecuted",
194 skip_serializing_if = "Option::is_none"
195 )]
196 pub provider_executed: Option<bool>,
197 #[serde(default, skip_serializing_if = "Option::is_none")]
201 pub dynamic: Option<bool>,
202 #[serde(
204 default,
205 rename = "providerOptions",
206 skip_serializing_if = "Option::is_none"
207 )]
208 pub provider_options: Option<ProviderOptions>,
209}
210
211#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
213pub struct ToolResultPart {
214 #[serde(rename = "toolCallId")]
216 pub tool_call_id: String,
217 #[serde(rename = "toolName")]
219 pub tool_name: String,
220 pub output: super::content::ToolResultOutput,
222 #[serde(
224 default,
225 rename = "providerOptions",
226 skip_serializing_if = "Option::is_none"
227 )]
228 pub provider_options: Option<ProviderOptions>,
229}
230
231#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
233pub struct ToolApprovalResponsePart {
234 #[serde(rename = "approvalId")]
236 pub approval_id: String,
237 pub approved: bool,
239 #[serde(default, skip_serializing_if = "Option::is_none")]
241 pub reason: Option<String>,
242 #[serde(
244 default,
245 rename = "providerOptions",
246 skip_serializing_if = "Option::is_none"
247 )]
248 pub provider_options: Option<ProviderOptions>,
249}