1mod api;
2mod impls;
3
4use std::collections::HashMap;
5use std::pin::Pin;
6
7pub use api::*;
8use derive_builder::Builder;
9use futures::Stream;
10use serde::{Deserialize, Serialize};
11
12use crate::error::OpenAIError;
13pub use crate::spec::shared::CompletionTokensDetails;
15pub use crate::spec::shared::{
16 CustomGrammarFormatParam, FunctionCall, FunctionObjectArgs, GrammarSyntax, ImageUrlArgs,
17 PromptTokensDetails,
18};
19pub use crate::spec::text::{PartibleTextContent, TextObject};
21
22#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
23#[serde(untagged)]
24pub enum Prompt {
25 String(String),
26 StringArray(Vec<String>),
27 IntegerArray(Vec<u32>),
29 ArrayOfIntegerArray(Vec<Vec<u32>>),
30}
31
32#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
33#[serde(untagged)]
34pub enum StopConfiguration {
35 String(String), StringArray(Vec<String>), }
38
39#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
40pub struct Logprobs {
41 pub tokens: Vec<String>,
42 pub token_logprobs: Vec<Option<f32>>, pub top_logprobs: Vec<serde_json::Value>,
44 pub text_offset: Vec<u32>,
45}
46
47#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
48#[serde(rename_all = "snake_case")]
49pub enum CompletionFinishReason {
50 Stop,
51 Length,
52 ContentFilter,
53}
54
55#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
56pub struct Choice {
57 pub text: String,
58 pub index: u32,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 pub logprobs: Option<Logprobs>,
61 #[serde(skip_serializing_if = "Option::is_none")]
62 pub finish_reason: Option<CompletionFinishReason>,
63}
64
65#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
66pub enum ChatCompletionFunctionCall {
67 #[serde(rename = "none")]
69 None,
70 #[serde(rename = "auto")]
72 Auto,
73
74 #[serde(untagged)]
79 Function { name: String },
80}
81
82#[derive(Debug, Serialize, Deserialize, Clone, Copy, Default, PartialEq)]
83#[serde(rename_all = "lowercase")]
84pub enum Role {
85 System,
86 #[default]
87 User,
88 Assistant,
89 Tool,
90 Function,
91}
92
93#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Default)]
95pub struct CompletionUsage {
96 pub prompt_tokens: u32,
98 pub completion_tokens: u32,
100 pub total_tokens: u32,
102 #[serde(skip_serializing_if = "Option::is_none")]
104 pub prompt_tokens_details: Option<PromptTokensDetails>,
105 #[serde(skip_serializing_if = "Option::is_none")]
107 pub completion_tokens_details: Option<CompletionTokensDetails>,
108}
109
110#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
111#[builder(name = "ChatCompletionRequestDeveloperMessageArgs")]
112#[builder(pattern = "mutable")]
113#[builder(setter(into, strip_option), default)]
114#[builder(derive(Debug))]
115#[builder(build_fn(error = "OpenAIError"))]
116pub struct ChatCompletionRequestDeveloperMessage {
117 pub content: ChatCompletionRequestDeveloperMessageContent,
119
120 #[serde(skip_serializing_if = "Option::is_none")]
123 pub name: Option<String>,
124}
125
126impl ChatCompletionRequestDeveloperMessage {
127 pub fn to_texts(&self) -> Vec<String> {
128 self.content.to_texts()
129 }
130}
131
132#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
133#[serde(untagged)]
134pub enum ChatCompletionRequestDeveloperMessageContent {
135 Text(String),
136 Array(Vec<ChatCompletionRequestDeveloperMessageContentPart>),
137}
138
139impl ChatCompletionRequestDeveloperMessageContent {
140 pub fn to_texts(&self) -> Vec<String> {
141 match self {
142 Self::Text(text) => vec![text.clone()],
143 Self::Array(parts) => parts
144 .iter()
145 .map(|part| {
146 let ChatCompletionRequestDeveloperMessageContentPart::Text(text_part) = part;
147 text_part.text.clone()
148 })
149 .collect(),
150 }
151 }
152}
153
154#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
155#[serde(tag = "type")]
156#[serde(rename_all = "snake_case")]
157pub enum ChatCompletionRequestDeveloperMessageContentPart {
158 Text(ChatCompletionRequestMessageContentPartText),
159}
160
161#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
162#[serde(untagged)]
163pub enum ChatCompletionRequestSystemMessageContent {
164 Text(String),
165 Array(Vec<ChatCompletionRequestSystemMessageContentPart>),
166}
167
168impl ChatCompletionRequestSystemMessageContent {
169 pub fn to_texts(&self) -> Vec<String> {
170 match self {
171 Self::Text(text) => vec![text.clone()],
172 Self::Array(parts) => parts
173 .iter()
174 .map(|part| {
175 let ChatCompletionRequestSystemMessageContentPart::Text(text_part) = part;
176 text_part.text.clone()
177 })
178 .collect(),
179 }
180 }
181}
182
183#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
184#[serde(tag = "type")]
185#[serde(rename_all = "snake_case")]
186pub enum ChatCompletionRequestSystemMessageContentPart {
187 Text(ChatCompletionRequestMessageContentPartText),
188}
189
190#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
191#[serde(untagged)]
192pub enum ChatCompletionRequestToolMessageContent {
193 Text(String),
194 Array(Vec<ChatCompletionRequestToolMessageContentPart>),
195}
196
197#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
198#[builder(name = "ChatCompletionRequestSystemMessageArgs")]
199#[builder(pattern = "mutable")]
200#[builder(setter(into, strip_option), default)]
201#[builder(derive(Debug))]
202#[builder(build_fn(error = "OpenAIError"))]
203pub struct ChatCompletionRequestSystemMessage {
204 pub content: ChatCompletionRequestSystemMessageContent,
206 #[serde(skip_serializing_if = "Option::is_none")]
209 pub name: Option<String>,
210}
211
212impl ChatCompletionRequestSystemMessage {
213 pub fn to_texts(&self) -> Vec<String> {
214 self.content.to_texts()
215 }
216}
217
218#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
219#[builder(name = "ChatCompletionRequestMessageContentPartTextArgs")]
220#[builder(pattern = "mutable")]
221#[builder(setter(into, strip_option), default)]
222#[builder(derive(Debug))]
223#[builder(build_fn(error = "OpenAIError"))]
224pub struct ChatCompletionRequestMessageContentPartText {
225 pub text: String,
226}
227
228#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
229pub struct ChatCompletionRequestMessageContentPartRefusal {
230 pub refusal: String,
232}
233
234#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
235#[serde(rename_all = "lowercase")]
236pub enum ImageDetail {
237 #[default]
238 Auto,
239 Low,
240 High,
241}
242
243#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
244#[builder(name = "ImageUrlBuilder")]
245#[builder(pattern = "mutable")]
246#[builder(setter(into, strip_option), default)]
247#[builder(derive(Debug))]
248#[builder(build_fn(error = "OpenAIError"))]
249pub struct ImageUrl {
250 pub url: String,
252 pub detail: Option<ImageDetail>,
254}
255
256#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
257#[builder(name = "ChatCompletionRequestMessageContentPartImageBuilder")]
258#[builder(pattern = "mutable")]
259#[builder(setter(into, strip_option), default)]
260#[builder(derive(Debug))]
261#[builder(build_fn(error = "OpenAIError"))]
262pub struct ChatCompletionRequestMessageContentPartImage {
263 pub image_url: ImageUrl,
264}
265
266#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
267#[serde(rename_all = "lowercase")]
268pub enum InputAudioFormat {
269 Wav,
270 #[default]
271 Mp3,
272}
273
274#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
275pub struct InputAudio {
276 pub data: String,
278 pub format: InputAudioFormat,
280}
281
282#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
284#[builder(name = "ChatCompletionRequestMessageContentPartAudioBuilder")]
285#[builder(pattern = "mutable")]
286#[builder(setter(into, strip_option), default)]
287#[builder(derive(Debug))]
288#[builder(build_fn(error = "OpenAIError"))]
289pub struct ChatCompletionRequestMessageContentPartAudio {
290 pub input_audio: InputAudio,
291}
292
293#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
294#[serde(tag = "type")]
295#[serde(rename_all = "snake_case")]
296pub enum ChatCompletionRequestUserMessageContentPart {
297 Text(TextObject),
298 ImageUrl(ChatCompletionRequestMessageContentPartImage),
299 InputAudio(ChatCompletionRequestMessageContentPartAudio),
300}
301
302#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
303#[serde(tag = "type")]
304#[serde(rename_all = "snake_case")]
305pub enum ChatCompletionRequestAssistantMessageContentPart {
306 Text(TextObject),
307 Refusal(ChatCompletionRequestMessageContentPartRefusal),
308}
309
310#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
311#[serde(tag = "type")]
312#[serde(rename_all = "snake_case")]
313pub enum ChatCompletionRequestToolMessageContentPart {
314 Text(TextObject),
315}
316
317#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
318#[serde(untagged)]
319pub enum ChatCompletionRequestUserMessageContent {
320 Text(String),
322 Array(Vec<ChatCompletionRequestUserMessageContentPart>),
324}
325impl ChatCompletionRequestUserMessageContent {
326 pub fn to_texts(&self) -> Vec<String> {
327 match self {
328 ChatCompletionRequestUserMessageContent::Text(text) => vec![text.clone()],
329 ChatCompletionRequestUserMessageContent::Array(parts) => parts
330 .iter()
331 .filter_map(|part| match part {
332 ChatCompletionRequestUserMessageContentPart::Text(text) => {
333 Some(text.text.clone())
334 }
335 _ => None,
336 })
337 .collect(),
338 }
339 }
340}
341
342#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
343#[serde(untagged)]
344pub enum ChatCompletionRequestAssistantMessageContent {
345 Text(String),
347 Array(Vec<ChatCompletionRequestAssistantMessageContentPart>),
350}
351impl ChatCompletionRequestAssistantMessageContent {
352 pub fn to_texts(&self) -> Vec<String> {
353 match self {
354 ChatCompletionRequestAssistantMessageContent::Text(text) => vec![text.clone()],
355 ChatCompletionRequestAssistantMessageContent::Array(parts) => parts
356 .iter()
357 .filter_map(|part| match part {
358 ChatCompletionRequestAssistantMessageContentPart::Text(text) => {
359 Some(text.text.clone())
360 }
361 _ => None,
362 })
363 .collect(),
364 }
365 }
366}
367
368#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
369#[builder(name = "ChatCompletionRequestUserMessageBuilder")]
370#[builder(pattern = "mutable")]
371#[builder(setter(into, strip_option), default)]
372#[builder(derive(Debug))]
373#[builder(build_fn(error = "OpenAIError"))]
374pub struct ChatCompletionRequestUserMessage {
375 pub content: ChatCompletionRequestUserMessageContent,
377 #[serde(skip_serializing_if = "Option::is_none")]
380 pub name: Option<String>,
381}
382impl ChatCompletionRequestUserMessage {
383 pub fn new(content: impl Into<ChatCompletionRequestUserMessageContent>) -> Self {
384 Self {
385 content: content.into(),
386 name: None,
387 }
388 }
389 pub fn to_texts(&self) -> Vec<String> {
390 self.content.to_texts()
391 }
392}
393
394#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
395pub struct ChatCompletionRequestAssistantMessageAudio {
396 pub id: String,
398}
399
400#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
401#[builder(name = "ChatCompletionRequestAssistantMessageBuilder")]
402#[builder(pattern = "mutable")]
403#[builder(setter(into, strip_option), default)]
404#[builder(derive(Debug))]
405#[builder(build_fn(error = "OpenAIError"))]
406pub struct ChatCompletionRequestAssistantMessage {
407 #[serde(skip_serializing_if = "Option::is_none")]
410 pub content: Option<ChatCompletionRequestAssistantMessageContent>,
411 #[serde(skip_serializing_if = "Option::is_none")]
413 pub refusal: Option<String>,
414 #[serde(skip_serializing_if = "Option::is_none")]
417 pub name: Option<String>,
418 #[serde(skip_serializing_if = "Option::is_none")]
421 pub audio: Option<ChatCompletionRequestAssistantMessageAudio>,
422 #[serde(skip_serializing_if = "Option::is_none")]
423 pub tool_calls: Option<Vec<ChatCompletionMessageToolCall>>,
424}
425impl ChatCompletionRequestAssistantMessage {
426 pub fn to_texts(&self) -> Vec<String> {
427 self.content
428 .as_ref()
429 .map_or_else(Vec::new, |content| content.to_texts())
430 }
431}
432
433#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
435#[builder(name = "ChatCompletionRequestToolMessageBuilder")]
436#[builder(pattern = "mutable")]
437#[builder(setter(into, strip_option), default)]
438#[builder(derive(Debug))]
439#[builder(build_fn(error = "OpenAIError"))]
440pub struct ChatCompletionRequestToolMessage {
441 pub content: PartibleTextContent,
443 pub tool_call_id: String,
444}
445impl ChatCompletionRequestToolMessage {
446 pub fn to_texts(&self) -> Vec<String> {
447 self.content.to_texts()
448 }
449}
450
451#[derive(Debug, Serialize, Deserialize, Default, Clone, Builder, PartialEq)]
452#[builder(name = "ChatCompletionRequestFunctionMessageBuilder")]
453#[builder(pattern = "mutable")]
454#[builder(setter(into, strip_option), default)]
455#[builder(derive(Debug))]
456#[builder(build_fn(error = "OpenAIError"))]
457pub struct ChatCompletionRequestFunctionMessage {
458 pub content: Option<String>,
460 pub name: String,
462}
463impl ChatCompletionRequestFunctionMessage {
464 pub fn to_texts(&self) -> Vec<String> {
465 self.content
466 .as_ref()
467 .map_or_else(Vec::new, |content| vec![content.clone()])
468 }
469}
470
471#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
472#[serde(tag = "role")]
473#[serde(rename_all = "lowercase")]
474pub enum ChatCompletionRequestMessage {
475 Developer(ChatCompletionRequestDeveloperMessage),
476 System(ChatCompletionRequestSystemMessage),
477 User(ChatCompletionRequestUserMessage),
478 Assistant(ChatCompletionRequestAssistantMessage),
479 Tool(ChatCompletionRequestToolMessage),
480 Function(ChatCompletionRequestFunctionMessage),
481}
482impl ChatCompletionRequestMessage {
483 pub fn to_texts(&self) -> Vec<String> {
484 match self {
485 ChatCompletionRequestMessage::Developer(msg) => msg.to_texts(),
486 ChatCompletionRequestMessage::System(msg) => msg.to_texts(),
487 ChatCompletionRequestMessage::User(msg) => msg.to_texts(),
488 ChatCompletionRequestMessage::Assistant(msg) => msg.to_texts(),
489 ChatCompletionRequestMessage::Tool(msg) => msg.to_texts(),
490 ChatCompletionRequestMessage::Function(msg) => msg.to_texts(),
491 }
492 }
493}
494
495#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
496pub struct ChatCompletionMessageToolCall {
497 pub id: String,
499 #[serde(rename = "type")]
501 pub kind: ChatCompletionToolType,
502 pub function: FunctionCall,
504}
505
506#[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq)]
507pub struct ChatCompletionResponseMessageAudio {
508 pub id: String,
510 pub expires_at: u32,
513 pub data: String,
515 pub transcript: String,
517}
518
519#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
521pub struct ChatCompletionResponseMessage {
522 pub content: Option<String>,
524 pub refusal: Option<String>,
526 pub tool_calls: Option<Vec<ChatCompletionMessageToolCall>>,
528
529 pub role: Role,
531
532 pub audio: Option<ChatCompletionResponseMessageAudio>,
534}
535
536#[derive(Clone, Serialize, Default, Debug, Deserialize, Builder, PartialEq)]
537#[builder(name = "FunctionObjectBuilder")]
538#[builder(pattern = "mutable")]
539#[builder(setter(into, strip_option), default)]
540#[builder(derive(Debug))]
541#[builder(build_fn(error = "OpenAIError"))]
542pub struct FunctionObject {
543 pub name: String,
546 #[serde(skip_serializing_if = "Option::is_none")]
549 pub description: Option<String>,
550 #[serde(skip_serializing_if = "Option::is_none")]
554 pub parameters: Option<serde_json::Value>,
555
556 #[serde(skip_serializing_if = "Option::is_none")]
558 pub strict: Option<bool>,
559}
560
561#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
562#[serde(tag = "type", rename_all = "snake_case")]
563pub enum ResponseFormat {
564 Text,
566 JsonObject,
568 JsonSchema {
570 json_schema: ResponseFormatJsonSchema,
571 },
572}
573
574#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
575pub struct ResponseFormatJsonSchema {
576 #[serde(skip_serializing_if = "Option::is_none")]
579 pub description: Option<String>,
580 pub name: String,
583 #[serde(skip_serializing_if = "Option::is_none")]
585 pub schema: Option<serde_json::Value>,
586 #[serde(skip_serializing_if = "Option::is_none")]
588 pub strict: Option<bool>,
589}
590
591#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
592#[serde(rename_all = "lowercase")]
593pub enum ChatCompletionToolType {
594 #[default]
595 Function,
596}
597
598#[derive(Clone, Serialize, Default, Debug, Builder, Deserialize, PartialEq)]
599#[builder(name = "ChatCompletionToolBuilder")]
600#[builder(pattern = "mutable")]
601#[builder(setter(into, strip_option), default)]
602#[builder(derive(Debug))]
603#[builder(build_fn(error = "OpenAIError"))]
604pub struct ChatCompletionTool {
605 #[builder(default = "ChatCompletionToolType::Function")]
606 #[serde(rename = "type")]
607 pub kind: ChatCompletionToolType,
608 pub function: FunctionObject,
609}
610
611#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
612pub struct FunctionName {
613 pub name: String,
615}
616
617#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
619pub struct ChatCompletionNamedToolChoice {
620 pub function: FunctionName,
621}
622
623#[derive(Clone, Serialize, Default, Debug, Deserialize, PartialEq)]
633#[serde(rename_all = "lowercase")]
634pub enum ChatCompletionToolChoiceOption {
635 #[default]
636 None,
637 Auto,
638 Required,
639 #[serde(untagged)]
640 Named(ChatCompletionNamedToolChoice),
641}
642
643#[derive(Clone, Serialize, Debug, Deserialize, PartialEq, Default)]
644#[serde(rename_all = "lowercase")]
645pub enum WebSearchContextSize {
647 Low,
648 #[default]
649 Medium,
650 High,
651}
652
653#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
654#[serde(rename_all = "lowercase")]
655pub enum WebSearchUserLocationType {
656 Approximate,
657}
658
659#[derive(Clone, Serialize, Debug, Default, Deserialize, PartialEq)]
661pub struct WebSearchLocation {
662 pub country: Option<String>,
664 pub region: Option<String>,
666 pub city: Option<String>,
668 pub timezone: Option<String>,
670}
671
672#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
673pub struct WebSearchUserLocation {
674 #[serde(rename = "type")]
676 pub kind: WebSearchUserLocationType,
677
678 pub approximate: WebSearchLocation,
679}
680
681#[derive(Clone, Serialize, Debug, Default, Deserialize, PartialEq)]
683pub struct WebSearchOptions {
684 pub search_context_size: Option<WebSearchContextSize>,
687
688 pub user_location: Option<WebSearchUserLocation>,
690}
691
692#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
693#[serde(rename_all = "lowercase")]
694pub enum ServiceTier {
695 Auto,
696 Default,
697 Flex,
698}
699
700#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
701#[serde(rename_all = "lowercase")]
702pub enum ServiceTierResponse {
703 Scale,
704 Default,
705 Flex,
706}
707
708#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
709#[serde(rename_all = "lowercase")]
710pub enum ReasoningEffort {
711 Low,
712 Medium,
713 High,
714}
715
716#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
723#[serde(rename_all = "lowercase")]
724pub enum ChatCompletionModalities {
725 Text,
726 Audio,
727}
728
729#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
731#[serde(tag = "type", rename_all = "lowercase", content = "content")]
732pub enum PredictionContent {
733 Content(PartibleTextContent),
736}
737
738#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
739#[serde(rename_all = "lowercase")]
740pub enum ChatCompletionAudioVoice {
741 Alloy,
742 Ash,
743 Ballad,
744 Coral,
745 Echo,
746 Sage,
747 Shimmer,
748 Verse,
749}
750
751#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
752#[serde(rename_all = "lowercase")]
753pub enum ChatCompletionAudioFormat {
754 Wav,
755 Mp3,
756 Flac,
757 Opus,
758 Pcm16,
759}
760
761#[derive(Clone, Serialize, Debug, Deserialize, PartialEq)]
762pub struct ChatCompletionAudio {
763 pub voice: ChatCompletionAudioVoice,
767 pub format: ChatCompletionAudioFormat,
769}
770
771#[derive(Clone, Serialize, Default, Debug, Builder, Deserialize, PartialEq)]
772#[builder(name = "CreateChatCompletionRequestBuilder")]
773#[builder(pattern = "mutable")]
774#[builder(setter(into, strip_option), default)]
775#[builder(derive(Debug))]
776#[builder(build_fn(error = "OpenAIError"))]
777pub struct CreateChatCompletionRequest {
778 pub messages: Vec<ChatCompletionRequestMessage>, pub model: String,
784
785 #[serde(skip_serializing_if = "Option::is_none")]
789 pub store: Option<bool>, #[serde(skip_serializing_if = "Option::is_none")]
801 pub reasoning_effort: Option<ReasoningEffort>,
802
803 #[serde(skip_serializing_if = "Option::is_none")]
805 pub metadata: Option<serde_json::Value>, #[serde(skip_serializing_if = "Option::is_none")]
811 pub frequency_penalty: Option<f32>, #[serde(skip_serializing_if = "Option::is_none")]
822 pub logit_bias: Option<HashMap<String, serde_json::Value>>, #[serde(skip_serializing_if = "Option::is_none")]
827 pub logprobs: Option<bool>,
828
829 #[serde(skip_serializing_if = "Option::is_none")]
833 pub top_logprobs: Option<u8>,
834
835 #[serde(skip_serializing_if = "Option::is_none")]
837 pub max_completion_tokens: Option<u32>,
838
839 #[serde(skip_serializing_if = "Option::is_none")]
843 pub n: Option<u8>, #[serde(skip_serializing_if = "Option::is_none")]
846 pub modalities: Option<Vec<ChatCompletionModalities>>,
847
848 #[serde(skip_serializing_if = "Option::is_none")]
850 pub prediction: Option<PredictionContent>,
851
852 #[serde(skip_serializing_if = "Option::is_none")]
854 pub audio: Option<ChatCompletionAudio>,
855
856 #[serde(skip_serializing_if = "Option::is_none")]
859 pub presence_penalty: Option<f32>, #[serde(skip_serializing_if = "Option::is_none")]
875 pub response_format: Option<ResponseFormat>,
876
877 #[serde(skip_serializing_if = "Option::is_none")]
883 pub seed: Option<i64>,
884
885 #[serde(skip_serializing_if = "Option::is_none")]
894 pub service_tier: Option<ServiceTier>,
895
896 #[serde(skip_serializing_if = "Option::is_none")]
898 pub stop: Option<Stop>,
899
900 #[serde(skip_serializing_if = "Option::is_none")]
904 pub stream: Option<bool>,
905
906 #[serde(skip_serializing_if = "Option::is_none")]
907 pub stream_options: Option<ChatCompletionStreamOptions>,
908
909 #[serde(skip_serializing_if = "Option::is_none")]
915 pub temperature: Option<f32>, #[serde(skip_serializing_if = "Option::is_none")]
923 pub top_p: Option<f32>, #[serde(skip_serializing_if = "Option::is_none")]
929 pub tools: Option<Vec<ChatCompletionTool>>,
930
931 #[serde(skip_serializing_if = "Option::is_none")]
932 pub tool_choice: Option<ChatCompletionToolChoiceOption>,
933
934 #[serde(skip_serializing_if = "Option::is_none")]
936 pub parallel_tool_calls: Option<bool>,
937
938 #[serde(skip_serializing_if = "Option::is_none")]
940 pub user: Option<String>,
941
942 #[serde(skip_serializing_if = "Option::is_none")]
945 pub web_search_options: Option<WebSearchOptions>,
946}
947
948impl CreateChatCompletionRequest {
949 pub fn new(model: impl Into<String>, messages: Vec<ChatCompletionRequestMessage>) -> Self {
951 Self {
952 model: model.into(),
953 messages,
954 ..Default::default()
955 }
956 }
957}
958
959#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
961pub struct ChatCompletionStreamOptions {
962 pub include_usage: bool,
967}
968
969#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq)]
970#[serde(rename_all = "snake_case")]
971pub enum FinishReason {
972 Stop,
973 Length,
974 ToolCalls,
975 ContentFilter,
976 FunctionCall,
977}
978
979#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
980pub struct TopLogprobs {
981 pub token: String,
983 pub logprob: f32,
985 pub bytes: Option<Vec<u8>>,
990}
991
992#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
993pub struct ChatCompletionTokenLogprob {
994 pub token: String,
996 pub logprob: f32,
999 pub bytes: Option<Vec<u8>>,
1004 pub top_logprobs: Vec<TopLogprobs>,
1007}
1008
1009#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
1010pub struct ChatChoiceLogprobs {
1011 pub content: Option<Vec<ChatCompletionTokenLogprob>>,
1013 pub refusal: Option<Vec<ChatCompletionTokenLogprob>>,
1014}
1015
1016#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
1017pub struct ChatChoice {
1018 pub index: u32,
1020 pub message: ChatCompletionResponseMessage,
1021 pub finish_reason: Option<FinishReason>,
1027 pub logprobs: Option<ChatChoiceLogprobs>,
1029}
1030
1031#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
1033pub struct CreateChatCompletionResponse {
1034 pub id: String,
1036 pub choices: Vec<ChatChoice>,
1038 pub created: u32,
1040 pub model: String,
1042 pub service_tier: Option<ServiceTierResponse>,
1045 pub system_fingerprint: Option<String>,
1050
1051 pub object: String,
1053 pub usage: Option<CompletionUsage>,
1054}
1055
1056pub type ChatCompletionResponseStream =
1058 Pin<Box<dyn Stream<Item = Result<CreateChatCompletionStreamResponse, OpenAIError>> + Send>>;
1059
1060#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
1061pub struct FunctionCallStream {
1062 pub name: Option<String>,
1064 pub arguments: Option<String>,
1069}
1070
1071#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
1072pub struct ChatCompletionMessageToolCallChunk {
1073 pub index: u32,
1074 pub id: Option<String>,
1076 #[serde(rename = "type")]
1078 pub kind: Option<ChatCompletionToolType>,
1079 pub function: Option<FunctionCallStream>,
1080}
1081
1082#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
1084pub struct ChatCompletionStreamResponseDelta {
1085 pub content: Option<String>,
1087
1088 pub tool_calls: Option<Vec<ChatCompletionMessageToolCallChunk>>,
1089 pub role: Option<Role>,
1091 pub refusal: Option<String>,
1093}
1094
1095#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
1096pub struct ChatChoiceStream {
1097 pub index: u32,
1099 pub delta: ChatCompletionStreamResponseDelta,
1100 pub finish_reason: Option<FinishReason>,
1111 pub logprobs: Option<ChatChoiceLogprobs>,
1113}
1114
1115#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
1116pub struct CreateChatCompletionStreamResponse {
1119 pub id: String,
1121 pub choices: Vec<ChatChoiceStream>,
1125
1126 pub created: u32,
1129 pub model: String,
1131 pub service_tier: Option<ServiceTierResponse>,
1134 pub system_fingerprint: Option<String>,
1138 pub object: String,
1140
1141 pub usage: Option<CompletionUsage>,
1145}
1146
1147pub type Stop = StopConfiguration;
1149
1150#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
1152pub struct ChatCompletionList {
1153 pub object: String,
1154 pub data: Vec<CreateChatCompletionResponse>,
1155 #[serde(skip_serializing_if = "Option::is_none")]
1156 pub first_id: Option<String>,
1157 #[serde(skip_serializing_if = "Option::is_none")]
1158 pub last_id: Option<String>,
1159 pub has_more: bool,
1160}
1161
1162#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
1164pub struct UpdateChatCompletionRequest {
1165 #[serde(skip_serializing_if = "Option::is_none")]
1167 pub metadata: Option<std::collections::HashMap<String, String>>,
1168}
1169
1170#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
1172pub struct ChatCompletionDeleted {
1173 pub id: String,
1174 pub object: String,
1175 pub deleted: bool,
1176}
1177
1178#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
1180pub struct ChatCompletionMessageList {
1181 pub object: String,
1182 pub data: Vec<ChatCompletionResponseMessage>,
1183 #[serde(skip_serializing_if = "Option::is_none")]
1184 pub first_id: Option<String>,
1185 #[serde(skip_serializing_if = "Option::is_none")]
1186 pub last_id: Option<String>,
1187 pub has_more: bool,
1188}