Skip to main content

ToolResultCompressor

Struct ToolResultCompressor 

Source
pub struct ToolResultCompressor;
Expand description

Stateless tool-result compressor for Acon (#4021).

All methods are pure functions: they take text, a token counter, and a config, and return compressed text with metadata. No I/O, no async, no agent state.

§Examples

use zeph_context::tool_result_compress::{
    ToolResultCompressor, ToolResultCompressionConfig, CompressionMethod,
};

struct WordCounter;
impl zeph_common::memory::TokenCounting for WordCounter {
    fn count_tokens(&self, text: &str) -> usize { text.split_whitespace().count() }
    fn count_tool_schema_tokens(&self, _schema: &serde_json::Value) -> usize { 0 }
}

let config = ToolResultCompressionConfig {
    passthrough_threshold: 5,
    summarize_threshold: 10,
    total_budget: 20,
};
let tc = WordCounter;

let result = ToolResultCompressor::compress_single("hello world", &tc, &config);
assert_eq!(result.method, CompressionMethod::PassThrough);

Implementations§

Source§

impl ToolResultCompressor

Source

pub fn compress_single( text: &str, tc: &dyn TokenCounting, config: &ToolResultCompressionConfig, ) -> CompressedToolResult

Compress a single tool result text.

  • Below passthrough_threshold tokens: returned unchanged.
  • At or above passthrough_threshold tokens: char-truncated so that the truncated text has approximately passthrough_threshold tokens (using a char-boundary-safe cut at passthrough_threshold * 4 bytes), with " [...truncated]" appended.
§Examples
use zeph_context::tool_result_compress::{
    ToolResultCompressor, ToolResultCompressionConfig, CompressionMethod,
};

struct WordCounter;
impl zeph_common::memory::TokenCounting for WordCounter {
    fn count_tokens(&self, text: &str) -> usize { text.split_whitespace().count() }
    fn count_tool_schema_tokens(&self, _schema: &serde_json::Value) -> usize { 0 }
}

let config = ToolResultCompressionConfig {
    passthrough_threshold: 3,
    summarize_threshold: 10,
    total_budget: 20,
};
let tc = WordCounter;

// Short text passes through.
let r = ToolResultCompressor::compress_single("one two three", &tc, &config);
assert_eq!(r.method, CompressionMethod::PassThrough);

// Long text is truncated.
let r = ToolResultCompressor::compress_single("one two three four five", &tc, &config);
assert_eq!(r.method, CompressionMethod::Truncated);
assert!(r.text.ends_with("[...truncated]"));
Source

pub fn compress_batch( entries: &[ToolResultEntry<'_>], tc: &dyn TokenCounting, config: &ToolResultCompressionConfig, ) -> Vec<CompressedToolResult>

Compress a batch of tool results, enforcing both per-result and total-budget limits.

  1. Applies compress_single to each entry.
  2. If the total compressed tokens still exceed total_budget, trims results in descending token-count order. Ties are broken by entry.index (lower index trimmed first) for deterministic output.

Returns one CompressedToolResult per input entry, in the same order.

§Examples
use zeph_context::tool_result_compress::{
    ToolResultCompressor, ToolResultCompressionConfig, ToolResultEntry, CompressionMethod,
};

struct WordCounter;
impl zeph_common::memory::TokenCounting for WordCounter {
    fn count_tokens(&self, text: &str) -> usize { text.split_whitespace().count() }
    fn count_tool_schema_tokens(&self, _schema: &serde_json::Value) -> usize { 0 }
}

let config = ToolResultCompressionConfig {
    passthrough_threshold: 100,
    summarize_threshold: 200,
    total_budget: 5,
};
let tc = WordCounter;
let entries = vec![
    ToolResultEntry { tool_name: "shell", text: "one two three", index: 0 },
    ToolResultEntry { tool_name: "fetch", text: "four five six", index: 1 },
];
let results = ToolResultCompressor::compress_batch(&entries, &tc, &config);
assert_eq!(results.len(), 2);
// Combined tokens (6) exceed total_budget (5) → at least one is BatchTrimmed.
assert!(results.iter().any(|r| r.method == CompressionMethod::BatchTrimmed));

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more