Skip to content

Commit

Permalink
feat: 添加知识库变量
Browse files Browse the repository at this point in the history
  • Loading branch information
leo committed Jul 9, 2024
1 parent 21e23be commit 318de1a
Show file tree
Hide file tree
Showing 14 changed files with 77 additions and 48 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
## 更新日志

### V1.6.58(2024-07-10)
1、Dify 和 FastGPT 每次调用都会携带用户信息和群聊信息,可以使用环境变量获取,实现真正的个性化机器人服务,更像真人

### V1.6.57(2024-06-05)
1、添加聊天内容记录到本地

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "wechaty-web-panel",
"version": "1.6.57",
"version": "1.6.58",
"description": "智能微秘书插件",
"exports": {
".": {
Expand Down
12 changes: 6 additions & 6 deletions src/botInstance/dify.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class DifyAi {
}


async getReply(content, uid, adminId = '', systemMessage = '') {
async getReply({ content, inputs }, id, adminId = '', systemMessage = '') {
try {
if(!this.difyChat) {
console.log('启用Dify对话平台');
Expand All @@ -76,12 +76,12 @@ class DifyAi {
}
if(systemMessage || content === 'reset' || content === '重置') {
console.log('重新更新上下文对话');
this.chatOption[uid] = {}
this.chatOption[id] = {}
if(content === 'reset' || content === '重置') {
return [{type: 1, content: '上下文已重置'}]
}
}
const { conversationId, text, files } = systemMessage ? await this.difyChat.sendMessage(content, { ...this.chatOption[uid], systemMessage, timeoutMs: this.config.timeoutMs * 1000 || 80 * 1000, user: uid }) : await this.difyChat.sendMessage(content, { ...this.chatOption[uid], timeoutMs: this.config.timeoutMs * 1000 || 80 * 1000, user: uid });
const { conversationId, text, files } = systemMessage ? await this.difyChat.sendMessage(content, { ...this.chatOption[id], inputs, systemMessage, timeoutMs: this.config.timeoutMs * 1000 || 80 * 1000, user: id }) : await this.difyChat.sendMessage(content, { ...this.chatOption[id], inputs, timeoutMs: this.config.timeoutMs * 1000 || 80 * 1000, user: id });
if(this.config.filter) {
const censor = await this.contentCensor.checkText(text)
if(!censor) {
Expand All @@ -90,11 +90,11 @@ class DifyAi {
}
}
if(this.config.record) {
void addAichatRecord({ contactId: uid, adminId, input: content, output: text, time: dayjs().format('YYYY-MM-DD HH:mm:ss') })
void addAichatRecord({ contactId: id, adminId, input: content, output: text, time: dayjs().format('YYYY-MM-DD HH:mm:ss') })
}
// 保存对话id 对于同一个用户的对话不更新conversationId
if(!this.chatOption[uid]?.conversationId) {
this.chatOption[uid] = {
if(!this.chatOption[id]?.conversationId) {
this.chatOption[id] = {
conversationId
};
}
Expand Down
7 changes: 6 additions & 1 deletion src/botInstance/officialOpenAi.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ class OfficialOpenAi {
}


async getReply(content, uid, adminId = '', systemMessage = '', isFastGPT) {
async getReply(content, uid, adminId = '', systemMessage = '', isFastGPT, variables) {
try {
if(!this.chatGPT) {
console.log(isFastGPT ? '看到此消息说明启用了FastGPT' : '看到此消息说明已启用ChatGPT');
Expand Down Expand Up @@ -164,11 +164,16 @@ class OfficialOpenAi {
}
}


const sendParams = { ...this.chatOption[uid], timeoutMs: this.config.timeoutMs * 1000 || 80 * 1000 }
if(systemMessage) {
sendParams.systemMessage = systemMessage;
}

if(isFastGPT && variables) {
sendParams.variables = variables
}

const { conversationId, text, id } = await this.chatGPT.sendMessage(content, sendParams);

if(this.config.filter) {
Expand Down
6 changes: 5 additions & 1 deletion src/botInstance/sdk/chatGPT.js
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,8 @@ let ChatGPTAPI = class {
stream = !!onProgress,
completionParams,
conversationId,
chatId
chatId,
variables
} = opts;
let { abortSignal } = opts;
let abortController = null;
Expand Down Expand Up @@ -202,6 +203,9 @@ let ChatGPTAPI = class {
if(chatId) {
body.chatId = chatId
}
if(variables) {
body.variables = variables
}
if (this._apiOrg) {
headers["OpenAI-Organization"] = this._apiOrg;
}
Expand Down
6 changes: 4 additions & 2 deletions src/botInstance/sdk/difyClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -146,10 +146,12 @@ export class CompletionClient extends DifyClient {

export class ChatClient extends DifyClient {
async sendMessage(query, {
systemMessage, user, conversationId = null, timeoutMs = 100 * 1000, files = null
systemMessage, user, conversationId = null, timeoutMs = 100 * 1000, files = null, inputs
}) {
const data = {
inputs: {},
inputs: {
...inputs
},
query,
user,
response_mode: this.stream ? 'streaming' : 'blocking',
Expand Down
23 changes: 17 additions & 6 deletions src/handlers/on-message.js
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,16 @@ async function dispatchFriendFilterByMsgType(that, msg) {
break
case that.Message.Type.Audio:
let finalConfig = await getCustomConfig({ name, id: contact.id, roomName: '', roomId: '', room: false, type: 'openWhisper' })
if(!finalConfig && config?.customBot?.openWhisper) {
finalConfig = {
botConfig: {
whisperConfig: config?.customBot?.whisperConfig
}
}
}
if(finalConfig) {
const audioFileBox = await msg.toFileBox()
const text = await getVoiceText(audioFileBox, finalConfig.botConfig.whisperConfig)
const text = msg.text().trim() ? msg.text().trim() : await getVoiceText(audioFileBox, finalConfig.botConfig.whisperConfig)
console.log('语音解析结果', text)
const keyword = finalConfig.botConfig.whisperConfig?.keywords?.length ? finalConfig.botConfig?.whisperConfig.keywords?.find((item) => text.includes(item)): true;
const isIgnore = checkIgnore(content.trim(), aibotConfig.ignoreMessages)
Expand Down Expand Up @@ -163,9 +170,6 @@ async function dispatchFriendFilterByMsgType(that, msg) {
case that.Message.Type.Video:
console.log(`发消息人${await contact.name()}:发了一个视频`)
break
case that.Message.Type.Audio:
console.log(`发消息人${await contact.name()}:发了一个视频`)
break
case that.Message.Type.MiniProgram:
console.log(`发消息人${await contact.name()}:发了一个小程序`)
const miniProgram = await msg.toMiniProgram()
Expand Down Expand Up @@ -313,9 +317,16 @@ async function dispatchRoomFilterByMsgType(that, room, msg) {
case that.Message.Type.Audio:
console.log(`群名: ${roomName} 发消息人: ${contactName} 发了一个语音`)
let finalConfig = await getCustomConfig({ name: contactName, id: contactId, roomName, roomId: room.id, room, type: 'openWhisper' })
if(!finalConfig && config?.customBot?.openWhisper) {
finalConfig = {
botConfig: {
whisperConfig: config?.customBot?.whisperConfig
}
}
}
if(finalConfig) {
const audioFileBox = await msg.toFileBox()
const text = await getVoiceText(audioFileBox, finalConfig.botConfig.whisperConfig)
const text = msg.text().trim() ? msg.text().trim() : await getVoiceText(audioFileBox, finalConfig.botConfig.whisperConfig)
console.log('语音解析结果', text)
const keyword = finalConfig.botConfig.whisperConfig?.keywords?.length ? finalConfig.botConfig?.whisperConfig?.keywords?.find((item) => text.includes(item)): true;
const isIgnore = checkIgnore(content.trim(), aibotConfig.ignoreMessages)
Expand All @@ -337,7 +348,7 @@ async function dispatchRoomFilterByMsgType(that, room, msg) {
}
return
}
replys = await await getRoomTextReply({
replys = await getRoomTextReply({
that,
content: text,
isFriend,
Expand Down
4 changes: 2 additions & 2 deletions src/proxy/bot/chatgpt.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export function resetAll() {
})
chatGPT = {}
}
export async function getChatGPTReply(content, uid, adminId, config = { token: "", debug: false, proxyPass: "", proxyUrl: "", showQuestion: false, timeoutMs: 80, model: "", systemMessage: "", keywordSystemMessages: [] }, isFastGPT) {
export async function getChatGPTReply({ content, variables }, uid, adminId, config = { token: "", debug: false, proxyPass: "", proxyUrl: "", showQuestion: false, timeoutMs: 80, model: "", systemMessage: "", keywordSystemMessages: [] }, isFastGPT) {
if (!config.token) {
console.log('请到智能微秘书平台配置Openai apikey参数方可使用')
return [{ type: 1, content: '请到平台配置Openai apikey参数方可使用' }]
Expand All @@ -36,5 +36,5 @@ export async function getChatGPTReply(content, uid, adminId, config = { token: "
content = content.replace(finalSystemMsg.keyword, '')
}
}
return await chatGPT[adminId].getReply(content, uid, adminId, systemMessage, isFastGPT)
return await chatGPT[adminId].getReply(content, uid, adminId, systemMessage, isFastGPT, variables)
}
4 changes: 2 additions & 2 deletions src/proxy/bot/dify.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export function resetAll() {
})
difyAi = {}
}
export async function getDifyAiReply(content, uid, adminId, config = { token: "", debug: false, proxyPass: "", proxyUrl: "", showQuestion: false, timeoutMs: 80, model: "", systemMessage: "", keywordSystemMessages: [], isAiAgent: false }) {
export async function getDifyAiReply({ content, inputs }, uid, adminId, config = { token: "", debug: false, proxyPass: "", proxyUrl: "", showQuestion: false, timeoutMs: 80, model: "", systemMessage: "", keywordSystemMessages: [], isAiAgent: false }) {
if (!config.token) {
console.log('请到智能微秘书平台配置Dify的 api秘钥方可使用')
return [{ type: 1, content: '请到智能微秘书平台配置Dify的 api秘钥方可使用' }]
Expand All @@ -36,5 +36,5 @@ export async function getDifyAiReply(content, uid, adminId, config = { token: ""
content = content.replace(finalSystemMsg.keyword, '')
}
}
return await difyAi[adminId].getReply(content, uid, adminId, systemMessage)
return await difyAi[adminId].getReply({ content, inputs }, uid, adminId, systemMessage)
}
12 changes: 6 additions & 6 deletions src/proxy/bot/dispatch.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,37 +10,37 @@ import globalConfig from '../../db/global.js'
* @param {botType: 机器人类别, content: 消息内容, uid: 说话的用户id, updateId: 更新的用户id, adminId: 对话实例id,用于分割不同配置, config: 机器人配置}
* @returns
*/
export async function dispatchBot({botType, content, uid, adminId, config}) {
export async function dispatchBot({botType, content, id, uid, uname, roomId, roomName, adminId, config}) {
console.log('进入定制机器人回复');
try {
const gptConfig = globalConfig.getGptConfigById(adminId);
let res, replys
switch (botType) {
case 6:
// ChatGPT api
res = await getChatGPTReply(content, uid, adminId, config, false)
res = await getChatGPTReply({ content }, id, adminId, config, false)
replys = res
break
case 7:
// ChatGPT web
console.log('进入聊天');
res = await getChatGPTWebReply(content, uid, adminId, config)
res = await getChatGPTWebReply(content, id, adminId, config)
replys = res
break
case 8:
// dify ai
console.log('进入Dify聊天');
res = await getDifyAiReply(content, uid, adminId, config)
res = await getDifyAiReply({ content, inputs: { uid, uname, roomId, roomName } }, id, adminId, config)
replys = res
break
case 9:
// fastGPT api
res = await getChatGPTReply(content, uid, adminId, config, true)
res = await getChatGPTReply({ content, variables: { uid, uname, roomId, roomName } }, id, adminId, config, true)
replys = res
break
case 11:
// coze api
res = await getCozeReply(content, uid, adminId, config)
res = await getCozeReply(content, id, adminId, config)
replys = res
break
default:
Expand Down
8 changes: 4 additions & 4 deletions src/proxy/difyAi.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export function reset() {
}
}

export async function getDifyReply(content, uid) {
export async function getDifyReply({ content, id, inputs}) {
const config = await allConfig()
if (!config.dify_token) {
console.log('请到智能微秘书平台配置difyAi apikey参数方可使用')
Expand All @@ -37,11 +37,11 @@ export async function getDifyReply(content, uid) {
if(!difyAi) {
difyAi = new DifyAi(chatConfig)
}
return await difyAi.getReply(content, uid)
return await difyAi.getReply({ content, inputs }, id)
}


export async function getDifySimpleReply({content, uid, config}) {
export async function getDifySimpleReply({content, id, inputs, config}) {
if (!config.token) {
console.log('请到智能微秘书平台配置聊天总结API Token参数方可使用')
return [{ type: 1, content: '请到平台配置API Token参数方可使用' }]
Expand All @@ -56,5 +56,5 @@ export async function getDifySimpleReply({content, uid, config}) {
isAiAgent: true,
}

return await new DifyAi(chatConfig).getReply(content, uid)
return await new DifyAi(chatConfig).getReply({content, inputs }, id)
}
8 changes: 4 additions & 4 deletions src/proxy/openAi.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export function reset() {
}
}

export async function getGptOfficialReply(content, uid, isFastGPT) {
export async function getGptOfficialReply(content, uid, isFastGPT, variables) {
const config = await allConfig()
if (!config.gpttoken) {
console.log('请到智能微秘书平台配置Openai apikey参数方可使用')
Expand Down Expand Up @@ -41,12 +41,12 @@ export async function getGptOfficialReply(content, uid, isFastGPT) {
if(!chatGPT) {
chatGPT = new OfficialOpenAi(chatConfig)
}
return await chatGPT.getReply(content, uid, '', '', isFastGPT)
return await chatGPT.getReply(content, uid, '', '', isFastGPT, variables)
}



export async function getSimpleGptReply({content, uid, config, isFastGPT}) {
export async function getSimpleGptReply({content, uid, config, isFastGPT, variables}) {
if (!config.token) {
console.log('请到智能微秘书平台配置聊天总结的API Token参数方可使用')
return [{ type: 1, content: '请到平台配置聊天总结的API Token参数方可使用' }]
Expand All @@ -62,5 +62,5 @@ export async function getSimpleGptReply({content, uid, config, isFastGPT}) {
systemMessage: config.prompt, // 预设promotion
}

return await new OfficialOpenAi(chatConfig).getReply(content, uid, '', '', isFastGPT)
return await new OfficialOpenAi(chatConfig).getReply(content, uid, '', '', isFastGPT, variables)
}
16 changes: 8 additions & 8 deletions src/service/event-dispatch-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ async function dispatchEventContent(that, eName, msg, name, id, avatar, room, ro
* @param {*} name 发消息人
* @param {*} id 发消息人id
*/
async function dispatchAiBot(bot, msg, name, id) {
async function dispatchAiBot({ bot, msg, name, id, uid, uname, roomId, roomName }) {
try {
let res, replys
switch (bot) {
Expand All @@ -169,12 +169,12 @@ async function dispatchAiBot(bot, msg, name, id) {
break
case 8:
// dify ai
res = await getDifyReply(msg, id)
res = await getDifyReply({ content: msg, id, inputs: { uid, uname, roomId, roomName } })
replys = res
break
case 9:
// fast gpt
res = await getGptOfficialReply(msg, id, true)
res = await getGptOfficialReply(msg, id, true, { uid, uname, roomId, roomName })
replys = res
break
case 11:
Expand All @@ -193,28 +193,28 @@ async function dispatchAiBot(bot, msg, name, id) {
}
}

async function dispatchSummerBot({ content, uid, config}) {
async function dispatchSummerBot({ content, id, uid, uname, roomId, roomName, config}) {
try {
let res, replys
switch (config.botType) {
case 6:
// ChatGPT-api
res = await getSimpleGptReply({content, uid, config, isFastGPT:false})
res = await getSimpleGptReply({content, uid: id, config, isFastGPT:false})
replys = res
break
case 8:
// dify ai
res = await getDifySimpleReply({content, uid, config})
res = await getDifySimpleReply({content, id, inputs: { uid, uname, roomId, roomName }, config})
replys = res
break
case 9:
// fast gpt
res = await getSimpleGptReply({content, uid, config, isFastGPT:true})
res = await getSimpleGptReply({content, uid: id, config, isFastGPT:true, variables: { uid, uname, roomId, roomName } })
replys = res
break
case 11:
// coze
res = await getCozeSimpleReply({content, uid, config, isFastGPT:true})
res = await getCozeSimpleReply({content, uid: id, config, isFastGPT:true})
replys = res
break
default:
Expand Down
Loading

0 comments on commit 318de1a

Please sign in to comment.