Skip to main content

xai_rust/models/
usage.rs

1//! Token usage statistics.
2
3use serde::{Deserialize, Serialize};
4
5/// Token usage information for a request.
6#[derive(Debug, Clone, Default, Serialize, Deserialize)]
7pub struct Usage {
8    /// Number of tokens in the prompt.
9    #[serde(default)]
10    pub prompt_tokens: u32,
11    /// Number of tokens in the completion.
12    #[serde(default)]
13    pub completion_tokens: u32,
14    /// Total number of tokens used.
15    #[serde(default)]
16    pub total_tokens: u32,
17    /// Number of reasoning tokens (for reasoning models).
18    #[serde(default, skip_serializing_if = "Option::is_none")]
19    pub reasoning_tokens: Option<u32>,
20    /// Number of cached prompt tokens (for cache hits).
21    #[serde(default, skip_serializing_if = "Option::is_none")]
22    pub prompt_tokens_details: Option<PromptTokensDetails>,
23    /// Completion tokens details.
24    #[serde(default, skip_serializing_if = "Option::is_none")]
25    pub completion_tokens_details: Option<CompletionTokensDetails>,
26}
27
28impl Usage {
29    /// Create empty usage stats.
30    pub fn new() -> Self {
31        Self::default()
32    }
33
34    /// Get the number of cached prompt tokens.
35    pub fn cached_tokens(&self) -> u32 {
36        self.prompt_tokens_details
37            .as_ref()
38            .and_then(|d| d.cached_tokens)
39            .unwrap_or(0)
40    }
41
42    /// Get the number of reasoning tokens.
43    pub fn reasoning_tokens(&self) -> u32 {
44        self.reasoning_tokens.unwrap_or(0)
45    }
46}
47
48/// Details about prompt token usage.
49#[derive(Debug, Clone, Default, Serialize, Deserialize)]
50pub struct PromptTokensDetails {
51    /// Number of cached tokens.
52    #[serde(default, skip_serializing_if = "Option::is_none")]
53    pub cached_tokens: Option<u32>,
54}
55
56/// Details about completion token usage.
57#[derive(Debug, Clone, Default, Serialize, Deserialize)]
58pub struct CompletionTokensDetails {
59    /// Number of reasoning tokens.
60    #[serde(default, skip_serializing_if = "Option::is_none")]
61    pub reasoning_tokens: Option<u32>,
62}
63
64/// Server-side tool usage statistics.
65#[derive(Debug, Clone, Default, Serialize, Deserialize)]
66pub struct ServerSideToolUsage {
67    /// Web search tool calls.
68    #[serde(default, skip_serializing_if = "Option::is_none")]
69    pub web_search: Option<u32>,
70    /// X search tool calls.
71    #[serde(default, skip_serializing_if = "Option::is_none")]
72    pub x_search: Option<u32>,
73    /// Code interpreter calls.
74    #[serde(default, skip_serializing_if = "Option::is_none")]
75    pub code_interpreter: Option<u32>,
76    /// Image view calls.
77    #[serde(default, skip_serializing_if = "Option::is_none")]
78    pub view_image: Option<u32>,
79}