use serde::{Deserialize, Serialize};
use crate::ToolCall;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TokenUsage {
pub prompt_tokens: u32,
pub completion_tokens: u32,
pub total_tokens: u32,
}
impl TokenUsage {
pub fn combine(&self, other: &TokenUsage) -> TokenUsage {
TokenUsage {
prompt_tokens: self.prompt_tokens + other.prompt_tokens,
completion_tokens: self.completion_tokens + other.completion_tokens,
total_tokens: self.total_tokens + other.total_tokens,
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct GenerateResult {
pub generation: String,
pub tokens: Option<TokenUsage>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tool_calls: Vec<ToolCall>,
}
impl GenerateResult {
pub fn from_text(text: impl Into<String>) -> Self {
Self {
generation: text.into(),
tokens: None,
tool_calls: Vec::new(),
}
}
pub fn wants_tool_calls(&self) -> bool {
!self.tool_calls.is_empty()
}
}