Merge branch 'v1' of github.com:ikechan8370/chatgpt-plugin into v2

This commit is contained in:
ikechan8370 2023-03-11 13:59:53 +08:00
commit 71704f3d35
4 changed files with 29 additions and 17 deletions

View file

@ -227,7 +227,7 @@ pnpm i
可能是由于Yunzai-bot异常退出等原因造成Redis 队列中有残留的等待问题。使用`#清空队列`命令清除队列后再试。 可能是由于Yunzai-bot异常退出等原因造成Redis 队列中有残留的等待问题。使用`#清空队列`命令清除队列后再试。
4. Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'xxx'. 3. Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'xxx'.
请参照本文档前面的安装依赖部分重新依赖。随着项目更新可能引入新的依赖。 请参照本文档前面的安装依赖部分重新依赖。随着项目更新可能引入新的依赖。
@ -242,7 +242,10 @@ pnpm i
> 原因:没装依赖 > 原因:没装依赖
> >
> 解决方式:请参考文档在本插件目录下用`pnmp install`安装依赖,安装完就不报错了 > 解决方式:请参考文档在本插件目录下用`pnmp install`安装依赖,安装完就不报错了
4. 反代能自己搭吗?
能。参考[这里](https://ikechan8370.com/archives/da-jian-chatgpt-guan-fang-fan-xiang-dai-li)
## 感谢 ## 感谢

View file

@ -116,8 +116,8 @@ export class dalle extends plugin {
this.reply(images[0], true) this.reply(images[0], true)
} }
} catch (err) { } catch (err) {
console.log(err.response?.data?.error?.message) console.log(err.response?.data?.error?.message || err.message || JSON.stringify(err.response || {}))
this.reply(`绘图失败: ${err.response?.data?.error?.message}`, true) this.reply(`绘图失败: ${err.response?.data?.error?.message || err.message || JSON.stringify(err.response || {})}`, true)
await redis.del(`CHATGPT:VARIATION:${e.sender.user_id}`) await redis.del(`CHATGPT:VARIATION:${e.sender.user_id}`)
} }
} }
@ -136,8 +136,8 @@ export class dalle extends plugin {
this.reply(images[0], true) this.reply(images[0], true)
} }
} catch (err) { } catch (err) {
console.log(err.response?.data?.error?.message) console.log(err.response?.data?.error?.message || err.message || JSON.stringify(err.response || {}))
this.reply(`搞失败了: ${err.response?.data?.error?.message}`, true) this.reply(`搞失败了: ${err.response?.data?.error?.message || err.message || JSON.stringify(err.response || {})}`, true)
await redis.del(`CHATGPT:VARIATION:${e.sender.user_id}`) await redis.del(`CHATGPT:VARIATION:${e.sender.user_id}`)
} }
} }
@ -201,8 +201,8 @@ export class dalle extends plugin {
this.reply(images[0], true) this.reply(images[0], true)
} }
} catch (err) { } catch (err) {
logger.error(err.response?.data?.error?.message) logger.error(err.response?.data?.error?.message || err.message || JSON.stringify(err.response || {}))
this.reply(`图片编辑失败: ${err.response?.data?.error?.message}`, true) this.reply(`图片编辑失败: ${err.response?.data?.error?.message || err.message || JSON.stringify(err.response || {})}`, true)
await redis.del(`CHATGPT:EDIT:${e.sender.user_id}`) await redis.del(`CHATGPT:EDIT:${e.sender.user_id}`)
} }
} }

View file

