chat_repository.dart 1.8 KB

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