use crate::types::{Acceleration, Image};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionMessage {
pub role: String,
#[serde(default)]
pub content: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct PromptTokensDetails {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub audio_tokens: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cache_write_tokens: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cached_tokens: Option<u64>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ChatCompletionUsage {
pub prompt_tokens: u64,
pub completion_tokens: u64,
pub total_tokens: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prompt_tokens_details: Option<PromptTokensDetails>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionChoice {
pub index: usize,
pub message: ChatCompletionMessage,
#[serde(default)]
pub finish_reason: Option<String>,
#[serde(default)]
pub logprobs: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletion {
pub object: String,
pub id: String,
pub model: String,
pub choices: Vec<ChatCompletionChoice>,
pub created: u64,
#[serde(default)]
pub usage: Option<ChatCompletionUsage>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ChatCompletionDelta {
#[serde(default)]
pub role: Option<String>,
#[serde(default)]
pub content: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionChunkChoice {
pub index: usize,
#[serde(default)]
pub delta: Option<ChatCompletionDelta>,
#[serde(default)]
pub finish_reason: Option<String>,
#[serde(default)]
pub logprobs: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionChunk {
pub object: String,
pub id: String,
pub model: String,
pub choices: Vec<ChatCompletionChunkChoice>,
pub created: u64,
#[serde(default)]
pub usage: Option<ChatCompletionUsage>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ChatCompletionReasoningEffort {
#[serde(rename = "minimal")]
Minimal,
#[serde(rename = "low")]
Low,
#[serde(rename = "medium")]
Medium,
#[serde(rename = "high")]
High,
#[serde(rename = "xhigh")]
XHigh,
}
impl ChatCompletionReasoningEffort {
pub fn as_str(self) -> &'static str {
match self {
Self::Minimal => "minimal",
Self::Low => "low",
Self::Medium => "medium",
Self::High => "high",
Self::XHigh => "xhigh",
}
}
}
#[derive(Debug, Clone, Default)]
pub struct ChatCompletionCreateParams {
pub model: String,
pub messages: Vec<ChatCompletionMessage>,
pub response_format: Option<serde_json::Map<String, serde_json::Value>>,
pub reasoning_effort: Option<ChatCompletionReasoningEffort>,
pub max_completion_tokens: Option<i32>,
pub temperature: Option<f32>,
pub top_p: Option<f32>,
pub frequency_penalty: Option<f32>,
pub presence_penalty: Option<f32>,
pub acceleration: Option<Acceleration>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum EmbeddingData {
Float(Vec<f32>),
Base64(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Embedding {
pub object: String,
pub embedding: EmbeddingData,
pub index: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbeddingUsage {
pub prompt_tokens: u64,
pub total_tokens: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbeddingCreateResponse {
pub object: String,
pub model: String,
pub data: Vec<Embedding>,
pub usage: EmbeddingUsage,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImageData {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub b64_json: Option<String>,
#[serde(skip)]
pub image: Option<Image>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImageUsage {
pub input_tokens: u64,
pub output_tokens: u64,
pub total_tokens: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImageResponse {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub data: Option<Vec<ImageData>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub background: Option<String>,
pub created: i64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub usage: Option<ImageUsage>,
}