use crate::v1::resources::response::items::{ComputerToolCallOutput, InputItemStatus};
use crate::v1::resources::response::shared::Annotation;
use crate::v1::resources::shared::WebSearchContextSize;
use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::{
items::{
ComputerToolCall, FileSearchToolCall, FunctionToolCall, FunctionToolCallOutput, Reasoning,
WebSearchToolCall,
},
response::{ResponseReasoning, ResponseText, Role},
shared::{ResponseTool, ResponseToolChoice, TruncationStrategy, WebSearchUserLocation},
};
#[derive(Serialize, Deserialize, Debug, Default, Builder, Clone, PartialEq)]
#[builder(name = "ResponseParametersBuilder")]
#[builder(setter(into, strip_option), default)]
pub struct ResponseParameters {
pub input: ResponseInput,
pub model: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub background: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt: Option<Prompt>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include: Option<Vec<ResponseInclude>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_output_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parallel_tool_calls: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub previous_response_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning: Option<ResponseReasoning>,
#[serde(skip_serializing_if = "Option::is_none")]
pub store: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<ResponseText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<ResponseToolChoice>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<ResponseTool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_logprobs: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub truncation: Option<TruncationStrategy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_tier: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct InputMessage {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<InputItemStatus>,
pub role: Role,
pub content: ContentInput,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct Prompt {
pub id: String,
pub version: Option<String>,
pub variables: Option<HashMap<String, String>>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(untagged)]
pub enum ContentInput {
Text(String),
List(Vec<ContentItem>),
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(tag = "type")]
pub enum ContentItem {
#[serde(rename = "input_text")]
Text {
text: String,
},
#[serde(rename = "input_image")]
Image {
detail: ImageDetailLevel,
file_id: Option<String>,
image_url: Option<String>,
},
#[serde(rename = "input_file")]
File {
file_data: Option<String>,
file_id: Option<String>,
filename: Option<String>,
},
#[serde(rename = "output_text")]
OutputText {
text: String,
annotations: Vec<Annotation>,
},
Refusal {
refusal: String,
},
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(untagged)]
pub enum ResponseInput {
Text(String),
List(Vec<ResponseInputItem>),
}
impl Default for ResponseInput {
fn default() -> Self {
ResponseInput::Text(String::new())
}
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponseInputItem {
Message(InputMessage),
ItemReference {
id: String,
},
#[serde(rename = "file_search_call")]
FileSearchToolCall(FileSearchToolCall),
#[serde(rename = "computer_call")]
ComputerToolCall(ComputerToolCall),
#[serde(rename = "computer_call_output")]
ComputerToolCallOutput(ComputerToolCallOutput),
#[serde(rename = "web_search_call")]
WebSearchToolCall(WebSearchToolCall),
#[serde(rename = "function_call")]
FunctionToolCall(FunctionToolCall),
#[serde(rename = "function_call_output")]
FunctionToolCallOutput(FunctionToolCallOutput),
#[serde(rename = "reasoning")]
Reasoning(Reasoning),
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct WebSearchOption {
pub search_context_size: Option<WebSearchContextSize>,
pub user_location: Option<WebSearchUserLocation>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub enum ResponseInclude {
#[serde(rename = "file_search_call.results")]
FileSearchCallResults,
#[serde(rename = "message.input_image.image_url")]
MessageInputImageUrls,
#[serde(rename = "computer_call_output.output.image_url")]
ComputerCallOutputOutputImageUrls,
#[serde(rename = "message.output_text.logprobs")]
MessageOutputTextLogprobs,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ImageDetailLevel {
High,
Low,
Auto,
}