1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use crate::{
Cancellation, Messages,
compression::{self, Error},
model::chat::{Chat, Request},
};
/// A pure Chat-backed compression operation. Its prompt is caller-supplied;
/// this type does not own compression scheduling or Memory persistence.
pub struct Compressor<C> {
chat: C,
request: Request,
size: Option<u64>,
}
impl<C: Chat> Compressor<C> {
/// Fixed instruction messages precede each call's explicit input. All other
/// fields retain their normal chat::Request meanings, including options.
pub fn new(chat: C, request: Request) -> Result<Self, Error> {
request.validate()?;
Ok(Self {
chat,
request,
size: None,
})
}
/// Configure the automatic trigger threshold without changing the model
/// Request. The automatic owner validates that it is present and positive;
/// standalone compress never schedules or persists anything.
pub fn with_size(mut self, size: u64) -> Self {
self.size = Some(size);
self
}
}
impl<C: Chat> compression::Compressor for Compressor<C> {
fn size(&self) -> Option<u64> {
self.size
}
async fn compress(
&self,
input: Messages,
cancellation: &Cancellation,
) -> Result<Messages, Error> {
super::message_transform::run(&self.chat, &self.request, input, cancellation).await
}
}