Browse Source

[feat]提交部分漏掉代码

云天逵 8 months ago
parent
commit
515895fa79

+ 68 - 0
lib/data/api/atmob_stream_api.c.dart

@@ -0,0 +1,68 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'atmob_stream_api.dart';
+
+// **************************************************************************
+// RetrofitGenerator
+// **************************************************************************
+
+// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers,unused_element,unnecessary_string_interpolations
+
+class _AtmobStreamApi implements AtmobStreamApi {
+  _AtmobStreamApi(this._dio, {this.baseUrl, this.errorLogger});
+
+  final Dio _dio;
+
+  String? baseUrl;
+
+  final ParseErrorLogger? errorLogger;
+
+  @override
+  Future<ResponseBody> deepSeekChat(DeepSeekChatRequest request) async {
+    final _extra = <String, dynamic>{};
+    final queryParameters = <String, dynamic>{};
+    final _headers = <String, dynamic>{};
+    final _data = <String, dynamic>{};
+    _data.addAll(request.toJson());
+    final _options = _setStreamType<ResponseBody>(
+      Options(method: 'POST', headers: _headers, extra: _extra)
+          .compose(
+            _dio.options,
+            '/project/gpt/v1/chat/deepseek/stream',
+            queryParameters: queryParameters,
+            data: _data,
+          )
+          .copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
+    );
+    final _result = await _dio.fetch<ResponseBody>(_options);
+
+    return _result.data!;
+  }
+
+  RequestOptions _setStreamType<T>(RequestOptions requestOptions) {
+    if (T != dynamic &&
+        !(requestOptions.responseType == ResponseType.bytes ||
+            requestOptions.responseType == ResponseType.stream)) {
+      if (T == String) {
+        requestOptions.responseType = ResponseType.plain;
+      } else {
+        requestOptions.responseType = ResponseType.json;
+      }
+    }
+    return requestOptions;
+  }
+
+  String _combineBaseUrls(String dioBaseUrl, String? baseUrl) {
+    if (baseUrl == null || baseUrl.trim().isEmpty) {
+      return dioBaseUrl;
+    }
+
+    final url = Uri.parse(baseUrl);
+
+    if (url.isAbsolute) {
+      return url.toString();
+    }
+
+    return Uri.parse(dioBaseUrl).resolveUri(url).toString();
+  }
+}

+ 22 - 0
lib/data/api/atmob_stream_api.dart

@@ -0,0 +1,22 @@
+
+import 'package:dio/dio.dart';
+import 'package:keyboard/data/api/request/deep_seek_chat_request.dart';
+import 'package:retrofit/error_logger.dart';
+import 'package:retrofit/http.dart';
+import 'package:retrofit/retrofit.dart';
+import '../consts/constants.dart';
+
+
+part 'atmob_stream_api.c.dart';
+
+@RestApi()
+abstract class AtmobStreamApi {
+
+  factory AtmobStreamApi(Dio dio, {String baseUrl}) = _AtmobStreamApi;
+
+  @POST("/project/gpt/v1/chat/deepseek/stream")
+  Future<ResponseBody> deepSeekChat(@Body() DeepSeekChatRequest request);
+
+
+}
+

+ 17 - 0
lib/data/api/request/deep_seek_chat_request.dart

@@ -0,0 +1,17 @@
+import 'package:json_annotation/json_annotation.dart';
+
+import '../../../base/app_base_request.dart';
+
+part 'deep_seek_chat_request.g.dart';
+
+@JsonSerializable()
+class DeepSeekChatRequest extends AppBaseRequest {
+  @JsonKey(name: 'content')
+  late String content;
+
+  DeepSeekChatRequest(this.content);
+
+
+  @override
+  Map<String, dynamic> toJson() => _$DeepSeekChatRequestToJson(this);
+}

+ 68 - 0
lib/data/api/request/deep_seek_chat_request.g.dart

