feat: add support for Claude and Poe(WIP)

This commit is contained in:
ikechan8370 2023-04-15 21:00:34 +08:00
parent a3a16bc5ff
commit 7ef6051da8
38 changed files with 882 additions and 19 deletions

View file

@ -6,6 +6,7 @@ import delay from 'delay'
import { ChatGPTAPI } from 'chatgpt'
import { BingAIClient } from '@waylaidwanderer/chatgpt-api'
import SydneyAIClient from '../utils/SydneyAIClient.js'
import { PoeClient } from '../utils/poe/index.js'
import {
render, renderUrl,
getMessageById,
@ -25,6 +26,7 @@ import { convertSpeaker, generateAudio, speakers } from '../utils/tts.js'
import ChatGLMClient from '../utils/chatglm.js'
import { convertFaces } from '../utils/face.js'
import uploadRecord from '../utils/uploadRecord.js'
import {SlackClaudeClient} from "../utils/slack/slackClient.js";
try {
await import('keyv')
} catch (err) {
@ -708,7 +710,7 @@ export class chatgpt extends plugin {
num: 0
}
}
} else {
} else if (use !== 'poe' && use === 'claude') {
switch (use) {
case 'api': {
key = `CHATGPT:CONVERSATIONS:${e.sender.user_id}`
@ -758,7 +760,7 @@ export class chatgpt extends plugin {
// 字数超限直接返回
return false
}
if (use !== 'api3') {
if (use !== 'api3' && use !== 'poe' && use !== 'claude') {
previousConversation.conversation = {
conversationId: chatMessage.conversationId
}
@ -1331,6 +1333,33 @@ export class chatgpt extends plugin {
let sendMessageResult = await this.chatGPTApi.sendMessage(prompt, conversation)
return sendMessageResult
}
case 'poe': {
const cookie = await redis.get('CHATGPT:POE_TOKEN')
if (!cookie) {
throw new Error('未绑定Poe Cookie请使用#chatgpt设置Poe token命令绑定cookie')
}
let client = new PoeClient({
quora_cookie: cookie
})
await client.setCredentials()
await client.getChatId()
let ai = 'a2' // todo
await client.sendMsg(ai, prompt)
const response = await client.getResponse(ai)
return {
text: response.data
}
}
case 'claude': {
let client = new SlackClaudeClient({
slackUserToken: Config.slackUserToken,
slackChannelId: Config.slackChannelId
})
let text = await client.sendMessage(prompt)
return {
text
}
}
default: {
let completionParams = {}
if (Config.model) {

View file

@ -138,8 +138,8 @@ let helpData = [
},
{
icon: 'switch',
title: '#chatgpt切换浏览器/API/API3/Bing/ChatGLM',
desc: '切换使用的后端为浏览器或OpenAI API/反代官网API/Bing/自建ChatGLM'
title: '#chatgpt切换浏览器/API/API3/Bing/ChatGLM/Claude/Poe',
desc: '切换使用的后端为浏览器或OpenAI API/反代官网API/Bing/自建ChatGLM/Slack Claude/Poe'
},
{
icon: 'confirm',

View file

@ -32,6 +32,11 @@ export class ChatgptManagement extends plugin {
fnc: 'setAccessToken',
permission: 'master'
},
{
reg: '#chatgpt(设置|绑定)(Poe|POE)(token|Token)',
fnc: 'setPoeCookie',
permission: 'master'
},
{
reg: '#chatgpt(设置|绑定|添加)(必应|Bing |bing )(token|Token)',
fnc: 'setBingAccessToken',
@ -77,6 +82,16 @@ export class ChatgptManagement extends plugin {
fnc: 'useBingSolution',
permission: 'master'
},
{
reg: '^#chatgpt切换(Poe|poe)$',
fnc: 'useClaudeBasedSolution',
permission: 'master'
},
{
reg: '^#chatgpt切换(Claude|claude|slack)$',
fnc: 'useSlackClaudeBasedSolution',
permission: 'master'
},
{
reg: '^#chatgpt(必应|Bing)切换',
fnc: 'changeBingTone',
@ -404,6 +419,25 @@ export class ChatgptManagement extends plugin {
return false
}
async setPoeCookie () {
this.setContext('savePoeToken')
await this.reply('请发送Poe Cookie', true)
return false
}
async savePoeToken (e) {
if (!this.e.msg) return
let token = this.e.msg
if (!token.startsWith('p-b=')) {
await this.reply('Poe cookie格式错误', true)
this.finish('savePoeToken')
return
}
await redis.set('CHATGPT:POE_TOKEN', token)
await this.reply('Poe cookie设置成功', true)
this.finish('savePoeToken')
}
async setBingAccessToken (e) {
this.setContext('saveBingToken')
await this.reply('请发送Bing Cookie Token.("_U" cookie from bing.com)', true)
@ -587,22 +621,32 @@ export class ChatgptManagement extends plugin {
let use = await redis.get('CHATGPT:USE')
if (use !== 'bing') {
await redis.set('CHATGPT:USE', 'bing')
// 结束所有人的对话
const keys = await redis.keys('CHATGPT:CONVERSATIONS:*')
if (keys.length) {
const response = await redis.del(keys)
if (Config.debug) {
console.log('Deleted keys:', response)
}
} else {
console.log('No keys matched the pattern')
}
await this.reply('已切换到基于微软新必应的解决方案,如果已经对话过务必执行`#结束对话`避免引起404错误')
} else {
await this.reply('当前已经是必应Bing模式了')
}
}
async useClaudeBasedSolution (e) {
let use = await redis.get('CHATGPT:USE')
if (use !== 'poe') {
await redis.set('CHATGPT:USE', 'poe')
await this.reply('已切换到基于Quora\'s POE的解决方案')
} else {
await this.reply('当前已经是POE模式了')
}
}
async useSlackClaudeBasedSolution () {
let use = await redis.get('CHATGPT:USE')
if (use !== 'claude') {
await redis.set('CHATGPT:USE', 'claude')
await this.reply('已切换到基于slack claude机器人的解决方案')
} else {
await this.reply('当前已经是claude模式了')
}
}
async changeBingTone (e) {
let tongStyle = e.msg.replace(/^#chatgpt(必应|Bing)切换/, '')
if (!tongStyle) {