pub struct FidelityScorer;Expand description
Stateless heuristic scorer that assigns and applies fidelity levels to a message window.
Call FidelityScorer::score_and_apply after apply_prepared_context() returns to
enforce the three-level representation (Full / Compressed / Placeholder) on historical
messages. The scorer never touches exempt messages (INV-07 through INV-10).
§Examples
use zeph_context::fidelity::{FidelityConfig, FidelityScorer};
let scorer = FidelityScorer;
let cfg = FidelityConfig { enabled: false, ..FidelityConfig::default() };
// With `enabled = false` the scorer is a no-op.
let mut messages = vec![];
scorer.score_and_apply(&mut messages, "query", &[], &cfg, &MockTc, 0, false, None, None).await;
struct MockTc;
impl zeph_common::memory::TokenCounting for MockTc {
fn count_tokens(&self, text: &str) -> usize { text.len() / 4 }
fn count_tool_schema_tokens(&self, _: &serde_json::Value) -> usize { 0 }
}Implementations§
Source§impl FidelityScorer
impl FidelityScorer
Sourcepub async fn score_and_apply(
&self,
messages: &mut Vec<Message>,
query: &str,
planned_tools: &[PlannedToolHint],
config: &FidelityConfig,
tc: &dyn TokenCounting,
inserted_count: usize,
allow_upgrade: bool,
embed_provider: Option<&dyn LlmProviderDyn>,
compress_provider: Option<&dyn LlmProviderDyn>,
)
pub async fn score_and_apply( &self, messages: &mut Vec<Message>, query: &str, planned_tools: &[PlannedToolHint], config: &FidelityConfig, tc: &dyn TokenCounting, inserted_count: usize, allow_upgrade: bool, embed_provider: Option<&dyn LlmProviderDyn>, compress_provider: Option<&dyn LlmProviderDyn>, )
Score all non-exempt messages and apply fidelity rendering in-place.
Steps (per spec §5 data flow):
- Guard: return early when
enabled == false. - Build exempt set (INV-07 through INV-10).
- Score each non-exempt message with normalized weight sum (INV-05).
- Apply floor invariant: a message with a persisted fidelity tag cannot
be upgraded to a less restrictive level unless
allow_upgrade = true. - Apply tool-pair atomicity — both get
min(score_a, score_b)(INV-03). - Render
Compressed/Placeholdermessages (INV-12). - Merge consecutive same-role
Placeholdermessages (INV-04).
§Parameters
messages— mutable message window (includes system prompt at index 0).query— current user query; drives semantic signal.planned_tools— DAG lookahead hints; empty slice disables plan signal.config— scoring thresholds and weights.tc— token counter used forPlaceholder/Compressedrendering.inserted_count— number of memory messages freshly injected at indices1..1+inserted_count; these are always exempt (INV-10).allow_upgrade— whentruethe persisted floor invariant is bypassed. Passtrueonly from the proactive regrade path; passfalseeverywhere else.embed_provider— optional LLM provider used for query and per-message embeddings whenconfig.semantic_scoring_provideris set. PassNoneto fall back to keyword overlap.compress_provider— optional LLM provider used forCompressedrendering whenconfig.compress_provideris set. PassNoneto fall back to truncation.
The two providers may be the same instance or different ones (e.g. a fast embedding
model for embed_provider and a generative model for compress_provider).
Auto Trait Implementations§
impl Freeze for FidelityScorer
impl RefUnwindSafe for FidelityScorer
impl Send for FidelityScorer
impl Sync for FidelityScorer
impl Unpin for FidelityScorer
impl UnsafeUnpin for FidelityScorer
impl UnwindSafe for FidelityScorer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more