From 06fd121950229a9129b6fd922b72f9b7db01631a Mon Sep 17 00:00:00 2001 From: ikechan8370 Date: Mon, 17 Apr 2023 12:48:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20claude=E7=9A=84=E8=AE=BE=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/chat.js | 46 ++++++++++++++++++++++++++++++++++++++++++++++ apps/help.js | 5 +++++ apps/prompts.js | 20 +++++++++++++------- guoba.support.js | 12 ++++++++++++ utils/config.js | 4 +++- 5 files changed, 79 insertions(+), 8 deletions(-) diff --git a/apps/chat.js b/apps/chat.js index 72c442b..37f2d15 100644 --- a/apps/chat.js +++ b/apps/chat.js @@ -27,6 +27,7 @@ import ChatGLMClient from '../utils/chatglm.js' import { convertFaces } from '../utils/face.js' import uploadRecord from '../utils/uploadRecord.js' import {SlackClaudeClient} from "../utils/slack/slackClient.js"; +import {getPromptByName} from "../utils/prompts.js"; try { await import('keyv') } catch (err) { @@ -174,6 +175,10 @@ export class chatgpt extends plugin { reg: '^#chatgpt删除对话', fnc: 'deleteConversation', permission: 'master' + }, + { + reg: '^#claude开启新对话', + fnc: 'newClaudeConversation' } ] }) @@ -1390,6 +1395,14 @@ export class chatgpt extends plugin { slackUserToken: Config.slackUserToken, slackChannelId: Config.slackChannelId }) + let conversationId = await redis.get(`CHATGPT:SLACK_CONVERSATION:${e.sender.user_id}`) + if (!conversationId) { + // 如果是新对话 + if (Config.slackClaudeEnableGlobalPreset && Config.slackClaudeGlobalPreset) { + // 先发送设定 + await client.sendMessage(Config.slackClaudeGlobalPreset, e) + } + } let text = await client.sendMessage(prompt, e) return { text @@ -1449,6 +1462,39 @@ export class chatgpt extends plugin { } } + async newClaudeConversation (e) { + let presetName = e.msg.replace(/^#claude开启新对话/, '').trim() + let client = new SlackClaudeClient({ + slackUserToken: Config.slackUserToken, + slackChannelId: Config.slackChannelId + }) + let response + if (!presetName || presetName === '空' || presetName === '无设定') { + let conversationId = await redis.get(`CHATGPT:SLACK_CONVERSATION:${e.sender.user_id}`) + if (conversationId) { + // 如果有对话进行中,先删除 + logger.info('开启Claude新对话,但旧对话未结束,自动结束上一次对话') + await redis.del(`CHATGPT:SLACK_CONVERSATION:${e.sender.user_id}`) + } + response = await client.sendMessage('', e) + await e.reply(response, true) + } else { + let preset = getPromptByName(presetName) + if (!preset) { + await e.reply('没有这个设定', true) + } else { + let conversationId = await redis.get(`CHATGPT:SLACK_CONVERSATION:${e.sender.user_id}`) + if (conversationId) { + // 如果有对话进行中,先删除 + logger.info('开启Claude新对话,但旧对话未结束,自动结束上一次对话') + await redis.del(`CHATGPT:SLACK_CONVERSATION:${e.sender.user_id}`) + } + response = await client.sendMessage(preset.content, e) + await e.reply(response, true) + } + } + } + async emptyQueue (e) { await redis.lTrim('CHATGPT:CHAT_QUEUE', 1, 0) await this.reply('已清空当前等待队列') diff --git a/apps/help.js b/apps/help.js index cb67474..679fccd 100644 --- a/apps/help.js +++ b/apps/help.js @@ -55,6 +55,11 @@ let helpData = [ icon: 'confirm', title: '#chatgpt(导出)聊天记录', desc: '图片形式导出聊天记录,目前仅支持Bing下的Sydney和自定义' + }, + { + icon: 'smiley-wink', + title: '#claude开启新对话+设定名', + desc: '结束之前的对话,并开启一个新的Claude对话,如果设定名不为空的话,会使用这个设定。设定必须是设定列表中有的设定。' } ] }, diff --git a/apps/prompts.js b/apps/prompts.js index d5ff999..53a0fe3 100644 --- a/apps/prompts.js +++ b/apps/prompts.js @@ -138,8 +138,12 @@ export class help extends plugin { content: Config.sydney } } else { - await e.reply('没有这个设定', true) - return + await this.importPrompt(`#chatgpt导入设定${promptName}`) + prompt = getPromptByName(promptName) + if (!prompt) { + await e.reply('没有这个设定', true) + return + } } } let use = await redis.get('CHATGPT:USE') || 'api' @@ -150,7 +154,8 @@ export class help extends plugin { } const keyMap = { api: 'promptPrefixOverride', - Custom: 'sydney' + Custom: 'sydney', + claude: 'slackClaudeGlobalPreset' } if (keyMap[use]) { @@ -158,10 +163,7 @@ export class help extends plugin { await redis.set(`CHATGPT:PROMPT_USE_${use}`, promptName) await e.reply(`你当前正在使用${use}模式,已将该模式设定应用为"${promptName}"。更该设定后建议结束对话以使设定更好生效`, true) } else { - await e.reply(`你当前正在使用${use}模式,该模式不支持设定`, true) - } - if (use === 'Custom') { - Config.sydneyBrainWashName = promptName + await e.reply(`你当前正在使用${use}模式,该模式不支持设定。支持设定的模式有:API、自定义、Claude`, true) } } @@ -439,6 +441,10 @@ export class help extends plugin { if (response.status === 200) { let r = await response.json() if (r.code === 200) { + if (!r.data) { + await e.reply('没有这个设定', true) + return true + } const { prompt, title } = r.data saveOnePrompt(title, prompt) e.reply(`导入成功。您现在可以使用 #chatgpt使用设定${title} 来体验这个设定了。`) diff --git a/guoba.support.js b/guoba.support.js index 92961d3..c09329e 100644 --- a/guoba.support.js +++ b/guoba.support.js @@ -469,6 +469,18 @@ export function supportGuoba () { bottomHelpMessage: 'Signing Secret。在Basic Information页面获取', component: 'Input' }, + { + field: 'slackClaudeEnableGlobalPreset', + label: 'Claude使用全局设定', + bottomHelpMessage: '开启后,所有人每次发起新对话时,会先发送设定过去再开始对话,达到类似Bing自设定的效果。', + component: 'Switch' + }, + { + field: 'slackClaudeGlobalPreset', + label: 'Slack全局设定', + bottomHelpMessage: '若启用全局设定,每个人都会默认使用这里的设定。', + component: 'Input' + }, { label: '以下为ChatGLM方式的配置', component: 'Divider' diff --git a/utils/config.js b/utils/config.js index 64b6d22..3c66e12 100644 --- a/utils/config.js +++ b/utils/config.js @@ -97,7 +97,9 @@ const defaultConfig = { // slackChannelId: '', slackSigningSecret: '', slackClaudeUserId: '', - version: 'v2.5.4' + slackClaudeEnableGlobalPreset: true, + slackClaudeGlobalPreset: '', + version: 'v2.5.5' } const _path = process.cwd() let config = {}