fix: 优化必应绘图逻辑

This commit is contained in:
ikechan8370 2023-12-12 19:48:03 +08:00
parent f7ee904414
commit 3f98d480de
2 changed files with 57 additions and 65 deletions

View file

@ -1588,7 +1588,6 @@ export class chatgpt extends plugin {
cookies = bingToken cookies = bingToken
} }
let bingAIClient let bingAIClient
if (Config.toneStyle === 'Sydney' || Config.toneStyle === 'Custom') {
const cacheOptions = { const cacheOptions = {
namespace: Config.toneStyle, namespace: Config.toneStyle,
store: new KeyvFile({ filename: 'cache.json' }) store: new KeyvFile({ filename: 'cache.json' })
@ -1605,19 +1604,6 @@ export class chatgpt extends plugin {
delete conversation.clientId delete conversation.clientId
delete conversation.invocationId delete conversation.invocationId
delete conversation.conversationSignature delete conversation.conversationSignature
} else {
let bingOption = {
userToken: bingToken, // "_U" cookie from bing.com
cookies,
debug: Config.debug,
proxy: Config.proxy,
host: Config.sydneyReverseProxy
}
if (Config.proxy && Config.sydneyReverseProxy && !Config.sydneyForceUseReverse) {
delete bingOption.host
}
bingAIClient = new BingAIClient(bingOption)
}
let response let response
let reply = '' let reply = ''
let retry = 3 let retry = 3
@ -1702,6 +1688,31 @@ export class chatgpt extends plugin {
const image = await getImg(e) const image = await getImg(e)
opt.imageUrl = image ? image[0] : undefined opt.imageUrl = image ? image[0] : undefined
} }
if (Config.enableGenerateContents) {
opt.onImageCreateRequest = prompt => {
logger.mark(`开始生成内容:${prompt}`)
if (Config.bingAPDraw) {
// 调用第三方API进行绘图
let apDraw = new APTool()
apDraw.func({
prompt
}, e)
} else {
let client = new BingDrawClient({
baseUrl: Config.sydneyReverseProxy,
userToken: bingToken
})
redis.set(`CHATGPT:DRAW:${e.sender.user_id}`, 'c', { EX: 30 }).then(() => {
try {
client.getImages(prompt, e)
} catch (err) {
redis.del(`CHATGPT:DRAW:${e.sender.user_id}`)
e.reply('绘图失败:' + err)
}
})
}
}
}
response = await bingAIClient.sendMessage(prompt, opt, (token) => { response = await bingAIClient.sendMessage(prompt, opt, (token) => {
reply += token reply += token
}) })
@ -1727,32 +1738,6 @@ export class chatgpt extends plugin {
}) })
} }
} }
// 处理内容生成的图片
if (response.details.imageTag) {
if (Config.debug) {
logger.mark(`开始生成内容:${response.details.imageTag}`)
}
if (Config.bingAPDraw) {
// 调用第三方API进行绘图
let apDraw = new APTool()
apDraw.func({
prompt: response.details.imageTag
}, e)
} else {
let client = new BingDrawClient({
baseUrl: Config.sydneyReverseProxy,
userToken: bingToken
})
await redis.set(`CHATGPT:DRAW:${e.sender.user_id}`, 'c', { EX: 30 })
try {
await client.getImages(response.details.imageTag, e)
} catch (err) {
await redis.del(`CHATGPT:DRAW:${e.sender.user_id}`)
await e.reply('绘图失败:' + err)
}
}
}
// 如果token曾经有异常则清除异常 // 如果token曾经有异常则清除异常
let Tokens = JSON.parse((await redis.get('CHATGPT:BING_TOKENS')) || '[]') let Tokens = JSON.parse((await redis.get('CHATGPT:BING_TOKENS')) || '[]')
const TokenIndex = Tokens?.findIndex(element => element.Token === abtrs.bingToken) const TokenIndex = Tokens?.findIndex(element => element.Token === abtrs.bingToken)
@ -1768,7 +1753,7 @@ export class chatgpt extends plugin {
const { maxConv } = error const { maxConv } = error
if (message && typeof message === 'string' && message.indexOf('CaptchaChallenge') > -1) { if (message && typeof message === 'string' && message.indexOf('CaptchaChallenge') > -1) {
if (bingToken) { if (bingToken) {
if (maxConv >= 20) { if (maxConv >= 20 && Config.bingCaptchaOneShotUrl) {
// maxConv为30说明token有效可以通过解验证码码服务过码 // maxConv为30说明token有效可以通过解验证码码服务过码
await e.reply('出现必应验证码,尝试解决中') await e.reply('出现必应验证码,尝试解决中')
try { try {
@ -1777,6 +1762,7 @@ export class chatgpt extends plugin {
await e.reply('验证码已解决') await e.reply('验证码已解决')
} else { } else {
logger.error(captchaResolveResult) logger.error(captchaResolveResult)
errorMessage = message
await e.reply('验证码解决失败: ' + captchaResolveResult.error) await e.reply('验证码解决失败: ' + captchaResolveResult.error)
retry = 0 retry = 0
} }
@ -1787,7 +1773,8 @@ export class chatgpt extends plugin {
} }
} else { } else {
// 未登录用户maxConv目前为5或10出验证码没救 // 未登录用户maxConv目前为5或10出验证码没救
logger.warn(`token [${bingToken}] 无效或已过期如确认token无误请前往网页版必应对话一次`) logger.warn(`token [${bingToken}] 出现必应验证码请前往网页版或app手动解决`)
errorMessage = message
retry = 0 retry = 0
} }
} else { } else {
@ -1838,9 +1825,9 @@ export class chatgpt extends plugin {
response = response || {} response = response || {}
if (errorMessage.includes('CaptchaChallenge')) { if (errorMessage.includes('CaptchaChallenge')) {
if (bingToken) { if (bingToken) {
errorMessage = '出现验证码请使用当前账户前往https://www.bing.com/chat或Edge侧边栏手动解除验证码' errorMessage = '出现验证码请使用当前账户前往https://www.bing.com/chat或Edge侧边栏或移动端APP手动解除验证码'
} else { } else {
errorMessage = '出现验证码,且未配置必应账户,请尝试更换代理/反代或绑定必应账户以解除验证码' errorMessage = '未配置必应账户,请绑定必应账户再使用必应模式'
} }
} }
return { return {

View file

@ -227,7 +227,8 @@ export default class SydneyAIClient {
firstMessageTimeout = Config.sydneyFirstMessageTimeout, firstMessageTimeout = Config.sydneyFirstMessageTimeout,
groupId, nickname, qq, groupName, chats, botName, masterName, groupId, nickname, qq, groupName, chats, botName, masterName,
messageType = 'Chat', messageType = 'Chat',
toSummaryFileContent toSummaryFileContent,
onImageCreateRequest = prompt => {}
} = opts } = opts
// if (messageType === 'Chat') { // if (messageType === 'Chat') {
// logger.warn('该Bing账户token已被限流降级至使用非搜索模式。本次对话AI将无法使用Bing搜索返回的内容') // logger.warn('该Bing账户token已被限流降级至使用非搜索模式。本次对话AI将无法使用Bing搜索返回的内容')
@ -651,6 +652,10 @@ export default class SydneyAIClient {
adaptiveCards: adaptiveCardsSoFar, adaptiveCards: adaptiveCardsSoFar,
text: replySoFar.join('') text: replySoFar.join('')
} }
if (messages[0].contentType === 'IMAGE') {
onImageCreateRequest(messages[0].text)
return
}
if (messages[0].contentOrigin === 'Apology') { if (messages[0].contentOrigin === 'Apology') {
console.log('Apology found') console.log('Apology found')
if (!replySoFar[0]) { if (!replySoFar[0]) {
@ -718,11 +723,11 @@ export default class SydneyAIClient {
adaptiveCards: adaptiveCardsSoFar, adaptiveCards: adaptiveCardsSoFar,
text: replySoFar.join('') text: replySoFar.join('')
} }
// 获取到图片内容 // // 获取到图片内容
if (messages.some(obj => obj.contentType === 'IMAGE')) { // if (messages.some(obj => obj.contentType === 'IMAGE')) {
message.imageTag = messages.filter(m => m.contentType === 'IMAGE').map(m => m.text).join('') // message.imageTag = messages.filter(m => m.contentType === 'IMAGE').map(m => m.text).join('')
} // }
message.text = messages.filter(m => m.author === 'bot' && m.contentType != 'IMAGE').map(m => m.text).join('') message.text = messages.filter(m => m.author === 'bot' && m.contentType !== 'IMAGE').map(m => m.text).join('')
if (!message) { if (!message) {
reject('No message was generated.') reject('No message was generated.')
return return