mirror of
https://github.com/ikechan8370/chatgpt-plugin.git
synced 2025-12-18 06:17:06 +00:00
fix: delete old codes
This commit is contained in:
parent
8dacaa4a48
commit
8ff0983a87
1 changed files with 1 additions and 158 deletions
159
apps/chat.js
159
apps/chat.js
|
|
@ -3,7 +3,6 @@ import _ from 'lodash'
|
||||||
import { Config } from '../config/index.js'
|
import { Config } from '../config/index.js'
|
||||||
import showdown from 'showdown'
|
import showdown from 'showdown'
|
||||||
import mjAPI from 'mathjax-node'
|
import mjAPI from 'mathjax-node'
|
||||||
import { ChatGPTPuppeteer } from '../utils/browser.js'
|
|
||||||
import { uuid } from 'oicq/lib/common.js'
|
import { uuid } from 'oicq/lib/common.js'
|
||||||
import delay from 'delay'
|
import delay from 'delay'
|
||||||
import { ChatGPTAPI } from 'chatgpt'
|
import { ChatGPTAPI } from 'chatgpt'
|
||||||
|
|
@ -53,7 +52,7 @@ export class chatgpt extends plugin {
|
||||||
/** 命令正则匹配 */
|
/** 命令正则匹配 */
|
||||||
reg: '^[^#][sS]*',
|
reg: '^[^#][sS]*',
|
||||||
/** 执行方法 */
|
/** 执行方法 */
|
||||||
fnc: 'chatgptNew'
|
fnc: 'chatgpt'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
reg: '#chatgpt对话列表',
|
reg: '#chatgpt对话列表',
|
||||||
|
|
@ -170,162 +169,6 @@ export class chatgpt extends plugin {
|
||||||
* @param e oicq传递的事件参数e
|
* @param e oicq传递的事件参数e
|
||||||
*/
|
*/
|
||||||
async chatgpt (e) {
|
async chatgpt (e) {
|
||||||
if (!e.msg || e.msg.startsWith('#')) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (e.isGroup && !e.atme) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let api = await redis.get('CHATGPT:API_OPTION')
|
|
||||||
if (!api) {
|
|
||||||
let option = { markdown: true }
|
|
||||||
if (Config['2captchaToken']) {
|
|
||||||
option.captchaToken = Config['2captchaToken']
|
|
||||||
}
|
|
||||||
// option.debug = true
|
|
||||||
option.email = Config.username
|
|
||||||
option.password = Config.password
|
|
||||||
this.chatGPTApi = new ChatGPTPuppeteer(option)
|
|
||||||
await redis.set('CHATGPT:API_OPTION', JSON.stringify(option))
|
|
||||||
} else {
|
|
||||||
let option = JSON.parse(api)
|
|
||||||
this.chatGPTApi = new ChatGPTPuppeteer(option)
|
|
||||||
}
|
|
||||||
let question = e.msg.trimStart()
|
|
||||||
|
|
||||||
let randomId = uuid()
|
|
||||||
// 队列队尾插入,开始排队
|
|
||||||
await redis.rPush('CHATGPT:CHAT_QUEUE', [randomId])
|
|
||||||
if (await redis.lIndex('CHATGPT:CHAT_QUEUE', 0) === randomId) {
|
|
||||||
await this.reply('我正在思考如何回复你,请稍等', true, { recallMsg: 60 })
|
|
||||||
} else {
|
|
||||||
let length = await redis.lLen('CHATGPT:CHAT_QUEUE') - 1
|
|
||||||
await this.reply(`我正在思考如何回复你,请稍等,当前队列前方还有${length}个问题`, true, { recallMsg: 120 })
|
|
||||||
// 开始排队
|
|
||||||
while (true) {
|
|
||||||
if (await redis.lIndex('CHATGPT:CHAT_QUEUE', 0) === randomId) {
|
|
||||||
break
|
|
||||||
} else {
|
|
||||||
await delay(1500)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info(`chatgpt question: ${question}`)
|
|
||||||
// try {
|
|
||||||
// await this.chatGPTApi.init()
|
|
||||||
// } catch (e) {
|
|
||||||
// await this.reply('chatgpt初始化出错:' + e.msg, true)
|
|
||||||
// }
|
|
||||||
let previousConversation = await redis.get(`CHATGPT:CONVERSATIONS:${e.sender.user_id}`)
|
|
||||||
let conversation = null
|
|
||||||
if (!previousConversation) {
|
|
||||||
let ctime = new Date()
|
|
||||||
previousConversation = {
|
|
||||||
sender: e.sender,
|
|
||||||
ctime,
|
|
||||||
utime: ctime,
|
|
||||||
num: 0
|
|
||||||
}
|
|
||||||
// await redis.set(`CHATGPT:CONVERSATIONS:${e.sender.user_id}`, JSON.stringify(previousConversation), { EX: CONVERSATION_PRESERVE_TIME })
|
|
||||||
} else {
|
|
||||||
previousConversation = JSON.parse(previousConversation)
|
|
||||||
conversation = {
|
|
||||||
conversationId: previousConversation.conversation.conversationId,
|
|
||||||
parentMessageId: previousConversation.conversation.parentMessageId
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
let option = {
|
|
||||||
onConversationResponse: function (c) {
|
|
||||||
previousConversation.conversation = {
|
|
||||||
conversationId: c.conversation_id,
|
|
||||||
parentMessageId: c.message.id
|
|
||||||
}
|
|
||||||
redis.set(`CHATGPT:CONVERSATIONS:${e.sender.user_id}`, JSON.stringify(previousConversation), { EX: CONVERSATION_PRESERVE_TIME }).then(res => {
|
|
||||||
logger.debug('redis set conversation')
|
|
||||||
})
|
|
||||||
},
|
|
||||||
timeoutMs: 120000
|
|
||||||
}
|
|
||||||
if (conversation) {
|
|
||||||
option = Object.assign(option, conversation)
|
|
||||||
}
|
|
||||||
let response = await this.chatGPTApi.sendMessage(question, option)
|
|
||||||
// 移除队列首位,释放锁
|
|
||||||
await redis.lPop('CHATGPT:CHAT_QUEUE', 0)
|
|
||||||
// 检索是否有屏蔽词
|
|
||||||
const blockWord = blockWords.split(',').find(word => response.toLowerCase().includes(word.toLowerCase()))
|
|
||||||
if (blockWord) {
|
|
||||||
await this.reply('返回内容存在敏感词,我不想回答你', true)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let userSetting = await redis.get(`CHATGPT:USER:${e.sender.user_id}`)
|
|
||||||
if (userSetting) {
|
|
||||||
userSetting = JSON.parse(userSetting)
|
|
||||||
} else {
|
|
||||||
userSetting = {
|
|
||||||
usePicture: false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (userSetting.usePicture) {
|
|
||||||
let endTokens = ['.', '。', '……', '!', '!', ']', ')', ')', '】', '?', '?', '~', '"', "'"]
|
|
||||||
while (!endTokens.find(token => response.trimEnd().endsWith(token))) {
|
|
||||||
// while (!response.trimEnd().endsWith('.') && !response.trimEnd().endsWith('。') && !response.trimEnd().endsWith('……') &&
|
|
||||||
// !response.trimEnd().endsWith('!') && !response.trimEnd().endsWith('!') && !response.trimEnd().endsWith(']') && !response.trimEnd().endsWith('】')
|
|
||||||
// ) {
|
|
||||||
await this.reply('内容有点多,我正在奋笔疾书,请再等一会', true, { recallMsg: 5 })
|
|
||||||
option = {
|
|
||||||
onConversationResponse: function (c) {
|
|
||||||
previousConversation.conversation = {
|
|
||||||
conversationId: c.conversation_id,
|
|
||||||
parentMessageId: c.message.id
|
|
||||||
}
|
|
||||||
redis.set(`CHATGPT:CONVERSATIONS:${e.sender.user_id}`, JSON.stringify(previousConversation), { EX: CONVERSATION_PRESERVE_TIME }).then(res => {
|
|
||||||
logger.debug('redis set conversation')
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
option = Object.assign(option, previousConversation.conversation)
|
|
||||||
const responseAppend = await this.chatGPTApi.sendMessage('Continue', option)
|
|
||||||
// console.log(responseAppend)
|
|
||||||
// 检索是否有屏蔽词
|
|
||||||
const blockWord = blockWords.split(',').find(word => responseAppend.toLowerCase().includes(word.toLowerCase()))
|
|
||||||
if (blockWord) {
|
|
||||||
await this.reply('返回内容存在敏感词,我不想回答你', true)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (responseAppend.indexOf('conversation') > -1 || responseAppend.startsWith("I'm sorry")) {
|
|
||||||
logger.warn('chatgpt might forget what it had said')
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
response = response + responseAppend
|
|
||||||
}
|
|
||||||
// logger.info(response)
|
|
||||||
// markdown转为html
|
|
||||||
// todo部分数学公式可能还有问题
|
|
||||||
let converted = converter.makeHtml(response)
|
|
||||||
|
|
||||||
/** 最后回复消息 */
|
|
||||||
await e.runtime.render('chatgpt-plugin', 'content/index', { content: converted, question, senderName: e.sender.nickname })
|
|
||||||
} else {
|
|
||||||
await this.reply(`${response}`, e.isGroup)
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
logger.error(e)
|
|
||||||
// 异常了也要腾地方(todo 大概率后面的也会异常,要不要一口气全杀了)
|
|
||||||
await redis.lPop('CHATGPT:CHAT_QUEUE', 0)
|
|
||||||
await this.reply(`与OpenAI通信异常,请稍后重试:${e}`, true, { recallMsg: e.isGroup ? 10 : 0 })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* #chatgpt
|
|
||||||
* @param e oicq传递的事件参数e
|
|
||||||
*/
|
|
||||||
async chatgptNew (e) {
|
|
||||||
if (!e.msg || e.msg.startsWith('#')) {
|
if (!e.msg || e.msg.startsWith('#')) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue