use std::collections::BTreeMap;
use runtime_types::{ConversationId, RuntimeInstanceId, WorkspaceId};
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OpenAiResponseRequest {
pub model: String,
pub input: Value,
#[serde(default)]
pub instructions: Option<Value>,
#[serde(default)]
pub max_output_tokens: Option<u32>,
#[serde(default)]
pub background: bool,
#[serde(default)]
pub stream: bool,
#[serde(default)]
pub metadata: BTreeMap<String, String>,
#[serde(default)]
pub tools: Vec<Value>,
#[serde(default)]
pub tool_choice: Option<Value>,
#[serde(default)]
pub previous_response_id: Option<String>,
#[serde(default)]
pub conversation: Option<Value>,
#[serde(default)]
pub reasoning: Option<Value>,
#[serde(default)]
pub temperature: Option<f64>,
#[serde(default)]
pub top_p: Option<f64>,
#[serde(default)]
pub store: Option<bool>,
#[serde(default)]
pub include: Vec<String>,
#[serde(default)]
pub text: Option<Value>,
#[serde(default)]
pub truncation: Option<String>,
#[serde(default)]
pub safety_identifier: Option<String>,
#[serde(default)]
pub prompt_cache_key: Option<String>,
#[serde(default)]
pub agent: Option<OpenAiAgentOptions>,
#[serde(default, flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct OpenAiAgentOptions {
#[serde(default)]
pub runtime_id: Option<RuntimeInstanceId>,
#[serde(default)]
pub workspace_id: Option<WorkspaceId>,
#[serde(default)]
pub conversation_id: Option<ConversationId>,
#[serde(default)]
pub downstream_model: Option<String>,
#[serde(default)]
pub deadline_seconds: Option<u64>,
#[serde(default)]
pub max_model_turns: Option<usize>,
#[serde(default)]
pub max_tool_calls: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OpenAiResponse {
pub id: String,
pub object: String,
pub created_at: i64,
pub status: String,
pub completed_at: Option<i64>,
pub error: Option<OpenAiResponseError>,
pub incomplete_details: Option<Value>,
pub instructions: Option<Value>,
pub max_output_tokens: Option<u32>,
pub model: String,
pub output: Vec<OpenAiOutputItem>,
pub parallel_tool_calls: bool,
pub previous_response_id: Option<String>,
pub tool_choice: Value,
pub tools: Vec<Value>,
pub metadata: BTreeMap<String, String>,
pub usage: Option<OpenAiUsage>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OpenAiOutputItem {
pub id: String,
#[serde(rename = "type")]
pub item_type: String,
pub status: String,
pub role: String,
pub content: Vec<OpenAiOutputContent>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OpenAiOutputContent {
#[serde(rename = "type")]
pub content_type: String,
pub text: String,
pub annotations: Vec<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct OpenAiUsage {
pub input_tokens: u64,
pub input_tokens_details: OpenAiInputTokensDetails,
pub output_tokens: u64,
pub output_tokens_details: OpenAiOutputTokensDetails,
pub total_tokens: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct OpenAiInputTokensDetails {
pub cached_tokens: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct OpenAiOutputTokensDetails {
pub reasoning_tokens: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct OpenAiResponseError {
pub code: String,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct OpenAiErrorEnvelope {
pub error: OpenAiError,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct OpenAiError {
pub message: String,
#[serde(rename = "type")]
pub error_type: String,
pub param: Option<String>,
pub code: Option<String>,
}