generateStream method
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));
}
}