Skip to main content

oxibrain_core/
context.rs

1//! Context assembly types (DESIGN §9.5).
2
3use 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
37/// Pre-load fallback token estimate (§7.5). Uses chars/4 — off by roughly
38/// fivefold on CJK (F27). Replaced by `TokenizerPort::count()` once the model
39/// tokenizer is available.
40pub fn estimate_tokens_rough(text: &str) -> usize {
41    (text.chars().count() / 4).max(1)
42}