@mi-gpt/chat
Version:
114 lines (110 loc) • 2.95 kB
JavaScript
;
var chunkMYPB6QNC_cjs = require('./chunk-MYPB6QNC.cjs');
var crypto = require('crypto');
var openai = require('@mi-gpt/openai');
var stream = require('@mi-gpt/stream');
var utils = require('@mi-gpt/utils');
var string = require('@mi-gpt/utils/string');
var _ChatBot = class {
history = [];
config = {};
init(config) {
this.config = utils.deepMerge(chunkMYPB6QNC_cjs.kDefaultChatConfig, config);
openai.OpenAI.init(config == null ? void 0 : config.openai);
stream.StreamResponse.init(config == null ? void 0 : config.stream);
}
dispose() {
this.history = [];
openai.OpenAI.dispose();
}
async chat(msg) {
const answer = await openai.OpenAI.chat({
requestId: msg.id,
createParams: {
messages: this._getMessages(msg),
stream: false
}
});
if (answer) {
this._addMessage({
id: crypto.randomUUID(),
text: answer,
timestamp: Date.now(),
sender: "assistant"
});
}
return answer;
}
/**
* 处理用户消息,返回流式响应
*/
async chatWithStream(msg, onError) {
const stream$1 = new stream.StreamResponse();
openai.OpenAI.chat({
requestId: msg.id,
createParams: {
messages: this._getMessages(msg),
stream: true
},
onStream: (text) => {
if (stream$1.status === "canceled") {
return openai.OpenAI.cancel(msg.id);
}
stream$1.write(text);
},
onError: async (error) => {
stream$1.cancel();
await (onError == null ? void 0 : onError(error));
}
}).then((answer) => {
if (answer) {
stream$1.flush();
this._addMessage({
id: crypto.randomUUID(),
text: answer,
timestamp: Date.now(),
sender: "assistant"
});
} else {
stream$1.cancel();
}
});
return stream$1;
}
_getMessages(msg) {
const { context } = this._addMessage(msg);
const messages = this.history.map((m) => ({
role: m.sender,
content: m.text
}));
if (this.config.prompt.system) {
messages.unshift({
role: "system",
content: string.replaceVars(this.config.prompt.system, context)
});
}
return messages;
}
_addMessage(msg) {
const context = {
msg: msg.text,
time: string.toUTC8Time(new Date(msg.timestamp)),
...this.config.context.vars
};
const message = {
...msg,
text: string.replaceVars(this.config.prompt[msg.sender], context)
};
const maxHistoryLength = Math.max(1, this.config.context.historyMaxLength);
if (this.history.length === maxHistoryLength) {
this.history.shift();
}
if (this.history.length < maxHistoryLength) {
this.history.push(message);
}
return { message, context };
}
};
var ChatBot = new _ChatBot();
exports.ChatBot = ChatBot;
exports._ChatBot = _ChatBot;