//! OpenAI API 数据模型 //! //! 用于 OpenAI Chat Completions API 的请求/响应格式转换 use serde::{Deserialize, Serialize}; use serde_json::Value; /// OpenAI 请求 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct OpenAIRequest { pub model: String, pub messages: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub max_tokens: Option, #[serde(skip_serializing_if = "Option::is_none")] pub temperature: Option, #[serde(skip_serializing_if = "Option::is_none")] pub stream: Option, #[serde(skip_serializing_if = "Option::is_none")] pub tools: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub tool_choice: Option, } /// OpenAI 消息 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct OpenAIMessage { pub role: String, #[serde(skip_serializing_if = "Option::is_none")] pub content: Option, // String 或 Vec #[serde(skip_serializing_if = "Option::is_none")] pub tool_calls: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub tool_call_id: Option, } /// OpenAI 内容部分 #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(tag = "type")] pub enum OpenAIContentPart { #[serde(rename = "text")] Text { text: String }, #[serde(rename = "image_url")] ImageUrl { image_url: ImageUrl }, } /// 图片 URL #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ImageUrl { pub url: String, } /// OpenAI 工具调用 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct OpenAIToolCall { pub id: String, #[serde(rename = "type")] pub call_type: String, pub function: OpenAIFunction, } /// OpenAI 函数 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct OpenAIFunction { pub name: String, pub arguments: String, // JSON 字符串 } /// OpenAI 工具定义 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct OpenAITool { #[serde(rename = "type")] pub tool_type: String, pub function: OpenAIFunctionDef, } /// OpenAI 函数定义 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct OpenAIFunctionDef { pub name: String, #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, pub parameters: Value, } /// OpenAI 响应 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct OpenAIResponse { pub id: String, pub object: String, pub created: u64, pub model: String, pub choices: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub usage: Option, } /// OpenAI 选择 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct OpenAIChoice { pub index: u32, pub message: OpenAIMessage, #[serde(skip_serializing_if = "Option::is_none")] pub finish_reason: Option, } /// OpenAI 使用量 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct OpenAIUsage { pub prompt_tokens: u32, pub completion_tokens: u32, pub total_tokens: u32, }