use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::v1::resources::shared::{ReasoningEffort, Usage};
use super::{
items::{FileSearchToolCall, FunctionToolCall, Reasoning, WebSearchToolCall},
shared::{Annotation, ResponseFormat, ResponseTool, ResponseToolChoice, TruncationStrategy},
};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct ResponseObject {
pub created_at: u32,
pub error: Option<ResponseError>,
pub id: String,
pub incomplete_details: Option<IncompleteDetails>,
pub instruction: Option<String>,
pub max_output_tokens: Option<u32>,
pub metadata: Option<HashMap<String, String>>,
pub model: String,
pub object: String,
pub output: Vec<ResponseOutput>,
pub parallel_tool_calls: Option<bool>,
pub previous_response_id: Option<String>,
pub reasoning: Option<ResponseReasoning>,
pub status: ReasoningStatus,
pub temperature: Option<f32>,
pub text: Option<ResponseText>,
pub tool_choice: Option<ResponseToolChoice>,
pub tools: Vec<ResponseTool>,
pub top_p: Option<f32>,
pub truncation: Option<TruncationStrategy>,
pub usage: Usage,
pub user: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct ResponseError {
pub code: String,
pub message: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct IncompleteDetails {
pub reason: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponseOutput {
Message(OutputMessage),
#[serde(rename = "function_call")]
FunctionToolCall(FunctionToolCall),
#[serde(rename = "file_search_call")]
FileSearchToolCall(FileSearchToolCall),
#[serde(rename = "web_search_call")]
WebSearchToolCall(WebSearchToolCall),
Reasoning(Reasoning),
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct OutputMessage {
pub id: String,
pub role: Role,
pub status: MessageStatus,
pub content: Vec<OutputContent>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct ResponseReasoning {
pub effort: Option<ReasoningEffort>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct ResponseText {
pub format: ResponseFormat,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ReasoningSummary {
Concise,
Detailed,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ReasoningStatus {
Completed,
Failed,
InProgress,
Incomplete,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum Role {
User,
System,
Assistant,
Developer,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum MessageStatus {
InProgress,
Completed,
Incomplete,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(tag = "type")]
pub enum OutputContent {
#[serde(rename = "output_text")]
Text {
text: String,
annotations: Vec<Annotation>,
},
#[serde(rename = "refusal")]
Refusal { refusal: String },
}