import Config from '../config/config.js' import { Chaite, SendMessageOption } from 'chaite' import { getPreset, intoUserMessage, toYunzai } from '../utils/message.js' import { YunzaiUserState } from '../models/chaite/user_state_storage.js' import { getGroupContextPrompt, getGroupHistory } from '../utils/group.js' import * as crypto from 'node:crypto' export class Chat extends plugin { constructor () { super({ name: 'ChatGPT-Plugin对话', dsc: 'ChatGPT-Plugin对话', event: 'message', priority: 500, rule: [ { reg: '^[^#][sS]*', fnc: 'chat', log: false }, { reg: '#hi', fnc: 'history' } ] }) } async chat (e) { let state = await Chaite.getInstance().getUserStateStorage().getItem(e.sender.user_id + '') if (!state) { state = new YunzaiUserState(e.sender.user_id, e.sender.nickname, e.sender.card) await Chaite.getInstance().getUserStateStorage().setItem(e.sender.user_id + '', state) } if (!state.current.conversationId) { state.current.conversationId = crypto.randomUUID() } const preset = await getPreset(e, state?.settings.preset || Config.llm.defaultChatPresetId, Config.basic.toggleMode, Config.basic.togglePrefix) if (!preset) { logger.debug('不满足对话触发条件或未找到预设,不进入对话') return false } else { logger.info('进入对话, prompt: ' + e.msg) } const sendMessageOptions = SendMessageOption.create(state?.settings) sendMessageOptions.onMessageWithToolCall = async content => { const { msgs, forward } = await toYunzai(e, [content]) if (msgs.length > 0) { await e.reply(msgs) } for (let forwardElement of forward) { this.reply(forwardElement) } } const userMessage = await intoUserMessage(e, { handleReplyText: false, handleReplyImage: true, useRawMessage: false, handleAtMsg: true, excludeAtBot: false, toggleMode: Config.basic.toggleMode, togglePrefix: Config.basic.togglePrefix }) if (Config.llm.enableGroupContext && e.isGroup) { const contextPrompt = await getGroupContextPrompt(e, Config.llm.groupContextLength) sendMessageOptions.systemOverride = sendMessageOptions.systemOverride ? sendMessageOptions.systemOverride + '\n' + contextPrompt : (preset.sendMessageOption.systemOverride + contextPrompt) } const response = await Chaite.getInstance().sendMessage(userMessage, e, { ...sendMessageOptions, chatPreset: preset }) // 更新当前聊天进度 state.current.messageId = response.id await Chaite.getInstance().getUserStateStorage().setItem(e.sender.user_id + '', state) const { msgs, forward } = await toYunzai(e, response.contents) if (msgs.length > 0) { await e.reply(msgs, true) } for (let forwardElement of forward) { this.reply(forwardElement) } } async history (e) { const history = await getGroupHistory(e, 10) e.reply(JSON.stringify(history)) } }