1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct ContextBudget {
7 pub max_tokens: usize,
8}
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct ContextLayer {
12 pub kind: LayerKind,
13 pub text: String,
14 pub estimated_tokens: usize,
15 pub provenance: Vec<String>,
16}
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
19#[serde(rename_all = "snake_case")]
20pub enum LayerKind {
21 Profile,
22 PinnedFacts,
23 HighSalienceBeliefs,
24 QueryNeighborhood,
25 Summaries,
26 RecentEpisodes,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
30pub struct ContextResult {
31 pub layers: Vec<ContextLayer>,
32 pub total_tokens: usize,
33 pub budget: ContextBudget,
34 pub truncated: bool,
35}
36
37pub fn estimate_tokens_rough(text: &str) -> usize {
41 (text.chars().count() / 4).max(1)
42}