chat_repository.dart 3.1 KB

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