pub struct CacheController;Expand description
Prompt Caching Controller
Manages cache control markers for messages and calculates cache savings.
§Note on Cache Control Implementation
Cache control markers are typically added at the API request level by the provider implementation, not stored in the message content itself. This controller identifies which messages are eligible for caching and provides the information needed for providers to add appropriate cache control headers.
Implementations§
Source§impl CacheController
impl CacheController
Sourcepub fn get_cache_eligibility(
messages: &[Message],
config: &CacheConfig,
) -> CacheEligibility
pub fn get_cache_eligibility( messages: &[Message], config: &CacheConfig, ) -> CacheEligibility
Identify messages eligible for cache control.
This method analyzes messages and returns information about which messages are eligible for caching based on the provided configuration.
§Arguments
messages- The messages to analyzeconfig- Cache configuration specifying thresholds and options
§Returns
CacheEligibility containing indices of cacheable messages
§Cache Eligibility Rules
Messages are eligible for caching if:
- They meet the minimum token threshold
- They are within the most recent N messages (as configured)
§Example
use aster::context::cache_controller::CacheController;
use aster::context::types::CacheConfig;
let messages = vec![/* ... */];
let config = CacheConfig::default();
let eligibility = CacheController::get_cache_eligibility(&messages, &config);
println!("Cacheable messages: {:?}", eligibility.cacheable_indices);Sourcepub fn add_cache_control(
messages: &[Message],
config: &CacheConfig,
) -> (Vec<Message>, Vec<usize>)
pub fn add_cache_control( messages: &[Message], config: &CacheConfig, ) -> (Vec<Message>, Vec<usize>)
Add cache control markers to eligible messages.
This method returns a new vector of messages with cache eligibility information. The actual cache control markers should be added by the provider when making API requests.
§Arguments
messages- The messages to potentially mark for cachingconfig- Cache configuration specifying thresholds and options
§Returns
A tuple of (messages, cacheable_indices) where cacheable_indices contains the indices of messages that should have cache control applied
Sourcepub fn is_cacheable(message: &Message, min_tokens: usize) -> bool
pub fn is_cacheable(message: &Message, min_tokens: usize) -> bool
Sourcepub fn calculate_cache_savings(usage: &TokenUsage) -> CacheSavings
pub fn calculate_cache_savings(usage: &TokenUsage) -> CacheSavings
Calculate cache cost savings based on token usage.
Uses Anthropic’s prompt caching pricing model:
- Cache write: 1.25x base input price
- Cache read: 0.1x base input price (90% discount)
§Arguments
usage- Token usage statistics including cache metrics
§Returns
CacheSavings containing base cost, actual cost, and savings
§Calculation
base_cost = input_tokens * base_price
cache_write_cost = cache_creation_tokens * (base_price * 1.25)
cache_read_cost = cache_read_tokens * (base_price * 0.1)
actual_cost = (input_tokens - cache_read_tokens) * base_price
+ cache_write_cost + cache_read_cost
savings = base_cost - actual_costSourcepub fn calculate_cache_stats(usage: &TokenUsage) -> CacheStats
pub fn calculate_cache_stats(usage: &TokenUsage) -> CacheStats
Sourcepub fn accumulate_cache_stats<'a>(
usages: impl Iterator<Item = &'a TokenUsage>,
) -> CacheStats
pub fn accumulate_cache_stats<'a>( usages: impl Iterator<Item = &'a TokenUsage>, ) -> CacheStats
Auto Trait Implementations§
impl Freeze for CacheController
impl RefUnwindSafe for CacheController
impl Send for CacheController
impl Sync for CacheController
impl Unpin for CacheController
impl UnsafeUnpin for CacheController
impl UnwindSafe for CacheController
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
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::RequestSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.