stripImagesFromMessages function
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();
}