chat_repository.dart 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import 'dart:convert';
  2. import 'package:electronic_assistant/base/base_response.dart';
  3. import 'package:electronic_assistant/data/api/request/chat_request.dart';
  4. import 'package:electronic_assistant/utils/http_handler.dart';
  5. import 'package:electronic_assistant/utils/sse_parse_util.dart';
  6. import '../api/atmob_stream_api.dart';
  7. class ChatRepository {
  8. ChatRepository._() {}
  9. Future<Stream<Message>> streamChat(String chatContent) {
  10. return atmobStreamApi.chat(ChatRequest(chatContent)).then((response) async {
  11. List<String>? contentType = response.headers['Content-Type'];
  12. if (contentType != null) {
  13. for (var value in contentType) {
  14. if (value.contains('text/event-stream')) {
  15. return response.stream;
  16. } else if (value.contains('application/json')) {
  17. BaseResponse<String> baseResponse = BaseResponse.fromJson(
  18. jsonDecode(await response.stream
  19. .map((bytes) => utf8.decoder.convert(bytes))
  20. .toList()
  21. .then((value) => value.join())),
  22. (json) => json as String);
  23. throw ServerErrorException(baseResponse.code, baseResponse.message);
  24. }
  25. }
  26. }
  27. throw Exception('Invalid content type');
  28. }).then((stream) => SSEParseUtil.parse(stream));
  29. }
  30. }
  31. final chatRepository = ChatRepository._();