doStream method

  1. @override
Future<LanguageModelV4StreamResult> doStream(
  1. LanguageModelV4CallOptions options
)

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,
  );
}