chat_repository.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'package:injectable/injectable.dart';
  4. import 'package:keyboard/data/api/request/chat_prologue_request.dart';
  5. import 'package:keyboard/data/api/response/chat_prologue_response.dart';
  6. import 'package:keyboard/data/api/response/chat_super_reply_response.dart';
  7. import 'package:keyboard/data/api/response/chat_super_speak_response.dart';
  8. import '../../base/base_response.dart';
  9. import '../../di/get_it.dart';
  10. import '../../utils/atmob_log.dart';
  11. import '../../utils/http_handler.dart';
  12. import '../../utils/sse_parse_util.dart';
  13. import '../api/atmob_api.dart';
  14. import '../api/atmob_stream_api.dart';
  15. import '../api/request/chat_super_reply_request.dart';
  16. import '../api/request/chat_super_speak_request.dart';
  17. import '../api/request/deep_seek_chat_request.dart';
  18. @lazySingleton
  19. class ChatRepository {
  20. final AtmobStreamApi atmobStreamApi;
  21. final AtmobApi atmobApi;
  22. var tag = "ChatRepository";
  23. ChatRepository(this.atmobStreamApi, this.atmobApi) {
  24. AtmobLog.d(tag, '$tag....init');
  25. }
  26. Future<ChatSuperReplyResponse> chatSuperReply({
  27. required String content,
  28. required String keyboardId,
  29. required String characterId,
  30. }) {
  31. return atmobApi
  32. .chatSuperReply(
  33. ChatSuperReplyRequest(
  34. content: content,
  35. keyboardId: keyboardId,
  36. characterId: characterId,
  37. ),
  38. )
  39. .then(HttpHandler.handle(true));
  40. }
  41. Future<ChatSuperSpeakResponse> chatSuperSpeak({
  42. required String content,
  43. required String keyboardId,
  44. required String characterId,
  45. }) {
  46. return atmobApi
  47. .chatSuperSpeak(
  48. ChatSuperSpeakRequest(
  49. content: content,
  50. keyboardId: keyboardId,
  51. characterId: characterId,
  52. ),
  53. )
  54. .then(HttpHandler.handle(true));
  55. }
  56. Future<ChatPrologueResponse> chatPrologue({required String name}) {
  57. return atmobApi
  58. .chatPrologue(ChatPrologueRequest(name: name))
  59. .then(HttpHandler.handle(true));
  60. }
  61. Future<Stream<Message>> streamDeepSeek(String chatContent) {
  62. return atmobStreamApi
  63. .deepSeekChat(DeepSeekChatRequest(chatContent))
  64. .then((response) async {
  65. List<String>? contentType = response.headers['Content-Type'];
  66. if (contentType != null) {
  67. for (var value in contentType) {
  68. if (value.contains('text/event-stream')) {
  69. return response.stream;
  70. } else if (value.contains('application/json')) {
  71. BaseResponse<String> baseResponse = BaseResponse.fromJson(
  72. jsonDecode(
  73. await response.stream
  74. .map((bytes) => utf8.decoder.convert(bytes))
  75. .toList()
  76. .then((value) => value.join()),
  77. ),
  78. (json) => json as String,
  79. );
  80. throw ServerErrorException(
  81. baseResponse.code,
  82. baseResponse.message,
  83. );
  84. }
  85. }
  86. }
  87. throw Exception('Invalid content type');
  88. })
  89. .then((stream) => SSEParseUtil.parse(stream));
  90. }
  91. static ChatRepository getInstance() {
  92. return getIt.get<ChatRepository>();
  93. }
  94. }