doStream method
Generate a streaming response.
Implementation
@override
Future<LanguageModelV4StreamResult> doStream(
LanguageModelV4CallOptions options,
) async {
streamCalls.add(options);
if (doStreamError != null) throw doStreamError!;
final textId = generateId();
final parts = <LanguageModelV4StreamPart>[];
final streamWarnings = warnings
.map((warning) => LanguageModelV4OtherWarning(message: warning))
.toList(growable: false);
parts.add(StreamPartStreamStart(warnings: streamWarnings));
for (final part in response) {
if (part is LanguageModelV4TextPart) {
parts.add(StreamPartTextStart(id: textId));
parts.add(StreamPartTextDelta(id: textId, delta: part.text));
parts.add(StreamPartTextEnd(id: textId));
} else if (part is LanguageModelV4ReasoningPart) {
parts.add(const StreamPartReasoningStart(id: 'mock-reasoning'));
parts.add(
StreamPartReasoningDelta(id: 'mock-reasoning', delta: part.text),
);
parts.add(const StreamPartReasoningEnd(id: 'mock-reasoning'));
} else if (part is LanguageModelV4ToolCallPart) {
parts.add(
StreamPartToolInputStart(
id: part.toolCallId,
toolName: part.toolName,
),
);
parts.add(
StreamPartToolInputDelta(
id: part.toolCallId,
delta: jsonEncode(part.input),
),
);
parts.add(StreamPartToolInputEnd(id: part.toolCallId));
parts.add(StreamPartToolCall(toolCall: part));
}
}
parts.add(
StreamPartFinish(
finishReason: finishReason,
rawFinishReason: rawFinishReason,
usage: usage ?? const LanguageModelV4Usage(),
providerMetadata: providerMetadata,
),
);
return LanguageModelV4StreamResult(
stream: Stream.fromIterable(parts),
warnings: streamWarnings,
);
}