kernel/capabilities/
chunk.rs1use serde::{Deserialize, Serialize};
6
7use super::tools::ToolCall;
8
9#[derive(Debug, Clone, PartialEq, Eq, Hash)]
12pub struct AudioFrame {
13 pub data: Vec<u8>,
14 pub sample_rate: i64,
15}
16
17impl AudioFrame {
18 pub fn new(data: Vec<u8>, sample_rate: i64) -> Self {
20 Self { data, sample_rate }
21 }
22}
23
24#[derive(Debug, Default, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
27#[serde(rename_all = "camelCase")]
28pub struct GenerationStats {
29 #[serde(skip_serializing_if = "Option::is_none", default)]
30 pub prompt_tokens: Option<i64>,
31 #[serde(skip_serializing_if = "Option::is_none", default)]
32 pub completion_tokens: Option<i64>,
33 #[serde(skip_serializing_if = "Option::is_none", default)]
34 pub duration_ms: Option<i64>,
35 #[serde(skip_serializing_if = "Option::is_none", default)]
36 pub ttft_ms: Option<i64>,
37 #[serde(skip_serializing_if = "Option::is_none", default)]
38 pub load_ms: Option<i64>,
39 #[serde(skip_serializing_if = "Option::is_none", default)]
41 pub prompt_ms: Option<i64>,
42 #[serde(skip_serializing_if = "Option::is_none", default)]
44 pub eval_ms: Option<i64>,
45 #[serde(skip_serializing_if = "Option::is_none", default)]
46 pub finish_reason: Option<String>,
47 #[serde(default)]
48 pub token_counts_estimated: bool,
49}
50
51#[derive(Debug, Clone, PartialEq)]
54pub enum CapabilityChunk {
55 Text(String),
57 Thinking(String),
59 Segment {
61 text: String,
62 start_ms: i64,
63 end_ms: i64,
64 },
65 Audio(AudioFrame),
67 Vector(Vec<f64>),
69 ToolCall(ToolCall),
71 Status(String),
73 Done(Option<GenerationStats>),
75}