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),
  };

  final renderText = _buildGroupedText(
    orderedResults,
    '\n\n',
    skipHeaders: singleSourceMode,
  );
  final compressedText = await _compressRenderedTextToBudget(
    renderText,
    tokenBudget,
    compressionLevel,
    language,
  );
  final exactTokens =
      compressedText.isEmpty ? 0 : _countTokens(compressedText);

  return AssembledContext(
    text: compressedText,
    includedChunks: orderedResults,
    estimatedTokens: exactTokens,
    remainingBudget: tokenBudget - exactTokens,
  );
}