chunkSummarizableMessages function
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;
}