projectionCopyForBudget method
ChatMessage
projectionCopyForBudget(
- ChatInputBudget inputBudget, {
- required bool frozen,
- bool preserveTurnId = true,
Implementation
ChatMessage projectionCopyForBudget(
acp.ChatInputBudget inputBudget, {
required bool frozen,
bool preserveTurnId = true,
}) {
inputBudget.validate();
final materializedText = text;
final isThought =
role == ChatMessageRole.status && metadata['kind'] == 'thought';
final counter = acp.ChatUtf8LineBudgetCounter(
maxBytes: isThought
? inputBudget.maxThoughtTextBytes
: inputBudget.maxMessageTextBytes,
maxLines: inputBudget.maxMessageTextLines,
resource: isThought ? 'thought text' : 'message text',
);
final appended = counter.append(materializedText);
final finished = counter.finish();
final copiedText = '${appended.safePrefix}${finished.safePrefix}';
final copiedAcceptedUtf8Bytes =
appended.acceptedBytes + finished.acceptedBytes;
final textOmission = appended.omission ?? finished.omission;
final guarded = _guardOwnedChatMessageMetadata(metadata, inputBudget);
var copiedBoundedOmissions = projectionBoundedChatMessageOmissions(
_omissions,
textOmission,
inputBudget.maxCollectionItems,
);
copiedBoundedOmissions = projectionBoundedChatMessageOmissions(
copiedBoundedOmissions,
guarded.omission,
inputBudget.maxCollectionItems,
);
for (final omission in guarded.localOmissions) {
copiedBoundedOmissions = projectionBoundedChatMessageOmissions(
copiedBoundedOmissions,
omission,
inputBudget.maxCollectionItems,
);
}
final copiedOmissions = List<acp.ChatInputOmission>.unmodifiable(
copiedBoundedOmissions.map(_copyInputOmission),
);
return ChatMessage._(
role: role,
text: copiedText,
timestamp: timestamp,
metadata: guarded.metadata,
omissions: copiedOmissions,
maxOmissions: inputBudget.maxCollectionItems,
inputBudget: inputBudget,
frozen: frozen,
revision: _revision,
acceptedUtf8Bytes: copiedAcceptedUtf8Bytes,
turnId: preserveTurnId ? projectionTurnId : null,
);
}