From a32eb61f847d9180229499385155a73e163f14ad Mon Sep 17 00:00:00 2001 From: hanhan258 <96119846+hanhan258@users.noreply.github.com> Date: Thu, 15 Feb 2024 16:04:11 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat=EF=BC=9A=E6=8C=87=E4=BB=A4=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E5=BD=93=E5=89=8D=E9=83=A8=E5=88=86=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=8Capi=E6=B5=81=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/chat.js | 4 ++- apps/management.js | 70 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 61 insertions(+), 13 deletions(-) diff --git a/apps/chat.js b/apps/chat.js index d575d678..d418ddc8 100644 --- a/apps/chat.js +++ b/apps/chat.js @@ -134,6 +134,7 @@ const newFetch = (url, options = {}) => { export class chatgpt extends plugin { constructor () { let toggleMode = Config.toggleMode + let apiStream = Config.apiStream super({ /** 功能名称 */ name: 'ChatGpt 对话', @@ -291,6 +292,7 @@ export class chatgpt extends plugin { ] }) this.toggleMode = toggleMode + this.apiStream = apiStream } /** @@ -2276,7 +2278,7 @@ export class chatgpt extends plugin { let option = { timeoutMs: 600000, completionParams, - stream: true, + stream: this.apiStream, onProgress: (data) => { if (Config.debug) { logger.info(data?.text || data.functionCall || data) diff --git a/apps/management.js b/apps/management.js index fcf8654b..90408c24 100644 --- a/apps/management.js +++ b/apps/management.js @@ -335,6 +335,16 @@ export class ChatgptManagement extends plugin { reg: '^#chatgpt必应(禁用|禁止|关闭|启用|开启)搜索$', fnc: 'switchBingSearch', permission: 'master' + }, + { + reg: '^#chatgpt查看当前配置$', + fnc: 'queryConfig', + permission: 'master' + }, + { + reg: '^#chatgpt(开启|关闭)(api|API)流$', + fnc: 'switchStream', + permission: 'master' } ] }) @@ -1682,26 +1692,20 @@ azure语音:Azure 语音是微软 Azure 平台提供的一项语音服务, async setXinghuoModel (e) { this.setContext('saveXinghuoModel') - await this.reply('1:星火V1.5\n2:星火V2\n3:星火V3\n4:星火助手') + await this.reply('1:星火V1.5\n2:星火V2\n3:星火V3\n4:星火V3.5\n5:星火助手') await this.reply('请发送序号', true) return false } - async switchBingSearch (e) { - if (e.msg.includes('启用') || e.msg.includes('开启')) { - Config.sydneyEnableSearch = true - await e.reply('已开启必应搜索') - } else { - Config.sydneyEnableSearch = false - await e.reply('已禁用必应搜索') - } - } - async saveXinghuoModel (e) { if (!this.e.msg) return let token = this.e.msg let ver switch (token) { + case '4': + ver = 'V3.5' + Config.xhmode = 'apiv3.5' + break case '3': ver = 'V3' Config.xhmode = 'apiv3' @@ -1714,7 +1718,7 @@ azure语音:Azure 语音是微软 Azure 平台提供的一项语音服务, ver = 'V1.5' Config.xhmode = 'api' break - case '4': + case '5': ver = '助手' Config.xhmode = 'assistants' break @@ -1724,4 +1728,46 @@ azure语音:Azure 语音是微软 Azure 平台提供的一项语音服务, await this.reply(`已成功切换到星火${ver}`, true) this.finish('saveXinghuoModel') } + + async switchBingSearch (e) { + if (e.msg.includes('启用') || e.msg.includes('开启')) { + Config.sydneyEnableSearch = true + await e.reply('已开启必应搜索') + } else { + Config.sydneyEnableSearch = false + await e.reply('已禁用必应搜索') + } + } + + async queryConfig (e) { + let use = await redis.get('CHATGPT:USE') + let config = [] + config.push(`当前模式:${use}`) + config.push(`\n当前API模型:${Config.model}`) + if (e.isPrivate) { + config.push(`\n当前APIKey:${Config.apiKey}`) + config.push(`\n当前API反代:${Config.openAiBaseUrl}`) + config.push(`\n当前必应反代:${Config.sydneyReverseProxy}`) + } + config.push(`\n当前星火模型:${Config.xhmode}`) + e.reply(config) + } + + async switchStream (e) { + if (e.msg.includes('开启')) { + if (Config.apiStream) { + await e.reply('已经开启了') + return + } + Config.apiStream = true + await e.reply('好的,已经打开API流式输出') + } else { + if (!Config.apiStream) { + await e.reply('已经是关闭得了') + return + } + Config.apiStream = false + await e.reply('好的,已经关闭API流式输出') + } + } } From 74a0b7ddbcaeb65967936738ae770df76cc8cb61 Mon Sep 17 00:00:00 2001 From: hanhan258 <96119846+hanhan258@users.noreply.github.com> Date: Sat, 17 Feb 2024 21:12:49 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat=EF=BC=9Adalle3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/draw.js | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/apps/draw.js b/apps/draw.js index f45722b5..6f584e10 100644 --- a/apps/draw.js +++ b/apps/draw.js @@ -32,11 +32,44 @@ export class dalle extends plugin { { reg: '^#bing(画图|绘图)', fnc: 'bingDraw' + }, + { + reg: '^#dalle3(画图|绘图)', + fnc: 'dalle3' } ] }) } + // dalle3 + async dalle3 (e) { + if (!Config.enableDraw) { + this.reply('画图功能未开启') + return false + } + let ttl = await redis.ttl(`CHATGPT:DALLE3:${e.sender.user_id}`) + if (ttl > 0 && !e.isMaster) { + this.reply(`冷却中,请${ttl}秒后再试`) + return false + } + let prompt = e.msg.replace(/^#?dalle3(画图|绘图)/, '').trim() + console.log('draw方法被调用,消息内容:', prompt) + await redis.set(`CHATGPT:DALLE3:${e.sender.user_id}`, 'c', { EX: 30 }) + await this.reply('正在为您绘制大小为1024x1024的1张图片,预计消耗0.24美元余额,请稍候……') + try { + let images = (await createImage(prompt, '1', '1024x1024')).map(image => segment.image(`base64://${image}`)) + if (images.length > 1) { + this.reply(await makeForwardMsg(e, images, prompt)) + } else { + this.reply(images[0], true) + } + } catch (err) { + logger.error(err.response?.data?.error?.message) + this.reply(`绘图失败: ${err.response?.data?.error?.message}`, true) + await redis.del(`CHATGPT:DALLE3:${e.sender.user_id}`) + } + } + async draw (e) { if (!Config.enableDraw) { this.reply('画图功能未开启') @@ -215,7 +248,7 @@ export class dalle extends plugin { } try { let images = (await editImage(imgUrl, position.split(',').map(p => parseInt(p, 10)), prompt, num, size)) - .map(image => segment.image(`base64://${image}`)) + .map(image => segment.image(`base64://${image}`)) if (images.length > 1) { this.reply(await makeForwardMsg(e, images, prompt)) } else { From c917688478e8349e6e8a28eca71381961c21b4fc Mon Sep 17 00:00:00 2001 From: hanhan258 <96119846+hanhan258@users.noreply.github.com> Date: Sun, 18 Feb 2024 14:25:00 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix=EF=BC=9Adalle3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/draw.js | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/apps/draw.js b/apps/draw.js index 6f584e10..339d29cb 100644 --- a/apps/draw.js +++ b/apps/draw.js @@ -4,6 +4,7 @@ import { makeForwardMsg } from '../utils/common.js' import _ from 'lodash' import { Config } from '../utils/config.js' import BingDrawClient from '../utils/BingDraw.js' +import fetch from 'node-fetch' export class dalle extends plugin { constructor (e) { @@ -57,15 +58,38 @@ export class dalle extends plugin { await redis.set(`CHATGPT:DALLE3:${e.sender.user_id}`, 'c', { EX: 30 }) await this.reply('正在为您绘制大小为1024x1024的1张图片,预计消耗0.24美元余额,请稍候……') try { - let images = (await createImage(prompt, '1', '1024x1024')).map(image => segment.image(`base64://${image}`)) - if (images.length > 1) { - this.reply(await makeForwardMsg(e, images, prompt)) - } else { - this.reply(images[0], true) + const response = await fetch(`${Config.openAiBaseUrl}/images/generations`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${Config.apiKey}` + }, + body: JSON.stringify({ + model: 'dall-e-3', + prompt, + n: 1, + size: '1024x1024', + response_format: 'b64_json' + }) + }) + // 如果需要,可以解析响应体 + const dataJson = await response.json() + console.log(dataJson) + if (dataJson.error) { + e.reply(`画图失败:${dataJson.error?.code}:${dataJson.error?.message}`) + await redis.del(`CHATGPT:DALLE3:${e.sender.user_id}`) + return + } + if (dataJson.data[0].b64_json) { + e.reply(`描述:${dataJson.data[0].revised_prompt}`) + e.reply(segment.image(`base64://${dataJson.data[0].b64_json}`)) + } else if (dataJson.data[0].url) { + e.reply(`哈哈哈,图来了~\n防止图💥,附上链接:\n${dataJson.data[0].url}`) + e.reply(segment.image(dataJson.data[0].url)) } } catch (err) { - logger.error(err.response?.data?.error?.message) - this.reply(`绘图失败: ${err.response?.data?.error?.message}`, true) + logger.error(err) + this.reply(`画图失败: ${err}`, true) await redis.del(`CHATGPT:DALLE3:${e.sender.user_id}`) } }