chunkSummarizableMessages function

List<List<Message>> chunkSummarizableMessages(
  1. List<Message> messages,
  2. int budgetTokens
)

Splits messages into consecutive chunks whose serialized conversation text estimates under budgetTokens (issue #729). Order is preserved and the chunks concatenate back to the whole region; a single message bigger than the budget becomes its own oversized chunk — the prompt builder truncates it with an explicit note, since chunking cannot split it.

Implementation

List<List<Message>> chunkSummarizableMessages(
  List<Message> messages,
  int budgetTokens,
) {
  final chunks = <List<Message>>[];
  var current = <Message>[];
  var currentTokens = 0;
  for (final message in messages) {
    final tokens = estimateStringTokens(serializeConversation([message]));
    if (current.isNotEmpty && currentTokens + tokens > budgetTokens) {
      chunks.add(current);
      current = <Message>[];
      currentTokens = 0;
    }
    current.add(message);
    currentTokens += tokens;
  }
  if (current.isNotEmpty) chunks.add(current);
  return chunks;
}