use macon::Builder;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::{
InputItem, MessageStatus, Model, ReasoningConfig, Role, ServiceTier, TextConfig, Tool,
ToolChoice, Truncation,
};
#[derive(Debug, Clone, Builder, Serialize, Deserialize)]
pub struct Request {
pub model: Model,
pub input: Input,
pub include: Option<Vec<Include>>,
pub instructions: Option<String>,
pub max_output_tokens: Option<u64>,
pub metadata: Option<HashMap<String, String>>,
pub parallel_tool_calls: Option<bool>,
pub previous_response_id: Option<String>,
pub reasoning: Option<ReasoningConfig>,
pub service_tier: Option<ServiceTier>,
pub store: Option<bool>,
#[doc(hidden)]
pub stream: Option<bool>,
pub temperature: Option<f32>,
pub text: Option<TextConfig>,
pub tool_choice: Option<ToolChoice>,
pub tools: Option<Vec<Tool>>,
pub top_p: Option<f32>,
pub truncation: Option<Truncation>,
pub user: Option<String>,
}
impl Default for Request {
fn default() -> Self {
Self {
user: None,
text: None,
tools: None,
store: None,
top_p: None,
stream: None,
include: None,
metadata: None,
reasoning: None,
truncation: None,
tool_choice: None,
temperature: None,
instructions: None,
service_tier: None,
model: Model::GPT4o,
max_output_tokens: None,
parallel_tool_calls: None,
previous_response_id: None,
input: Input::Text(String::new()),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Input {
Text(String),
List(Vec<InputListItem>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum InputListItem {
Message(InputMessage),
#[serde(rename = "item_reference")]
ItemRef {
id: String,
},
#[serde(untagged)]
Item(InputItem),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputMessage {
pub role: Role,
pub content: ContentInput,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ContentInput {
Text(String),
List(Vec<ContentItem>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct APIInputMessage {
pub role: Role,
pub content: ContentItem,
pub status: Option<MessageStatus>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ContentItem {
#[serde(rename = "input_text")]
Text { text: String },
#[serde(rename = "input_image")]
Image {
detail: ImageDetail,
file_id: Option<String>,
image_url: Option<String>,
},
#[serde(rename = "input_file")]
File {
file_data: Option<String>,
file_id: Option<String>,
filename: Option<String>,
},
}
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ImageDetail {
#[default]
Auto,
Low,
High,
Medium,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Include {
#[serde(rename = "file_search_call.results")]
FileSearchResults,
#[serde(rename = "message.input_image.image_url")]
InputImageURLs,
#[serde(rename = "computer_call_output.output.image_url")]
ComputerCallImageURLs,
}