postStreamRaw method
Make a POST request and return raw stream for JSON streaming
Implementation
Stream<String> postStreamRaw(
String endpoint,
Map<String, dynamic> data,
) async* {
try {
logger.fine('Ollama streaming request payload: ${jsonEncode(data)}');
final response = await dio.post(
endpoint,
data: data,
options: Options(responseType: ResponseType.stream),
);
logger.fine('Ollama streaming HTTP status: ${response.statusCode}');
if (response.statusCode != 200) {
throw DioException(
requestOptions: response.requestOptions,
response: response,
message: 'Ollama API returned status ${response.statusCode}',
);
}
// Handle ResponseBody properly for streaming
final responseBody = response.data;
Stream<List<int>> stream;
if (responseBody is Stream<List<int>>) {
stream = responseBody;
} else if (responseBody is ResponseBody) {
stream = responseBody.stream;
} else {
throw Exception(
'Unexpected response type: ${responseBody.runtimeType}');
}
// Use UTF-8 stream decoder to handle incomplete byte sequences
final decoder = Utf8StreamDecoder();
await for (final chunk in stream) {
final decoded = decoder.decode(chunk);
if (decoded.isNotEmpty) {
yield decoded;
}
}
// Flush any remaining bytes
final remaining = decoder.flush();
if (remaining.isNotEmpty) {
yield remaining;
}
} on DioException catch (e) {
logger.severe('Stream request failed: ${e.message}');
rethrow;
}
}