use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize)]
pub struct OpenAiChatRequest {
pub model: String,
pub messages: Vec<OpenAiMessage>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub tools: Vec<OpenAiToolDef>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_format: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<u32>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub stop: Vec<String>,
pub stream: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OpenAiMessage {
pub role: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<OpenAiToolCall>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_call_id: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct OpenAiToolDef {
#[serde(rename = "type")]
pub kind: String,
pub function: OpenAiFunctionDef,
}
#[derive(Debug, Clone, Serialize)]
pub struct OpenAiFunctionDef {
pub name: String,
pub description: String,
pub parameters: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OpenAiToolCall {
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub index: Option<usize>,
#[serde(rename = "type")]
pub kind: Option<String>,
pub function: OpenAiFunctionCall,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OpenAiFunctionCall {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiChatResponse {
pub id: String,
pub model: String,
pub choices: Vec<OpenAiChatChoice>,
pub usage: Option<OpenAiUsage>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiChatChoice {
pub index: u32,
pub message: OpenAiMessage,
pub finish_reason: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiUsage {
pub prompt_tokens: u64,
pub completion_tokens: u64,
pub total_tokens: u64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiStreamChunk {
pub id: Option<String>,
pub model: Option<String>,
pub choices: Vec<OpenAiStreamChoice>,
pub usage: Option<OpenAiUsage>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiStreamChoice {
pub index: u32,
pub delta: OpenAiDelta,
pub finish_reason: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiDelta {
pub role: Option<String>,
pub content: Option<String>,
pub tool_calls: Option<Vec<OpenAiToolCall>>,
}
#[derive(Debug, Clone, Serialize)]
pub struct OpenAiEmbeddingRequest {
pub model: String,
pub input: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dimensions: Option<u32>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiEmbeddingResponse {
pub model: String,
pub data: Vec<OpenAiEmbeddingData>,
pub usage: Option<OpenAiUsage>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiEmbeddingData {
pub index: usize,
pub embedding: Vec<f32>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiErrorBody {
pub error: Option<OpenAiErrorDetail>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiErrorDetail {
pub message: Option<String>,
#[serde(rename = "type")]
pub kind: Option<String>,
}