mirror of
https://github.com/ikechan8370/chatgpt-plugin.git
synced 2025-12-16 13:27:08 +00:00
99 lines
3.8 KiB
JavaScript
99 lines
3.8 KiB
JavaScript
import Config from '../config/config.js'
|
|
import { Chaite, SendMessageOption } from 'chaite'
|
|
import { getPreset, intoUserMessage, toYunzai } from '../utils/message.js'
|
|
import { YunzaiUserState } from '../models/chaite/storage/lowdb/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
|
|
}
|
|
]
|
|
})
|
|
}
|
|
|
|
async chat (e) {
|
|
if (!Chaite.getInstance()) {
|
|
return false
|
|
}
|
|
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()
|
|
}
|
|
if (!state.current.messageId) {
|
|
state.current.messageId = 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
|
|
})
|
|
sendMessageOptions.conversationId = state?.current?.conversationId
|
|
sendMessageOptions.parentMessageId = state?.current?.messageId || state?.conversations.find(c => c.id === sendMessageOptions.conversationId)?.lastMessageId
|
|
const enableGroupContext = (preset.groupContext === 'use_system' || !preset.groupContext) ? Config.llm.enableGroupContext : (preset.groupContext === 'enabled')
|
|
if (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
|
|
const conversations = state.conversations
|
|
if (conversations.find(c => c.id === sendMessageOptions.conversationId)) {
|
|
conversations.find(c => c.id === sendMessageOptions.conversationId).lastMessageId = response.id
|
|
} else {
|
|
conversations.push({
|
|
id: sendMessageOptions.conversationId,
|
|
lastMessageId: response.id,
|
|
// todo
|
|
name: 'New Conversation'
|
|
})
|
|
}
|
|
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)
|
|
}
|
|
}
|
|
}
|