stripImagesFromMessages function

List<CompactMessage> stripImagesFromMessages(
  1. List<CompactMessage> messages
)

Strip image blocks from user messages before sending for compaction. Images are not needed for generating a conversation summary.

Implementation

List<CompactMessage> stripImagesFromMessages(List<CompactMessage> messages) {
  return messages.map((message) {
    if (message.type != MessageRole.user) return message;

    bool hasMediaBlock = false;
    final newBlocks = <ContentBlock>[];

    for (final block in message.contentBlocks) {
      if (block.type == ContentBlockType.image) {
        hasMediaBlock = true;
        newBlocks.add(
          const ContentBlock(type: ContentBlockType.text, text: '[image]'),
        );
      } else if (block.type == ContentBlockType.document) {
        hasMediaBlock = true;
        newBlocks.add(
          const ContentBlock(type: ContentBlockType.text, text: '[document]'),
        );
      } else if (block.type == ContentBlockType.toolResult &&
          block.content is List) {
        bool toolHasMedia = false;
        final newToolContent = (block.content as List).map((item) {
          if (item is Map) {
            if (item['type'] == 'image') {
              toolHasMedia = true;
              return {'type': 'text', 'text': '[image]'};
            }
            if (item['type'] == 'document') {
              toolHasMedia = true;
              return {'type': 'text', 'text': '[document]'};
            }
          }
          return item;
        }).toList();

        if (toolHasMedia) {
          hasMediaBlock = true;
          newBlocks.add(
            ContentBlock(
              type: block.type,
              toolUseId: block.toolUseId,
              content: newToolContent,
              isError: block.isError,
            ),
          );
        } else {
          newBlocks.add(block);
        }
      } else {
        newBlocks.add(block);
      }
    }

    if (!hasMediaBlock) return message;
    return message.copyWith(contentBlocks: newBlocks);
  }).toList();
}