use super::*;
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
pub struct Usage {
pub completion_tokens: u64,
pub prompt_tokens: u64,
pub prompt_cache_hit_tokens: u64,
pub prompt_cache_miss_tokens: u64,
pub total_tokens: u64,
pub completion_tokens_details: Option<CompletionTokensDetails>,
}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
pub struct CompletionTokensDetails {
pub reasoning_tokens: u64,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct ChatGeneric<C> {
pub id: String,
pub choices: Vec<C>,
pub created: u64,
pub model: String,
pub system_fingerprint: String,
pub object: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage: Option<Usage>,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct ChatChoice {
pub finish_reason: FinishReason,
pub index: u64,
pub message: ChoiceMessage,
#[serde(skip_serializing_if = "Option::is_none")]
pub logprobs: Option<Logprobs>,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct ChatChoiceStream {
pub finish_reason: Option<FinishReason>,
pub index: u64,
pub delta: ChoiceMessageDelta,
#[serde(skip_serializing_if = "Option::is_none")]
pub logprobs: Option<Logprobs>,
}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
pub struct ChoiceMessage {
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning_content: Option<String>,
#[serde(skip_serializing_if = "is_none_or_empty_vec")]
pub tool_calls: Option<Vec<ToolCall>>,
pub role: Role,
}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
pub struct ChoiceMessageDelta {
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning_content: Option<String>,
#[serde(skip_serializing_if = "is_none_or_empty_vec")]
pub tool_calls: Option<Vec<ToolCall>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<Role>,
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum Role {
System,
User,
Assistant,
Tool,
}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
pub struct ToolCall {
pub id: String,
#[serde(rename = "type")]
pub typ: ToolCallType,
pub function: ToolCallFunction,
}
impl ToolCall {
pub fn new(
id: impl Into<String>,
name: impl Into<String>,
arguments: impl Into<String>,
) -> Self {
ToolCall {
id: id.into(),
typ: ToolCallType::Function,
function: ToolCallFunction {
name: name.into(),
arguments: arguments.into(),
},
}
}
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ToolCallType {
Function,
}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
pub struct ToolCallFunction {
pub name: String,
pub arguments: String,
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum FinishReason {
Stop,
Length,
ContentFilter,
ToolCalls,
InsufficientSystemResources,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct Logprobs {
#[serde(skip_serializing_if = "is_none_or_empty_vec")]
pub content: Option<Vec<LogprobsContent>>,
#[serde(skip_serializing_if = "is_none_or_empty_vec")]
pub reasoning_content: Option<Vec<LogprobsReasoningContent>>,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct LogprobsContent {
pub token: String,
pub logprob: f64,
pub bytes: Option<Vec<u8>>,
pub top_logprobs: Vec<TopLogprobs>,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct TopLogprobs {
pub token: String,
pub logprob: f64,
pub bytes: Option<Vec<u8>>,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct LogprobsReasoningContent {
pub token: String,
pub logprob: f64,
pub bytes: Option<Vec<u8>>,
pub top_logprobs: Vec<TopLogprobs>,
}