use std::collections::BTreeMap;
use http::StatusCode;
use serde::{Deserialize, Serialize};
use crate::openai::create_response::types::{
Metadata, Model, OpenAiApiErrorResponse, OpenAiResponseHeaders, ResponseConversationParam,
ResponseError, ResponseIncompleteDetails, ResponseInput, ResponseObject, ResponseOutputItem,
ResponsePrompt, ResponsePromptCacheRetention, ResponseReasoning, ResponseServiceTier,
ResponseStatus, ResponseTextConfig, ResponseTool, ResponseToolChoice, ResponseTruncation,
ResponseUsage,
};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ResponseBody {
pub id: String,
pub created_at: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<ResponseError>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub incomplete_details: Option<ResponseIncompleteDetails>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instructions: Option<ResponseInput>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub metadata: Metadata,
pub model: Model,
pub object: ResponseObject,
pub output: Vec<ResponseOutputItem>,
pub parallel_tool_calls: bool,
pub temperature: f64,
pub tool_choice: ResponseToolChoice,
pub tools: Vec<ResponseTool>,
pub top_p: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub background: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub conversation: Option<ResponseConversationParam>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_output_tokens: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_tool_calls: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub output_text: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub previous_response_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prompt: Option<ResponsePrompt>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prompt_cache_key: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prompt_cache_retention: Option<ResponsePromptCacheRetention>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reasoning: Option<ResponseReasoning>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub safety_identifier: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub service_tier: Option<ResponseServiceTier>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status: Option<ResponseStatus>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub text: Option<ResponseTextConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub top_logprobs: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub truncation: Option<ResponseTruncation>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub usage: Option<ResponseUsage>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
#[allow(clippy::large_enum_variant)]
pub enum OpenAiCreateResponseResponse {
Success {
#[serde(with = "crate::openai::types::status_code_serde")]
stats_code: StatusCode,
headers: OpenAiResponseHeaders,
body: ResponseBody,
},
Error {
#[serde(with = "crate::openai::types::status_code_serde")]
stats_code: StatusCode,
headers: OpenAiResponseHeaders,
body: OpenAiApiErrorResponse,
},
}