concat method
Merges a later streaming chunk into this block.
Implementation
AIChatMessageContentBlock concat(final AIChatMessageContentBlock other) {
if (!canMerge(other)) {
throw ArgumentError('Cannot merge unrelated content blocks');
}
return switch ((this, other)) {
(final AIChatMessageTextBlock first, final AIChatMessageTextBlock next) =>
AIChatMessageTextBlock(
text: first.text + next.text,
id: _mergedId(first, next),
index: next.index ?? first.index,
providerData: mergeProviderData(
first.providerData,
next.providerData,
),
),
(
final AIChatMessageReasoningBlock first,
final AIChatMessageReasoningBlock next,
) =>
AIChatMessageReasoningBlock(
reasoning: first.reasoning + next.reasoning,
id: _mergedId(first, next),
index: next.index ?? first.index,
providerData: mergeProviderData(
first.providerData,
next.providerData,
),
),
(
final AIChatMessageMediaBlock first,
final AIChatMessageMediaBlock next,
) =>
AIChatMessageMediaBlock(
data: first.data + next.data,
mimeType: next.mimeType ?? first.mimeType,
id: _mergedId(first, next),
index: next.index ?? first.index,
providerData: mergeProviderData(
first.providerData,
next.providerData,
),
),
(final AIChatMessageFileBlock first, final AIChatMessageFileBlock next) =>
AIChatMessageFileBlock(
uri: next.uri.isNotEmpty ? next.uri : first.uri,
name: next.name ?? first.name,
mimeType: next.mimeType ?? first.mimeType,
id: _mergedId(first, next),
index: next.index ?? first.index,
providerData: mergeProviderData(
first.providerData,
next.providerData,
),
),
(final AIChatMessageToolCall first, final AIChatMessageToolCall next) =>
AIChatMessageToolCall(
id: _mergedToolCallId(first, next),
index: next.index ?? first.index,
name: first.name + next.name,
argumentsRaw: first.argumentsRaw + next.argumentsRaw,
arguments: _mergeToolArguments(first, next),
providerData: mergeProviderData(
first.providerData,
next.providerData,
),
),
(
final AIChatMessageServerToolCall first,
final AIChatMessageServerToolCall next,
) =>
AIChatMessageServerToolCall(
id: _mergedId(first, next),
index: next.index ?? first.index,
name: first.name + next.name,
argumentsRaw: first.argumentsRaw + next.argumentsRaw,
arguments: _mergeServerToolArguments(first, next),
providerData: mergeProviderData(
first.providerData,
next.providerData,
),
),
(
final AIChatMessageServerToolResult first,
final AIChatMessageServerToolResult next,
) =>
AIChatMessageServerToolResult(
id: _mergedId(first, next),
index: next.index ?? first.index,
toolCallId: next.toolCallId.isNotEmpty
? next.toolCallId
: first.toolCallId,
name: next.name ?? first.name,
result: _mergeValues(first.result, next.result),
providerData: mergeProviderData(
first.providerData,
next.providerData,
),
),
(
final AIChatMessageProviderMetadataBlock first,
final AIChatMessageProviderMetadataBlock next,
) =>
AIChatMessageProviderMetadataBlock(
id: _mergedId(first, next),
index: next.index ?? first.index,
providerData: mergeProviderData(
first.providerData,
next.providerData,
),
),
(
final AIChatMessageNonStandardBlock first,
final AIChatMessageNonStandardBlock next,
) =>
AIChatMessageNonStandardBlock(
value: _mergeValues(first.value, next.value),
id: _mergedId(first, next),
index: next.index ?? first.index,
providerData: mergeProviderData(
first.providerData,
next.providerData,
),
),
_ => throw StateError('Unreachable content-block merge'),
};
}