@@ -0,0 +1,68 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'deep_seek_chat_request.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+DeepSeekChatRequest _$DeepSeekChatRequestFromJson(Map<String, dynamic> json) =>
+    DeepSeekChatRequest(json['content'] as String)
+      ..appPlatform = (json['appPlatform'] as num).toInt()
+      ..os = json['os'] as String
+      ..osVersion = json['osVersion'] as String
+      ..packageName = json['packageName'] as String?
+      ..appVersionName = json['appVersionName'] as String?
+      ..appVersionCode = (json['appVersionCode'] as num?)?.toInt()
+      ..channelName = json['channelName'] as String?
+      ..appId = (json['appId'] as num?)?.toInt()
+      ..tgPlatform = (json['tgPlatform'] as num?)?.toInt()
+      ..oaid = json['oaid'] as String?
+      ..aaid = json['aaid'] as String?
+      ..androidId = json['androidId'] as String?
+      ..imei = json['imei'] as String?
+      ..simImei0 = json['simImei0'] as String?
+      ..simImei1 = json['simImei1'] as String?
+      ..mac = json['mac'] as String?
+      ..idfa = json['idfa'] as String?
+      ..idfv = json['idfv'] as String?
+      ..machineId = json['machineId'] as String?
+      ..brand = json['brand'] as String?
+      ..model = json['model'] as String?
+      ..wifiName = json['wifiName'] as String?
+      ..region = json['region'] as String?
+      ..locLng = (json['locLng'] as num?)?.toDouble()
+      ..locLat = (json['locLat'] as num?)?.toDouble()
+      ..authToken = json['authToken'] as String?;
+
+Map<String, dynamic> _$DeepSeekChatRequestToJson(
+  DeepSeekChatRequest instance,
+) => <String, dynamic>{
+  'appPlatform': instance.appPlatform,
+  'os': instance.os,
+  'osVersion': instance.osVersion,
+  'packageName': instance.packageName,
+  'appVersionName': instance.appVersionName,
+  'appVersionCode': instance.appVersionCode,
+  'channelName': instance.channelName,
+  'appId': instance.appId,
+  'tgPlatform': instance.tgPlatform,
+  'oaid': instance.oaid,
+  'aaid': instance.aaid,
+  'androidId': instance.androidId,
+  'imei': instance.imei,
+  'simImei0': instance.simImei0,
+  'simImei1': instance.simImei1,
+  'mac': instance.mac,
+  'idfa': instance.idfa,
+  'idfv': instance.idfv,
+  'machineId': instance.machineId,
+  'brand': instance.brand,
+  'model': instance.model,
+  'wifiName': instance.wifiName,
+  'region': instance.region,
+  'locLng': instance.locLng,
+  'locLat': instance.locLat,
+  'authToken': instance.authToken,
+  'content': instance.content,
+};

+ 64 - 0
lib/data/bean/stream_deepseek_data.dart

@@ -0,0 +1,64 @@
+import 'package:json_annotation/json_annotation.dart';
+
+part 'stream_deepseek_data.g.dart';
+
+@JsonSerializable()
+class StreamDeepseekData {
+  @JsonKey(name: "id")
+  final String id;
+  @JsonKey(name: "object")
+  final String object;
+  @JsonKey(name: "created")
+  final int created;
+  @JsonKey(name: "model")
+  final String model;
+  @JsonKey(name: "choices")
+  final List<Choices>? choices;
+
+  StreamDeepseekData({
+    required this.id,
+    required this.object,
+    required this.created,
+    required this.model,
+
+    required this.choices,
+  });
+
+  factory StreamDeepseekData.fromJson(Map<String, dynamic> json) => _$StreamDeepseekDataFromJson(json);
+}
+
+
+@JsonSerializable()
+class Choices {
+  @JsonKey(name: "index")
+  final int? index;
+  @JsonKey(name: "delta")
+  final Delta? delta;
+  @JsonKey(name: "finishReason")
+  final String? finishReason;
+
+  Choices({
+    required this.index,
+    required this.delta,
+    required this.finishReason,
+  });
+
+  factory Choices.fromJson(Map<String, dynamic> json) => _$ChoicesFromJson(json);
+}
+
+@JsonSerializable()
+class Delta {
+  @JsonKey(name: "role")
+  final String? role;
+  @JsonKey(name: "content")
+  final String? content;
+  @JsonKey(name: "reasoning_content")
+  final String? reasoningContent;
+  Delta({
+    required this.role,
+    required this.content,
+    required this.reasoningContent,
+  });
+
+  factory Delta.fromJson(Map<String, dynamic> json) => _$DeltaFromJson(json);
+}

