1"""Types and data structures for context compression."""
2
3from __future__ import annotations
4
5from dataclasses import dataclass, field
6from enum import StrEnum
7
8
9class CompressionStrategy(StrEnum):
10 """Available compression strategies."""
11
12 EXTRACTIVE = "extractive"
13 ABSTRACTIVE = "abstractive"
14 RERANKING = "reranking"
15 TOKEN_LIMIT = "token_limit" # noqa: S105 # strategy name, not a credential
16 SEMANTIC_DEDUP = "semantic_dedup"
17 HYBRID = "hybrid"
18 LLMLINGUA2 = "llmlingua2"
19
20
21@dataclass
22class CompressionResult:
23 """Result of context compression.
24
25 Attributes:
26 original_text: Original uncompressed text.
27 compressed_text: Compressed text.
28 original_tokens: Estimated original token count.
29 compressed_tokens: Estimated compressed token count.
30 compression_ratio: Ratio of compressed to original size.
31 strategy: Strategy used for compression.
32 metadata: Additional compression metadata.
33 """
34
35 original_text: str
36 compressed_text: str
37 original_tokens: int
38 compressed_tokens: int
39 compression_ratio: float
40 strategy: CompressionStrategy
41 metadata: dict = field(default_factory=dict)
42
43 def __repr__(self) -> str:
44 """String representation."""
45 return (
46 f"CompressionResult(ratio={self.compression_ratio:.2f}, "
47 f"tokens={self.original_tokens}→{self.compressed_tokens})"
48 )
49
50 @property
51 def token_savings(self) -> int:
52 """Calculate token savings."""
53 return self.original_tokens - self.compressed_tokens
54
55 @property
56 def savings_percentage(self) -> float:
57 """Calculate savings as percentage."""
58 if self.original_tokens == 0:
59 return 0.0
60 return (self.token_savings / self.original_tokens) * 100