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)]
40 pub finish_reason: Option<String>,
41 #[serde(default)]
42 pub token_counts_estimated: bool,
43}
44
45#[derive(Debug, Clone, PartialEq)]
48pub enum CapabilityChunk {
49 Text(String),
51 Thinking(String),
53 Segment {
55 text: String,
56 start_ms: i64,
57 end_ms: i64,
58 },
59 Audio(AudioFrame),
61 Vector(Vec<f64>),
63 ToolCall(ToolCall),
65 Status(String),
67 Done(Option<GenerationStats>),
69}