use crate::types::Choice;
use serde::{Deserialize, Serialize};
#[doc(alias = "token_usage")]
#[doc(alias = "usage_info")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Usage {
pub prompt_tokens: u32,
pub completion_tokens: u32,
pub total_tokens: u32,
}
#[doc(alias = "usage_status")]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum UsageStatus {
#[serde(rename = "finalized")]
Finalized,
#[serde(rename = "estimated")]
Estimated,
#[serde(rename = "pending")]
Pending,
#[serde(rename = "unsupported")]
Unsupported,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletionResponse {
pub id: String,
pub object: String,
pub created: u64,
pub model: String,
pub choices: Vec<Choice>,
pub usage: Usage,
pub usage_status: UsageStatus,
}
impl ChatCompletionResponse {
pub fn first_text(&self) -> Result<&str, crate::types::AiLibError> {
let choice = self.choices.first().ok_or_else(|| {
crate::types::AiLibError::InvalidModelResponse("empty choices".into())
})?;
match &choice.message.content {
crate::types::common::Content::Text(t) => Ok(t.as_str()),
other => Err(crate::types::AiLibError::InvalidModelResponse(format!(
"expected text content, got {:?}",
other
))),
}
}
}