Skip to main content

outfox_openai/spec/chat/
impls.rs

1use std::fmt::Display;
2
3use crate::spec::chat::{
4    ChatCompletionFunctionCall, ChatCompletionNamedToolChoice,
5    ChatCompletionRequestAssistantMessage, ChatCompletionRequestAssistantMessageContent,
6    ChatCompletionRequestDeveloperMessage, ChatCompletionRequestDeveloperMessageContent,
7    ChatCompletionRequestFunctionMessage, ChatCompletionRequestMessage,
8    ChatCompletionRequestMessageContentPartAudio, ChatCompletionRequestMessageContentPartImage,
9    ChatCompletionRequestMessageContentPartText, ChatCompletionRequestSystemMessage,
10    ChatCompletionRequestSystemMessageContent, ChatCompletionRequestToolMessage,
11    ChatCompletionRequestToolMessageContent, ChatCompletionRequestUserMessage,
12    ChatCompletionRequestUserMessageContent, ChatCompletionRequestUserMessageContentPart,
13    FunctionName, ImageUrl, Role,
14};
15use crate::spec::text::TextObject;
16
17impl From<ChatCompletionRequestUserMessage> for ChatCompletionRequestMessage {
18    fn from(value: ChatCompletionRequestUserMessage) -> Self {
19        Self::User(value)
20    }
21}
22
23impl From<ChatCompletionRequestSystemMessage> for ChatCompletionRequestMessage {
24    fn from(value: ChatCompletionRequestSystemMessage) -> Self {
25        Self::System(value)
26    }
27}
28
29impl From<ChatCompletionRequestDeveloperMessage> for ChatCompletionRequestMessage {
30    fn from(value: ChatCompletionRequestDeveloperMessage) -> Self {
31        Self::Developer(value)
32    }
33}
34
35impl From<ChatCompletionRequestAssistantMessage> for ChatCompletionRequestMessage {
36    fn from(value: ChatCompletionRequestAssistantMessage) -> Self {
37        Self::Assistant(value)
38    }
39}
40
41impl From<ChatCompletionRequestFunctionMessage> for ChatCompletionRequestMessage {
42    fn from(value: ChatCompletionRequestFunctionMessage) -> Self {
43        Self::Function(value)
44    }
45}
46
47impl From<ChatCompletionRequestToolMessage> for ChatCompletionRequestMessage {
48    fn from(value: ChatCompletionRequestToolMessage) -> Self {
49        Self::Tool(value)
50    }
51}
52
53impl From<ChatCompletionRequestUserMessageContent> for ChatCompletionRequestUserMessage {
54    fn from(value: ChatCompletionRequestUserMessageContent) -> Self {
55        Self {
56            content: value,
57            name: None,
58        }
59    }
60}
61
62impl From<ChatCompletionRequestSystemMessageContent> for ChatCompletionRequestSystemMessage {
63    fn from(value: ChatCompletionRequestSystemMessageContent) -> Self {
64        Self {
65            content: value,
66            name: None,
67        }
68    }
69}
70
71impl From<ChatCompletionRequestDeveloperMessageContent> for ChatCompletionRequestDeveloperMessage {
72    fn from(value: ChatCompletionRequestDeveloperMessageContent) -> Self {
73        Self {
74            content: value,
75            name: None,
76        }
77    }
78}
79
80impl From<ChatCompletionRequestAssistantMessageContent> for ChatCompletionRequestAssistantMessage {
81    fn from(value: ChatCompletionRequestAssistantMessageContent) -> Self {
82        Self {
83            content: Some(value),
84            ..Default::default()
85        }
86    }
87}
88
89impl From<&str> for ChatCompletionRequestUserMessageContent {
90    fn from(value: &str) -> Self {
91        ChatCompletionRequestUserMessageContent::Text(value.into())
92    }
93}
94
95impl From<String> for ChatCompletionRequestUserMessageContent {
96    fn from(value: String) -> Self {
97        ChatCompletionRequestUserMessageContent::Text(value)
98    }
99}
100
101impl From<&str> for ChatCompletionRequestSystemMessageContent {
102    fn from(value: &str) -> Self {
103        ChatCompletionRequestSystemMessageContent::Text(value.into())
104    }
105}
106
107impl From<String> for ChatCompletionRequestSystemMessageContent {
108    fn from(value: String) -> Self {
109        ChatCompletionRequestSystemMessageContent::Text(value)
110    }
111}
112
113impl From<&str> for ChatCompletionRequestDeveloperMessageContent {
114    fn from(value: &str) -> Self {
115        ChatCompletionRequestDeveloperMessageContent::Text(value.into())
116    }
117}
118
119impl From<String> for ChatCompletionRequestDeveloperMessageContent {
120    fn from(value: String) -> Self {
121        ChatCompletionRequestDeveloperMessageContent::Text(value)
122    }
123}
124
125impl From<&str> for ChatCompletionRequestAssistantMessageContent {
126    fn from(value: &str) -> Self {
127        ChatCompletionRequestAssistantMessageContent::Text(value.into())
128    }
129}
130
131impl From<String> for ChatCompletionRequestAssistantMessageContent {
132    fn from(value: String) -> Self {
133        ChatCompletionRequestAssistantMessageContent::Text(value)
134    }
135}
136
137impl From<&str> for ChatCompletionRequestToolMessageContent {
138    fn from(value: &str) -> Self {
139        ChatCompletionRequestToolMessageContent::Text(value.into())
140    }
141}
142
143impl From<String> for ChatCompletionRequestToolMessageContent {
144    fn from(value: String) -> Self {
145        ChatCompletionRequestToolMessageContent::Text(value)
146    }
147}
148
149impl From<&str> for ChatCompletionRequestUserMessage {
150    fn from(value: &str) -> Self {
151        ChatCompletionRequestUserMessageContent::Text(value.into()).into()
152    }
153}
154
155impl From<String> for ChatCompletionRequestUserMessage {
156    fn from(value: String) -> Self {
157        value.as_str().into()
158    }
159}
160
161impl From<&str> for ChatCompletionRequestSystemMessage {
162    fn from(value: &str) -> Self {
163        ChatCompletionRequestSystemMessageContent::Text(value.into()).into()
164    }
165}
166
167impl From<&str> for ChatCompletionRequestDeveloperMessage {
168    fn from(value: &str) -> Self {
169        ChatCompletionRequestDeveloperMessageContent::Text(value.into()).into()
170    }
171}
172
173impl From<String> for ChatCompletionRequestSystemMessage {
174    fn from(value: String) -> Self {
175        value.as_str().into()
176    }
177}
178
179impl From<String> for ChatCompletionRequestDeveloperMessage {
180    fn from(value: String) -> Self {
181        value.as_str().into()
182    }
183}
184
185impl From<&str> for ChatCompletionRequestAssistantMessage {
186    fn from(value: &str) -> Self {
187        ChatCompletionRequestAssistantMessageContent::Text(value.into()).into()
188    }
189}
190
191impl From<String> for ChatCompletionRequestAssistantMessage {
192    fn from(value: String) -> Self {
193        value.as_str().into()
194    }
195}
196
197impl From<Vec<ChatCompletionRequestUserMessageContentPart>>
198    for ChatCompletionRequestUserMessageContent
199{
200    fn from(value: Vec<ChatCompletionRequestUserMessageContentPart>) -> Self {
201        ChatCompletionRequestUserMessageContent::Array(value)
202    }
203}
204
205impl From<TextObject> for ChatCompletionRequestUserMessageContentPart {
206    fn from(value: TextObject) -> Self {
207        ChatCompletionRequestUserMessageContentPart::Text(value)
208    }
209}
210
211impl From<ChatCompletionRequestMessageContentPartText>
212    for ChatCompletionRequestUserMessageContentPart
213{
214    fn from(value: ChatCompletionRequestMessageContentPartText) -> Self {
215        ChatCompletionRequestUserMessageContentPart::Text(TextObject { text: value.text })
216    }
217}
218
219impl From<ChatCompletionRequestMessageContentPartImage>
220    for ChatCompletionRequestUserMessageContentPart
221{
222    fn from(value: ChatCompletionRequestMessageContentPartImage) -> Self {
223        ChatCompletionRequestUserMessageContentPart::ImageUrl(value)
224    }
225}
226
227impl From<ChatCompletionRequestMessageContentPartAudio>
228    for ChatCompletionRequestUserMessageContentPart
229{
230    fn from(value: ChatCompletionRequestMessageContentPartAudio) -> Self {
231        ChatCompletionRequestUserMessageContentPart::InputAudio(value)
232    }
233}
234
235impl From<&str> for ChatCompletionRequestMessageContentPartText {
236    fn from(value: &str) -> Self {
237        ChatCompletionRequestMessageContentPartText { text: value.into() }
238    }
239}
240
241impl From<String> for ChatCompletionRequestMessageContentPartText {
242    fn from(value: String) -> Self {
243        ChatCompletionRequestMessageContentPartText { text: value }
244    }
245}
246
247impl From<&str> for ChatCompletionFunctionCall {
248    fn from(value: &str) -> Self {
249        match value {
250            "auto" => Self::Auto,
251            "none" => Self::None,
252            _ => Self::Function { name: value.into() },
253        }
254    }
255}
256
257impl From<&str> for FunctionName {
258    fn from(value: &str) -> Self {
259        Self { name: value.into() }
260    }
261}
262
263impl From<String> for FunctionName {
264    fn from(value: String) -> Self {
265        Self { name: value }
266    }
267}
268
269impl From<&str> for ChatCompletionNamedToolChoice {
270    fn from(value: &str) -> Self {
271        Self {
272            function: value.into(),
273        }
274    }
275}
276
277impl From<String> for ChatCompletionNamedToolChoice {
278    fn from(value: String) -> Self {
279        Self {
280            function: value.into(),
281        }
282    }
283}
284
285impl Default for ChatCompletionRequestDeveloperMessageContent {
286    fn default() -> Self {
287        ChatCompletionRequestDeveloperMessageContent::Text("".into())
288    }
289}
290
291impl Default for ChatCompletionRequestSystemMessageContent {
292    fn default() -> Self {
293        ChatCompletionRequestSystemMessageContent::Text("".into())
294    }
295}
296
297impl Default for ChatCompletionRequestToolMessageContent {
298    fn default() -> Self {
299        ChatCompletionRequestToolMessageContent::Text("".into())
300    }
301}
302
303impl Default for ChatCompletionRequestUserMessageContent {
304    fn default() -> Self {
305        ChatCompletionRequestUserMessageContent::Text("".into())
306    }
307}
308
309impl From<&str> for ImageUrl {
310    fn from(value: &str) -> Self {
311        Self {
312            url: value.into(),
313            detail: Default::default(),
314        }
315    }
316}
317
318impl From<String> for ImageUrl {
319    fn from(value: String) -> Self {
320        Self {
321            url: value,
322            detail: Default::default(),
323        }
324    }
325}
326
327impl Display for Role {
328    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
329        write!(
330            f,
331            "{}",
332            match self {
333                Role::User => "user",
334                Role::System => "system",
335                Role::Assistant => "assistant",
336                Role::Function => "function",
337                Role::Tool => "tool",
338            }
339        )
340    }
341}
342
343// Note: ChatCompletionTools enum with Function/Custom variants not implemented.
344// These From impls were removed because the target types don't exist.
345
346impl From<ChatCompletionRequestUserMessage> for Vec<ChatCompletionRequestMessage> {
347    fn from(value: ChatCompletionRequestUserMessage) -> Self {
348        vec![value.into()]
349    }
350}
351
352impl From<ChatCompletionRequestSystemMessage> for Vec<ChatCompletionRequestMessage> {
353    fn from(value: ChatCompletionRequestSystemMessage) -> Self {
354        vec![value.into()]
355    }
356}
357
358impl From<ChatCompletionRequestDeveloperMessage> for Vec<ChatCompletionRequestMessage> {
359    fn from(value: ChatCompletionRequestDeveloperMessage) -> Self {
360        vec![value.into()]
361    }
362}
363
364impl From<ChatCompletionRequestAssistantMessage> for Vec<ChatCompletionRequestMessage> {
365    fn from(value: ChatCompletionRequestAssistantMessage) -> Self {
366        vec![value.into()]
367    }
368}
369
370impl From<ChatCompletionRequestFunctionMessage> for Vec<ChatCompletionRequestMessage> {
371    fn from(value: ChatCompletionRequestFunctionMessage) -> Self {
372        vec![value.into()]
373    }
374}
375
376impl From<ChatCompletionRequestToolMessage> for Vec<ChatCompletionRequestMessage> {
377    fn from(value: ChatCompletionRequestToolMessage) -> Self {
378        vec![value.into()]
379    }
380}
381
382// Note: ChatCompletionMessageToolCalls enum with Function/Custom variants not implemented.
383// These From impls were removed because the target types don't exist.
384
385impl From<ImageUrl> for ChatCompletionRequestMessageContentPartImage {
386    fn from(value: ImageUrl) -> Self {
387        ChatCompletionRequestMessageContentPartImage { image_url: value }
388    }
389}