| |
|
|
| use serde::{Deserialize, Serialize}; |
| use serde_json::Value; |
|
|
| #[derive(Debug, Clone, Serialize, Deserialize, Default)] |
| pub struct OpenAIRequest { |
| pub model: String, |
| #[serde(default)] |
| pub messages: Vec<OpenAIMessage>, |
| #[serde(default)] |
| pub prompt: Option<String>, |
| #[serde(default)] |
| pub stream: bool, |
| #[serde(default)] |
| pub n: Option<u32>, |
| #[serde(rename = "max_tokens")] |
| pub max_tokens: Option<u32>, |
| pub temperature: Option<f64>, |
| #[serde(rename = "top_p")] |
| pub top_p: Option<f64>, |
| pub stop: Option<Value>, |
| pub response_format: Option<ResponseFormat>, |
| #[serde(default)] |
| pub tools: Option<Vec<Value>>, |
| #[serde(rename = "tool_choice")] |
| pub tool_choice: Option<Value>, |
| #[serde(rename = "parallel_tool_calls")] |
| pub parallel_tool_calls: Option<bool>, |
| |
| pub instructions: Option<String>, |
| pub input: Option<Value>, |
| |
| #[serde(default)] |
| pub size: Option<String>, |
| #[serde(default)] |
| pub quality: Option<String>, |
| #[serde(default, rename = "personGeneration")] |
| pub person_generation: Option<String>, |
| |
| #[serde(default)] |
| pub thinking: Option<ThinkingConfig>, |
| |
| #[serde(default, rename = "imageSize")] |
| pub image_size: Option<String>, |
| } |
|
|
| |
| #[derive(Debug, Clone, Serialize, Deserialize, Default)] |
| pub struct ThinkingConfig { |
| #[serde(rename = "type")] |
| pub thinking_type: Option<String>, |
| #[serde(rename = "budget_tokens", alias = "budgetTokens")] |
| pub budget_tokens: Option<u32>, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub effort: Option<String>, |
| } |
|
|
|
|
| #[derive(Debug, Clone, Serialize, Deserialize)] |
| pub struct ResponseFormat { |
| pub r#type: String, |
| } |
|
|
| #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] |
| #[serde(untagged)] |
| pub enum OpenAIContent { |
| String(String), |
| Array(Vec<OpenAIContentBlock>), |
| } |
|
|
| #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] |
| #[serde(tag = "type")] |
| pub enum OpenAIContentBlock { |
| #[serde(rename = "text", alias = "input_text")] |
| Text { text: String }, |
| #[serde(rename = "image_url")] |
| ImageUrl { image_url: OpenAIImageUrl }, |
| #[serde(rename = "audio_url")] |
| AudioUrl { audio_url: AudioUrlContent }, |
| } |
|
|
| #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] |
| pub struct OpenAIImageUrl { |
| pub url: String, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub detail: Option<String>, |
| } |
|
|
| #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] |
| pub struct AudioUrlContent { |
| pub url: String, |
| } |
|
|
| #[derive(Debug, Clone, Serialize, Deserialize)] |
| pub struct OpenAIMessage { |
| pub role: String, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub content: Option<OpenAIContent>, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub reasoning_content: Option<String>, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub tool_calls: Option<Vec<ToolCall>>, |
| #[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, Clone, Serialize, Deserialize)] |
| pub struct ToolCall { |
| pub id: String, |
| pub r#type: String, |
| pub function: ToolFunction, |
| } |
|
|
| #[derive(Debug, Clone, Serialize, Deserialize)] |
| pub struct ToolFunction { |
| pub name: String, |
| pub arguments: String, |
| } |
|
|
| #[derive(Debug, Clone, Serialize, Deserialize)] |
| pub struct OpenAIResponse { |
| pub id: String, |
| pub object: String, |
| pub created: u64, |
| pub model: String, |
| pub choices: Vec<Choice>, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub usage: Option<OpenAIUsage>, |
| } |
|
|
| #[derive(Debug, Clone, Serialize, Deserialize)] |
| pub struct Choice { |
| pub index: u32, |
| pub message: OpenAIMessage, |
| pub finish_reason: Option<String>, |
| } |
|
|
| #[derive(Debug, Clone, Serialize, Deserialize)] |
| pub struct OpenAIUsage { |
| pub prompt_tokens: u32, |
| pub completion_tokens: u32, |
| pub total_tokens: u32, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub prompt_tokens_details: Option<PromptTokensDetails>, |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub completion_tokens_details: Option<CompletionTokensDetails>, |
| } |
|
|
| #[derive(Debug, Clone, Serialize, Deserialize)] |
| pub struct PromptTokensDetails { |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub cached_tokens: Option<u32>, |
| } |
|
|
| #[derive(Debug, Clone, Serialize, Deserialize)] |
| pub struct CompletionTokensDetails { |
| #[serde(skip_serializing_if = "Option::is_none")] |
| pub reasoning_tokens: Option<u32>, |
| } |
|
|