Skip to main content

dynamo_protocols/types/
impls.rs

1// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2// SPDX-License-Identifier: Apache-2.0
3//
4// Convenience trait implementations for locally-defined types.
5// Types re-exported from upstream async-openai already have their own impls.
6
7use std::fmt::Display;
8
9use super::{
10    AudioUrl, ChatCompletionNamedToolChoice, ChatCompletionRequestAssistantMessage,
11    ChatCompletionRequestAssistantMessageContent, ChatCompletionRequestMessage,
12    ChatCompletionRequestMessageContentPartAudio, ChatCompletionRequestMessageContentPartAudioUrl,
13    ChatCompletionRequestMessageContentPartImage, ChatCompletionRequestMessageContentPartText,
14    ChatCompletionRequestMessageContentPartVideo, ChatCompletionRequestUserMessageContentPart,
15    ChatCompletionToolChoiceOption, ChatCompletionToolType, FunctionName, ImageUrl, VideoUrl,
16};
17
18use crate::error::OpenAIError;
19
20// --- From impls for locally-defined types ---
21
22impl From<&str> for FunctionName {
23    fn from(value: &str) -> Self {
24        Self { name: value.into() }
25    }
26}
27
28impl From<String> for FunctionName {
29    fn from(value: String) -> Self {
30        Self { name: value }
31    }
32}
33
34impl From<&str> for ChatCompletionNamedToolChoice {
35    fn from(value: &str) -> Self {
36        Self {
37            r#type: ChatCompletionToolType::Function,
38            function: value.into(),
39        }
40    }
41}
42
43impl From<String> for ChatCompletionNamedToolChoice {
44    fn from(value: String) -> Self {
45        Self {
46            r#type: ChatCompletionToolType::Function,
47            function: value.into(),
48        }
49    }
50}
51
52impl From<&str> for ChatCompletionToolChoiceOption {
53    fn from(value: &str) -> Self {
54        match value {
55            "auto" => Self::Auto,
56            "none" => Self::None,
57            _ => Self::Named(value.into()),
58        }
59    }
60}
61
62impl From<String> for ChatCompletionToolChoiceOption {
63    fn from(value: String) -> Self {
64        match value.as_str() {
65            "auto" => Self::Auto,
66            "none" => Self::None,
67            _ => Self::Named(value.into()),
68        }
69    }
70}
71
72// From message types into ChatCompletionRequestMessage enum
73// Note: types from upstream (SystemMessage, ToolMessage, etc.) need From impls
74// on our local ChatCompletionRequestMessage enum.
75
76impl From<super::ChatCompletionRequestUserMessage> for ChatCompletionRequestMessage {
77    fn from(value: super::ChatCompletionRequestUserMessage) -> Self {
78        Self::User(value)
79    }
80}
81
82impl From<async_openai::types::chat::ChatCompletionRequestSystemMessage>
83    for ChatCompletionRequestMessage
84{
85    fn from(value: async_openai::types::chat::ChatCompletionRequestSystemMessage) -> Self {
86        Self::System(value)
87    }
88}
89
90impl From<async_openai::types::chat::ChatCompletionRequestDeveloperMessage>
91    for ChatCompletionRequestMessage
92{
93    fn from(value: async_openai::types::chat::ChatCompletionRequestDeveloperMessage) -> Self {
94        Self::Developer(value)
95    }
96}
97
98impl From<async_openai::types::chat::ChatCompletionRequestToolMessage>
99    for ChatCompletionRequestMessage
100{
101    fn from(value: async_openai::types::chat::ChatCompletionRequestToolMessage) -> Self {
102        Self::Tool(value)
103    }
104}
105
106impl From<async_openai::types::chat::ChatCompletionRequestFunctionMessage>
107    for ChatCompletionRequestMessage
108{
109    fn from(value: async_openai::types::chat::ChatCompletionRequestFunctionMessage) -> Self {
110        Self::Function(value)
111    }
112}
113
114impl From<ChatCompletionRequestAssistantMessage> for ChatCompletionRequestMessage {
115    fn from(value: ChatCompletionRequestAssistantMessage) -> Self {
116        Self::Assistant(value)
117    }
118}
119
120impl From<ChatCompletionRequestAssistantMessageContent> for ChatCompletionRequestAssistantMessage {
121    fn from(value: ChatCompletionRequestAssistantMessageContent) -> Self {
122        Self {
123            content: Some(value),
124            ..Default::default()
125        }
126    }
127}
128
129impl From<&str> for ChatCompletionRequestAssistantMessage {
130    fn from(value: &str) -> Self {
131        ChatCompletionRequestAssistantMessageContent::Text(value.into()).into()
132    }
133}
134
135impl From<String> for ChatCompletionRequestAssistantMessage {
136    fn from(value: String) -> Self {
137        value.as_str().into()
138    }
139}
140
141// From content parts into UserMessageContentPart enum
142
143impl From<ChatCompletionRequestMessageContentPartText>
144    for ChatCompletionRequestUserMessageContentPart
145{
146    fn from(value: ChatCompletionRequestMessageContentPartText) -> Self {
147        ChatCompletionRequestUserMessageContentPart::Text(value)
148    }
149}
150
151impl From<ChatCompletionRequestMessageContentPartImage>
152    for ChatCompletionRequestUserMessageContentPart
153{
154    fn from(value: ChatCompletionRequestMessageContentPartImage) -> Self {
155        ChatCompletionRequestUserMessageContentPart::ImageUrl(value)
156    }
157}
158
159impl From<ChatCompletionRequestMessageContentPartAudio>
160    for ChatCompletionRequestUserMessageContentPart
161{
162    fn from(value: ChatCompletionRequestMessageContentPartAudio) -> Self {
163        ChatCompletionRequestUserMessageContentPart::InputAudio(value)
164    }
165}
166
167impl From<ChatCompletionRequestMessageContentPartVideo>
168    for ChatCompletionRequestUserMessageContentPart
169{
170    fn from(value: ChatCompletionRequestMessageContentPartVideo) -> Self {
171        ChatCompletionRequestUserMessageContentPart::VideoUrl(value)
172    }
173}
174
175impl From<ChatCompletionRequestMessageContentPartAudioUrl>
176    for ChatCompletionRequestUserMessageContentPart
177{
178    fn from(value: ChatCompletionRequestMessageContentPartAudioUrl) -> Self {
179        ChatCompletionRequestUserMessageContentPart::AudioUrl(value)
180    }
181}
182
183// URL type conversions
184
185impl From<&str> for ImageUrl {
186    fn from(value: &str) -> Self {
187        Self {
188            url: value.parse().expect("Invalid URL"),
189            detail: Default::default(),
190            uuid: None,
191        }
192    }
193}
194
195impl From<String> for ImageUrl {
196    fn from(value: String) -> Self {
197        Self {
198            url: value.parse().expect("Invalid URL"),
199            detail: Default::default(),
200            uuid: None,
201        }
202    }
203}
204
205impl From<&str> for VideoUrl {
206    fn from(value: &str) -> Self {
207        Self {
208            url: value.parse().expect("Invalid URL"),
209            detail: Default::default(),
210            uuid: None,
211        }
212    }
213}
214
215impl From<String> for VideoUrl {
216    fn from(value: String) -> Self {
217        Self {
218            url: value.parse().expect("Invalid URL"),
219            detail: Default::default(),
220            uuid: None,
221        }
222    }
223}
224
225impl From<&str> for AudioUrl {
226    fn from(value: &str) -> Self {
227        Self {
228            url: value.parse().expect("Invalid URL"),
229            uuid: None,
230        }
231    }
232}
233
234impl From<String> for AudioUrl {
235    fn from(value: String) -> Self {
236        Self {
237            url: value.parse().expect("Invalid URL"),
238            uuid: None,
239        }
240    }
241}