use serde::{Deserialize, Serialize};
use super::common::Role;
use super::response::ResponseAnnotation;
#[derive(Debug, Clone, Deserialize, Serialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ResponseOutputContent {
#[serde(rename = "type")]
pub type_: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub annotations: Option<Vec<ResponseAnnotation>>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ResponseOutputItem {
#[serde(rename = "type")]
pub type_: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<Role>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<Vec<ResponseOutputContent>>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub call_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
#[serde(tag = "type")]
#[non_exhaustive]
pub enum OutputItem {
#[serde(rename = "message")]
Message {
#[serde(default)]
id: Option<String>,
#[serde(default)]
role: Option<Role>,
#[serde(default)]
content: Option<Vec<ResponseOutputContent>>,
#[serde(default)]
status: Option<String>,
},
#[serde(rename = "function_call")]
FunctionCall(FunctionToolCall),
#[serde(rename = "reasoning")]
Reasoning(ReasoningItem),
#[serde(rename = "web_search_call")]
WebSearchCall(serde_json::Value),
#[serde(rename = "file_search_call")]
FileSearchCall(serde_json::Value),
#[serde(other)]
Other,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct FunctionToolCall {
pub arguments: String,
pub call_id: String,
pub name: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ReasoningItem {
pub id: String,
pub summary: Vec<SummaryPart>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<Vec<ReasoningContent>>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub encrypted_content: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
#[serde(tag = "type")]
#[non_exhaustive]
pub enum SummaryPart {
#[serde(rename = "summary_text")]
SummaryText(SummaryTextContent),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct SummaryTextContent {
pub text: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct ReasoningContent {
pub text: String,
#[serde(rename = "type")]
#[serde(default = "default_reasoning_text_type")]
pub type_: String,
}
fn default_reasoning_text_type() -> String {
"reasoning_text".to_string()
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "structured", derive(schemars::JsonSchema))]
pub struct FunctionCall {
pub call_id: String,
pub name: String,
pub arguments: serde_json::Value,
}