feat: 新增追问模式和iOS本地化,重构后端输出模型
This commit is contained in:
@@ -93,6 +93,7 @@ class DivinationApi {
|
||||
advice: _asStringList(agentOutputRaw['advice']),
|
||||
keywords: _asStringList(agentOutputRaw['keywords']),
|
||||
answer: _asString(agentOutputRaw['answer']),
|
||||
status: _parseStatus(agentOutputRaw['status']),
|
||||
);
|
||||
records.add(aggregate.toViewData(params));
|
||||
} catch (error, stackTrace) {
|
||||
@@ -472,12 +473,24 @@ String _asString(Object? value) {
|
||||
return value is String ? value : '';
|
||||
}
|
||||
|
||||
List<String> _asStringList(Object? value) {
|
||||
if (value is! List<dynamic>) {
|
||||
return const <String>[];
|
||||
List<String> _asStringList(Object? value) {
|
||||
if (value is! List<dynamic>) {
|
||||
return const <String>[];
|
||||
}
|
||||
return value.whereType<String>().toList(growable: false);
|
||||
}
|
||||
|
||||
DivinationRunStatus _parseStatus(Object? value) {
|
||||
if (value is! String) {
|
||||
return DivinationRunStatus.success;
|
||||
}
|
||||
return switch (value) {
|
||||
'success' => DivinationRunStatus.success,
|
||||
'failed' => DivinationRunStatus.failed,
|
||||
'refused' => DivinationRunStatus.refused,
|
||||
_ => DivinationRunStatus.success,
|
||||
};
|
||||
}
|
||||
return value.whereType<String>().toList(growable: false);
|
||||
}
|
||||
|
||||
String _yaoTypeToText(YaoType type) {
|
||||
return switch (type) {
|
||||
|
||||
@@ -60,6 +60,7 @@ class DivinationRunAggregate {
|
||||
required this.advice,
|
||||
required this.keywords,
|
||||
required this.answer,
|
||||
this.status = DivinationRunStatus.success,
|
||||
});
|
||||
|
||||
final DerivedDivinationData derived;
|
||||
@@ -70,6 +71,7 @@ class DivinationRunAggregate {
|
||||
final List<String> advice;
|
||||
final List<String> keywords;
|
||||
final String answer;
|
||||
final DivinationRunStatus status;
|
||||
|
||||
DivinationResultData toViewData(DivinationParams params) {
|
||||
return DivinationResultData(
|
||||
@@ -84,9 +86,9 @@ class DivinationRunAggregate {
|
||||
signType: signLevel,
|
||||
keywords: keywords.join('、'),
|
||||
focusPoints: focusPoints,
|
||||
conclusion: _asBullet(conclusion),
|
||||
conclusion: conclusion.join('\n'),
|
||||
analysis: answer,
|
||||
suggestion: _asBullet(advice),
|
||||
suggestion: advice.join('\n'),
|
||||
ganzhi: GanzhiData(
|
||||
yearGanZhi: derived.ganzhi.yearGanZhi,
|
||||
monthGanZhi: derived.ganzhi.monthGanZhi,
|
||||
@@ -108,19 +110,9 @@ class DivinationRunAggregate {
|
||||
targetYaoLines: derived.targetYaoInfoList
|
||||
.map((line) => line.toViewModel())
|
||||
.toList(growable: false),
|
||||
status: status,
|
||||
);
|
||||
}
|
||||
|
||||
String _asBullet(List<String> lines) {
|
||||
if (lines.isEmpty) {
|
||||
return '';
|
||||
}
|
||||
return List<String>.generate(
|
||||
lines.length,
|
||||
(i) => '${i + 1}. ${lines[i]}',
|
||||
growable: false,
|
||||
).join('\n');
|
||||
}
|
||||
}
|
||||
|
||||
class DerivedDivinationData {
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import 'divination_params.dart';
|
||||
|
||||
enum DivinationRunStatus { success, failed, refused }
|
||||
|
||||
class DivinationResultData {
|
||||
const DivinationResultData({
|
||||
this.threadId,
|
||||
@@ -20,6 +22,7 @@ class DivinationResultData {
|
||||
required this.wuXingStatus,
|
||||
required this.yaoLines,
|
||||
required this.targetYaoLines,
|
||||
this.status = DivinationRunStatus.success,
|
||||
});
|
||||
|
||||
final DivinationParams params;
|
||||
@@ -40,8 +43,10 @@ class DivinationResultData {
|
||||
final Map<String, String> wuXingStatus;
|
||||
final List<YaoLineData> yaoLines;
|
||||
final List<YaoLineData> targetYaoLines;
|
||||
final DivinationRunStatus status;
|
||||
|
||||
bool get hasChangingYao => binaryCode != changedBinaryCode;
|
||||
bool get isSuccess => status == DivinationRunStatus.success;
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return <String, dynamic>{
|
||||
@@ -65,6 +70,7 @@ class DivinationResultData {
|
||||
'targetYaoLines': targetYaoLines
|
||||
.map((line) => line.toJson())
|
||||
.toList(growable: false),
|
||||
'status': status.name,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -117,8 +123,21 @@ class DivinationResultData {
|
||||
return YaoLineData.fromJson(raw);
|
||||
})
|
||||
.toList(growable: false),
|
||||
status: _parseStatus(json['status']),
|
||||
);
|
||||
}
|
||||
|
||||
static DivinationRunStatus _parseStatus(Object? value) {
|
||||
if (value is! String) {
|
||||
return DivinationRunStatus.success;
|
||||
}
|
||||
return switch (value) {
|
||||
'success' => DivinationRunStatus.success,
|
||||
'failed' => DivinationRunStatus.failed,
|
||||
'refused' => DivinationRunStatus.refused,
|
||||
_ => DivinationRunStatus.success,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
List<String> _requiredStringList(Map<String, dynamic> json, String key) {
|
||||
|
||||
@@ -5,6 +5,7 @@ import '../../../../core/network/api_problem.dart';
|
||||
import '../apis/divination_api.dart';
|
||||
import '../models/divination_backend_models.dart';
|
||||
import '../models/divination_params.dart';
|
||||
import '../models/divination_result.dart';
|
||||
|
||||
class DivinationRunService {
|
||||
const DivinationRunService({required DivinationApi api}) : _api = api;
|
||||
@@ -38,6 +39,7 @@ class DivinationRunService {
|
||||
List<String> advice = const <String>[];
|
||||
List<String> keywords = const <String>[];
|
||||
String answer = '';
|
||||
DivinationRunStatus status = DivinationRunStatus.success;
|
||||
|
||||
await for (final event in _api.streamEvents(
|
||||
threadId: threadId,
|
||||
@@ -68,6 +70,7 @@ class DivinationRunService {
|
||||
advice = _requiredStringList(event, 'advice');
|
||||
keywords = _requiredStringList(event, 'keywords');
|
||||
answer = _requiredString(event, 'answer');
|
||||
status = _parseStatus(event['status']);
|
||||
onTextMessageEnd?.call();
|
||||
continue;
|
||||
}
|
||||
@@ -111,9 +114,22 @@ class DivinationRunService {
|
||||
advice: advice,
|
||||
keywords: keywords,
|
||||
answer: answer,
|
||||
status: status,
|
||||
);
|
||||
}
|
||||
|
||||
DivinationRunStatus _parseStatus(Object? value) {
|
||||
if (value is! String) {
|
||||
return DivinationRunStatus.success;
|
||||
}
|
||||
return switch (value) {
|
||||
'success' => DivinationRunStatus.success,
|
||||
'failed' => DivinationRunStatus.failed,
|
||||
'refused' => DivinationRunStatus.refused,
|
||||
_ => DivinationRunStatus.success,
|
||||
};
|
||||
}
|
||||
|
||||
String _requiredString(Map<String, dynamic> json, String key) {
|
||||
final value = json[key];
|
||||
if (value is! String || value.isEmpty) {
|
||||
|
||||
Reference in New Issue
Block a user