stream method

  1. @override
Stream<String> stream({
  1. required String apiKey,
  2. required String model,
  3. required ChatRequest request,
})
override

Token-streaming chat. Each event is an incremental delta — concatenating every event yields the same string chat would return. Closes the stream cleanly on end-of-message; errors are surfaced via the stream.

Implementation

@override
Stream<String> stream({
  required String apiKey,
  required String model,
  required ChatRequest request,
}) async* {
  final body = jsonEncode(_buildPayload(model, request, stream: true));
  final byteStream = await openSsePost(
    uri: Uri.parse('$_baseUrl/chat/completions'),
    headers: {
      'Authorization': 'Bearer $apiKey',
      'Content-Type': 'application/json',
      'Accept': 'text/event-stream',
    },
    body: body,
    providerLabel: 'OpenAI',
    client: _http,
  );
  await for (final event in decodeSseStream(byteStream)) {
    final data = event.data;
    if (data == '[DONE]') return;
    if (data.isEmpty) continue;
    final json = jsonDecode(data) as Map<String, Object?>;
    final choices = json['choices'] as List<Object?>? ?? const [];
    if (choices.isEmpty) continue;
    final delta = (choices.first as Map<String, Object?>)['delta']
        as Map<String, Object?>?;
    final content = delta?['content'] as String?;
    if (content != null && content.isNotEmpty) yield content;
  }
}