use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct Usage {
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_secs: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completion_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completion_secs: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completion_per_token_secs: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completion_tps: Option<f64>,
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(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct InputTokensDetails {
pub cached_tokens: u32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct OutputTokensDetails {
pub reasoning_tokens: u32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct PromptTokensDetails {
#[serde(skip_serializing_if = "Option::is_none")]
pub audio_tokens: Option<u32>,
pub cached_tokens: u32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct CompletionTokensDetails {
pub reasoning_tokens: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub audio_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub accepted_prediction_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rejected_prediction_tokens: Option<u32>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct ResponseWrapper<T> {
pub data: T,
pub headers: Headers,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct Headers {
#[serde(rename = "x-ratelimit-limit-requests")]
pub x_ratelimit_limit_requests: Option<u32>,
#[serde(rename = "x-ratelimit-limit-tokens")]
pub x_ratelimit_limit_tokens: Option<u32>,
#[serde(rename = "x-ratelimit-remaining-requests")]
pub x_ratelimit_remaining_requests: Option<u32>,
#[serde(rename = "x-ratelimit-remaining-tokens")]
pub x_ratelimit_remaining_tokens: Option<u32>,
#[serde(rename = "x-ratelimit-reset-requests")]
pub x_ratelimit_reset_requests: Option<String>,
#[serde(rename = "x-ratelimit-reset-tokens")]
pub x_ratelimit_reset_tokens: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct SimpleListParameters {
pub after: Option<String>,
pub limit: Option<u32>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct ListParameters {
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub after: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub before: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct ListResponse<T> {
pub object: String,
pub data: Vec<T>,
pub first_id: Option<String>,
pub last_id: Option<String>,
pub has_more: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct DeletedObject {
pub id: String,
pub object: String,
pub deleted: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct LastError {
pub code: LastErrorCode,
pub message: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum LastErrorCode {
ServerError,
RateLimitExceeded,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum FinishReason {
#[serde(rename = "stop", alias = "STOP")]
StopSequenceReached,
#[serde(rename = "length", alias = "MAX_TOKENS")]
TokenLimitReached,
#[serde(
rename = "content_filter",
alias = "SAFETY",
alias = "SPII",
alias = "PROHIBITED_CONTENT",
alias = "BLOCKLIST",
alias = "RECITATION"
)]
ContentFilterFlagged,
ToolCalls,
EndTurn,
#[serde(rename = "FINISH_REASON_UNSPECIFIED ")]
Unspecified,
#[serde(rename = "MALFORMED_FUNCTION_CALL")]
MalformedFunctionCall,
#[serde(rename = "OTHER")]
Other,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ReasoningEffort {
High,
Medium,
Low,
Minimal,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum WebSearchContextSize {
Low,
Medium,
Large,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(untagged)]
pub enum StopToken {
String(String),
Array(Vec<String>),
}