compactCore method

  1. @override
Future<bool> compactCore(
  1. CompactionMessageIndex index,
  2. Logger logger,
  3. CancellationToken cancellationToken
)
override

Implementation

@override
Future<bool> compactCore(
  CompactionMessageIndex index,
  Logger logger,
  CancellationToken cancellationToken,
) async {
  var nonSystemIncludedCount = 0;
  for (final group in index.groups) {
    if (!group.isExcluded && group.kind != CompactionGroupKind.system) {
      nonSystemIncludedCount++;
    }
  }

  final protectedFromEnd = min(
    minimumPreservedGroups,
    nonSystemIncludedCount,
  );
  final maxSummarizable = nonSystemIncludedCount - protectedFromEnd;
  if (maxSummarizable <= 0) {
    return false;
  }

  final summarizationMessages = <ChatMessage>[
    ChatMessage.fromText(ChatRole.system, summarizationPrompt),
  ];
  final excludedGroups = <CompactionMessageGroup>[];
  var insertIndex = -1;

  for (
    var i = 0;
    i < index.groups.length && excludedGroups.length < maxSummarizable;
    i++
  ) {
    final group = index.groups[i];
    if (group.isExcluded || group.kind == CompactionGroupKind.system) {
      continue;
    }

    if (insertIndex < 0) {
      insertIndex = i;
    }

    summarizationMessages.addAll(group.messages);
    group.isExcluded = true;
    group.excludeReason = 'Summarized by SummarizationCompactionStrategy';
    excludedGroups.add(group);

    if (target(index)) {
      break;
    }
  }

  final summarized = excludedGroups.length;
  if (logger.isEnabled(LogLevel.debug)) {
    logger.logSummarizationStarting(
      summarized,
      summarizationMessages.length - 1,
      chatClient.runtimeType.toString(),
    );
  }

  final summarizeActivity = CompactionTelemetry.activitySource.startActivity(
    CompactionTelemetry.activityNames.summarize,
  );
  summarizeActivity?.setTag(
    CompactionTelemetry.tags.groupsSummarized,
    summarized,
  );

  late final ChatResponse response;
  try {
    response = await chatClient.getResponse(
      messages: summarizationMessages,
      cancellationToken: cancellationToken,
    );
  } catch (error) {
    for (final group in excludedGroups) {
      group.isExcluded = false;
      group.excludeReason = null;
    }
    logger.logSummarizationFailed(summarized, error.toString());
    return false;
  }

  final responseText = response.text.trim();
  final summaryText = responseText.isEmpty
      ? '[Summary unavailable]'
      : responseText;
  summarizeActivity?.setTag(
    CompactionTelemetry.tags.summaryLength,
    summaryText.length,
  );

  final summaryMessage = ChatMessage.fromText(
    ChatRole.assistant,
    '[Summary]\n$summaryText',
  );
  (summaryMessage.additionalProperties ??=
          <String, Object?>{})[CompactionMessageGroup.summaryPropertyKey] =
      true;

  index.insertGroup(insertIndex, CompactionGroupKind.summary, [
    summaryMessage,
  ]);
  logger.logSummarizationCompleted(summaryText.length, insertIndex);
  return true;
}