generateStream method

Stream<String> generateStream(
  1. String prompt, [
  2. Map<String, dynamic>? options
])

Generate with streaming

Implementation

Stream<String> generateStream(
  String prompt, [
  Map<String, dynamic>? options,
]) async* {
  try {
    _setState(AIState.loading());

    final response = await _dio.post(
      '$_baseUrl/api/generate/stream',
      data: {
        'prompt': prompt,
        if (options != null) ...options,
      },
      options: Options(responseType: ResponseType.stream),
    );

    int progress = 0;
    String buffer = '';

    await for (final chunk in response.data.stream) {
      final text = String.fromCharCodes(chunk);
      buffer += text;

      // Parse SSE format
      if (buffer.contains('\n')) {
        final lines = buffer.split('\n');
        buffer = lines.last;

        for (final line in lines.sublist(0, lines.length - 1)) {
          if (line.startsWith('data: ')) {
            try {
              final data = line.substring(6);
              yield data;
              progress = (progress + 5).clamp(0, 99);
              _setState(state.copyWith(progress: progress));
            } catch (e) {
              // Ignore parse errors
            }
          }
        }
      }
    }

    _setState(state.copyWith(
      progress: 100,
      status: AIStatus.success,
    ));
  } catch (e) {
    final error = e is Exception ? e : Exception(e.toString());
    _setState(AIState.error(error));
  }
}