use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Deserialize)]
pub struct ResponsesRequest {
pub model: String,
pub input: ResponsesInput,
#[serde(default)]
pub previous_response_id: Option<String>,
#[serde(default)]
pub tools: Vec<Value>,
#[serde(default)]
pub stream: bool,
#[serde(default)]
pub temperature: Option<f64>,
#[serde(default)]
pub max_output_tokens: Option<u32>,
#[serde(default)]
pub system: Option<String>,
#[serde(default)]
pub instructions: Option<String>,
}
#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub enum ResponsesInput {
Text(String),
Messages(Vec<Value>),
}
#[derive(Debug, Deserialize, Clone, Serialize)]
pub struct ContentPart {
#[serde(rename = "type")]
pub kind: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
}
#[derive(Debug, Serialize)]
pub struct ResponsesResponse {
pub id: String,
pub object: &'static str,
pub model: String,
pub output: Vec<ResponsesOutputItem>,
pub usage: ResponsesUsage,
}
#[derive(Debug, Serialize)]
pub struct ResponsesOutputItem {
#[serde(rename = "type")]
pub kind: String,
pub role: String,
pub content: Vec<ContentPart>,
}
#[derive(Debug, Serialize, Default)]
pub struct ResponsesUsage {
pub input_tokens: u32,
pub output_tokens: u32,
pub total_tokens: u32,
}
#[derive(Debug, Serialize)]
pub struct ChatRequest {
pub model: String,
pub messages: Vec<ChatMessage>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub tools: Vec<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<u32>,
pub stream: bool,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ChatMessage {
pub role: String,
pub content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning_content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_call_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct ChatResponse {
pub choices: Vec<ChatChoice>,
#[serde(default)]
pub usage: Option<ChatUsage>,
}
#[derive(Debug, Deserialize)]
pub struct ChatChoice {
pub message: ChatMessage,
}
#[derive(Debug, Deserialize)]
pub struct ChatUsage {
pub prompt_tokens: u32,
pub completion_tokens: u32,
pub total_tokens: u32,
}
#[derive(Debug, Deserialize)]
pub struct ChatStreamChunk {
pub choices: Vec<ChatStreamChoice>,
#[serde(default)]
#[allow(dead_code)]
pub usage: Option<ChatUsage>,
}
#[derive(Debug, Deserialize)]
pub struct ChatStreamChoice {
pub delta: ChatDelta,
#[allow(dead_code)]
pub finish_reason: Option<String>,
}
#[derive(Debug, Deserialize, Default)]
pub struct ChatDelta {
#[allow(dead_code)]
pub role: Option<String>,
pub content: Option<String>,
#[serde(default)]
pub reasoning_content: Option<String>,
#[serde(default)]
pub tool_calls: Option<Vec<DeltaToolCall>>,
}
#[derive(Debug, Deserialize, Default)]
pub struct DeltaToolCall {
pub index: usize,
#[serde(default)]
pub id: Option<String>,
#[serde(default)]
pub function: Option<DeltaFunction>,
}
#[derive(Debug, Deserialize, Default)]
pub struct DeltaFunction {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub arguments: Option<String>,
}