You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.3 KiB
46 lines
1.3 KiB
/// EMAI 助手的一条对话消息。
|
|
class EmaiMessage {
|
|
EmaiMessage({
|
|
required this.isUser,
|
|
required this.text,
|
|
this.isFinal = false,
|
|
this.isError = false,
|
|
this.fromEarphone = false,
|
|
DateTime? at,
|
|
}) : at = at ?? DateTime.now();
|
|
|
|
final bool isUser;
|
|
String text;
|
|
|
|
/// 流式内容是否已经收完(用户侧看 SpeechEnded,助手侧看 RespondingEnded)
|
|
bool isFinal;
|
|
|
|
/// 错误提示气泡(用红色系展示,不参与对话上下文)
|
|
final bool isError;
|
|
|
|
/// 这一轮是不是耳机按键唤醒时发生的。
|
|
/// 手机页面照样要展示它——用户要求「不管在哪聊的,打开界面都能看到」——
|
|
/// 只是给个耳机小标记,免得看不懂这些内容是哪来的。
|
|
final bool fromEarphone;
|
|
|
|
final DateTime at;
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
'u': isUser,
|
|
't': text,
|
|
'f': isFinal,
|
|
'e': isError,
|
|
'h': fromEarphone,
|
|
'at': at.millisecondsSinceEpoch,
|
|
};
|
|
|
|
factory EmaiMessage.fromJson(Map json) => EmaiMessage(
|
|
isUser: json['u'] == true,
|
|
text: (json['t'] ?? '').toString(),
|
|
isFinal: json['f'] == true,
|
|
isError: json['e'] == true,
|
|
fromEarphone: json['h'] == true,
|
|
at: DateTime.fromMillisecondsSinceEpoch(
|
|
(json['at'] as num?)?.toInt() ?? 0),
|
|
);
|
|
}
|
|
|