UNPKG

@mi-gpt/chat

Version:
114 lines (110 loc) 2.95 kB
'use strict'; 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;