buildWithCompression static method

Future<AssembledContext> buildWithCompression({
  1. required List<ChunkSearchResult> searchResults,
  2. int tokenBudget = 2000,
  3. ContextStrategy strategy = ContextStrategy.relevanceFirst,
  4. int compressionLevel = 1,
  5. String language = 'ko',
  6. 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,
  );
}