Merge branch 'ikechan8370:v2' into v2

This commit is contained in:
ifeif 2023-12-09 22:51:32 +08:00 committed by GitHub
commit 97dfbf9fb5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 311 additions and 82 deletions

View file

@ -20,6 +20,23 @@ import fs from 'fs'
import loader from '../../../lib/plugins/loader.js'
import VoiceVoxTTS, { supportConfigurations as voxRoleList } from '../utils/tts/voicevox.js'
import { supportConfigurations as azureRoleList } from '../utils/tts/microsoft-azure.js'
import fetch from 'node-fetch'
import { getProxy } from '../utils/proxy.js'
let proxy = getProxy()
const newFetch = (url, options = {}) => {
const defaultOptions = Config.proxy
? {
agent: proxy(Config.proxy)
}
: {}
const mergedOptions = {
...defaultOptions,
...options
}
return fetch(url, mergedOptions)
}
export class ChatgptManagement extends plugin {
constructor (e) {
@ -257,7 +274,13 @@ export class ChatgptManagement extends plugin {
},
{
reg: '^#chatgpt设置后台(刷新|refresh)(t|T)oken$',
fnc: 'setOpenAIPlatformToken'
fnc: 'setOpenAIPlatformToken',
permission: 'master'
},
{
reg: '^#chatgpt设置sessKey$',
fnc: 'getSessKey',
permission: 'master'
},
{
reg: '^#(chatgpt)?查看回复设置$',
@ -277,6 +300,25 @@ export class ChatgptManagement extends plugin {
reg: '^#chatgpt(开启|关闭)智能模式$',
fnc: 'switchSmartMode',
permission: 'master'
},
{
reg: '^#chatgpt模型列表$',
fnc: 'viewAPIModel'
},
{
reg: '^#chatgpt设置(API|api)模型$',
fnc: 'setAPIModel',
permission: 'master'
},
{
reg: '^#chatgpt设置(API|api)反代$',
fnc: 'setOpenAiBaseUrl',
permission: 'master'
},
{
reg: '^#chatgpt设置星火模型$',
fnc: 'setXinghuoModel',
permission: 'master'
}
]
})
@ -918,12 +960,13 @@ azure语音Azure 语音是微软 Azure 平台提供的一项语音服务,
return
}
let map = {
精准: 'precise',
创意: 'creative',
均衡: 'balanced',
精准: 'Sydney',
创意: 'Sydney',
均衡: 'Sydney',
Sydney: 'Sydney',
sydney: 'Sydney',
悉尼: 'Sydney',
默认: 'Sydney',
自设定: 'Custom',
自定义: 'Custom'
}
@ -931,7 +974,7 @@ azure语音Azure 语音是微软 Azure 平台提供的一项语音服务,
Config.toneStyle = map[tongStyle]
await e.reply('切换成功')
} else {
await e.reply('没有这种风格。支持的风格:精准、创意、均衡、悉尼、自设定')
await e.reply('没有这种风格。支持的风格:默认/创意/悉尼、自设定')
}
}
@ -956,7 +999,7 @@ azure语音Azure 语音是微软 Azure 平台提供的一项语音服务,
async modeHelp () {
let mode = await redis.get('CHATGPT:USE')
const modeMap = {
browser: '浏览器',
// browser: '浏览器',
azure: 'Azure',
// apiReverse: 'API2',
api: 'API',
@ -964,30 +1007,12 @@ azure语音Azure 语音是微软 Azure 平台提供的一项语音服务,
api3: 'API3',
chatglm: 'ChatGLM-6B',
claude: 'Claude',
poe: 'Poe'
poe: 'Poe',
xh: '星火',
qwen: '通义千问'
}
let modeText = modeMap[mode || 'api']
let message = `API模式和浏览器模式如何选择
API模式会调用 OpenAI 官方提供的 gpt-3.5-turbo API只需要提供 API Key一般情况下该种方式响应速度更快不会像 chatGPT 官网一样总出现不可用的现象但要注意 gpt-3.5-turbo API 调用是收费的新用户有 $5 的试用金可用于支付价格为 $0.0020/1K tokens问题和回答加起来算 token
API3 模式会调用官网反代 API它会帮你绕过 CF 防护需要提供 ChatGPT Token效果与官网和浏览器一致设置 Token 指令#chatgpt设置token
浏览器模式通过在本地启动 Chrome 等浏览器模拟用户访问 ChatGPT 网站使得获得和官方以及 API2 模式一模一样的回复质量同时保证安全性缺点是本方法对环境要求较高需要提供桌面环境和一个可用的代理能够访问 ChatGPT IP 地址且响应速度不如 API而且高峰期容易无法使用
必应Bing将调用微软新必应接口进行对话需要在必应网页能够正常使用新必应且设置有效的 Bing 登录 Cookie 方可使用#chatgpt设置必应 Token
自建 ChatGLM 模式会调用自建的 ChatGLM-6B 服务器 API 进行对话需要自建参考 https://github.com/ikechan8370/SimpleChatGLM6BAPI。
Claude 模式会调用 Slack 中的 Claude 机器人进行对话与其他模式不同的是全局共享一个对话配置参考 https://ikechan8370.com/archives/chatgpt-plugin-for-yunzaipei-zhi-slack-claude。
Poe 模式会调用 Poe 中的 Claude-instant 进行对话需要提供 Cookie#chatgpt设置 Poe Token
星火 模式会调用科大讯飞推出的新一代认知智能大模型 '星火认知大模型' 进行对话需要提供Cookie#chatgpt设置星火token
您可以使用 "#chatgpt切换浏览器/API/API3/Bing/ChatGLM/Claude/Poe/星火" 来切换到指定模式
当前为 ${modeText} 模式`
let message = `请访问yunzai.chat查看文档。当前为 ${modeText} 模式。`
await this.reply(message)
}
@ -1124,8 +1149,8 @@ Poe 模式会调用 Poe 中的 Claude-instant 进行对话。需要提供 Cookie
async saveAPIKey () {
if (!this.e.msg) return
let token = this.e.msg
if (!token.startsWith('sk-')) {
await this.reply('OpenAI API Key格式错误', true)
if (!token.startsWith('sk-') && !token.startsWith('sess-')) {
await this.reply('OpenAI API Key格式错误。如果是格式特殊的非官方Key请前往锅巴或工具箱手动设置', true)
this.finish('saveAPIKey')
return
}
@ -1312,7 +1337,64 @@ Poe 模式会调用 Poe 中的 Claude-instant 进行对话。需要提供 Cookie
async setOpenAIPlatformToken (e) {
this.setContext('doSetOpenAIPlatformToken')
await e.reply('请发送refreshToken\n你可以在已登录的platform.openai.com后台界面打开调试窗口在终端中执行\nJSON.parse(localStorage.getItem(Object.keys(localStorage).filter(k => k.includes(\'auth0\'))[0])).body.refresh_token\n如果仍不能查看余额请退出登录重新获取刷新令牌')
await e.reply('请发送refreshToken\n你可以在已登录的platform.openai.com后台界面打开调试窗口在终端中执行\nJSON.parse(localStorage.getItem(Object.keys(localStorage).filter(k => k.includes(\'auth0\'))[0])).body.refresh_token\n如果仍不能查看余额请退出登录重新获取刷新令牌.设置后可以发送#chatgpt设置sessKey来将sessKey作为API Key使用')
}
async getSessKey (e) {
if (!Config.OpenAiPlatformRefreshToken) {
this.reply('当前未配置platform.openai.com的刷新token请发送【#chatgpt设置后台刷新token】进行配置。')
return false
}
let authHost = 'https://auth0.openai.com'
if (Config.openAiBaseUrl && !Config.openAiBaseUrl.startsWith('https://api.openai.com')) {
authHost = Config.openAiBaseUrl.replace('/v1', '').replace('/v1/', '')
}
let refreshRes = await newFetch(`${authHost}/oauth/token`, {
method: 'POST',
body: JSON.stringify({
refresh_token: Config.OpenAiPlatformRefreshToken,
client_id: 'DRivsnm2Mu42T3KOpqdtwB3NYviHYzwD',
grant_type: 'refresh_token'
}),
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
'Content-Type': 'application/json'
}
})
if (refreshRes.status !== 200) {
let errMsg = await refreshRes.json()
logger.error(JSON.stringify(errMsg))
if (errMsg.error === 'access_denied') {
await e.reply('刷新令牌失效,请重新发送【#chatgpt设置后台刷新token】进行配置。建议退出platform.openai.com重新登录后再获取和配置')
} else {
await e.reply('获取失败')
}
return false
}
let newToken = await refreshRes.json()
// eslint-disable-next-line camelcase
const { access_token, refresh_token } = newToken
// eslint-disable-next-line camelcase
Config.OpenAiPlatformRefreshToken = refresh_token
let host = Config.openAiBaseUrl.replace('/v1', '').replace('/v1/', '')
let res = await newFetch(`${host}/dashboard/onboarding/login`, {
headers: {
// eslint-disable-next-line camelcase
Authorization: `Bearer ${access_token}`,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
},
method: 'POST'
})
if (res.status === 200) {
let authRes = await res.json()
let sess = authRes.user.session.sensitive_id
if (sess) {
Config.apiKey = sess
await e.reply('已成功将sessKey设置为apiKey您可以发送#openai余额来查看该账号余额')
} else {
await e.reply('设置失败!')
}
}
}
async doSetOpenAIPlatformToken () {
@ -1447,4 +1529,94 @@ Poe 模式会调用 Poe 中的 Claude-instant 进行对话。需要提供 Cookie
await e.reply('好的,已经关闭智能模式')
}
}
async viewAPIModel (e) {
const contents = [
'仅列出部分模型以供参考',
'gpt-3.5-turbo',
'gpt-3.5-turbo-0301',
'gpt-3.5-turbo-0613',
'gpt-3.5-turbo-1106',
'gpt-3.5-turbo-16k',
'gpt-3.5-turbo-16k-0613',
'gpt-4',
'gpt-4-32k',
'gpt-4-1106-preview'
]
let modelList = []
contents.forEach(value => {
// console.log(value)
modelList.push(value)
})
await this.e.reply(makeForwardMsg(e, modelList, '模型列表'))
}
async setAPIModel (e) {
this.setContext('saveAPIModel')
await this.reply('请发送API模型', true)
return false
}
async saveAPIModel () {
if (!this.e.msg) return
let token = this.e.msg
Config.model = token
await this.reply('API模型设置成功', true)
this.finish('saveAPIModel')
}
async setOpenAiBaseUrl (e) {
this.setContext('saveOpenAiBaseUrl')
await this.reply('请发送API反代', true)
return false
}
async saveOpenAiBaseUrl () {
if (!this.e.msg) return
let token = this.e.msg
// console.log(token.startsWith('http://') || token.startsWith('https://'))
if (token.startsWith('http://') || token.startsWith('https://')) {
Config.openAiBaseUrl = token
await this.reply('API反代设置成功', true)
this.finish('saveOpenAiBaseUrl')
return
}
await this.reply('你的输入不是一个有效的URL,请检查是否含有http://或https://', true)
this.finish('saveOpenAiBaseUrl')
}
async setXinghuoModel (e) {
this.setContext('saveXinghuoModel')
await this.reply('1星火V1.5\n2星火V2\n3星火V3\n4星火助手')
await this.reply('请发送序号', true)
return false
}
async saveXinghuoModel (e) {
if (!this.e.msg) return
let token = this.e.msg
let ver
switch (token) {
case '3':
ver = 'V3'
Config.xhmode = 'apiv3'
break
case '2':
ver = 'V2'
Config.xhmode = 'apiv2'
break
case '1':
ver = 'V1.5'
Config.xhmode = 'api'
break
case '4':
ver = '助手'
Config.xhmode = 'assistants'
break
default:
break
}
await this.reply(`已成功切换到星火${ver}`, true)
this.finish('saveXinghuoModel')
}
}