projectionCopyForBudget method

ChatMessage projectionCopyForBudget(
  1. ChatInputBudget inputBudget, {
  2. required bool frozen,
  3. 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,
  );
}