buildWithCompression static method
Future<AssembledContext>
buildWithCompression({
- required List<
ChunkSearchResult> searchResults, - int tokenBudget = 2000,
- ContextStrategy strategy = ContextStrategy.relevanceFirst,
- int compressionLevel = 1,
- String language = 'ko',
- bool singleSourceMode = false,
Build context with REFRAG-style compression.
Uses PromptCompressor to reduce token count while preserving key information. This is an async method unlike build.
searchResults - Chunks ranked by relevance.
tokenBudget - Maximum tokens to use.
compressionLevel - How aggressively to compress (0=minimal, 1=balanced, 2=aggressive).
language - Language for stopword filtering ("ko" or "en").
Implementation
static Future<AssembledContext> buildWithCompression({
required List<ChunkSearchResult> searchResults,
int tokenBudget = 2000,
ContextStrategy strategy = ContextStrategy.relevanceFirst,
int compressionLevel = 1, // 0=minimal, 1=balanced, 2=aggressive
String language = 'ko',
bool singleSourceMode = false,
}) async {
if (searchResults.isEmpty) {
return const AssembledContext(
text: '',
includedChunks: [],
estimatedTokens: 0,
remainingBudget: 0,
);
}
// First, apply standard filtering and ordering
var filteredResults = searchResults;
if (singleSourceMode) {
filteredResults = _filterToMostRelevantSource(searchResults);
}
final orderedResults = switch (strategy) {
ContextStrategy.relevanceFirst => filteredResults,
ContextStrategy.diverseSources => _diversifySources(filteredResults),
ContextStrategy.chronological => _orderChronologically(filteredResults),
};
// Import compression utilities dynamically
final compressText = await _compressChunksText(
orderedResults,
tokenBudget,
compressionLevel,
language,
);
final estimatedTokens = (compressText.length / 4).ceil();
return AssembledContext(
text: compressText,
includedChunks: orderedResults,
estimatedTokens: estimatedTokens,
remainingBudget: tokenBudget - estimatedTokens,
);
}