Skip to main content

zagens_core/
models.rs

1//! Shared model types — pure data, no LLM client dependency.
2
3use schemars::JsonSchema;
4
5/// Server-side tool usage counters.
6#[derive(
7    Debug, serde::Serialize, serde::Deserialize, Clone, Default, PartialEq, Eq, JsonSchema,
8)]
9pub struct ServerToolUsage {
10    #[serde(skip_serializing_if = "Option::is_none")]
11    pub code_execution_requests: Option<u32>,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub tool_search_requests: Option<u32>,
14}
15
16/// Token usage metadata for a response.
17#[derive(
18    Debug, serde::Serialize, serde::Deserialize, Clone, Default, PartialEq, Eq, JsonSchema,
19)]
20pub struct Usage {
21    pub input_tokens: u32,
22    pub output_tokens: u32,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub prompt_cache_hit_tokens: Option<u32>,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub prompt_cache_miss_tokens: Option<u32>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub reasoning_tokens: Option<u32>,
29    /// Approximate input tokens spent re-sending prior `reasoning_content`
30    /// across user-message boundaries (V4 §5.1.1 "Interleaved Thinking").
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub reasoning_replay_tokens: Option<u32>,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub server_tool_use: Option<ServerToolUsage>,
35}