@ -19,7 +19,7 @@ export async function getConversations (qq = '', fetchFn = fetch) {
} }
let conversations let conversations
try { try {
conversations = JSON.parse(json) conversations = JSON.parse(json).body
} catch (e) { } catch (e) {
throw new Error(json) throw new Error(json)
} }
@ -33,7 +33,7 @@ export async function getConversations (qq = '', fetchFn = fetch) {
map[item.id] = cachedConversationLastMessage map[item.id] = cachedConversationLastMessage
} else { } else {
// 缓存中没有就去查官方api // 缓存中没有就去查官方api
let conversationDetailResponse = await fetchFn(`${Config.apiBaseUrl}/api/conversation/${item.id}`, { let conversationDetailResponse = await fetchFn(`${Config.apiBaseUrl}/conversation/${item.id}`, {
method: 'GET', method: 'GET',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
@ -44,16 +44,21 @@ export async function getConversations (qq = '', fetchFn = fetch) {
if (Config.debug) { if (Config.debug) {
logger.mark('conversation detail for conversation ' + item.id, conversationDetail) logger.mark('conversation detail for conversation ' + item.id, conversationDetail)
} }
conversationDetail = JSON.parse(conversationDetail) try {
conversationDetail = JSON.parse(conversationDetail).body
} catch (err) {
logger.warn('跳过')
continue
}
let messages = Object.values(conversationDetail.mapping || {}) let messages = Object.values(conversationDetail.mapping || {})
messages = messages messages = messages
.filter(message => message.message) .filter(message => message.message)
.map(messages => messages.message) .map(messages => messages.message)
let messagesAssistant = messages.filter(messages => messages.role === 'assistant') let messagesAssistant = messages.filter(messages => messages.author.role === 'assistant')
.sort((a, b) => b.create_time - a.create_time) .sort((a, b) => b.create_time - a.create_time)
let messagesUser = messages.filter(messages => messages.role === 'user') let messagesUser = messages.filter(messages => messages.author.role === 'user')
.sort((a, b) => b.create_time - a.create_time) .sort((a, b) => b.create_time - a.create_time)
await redis.set(`CHATGPT:CONVERSATION_LENGTH:${item.id}`, messagesUser?.length || 0) await redis.set(`CHATGPT:CONVERSATION_LENGTH:${item.id}`, messagesUser?.length || 0)
let lastMessage = null let lastMessage = null
@ -101,7 +106,7 @@ export async function getLatestMessageIdByConversationId (conversationId, fetchF
if (!accessToken) { if (!accessToken) {
throw new Error('未绑定ChatGPT AccessToken请使用#chatgpt设置token命令绑定token') throw new Error('未绑定ChatGPT AccessToken请使用#chatgpt设置token命令绑定token')
} }
let conversationDetailResponse = await fetchFn(`${Config.apiBaseUrl}/api/conversation/${conversationId}`, { let conversationDetailResponse = await fetchFn(`${Config.apiBaseUrl}/conversation/${conversationId}`, {
method: 'GET', method: 'GET',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
@ -112,12 +117,12 @@ export async function getLatestMessageIdByConversationId (conversationId, fetchF
if (Config.debug) { if (Config.debug) {
logger.mark('conversation detail for conversation ' + conversationId, conversationDetail) logger.mark('conversation detail for conversation ' + conversationId, conversationDetail)
} }
conversationDetail = JSON.parse(conversationDetail) conversationDetail = JSON.parse(conversationDetail).body
let messages = Object.values(conversationDetail.mapping) let messages = Object.values(conversationDetail.mapping)
messages = messages messages = messages
.filter(message => message.message) .filter(message => message.message)
.map(messages => messages.message) .map(messages => messages.message)
.filter(messages => messages.role === 'assistant') .filter(messages => messages.author.role === 'assistant')
.sort((a, b) => b.create_time - a.create_time) .sort((a, b) => b.create_time - a.create_time)
await redis.set(`CHATGPT:CONVERSATION_LAST_MESSAGE_ID:${conversationId}`, messages[0].id) await redis.set(`CHATGPT:CONVERSATION_LAST_MESSAGE_ID:${conversationId}`, messages[0].id)
return messages[0].id return messages[0].id
@ -129,7 +134,7 @@ export async function deleteConversation (conversationId, fetchFn = fetch) {
if (!accessToken) { if (!accessToken) {
throw new Error('未绑定ChatGPT AccessToken请使用#chatgpt设置token命令绑定token') throw new Error('未绑定ChatGPT AccessToken请使用#chatgpt设置token命令绑定token')
} }
let response = await fetchFn(`${Config.apiBaseUrl}/api/conversation/${conversationId}`, { let response = await fetchFn(`${Config.apiBaseUrl}/conversation/${conversationId}`, {
method: 'PATCH', method: 'PATCH',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',

View file

@ -86,6 +86,10 @@ export class OfficialChatGPTClient {
referrer: 'https://chat.openai.com/chat' referrer: 'https://chat.openai.com/chat'
} }
const res = await this._fetch(url, option) const res = await this._fetch(url, option)
if (res.status !== 200) {
let body = await res.json()
throw new Error(JSON.stringify(body, null, 2))
}
const decoder = new TextDecoder('utf-8') const decoder = new TextDecoder('utf-8')
const bodyBytes = await res.arrayBuffer() const bodyBytes = await res.arrayBuffer()
const bodyText = decoder.decode(bodyBytes) const bodyText = decoder.decode(bodyBytes)