+ 55 - 0
lib/data/bean/stream_deepseek_data.g.dart

@@ -0,0 +1,55 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'stream_deepseek_data.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+StreamDeepseekData _$StreamDeepseekDataFromJson(Map<String, dynamic> json) =>
+    StreamDeepseekData(
+      id: json['id'] as String,
+      object: json['object'] as String,
+      created: (json['created'] as num).toInt(),
+      model: json['model'] as String,
+      choices:
+          (json['choices'] as List<dynamic>?)
+              ?.map((e) => Choices.fromJson(e as Map<String, dynamic>))
+              .toList(),
+    );
+
+Map<String, dynamic> _$StreamDeepseekDataToJson(StreamDeepseekData instance) =>
+    <String, dynamic>{
+      'id': instance.id,
+      'object': instance.object,
+      'created': instance.created,
+      'model': instance.model,
+      'choices': instance.choices,
+    };
+
+Choices _$ChoicesFromJson(Map<String, dynamic> json) => Choices(
+  index: (json['index'] as num?)?.toInt(),
+  delta:
+      json['delta'] == null
+          ? null
+          : Delta.fromJson(json['delta'] as Map<String, dynamic>),
+  finishReason: json['finishReason'] as String?,
+);
+
+Map<String, dynamic> _$ChoicesToJson(Choices instance) => <String, dynamic>{
+  'index': instance.index,
+  'delta': instance.delta,
+  'finishReason': instance.finishReason,
+};
+
+Delta _$DeltaFromJson(Map<String, dynamic> json) => Delta(
+  role: json['role'] as String?,
+  content: json['content'] as String?,
+  reasoningContent: json['reasoning_content'] as String?,
+);
+
+Map<String, dynamic> _$DeltaToJson(Delta instance) => <String, dynamic>{
+  'role': instance.role,
+  'content': instance.content,
+  'reasoning_content': instance.reasoningContent,
+};

+ 53 - 0
lib/data/repository/chat_repository.dart

@@ -0,0 +1,53 @@
+import 'dart:convert';
+
+import 'package:injectable/injectable.dart';
+
+import '../../base/base_response.dart';
+import '../../utils/atmob_log.dart';
+import '../../utils/http_handler.dart';
+import '../../utils/sse_parse_util.dart';
+import '../api/atmob_stream_api.dart';
+import '../api/request/deep_seek_chat_request.dart';
+
+@lazySingleton
+class ChatRepository {
+  final AtmobStreamApi atmobStreamApi;
+  var tag = "ChatRepository";
+
+  ChatRepository(this.atmobStreamApi) {
+    AtmobLog.d(tag, '$tag....init');
+  }
+
+
+
+  Future<Stream<Message>> streamDeepSeek(String chatContent) {
+    return atmobStreamApi
+        .deepSeekChat(DeepSeekChatRequest(chatContent))
+        .then((response) async {
+          List<String>? contentType = response.headers['Content-Type'];
+          if (contentType != null) {
+            for (var value in contentType) {
+              if (value.contains('text/event-stream')) {
+                return response.stream;
+              } else if (value.contains('application/json')) {
+                BaseResponse<String> baseResponse = BaseResponse.fromJson(
+                  jsonDecode(
+                    await response.stream
+                        .map((bytes) => utf8.decoder.convert(bytes))
+                        .toList()
+                        .then((value) => value.join()),
+                  ),
+                  (json) => json as String,
+                );
+                throw ServerErrorException(
+                  baseResponse.code,
+                  baseResponse.message,
+                );
+              }
+            }
+          }
+          throw Exception('Invalid content type');
+        })
+        .then((stream) => SSEParseUtil.parse(stream));
+  }
+}