use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct Usage { /// Number of tokens in the prompt. #[serde(skip_serializing_if = "Option::is_none")] pub prompt_tokens: Option, /// Number of tokens in the prompt. #[serde(skip_serializing_if = "Option::is_none")] pub prompt_secs: Option, /// Number of tokens in the completion. #[serde(skip_serializing_if = "Option::is_none")] pub completion_tokens: Option, #[serde(skip_serializing_if = "Option::is_none")] pub completion_secs: Option, #[serde(skip_serializing_if = "Option::is_none")] pub completion_per_token_secs: Option, #[serde(skip_serializing_if = "Option::is_none")] pub completion_tps: Option, /// Number of tokens in the entire response. pub total_tokens: u32, /// Breakdown of tokens used in the prompt. #[serde(skip_serializing_if = "Option::is_none")] pub prompt_tokens_details: Option, /// Breakdown of tokens used in a completion. #[serde(skip_serializing_if = "Option::is_none")] pub completion_tokens_details: Option, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct InputTokensDetails { /// The number of tokens that were retrieved from the cache. pub cached_tokens: u32, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct OutputTokensDetails { /// The number of reasoning tokens. pub reasoning_tokens: u32, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct PromptTokensDetails { /// Audio input tokens present in the prompt. #[serde(skip_serializing_if = "Option::is_none")] pub audio_tokens: Option, /// Cached tokens present in the prompt. pub cached_tokens: u32, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct CompletionTokensDetails { /// Tokens generated by the model for reasoning. pub reasoning_tokens: u32, /// Audio input tokens generated by the model. #[serde(skip_serializing_if = "Option::is_none")] pub audio_tokens: Option, /// When using Predicted Outputs, the number of tokens in the prediction that appeared in the completion. #[serde(skip_serializing_if = "Option::is_none")] pub accepted_prediction_tokens: Option, /// When using Predicted Outputs, the number of tokens in the prediction that did not appear in the completion. #[serde(skip_serializing_if = "Option::is_none")] pub rejected_prediction_tokens: Option, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct ResponseWrapper { pub data: T, pub headers: Headers, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct Headers { /// The maximum number of requests that are permitted before exhausting the rate limit. #[serde(rename = "x-ratelimit-limit-requests")] pub x_ratelimit_limit_requests: Option, /// The maximum number of tokens that are permitted before exhausting the rate limit. #[serde(rename = "x-ratelimit-limit-tokens")] pub x_ratelimit_limit_tokens: Option, /// The remaining number of requests that are permitted before exhausting the rate limit. #[serde(rename = "x-ratelimit-remaining-requests")] pub x_ratelimit_remaining_requests: Option, /// The remaining number of tokens that are permitted before exhausting the rate limit. #[serde(rename = "x-ratelimit-remaining-tokens")] pub x_ratelimit_remaining_tokens: Option, /// The time until the rate limit (based on requests) resets to its initial state. #[serde(rename = "x-ratelimit-reset-requests")] pub x_ratelimit_reset_requests: Option, /// The time until the rate limit (based on tokens) resets to its initial state. #[serde(rename = "x-ratelimit-reset-tokens")] pub x_ratelimit_reset_tokens: Option, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct SimpleListParameters { /// Identifier for the last object from the previous pagination request. pub after: Option, /// Number of objects to retrieve. pub limit: Option, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct ListParameters { /// A limit on the number of objects to be returned. Limit can range between 1 and 100, and the default is 20. #[serde(skip_serializing_if = "Option::is_none")] pub limit: Option, /// Sort order by the created_at timestamp of the objects. asc for ascending order and desc for descending order. #[serde(skip_serializing_if = "Option::is_none")] pub order: Option, /// A cursor for use in pagination. after is an object ID that defines your place in the list. #[serde(skip_serializing_if = "Option::is_none")] pub after: Option, /// A cursor for use in pagination. before is an object ID that defines your place in the list. #[serde(skip_serializing_if = "Option::is_none")] pub before: Option, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct ListResponse { // The object type, which is always "list". pub object: String, /// The list ob objects. pub data: Vec, /// The ID of the first objects in the list. pub first_id: Option, /// The ID of the last objects in the list. pub last_id: Option, /// Indicates whether there are more objects to retrieve. pub has_more: bool, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct DeletedObject { /// ID of the deleted object. pub id: String, /// The object type. pub object: String, /// Indicates whether the file was successfully deleted. pub deleted: bool, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct LastError { /// One of 'server_error' or 'rate_limit_exceeded'. pub code: LastErrorCode, /// A human-readable description of the error. 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 { /// API returned complete message, or a message terminated by one of the stop sequences provided via the stop parameter. #[serde(rename = "stop", alias = "STOP")] StopSequenceReached, /// Incomplete model output due to max_tokens parameter or token limit. #[serde(rename = "length", alias = "MAX_TOKENS")] TokenLimitReached, /// Omitted content due to a flag from our content filters. #[serde( rename = "content_filter", alias = "SAFETY", alias = "SPII", alias = "PROHIBITED_CONTENT", alias = "BLOCKLIST", alias = "RECITATION" )] ContentFilterFlagged, /// The model decided to call one or more tools. ToolCalls, /// The model reached a natural stopping point. [Claude] EndTurn, /// The finish reason is unspecified. [Gemini] #[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), }