feat: bym

This commit is contained in:
ikechan8370 2025-03-17 16:19:12 +08:00
parent 6997d1e024
commit 9fcc25a726
5 changed files with 219 additions and 46 deletions

93
apps/bym.js Normal file
View file

@ -0,0 +1,93 @@
import ChatGPTConfig from '../config/config.js'
import { Chaite } from 'chaite'
import { intoUserMessage, toYunzai } from '../utils/message.js'
import common from '../../../lib/common/common.js'
export class bym extends plugin {
constructor () {
super({
name: 'ChatGPT-Plugin伪人模式',
dsc: 'ChatGPT-Plugin伪人模式',
event: 'message',
priority: -150,
rule: [
{
reg: '^#chatgpt伪人模式$',
fnc: 'bym'
}
]
})
}
async bym (e) {
if (!ChatGPTConfig.bym.enable) {
return false
}
let recall = false
let presetId = ChatGPTConfig.bym.defaultPreset
if (ChatGPTConfig.bym.presetMap && ChatGPTConfig.bym.presetMap.length > 0) {
const option = ChatGPTConfig.bym.presetMap.sort((a, b) => a.priority - b.priority)
.find(item => item.keywords.find(keyword => e.msg.includes(keyword)))
if (option) {
presetId = option.presetId
}
recall = !!option.recall
}
const presetManager = Chaite.getInstance().getChatPresetManager()
let preset = await presetManager.getInstance(presetId)
if (!preset) {
preset = await presetManager.getInstance(ChatGPTConfig.bym.defaultPreset)
}
if (!preset) {
logger.debug('未找到预设,请检查配置文件')
return false
}
if (ChatGPTConfig.bym.presetPrefix) {
if (!preset.sendMessageOption.systemOverride) {
preset.sendMessageOption.systemOverride = ''
}
preset.sendMessageOption.systemOverride = ChatGPTConfig.bym.presetPrefix + preset.sendMessageOption.systemOverride
}
const userMessage = await intoUserMessage(e, {
handleReplyText: true,
handleReplyImage: true,
useRawMessage: true,
handleAtMsg: true,
excludeAtBot: false,
toggleMode: ChatGPTConfig.basic.toggleMode,
togglePrefix: ChatGPTConfig.basic.togglePrefix
})
// 伪人不记录历史
preset.sendMessageOption.disableHistoryRead = true
preset.sendMessageOption.disableHistorySave = true
// 设置多轮调用回掉
preset.sendMessageOption.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 response = await Chaite.getInstance().sendMessage(userMessage, e, {
...preset.sendMessageOption,
chatPreset: preset
})
const { msgs, forward } = await toYunzai(e, response.contents)
if (msgs.length > 0) {
// await e.reply(msgs, false, { recallMsg: recall })
for (let msg of msgs) {
await e.reply(msg, false, { recallMsg: recall ? 10 : 0 })
await common.sleep(Math.floor(Math.random() * 2000) + 1000)
}
}
if (ChatGPTConfig.bym.sendReasoning) {
for (let forwardElement of forward) {
await e.reply(forwardElement, false, { recallMsg: recall ? 10 : 0 })
}
}
}
}

View file

@ -1,6 +1,6 @@
import Config from '../config/config.js'
import { Chaite, SendMessageOption } from 'chaite'
import { getPreset, intoUserMessage } from '../utils/message.js'
import { getPreset, intoUserMessage, toYunzai } from '../utils/message.js'
export class Chat extends plugin {
constructor () {
@ -22,9 +22,18 @@ export class Chat extends plugin {
async chat (e) {
const state = await Chaite.getInstance().getUserStateStorage().getItem(e.sender.user_id + '')
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 preset = await getPreset(e, state?.settings.preset || Config.llm.defaultChatPresetId, Config.basic.toggleMode, Config.basic.togglePrefix)
if (!preset) {
logger.debug('未找到预设,不进入对话')
logger.debug('不满足对话触发条件或未找到预设,不进入对话')
return false
}
const userMessage = await intoUserMessage(e, {
@ -40,10 +49,12 @@ export class Chat extends plugin {
...sendMessageOptions,
chatPreset: preset
})
const responseText = response.contents
.filter(c => c.type === 'text')
.map(c => (/** @type {import('chaite').TextContent} **/ c).text)
.reduce((a, b) => a + b, '')
await this.reply(responseText)
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)
}
}
}

View file

@ -1,7 +1,6 @@
import ChatGPTConfig from '../config/config.js'
import { createCRUDCommandRules, createSwitchCommandRules } from '../utils/command.js'
import { Chaite } from 'chaite'
import { resolve } from 'eslint-plugin-promise/rules/lib/promise-statics.js'
export class ChatGPTManagement extends plugin {
constructor () {
@ -20,6 +19,11 @@ export class ChatGPTManagement extends plugin {
{
reg: `^${cmdPrefix}结束(全部)?对话$`,
fnc: 'destroyConversation'
},
{
reg: `^${cmdPrefix}(bym|伪人)设置默认预设`,
fnc: 'setDefaultBymPreset',
permission: 'master'
}
]
})
@ -49,7 +53,8 @@ export class ChatGPTManagement extends plugin {
...createCRUDCommandRules.bind(this)(cmdPrefix, '黑名单群', 'blackGroups', false),
...createCRUDCommandRules.bind(this)(cmdPrefix, '白名单群', 'whiteGroups', false),
...createCRUDCommandRules.bind(this)(cmdPrefix, '黑名单用户', 'blackUsers', false),
...createCRUDCommandRules.bind(this)(cmdPrefix, '白名单用户', 'whiteUsers', false)
...createCRUDCommandRules.bind(this)(cmdPrefix, '白名单用户', 'whiteUsers', false),
createSwitchCommandRules(cmdPrefix, '(伪人|bym)', 'bym')
])
}
@ -60,6 +65,17 @@ export class ChatGPTManagement extends plugin {
this.reply(`token: ${token}, 有效期300秒`, true)
}
async setDefaultBymPreset (e) {
const presetId = e.msg.replace(`${ChatGPTConfig.basic.commandPrefix}伪人设置默认预设`, '')
const preset = await Chaite.getInstance().getChatPresetManager().getInstance(presetId)
if (preset) {
ChatGPTConfig.bym.defaultPreset = presetId
this.reply(`伪人模式默认预设已切换为${presetId}(${preset.name})`)
} else {
this.reply(`未找到预设${presetId}`)
}
}
async destroyConversation (e) {
if (e.msg.includes('全部')) {
if (!e.isMaster) {