@mi-gpt/next
Version:
让小爱音箱「听你的」,解锁无限可能。
112 lines (109 loc) • 3.33 kB
JavaScript
import { MiService } from './chunk-QDFX3624.js';
import { randomUUID } from 'node:crypto';
import { firstOf, lastOf } from '@mi-gpt/utils';
var _MiMessage = class {
_lastQueryMsg;
_tempQueryMsgs = [];
async fetchNextMessage() {
if (!this._lastQueryMsg) {
return this._fetchFirstMessage();
}
return this._fetchNextMessage();
}
async _fetchFirstMessage() {
const msgs = await this._fetchHistoryMsgs({
limit: 1,
filterAnswer: false
});
this._lastQueryMsg = msgs[0];
return void 0;
}
async _fetchNextMessage() {
if (this._tempQueryMsgs.length > 0) {
return this._fetchNextTempMessage();
}
const nextMsg = await this._fetchNext2Messages();
if (nextMsg !== "continue") {
return nextMsg;
}
return this._fetchNextRemainingMessages();
}
/**
* 拉取最新的 2 条消息,用于和上一条消息比对是否连续
*/
async _fetchNext2Messages() {
const msgs = await this._fetchHistoryMsgs({ limit: 2 });
if (msgs.length < 1 || firstOf(msgs).timestamp <= this._lastQueryMsg.timestamp) {
return;
}
if (firstOf(msgs).timestamp > this._lastQueryMsg.timestamp && (msgs.length === 1 || lastOf(msgs).timestamp <= this._lastQueryMsg.timestamp)) {
this._lastQueryMsg = firstOf(msgs);
return this._lastQueryMsg;
}
for (const msg of msgs) {
if (msg.timestamp > this._lastQueryMsg.timestamp) {
this._tempQueryMsgs.push(msg);
}
}
return "continue";
}
/**
* 继续向上拉取其他新消息
*/
async _fetchNextRemainingMessages(options) {
let currentPage = 0;
const { maxPage = 3, pageSize = 10 } = options ?? {};
while (true) {
currentPage++;
if (currentPage > maxPage) {
return this._fetchNextTempMessage();
}
const nextTimestamp = lastOf(this._tempQueryMsgs).timestamp;
const msgs = await this._fetchHistoryMsgs({
limit: pageSize,
timestamp: nextTimestamp
});
for (const msg of msgs) {
if (msg.timestamp >= nextTimestamp) ; else if (msg.timestamp > this._lastQueryMsg.timestamp) {
this._tempQueryMsgs.push(msg);
} else {
return this._fetchNextTempMessage();
}
}
}
}
/**
* 读取暂存的消息
*/
_fetchNextTempMessage() {
const nextMsg = this._tempQueryMsgs.pop();
this._lastQueryMsg = nextMsg;
return nextMsg;
}
async _fetchHistoryMsgs(options) {
var _a;
const filterAnswer = (options == null ? void 0 : options.filterAnswer) ?? true;
const conversation = await ((_a = MiService.MiNA) == null ? void 0 : _a.getConversations(options));
let records = (conversation == null ? void 0 : conversation.records) ?? [];
if (filterAnswer) {
records = records.filter(
(e) => {
var _a2;
return ["TTS", "LLM"].includes(((_a2 = e.answers[0]) == null ? void 0 : _a2.type) ?? "") && // 过滤 TTS 和 LLM 消息
e.answers.length === 1;
}
// 播放音乐时会有 TTS、Audio 两个 Answer
);
}
return records.map((e) => {
return {
id: randomUUID(),
sender: "user",
text: e.query,
timestamp: e.time
};
});
}
};
var MiMessage = new _MiMessage();
export { MiMessage };