From 873deda49d74ba94cb24ffee68172309210199b6 Mon Sep 17 00:00:00 2001 From: ikechan8370 Date: Fri, 3 Mar 2023 20:31:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=A0=BC=E5=BC=8F=E9=81=BF=E5=85=8D=E9=A2=91?= =?UTF-8?q?=E7=B9=81panic=EF=BC=9B=E9=99=8D=E4=BD=8Eapi=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E9=87=8D=E8=AF=95=E6=AC=A1=E6=95=B0=EF=BC=9B=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=B8=AE=E5=8A=A9=E6=98=BE=E7=A4=BA=EF=BC=9B=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=BF=85=E5=BA=94=E6=96=B0=E5=A2=9E=E7=9A=84=E4=B8=89=E7=A7=8D?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++- apps/chat.js | 138 +++++++++++++++++-------------------- apps/help.js | 5 ++ apps/management.js | 9 +-- config/config.example.js | 84 ---------------------- config/config.example.json | 21 ++++++ guoba.support.js | 13 ++++ package.json | 2 +- resources/help/help.css | 2 +- utils/config.js | 46 +++++++++++-- 10 files changed, 156 insertions(+), 172 deletions(-) delete mode 100644 config/config.example.js create mode 100644 config/config.example.json diff --git a/README.md b/README.md index e5b52af..4d1346d 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ * 支持单人连续对话Conversation,群聊中支持加入其他人的对话 * API模式下,使用 gpt-3.5-turbo API,ChatGPT官网同款模型,仅需OpenAI Api Key,开箱即用。**注意收费** * 支持问答图片截图 +* 支持AI性格调教 * API3模式下,绕过Cloudflare防护直接访问ChatGPT的SSE API,与官方体验一致,且保留对话记录,在官网可查。免费。 * 提供基于浏览器的解决方案作为备选,API3不可用的情况下或担心账户安全的用户可以选择使用浏览器模式。 * 支持新[必应](https://www.bing.com/new)(Beta) @@ -24,7 +25,7 @@ Node.js >= 18 / Node.js >= 14(with node-fetch) > #### API模式和浏览器模式如何选择? > > * API模式会调用OpenAI官方提供的gpt-3.5-turbo API,ChatGPT官网同款模型,只需要提供API Key。一般情况下,该种方式响应速度更快,可配置项多,且不会像chatGPT官网一样总出现不可用的现象,但注意API调用是收费的,新用户有18美元试用金可用于支付,价格为`$0.0020/ 1K tokens`。(问题和回答**加起来**算token) -> * API3模式会调用第三方提供的官网反代API,他会帮你绕过CF防护,需要提供ChatGPT的Token。效果与官网和浏览器一致,但稳定性不一定。设置token和API2方法一样。 +> * API3模式会调用第三方提供的官网反代API,他会帮你绕过CF防护,需要提供ChatGPT的Token。效果与官网和浏览器一致,但稳定性不一定。发送#chatgpt设置token来设置token。 > * 浏览器模式通过在本地启动Chrome等浏览器模拟用户访问ChatGPT网站,使得获得和官方以及API2模式一模一样的回复质量,同时保证安全性。缺点是本方法对环境要求较高,需要提供桌面环境和一个可用的代理(能够访问ChatGPT的IP地址),且响应速度不如API,而且高峰期容易无法使用。一般作为API3的下位替代。 > * 必应(Bing)将调用微软新必应接口进行对话。需要在必应网页能够正常使用新必应且设置有效的Bing登录Cookie方可使用。 1. 进入 Yunzai根目录 @@ -45,9 +46,10 @@ pnpm i > 2.20更新:必应被大削,变得蠢了,建议还是API/API3优先 3. 修改配置 +**本插件配置项比较多,建议使用[锅巴面板](https://github.com/guoba-yunzai/Guoba-Plugin)修改** -复制`plugins/chatgpt-plugin/config/config.example.js`并将其改名为`config.js` -编辑`plugins/chatgpt-plugin/config/config.js`文件,根据其中的注释修改必要配置项 + 复制`plugins/chatgpt-plugin/config/config.example.json`并将其改名为`config.json`\ + 编辑`plugins/chatgpt-plugin/config/config.json`文件,修改必要配置项 4. 重启Yunzai-Bot diff --git a/apps/chat.js b/apps/chat.js index 7d4d4e7..f5d757d 100644 --- a/apps/chat.js +++ b/apps/chat.js @@ -72,6 +72,10 @@ export class chatgpt extends plugin { reg: '^#结束对话([sS]*)', fnc: 'destroyConversations' }, + { + reg: '^#结束全部对话$', + fnc: 'endAllConversations' + }, // { // reg: '#chatgpt帮助', // fnc: 'help' @@ -179,9 +183,40 @@ export class chatgpt extends plugin { } } + async endAllConversations (e) { + let use = await redis.get('CHATGPT:USE') || 'api' + let deleted = 0 + switch (use) { + case 'bing': + case 'api': { + let cs = await redis.keys('CHATGPT:CONVERSATIONS:*') + for (let i = 0; i < cs.length; i++) { + await redis.del(cs[i]) + if (Config.debug) { + logger.info('delete conversation of qq: ' + cs[i]) + } + deleted++ + } + break + } + case 'api3': { + let qcs = await redis.keys('CHATGPT:CONVERSATIONS:*') + for (let i = 0; i < qcs.length; i++) { + await redis.del(qcs[i]) + if (Config.debug) { + logger.info('delete conversation bind: ' + qcs[i]) + } + deleted++ + } + break + } + } + await this.reply(`结束了${deleted}个中用户的对话。`, true) + } + async deleteConversation (e) { let ats = e.message.filter(m => m.type === 'at') - let use = await redis.get('CHATGPT:USE') + let use = await redis.get('CHATGPT:USE') || 'api' if (use !== 'api3') { await this.reply('本功能当前仅支持API3模式', true) return false @@ -193,7 +228,7 @@ export class chatgpt extends plugin { return false } else { let deleteResponse = await deleteConversation(conversationId, newFetch) - console.log(deleteResponse) + logger.mark(deleteResponse) let deleted = 0 let qcs = await redis.keys('CHATGPT:QQ_CONVERSATION:*') for (let i = 0; i < qcs.length; i++) { @@ -215,7 +250,9 @@ export class chatgpt extends plugin { let conversationId = await redis.get('CHATGPT:QQ_CONVERSATION:' + qq) if (conversationId) { let deleteResponse = await deleteConversation(conversationId) - console.log(deleteResponse) + if (Config.debug) { + logger.mark(deleteResponse) + } let deleted = 0 let qcs = await redis.keys('CHATGPT:QQ_CONVERSATION:*') for (let i = 0; i < qcs.length; i++) { @@ -235,16 +272,6 @@ export class chatgpt extends plugin { } } - async help (e) { - let response = 'chatgpt-plugin使用帮助文字版\n' + - '@我+聊天内容: 发起对话与AI进行聊天\n' + - '#chatgpt对话列表: 查看当前发起的对话\n' + - '#结束对话: 结束自己或@用户的对话\n' + - '#chatgpt帮助: 查看本帮助\n' + - '源代码:https://github.com/ikechan8370/chatgpt-plugin' - await this.reply(response) - } - async switch2Picture (e) { let userSetting = await redis.get(`CHATGPT:USER:${e.sender.user_id}`) if (!userSetting) { @@ -331,15 +358,8 @@ export class chatgpt extends plugin { await this.reply('主人不让我回答你这种问题,真是抱歉了呢', true) return false } - // if (prompt.indexOf('