stripImagesFromMessages function

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

Strip image and document blocks from user messages before compaction.

Images are not needed for generating a conversation summary and can cause the compaction API call itself to hit the prompt-too-long limit. Replaces image blocks with a text marker so the summary still notes that an image was shared.

Implementation

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

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

    for (final block in message.content) {
      if (block is ImageBlock) {
        hasMediaBlock = true;
        newContent.add(const TextBlock('[image]'));
      } else if (block is ToolResultBlock) {
        // Tool results are text-only in our model, so pass through.
        newContent.add(block);
      } else {
        newContent.add(block);
      }
    }

    if (!hasMediaBlock) return message;

    return Message(
      id: message.id,
      role: message.role,
      content: newContent,
      stopReason: message.stopReason,
      usage: message.usage,
    );
  }).toList();
}