diff --git a/bots/config.example.json b/bots/config.example.json index 93e9d71..57e8497 100644 --- a/bots/config.example.json +++ b/bots/config.example.json @@ -27,20 +27,7 @@ { "label": "DOWNLOAD", "threshold": 0.85, - "responses": [ - { - "p": "discord", - "text": "you wanted peevanced" - }, - { - "p": "telegram", - "text":"you wanted peevanced, on telegram" - }, - { - "p": "reddit", - "text": "you wanted peevanced, on reddit" - } - ] + "text": "the download?" } ] } diff --git a/bots/discord/events/discord/messageCreate.js b/bots/discord/events/discord/messageCreate.js index 66094fc..3b0f5e0 100644 --- a/bots/discord/events/discord/messageCreate.js +++ b/bots/discord/events/discord/messageCreate.js @@ -5,7 +5,6 @@ export default { once: false, execute(helper, _, msg) { if (!msg.content || msg.author.bot) return; - if (!msg.mentions.has(msg.client.user)) return; helper.scanText(msg.content.toLowerCase().replace(/<.*?>/g, ''), `${msg.channelId}/${msg.id}`); } }; diff --git a/bots/discord/events/helper/aiResponse.js b/bots/discord/events/helper/aiResponse.js index 958052a..f6af4cd 100644 --- a/bots/discord/events/helper/aiResponse.js +++ b/bots/discord/events/helper/aiResponse.js @@ -1,8 +1,11 @@ +import { EmbedBuilder } from 'discord.js'; + export default { name: 'aiResponse', once: false, async execute(client, config, aiRes) { if (!aiRes.response) return; + if (!aiRes.response[0]) return; try { const ids = aiRes.id.split('/'); @@ -20,10 +23,19 @@ export default { message = channel.messages.cache.get(ids[1]); } - message.reply(aiRes.response); + const intent = aiRes.response.reduce((a, b) => a.confidence > b.confidence ? a : b); + const response = config.responses.find((res) => res.label === intent.name); + if (response.threshold > intent.confidence) return; + + const embed = new EmbedBuilder() + .setTitle('You have asked a Frequently Asked Question') + .setDescription(response.text) + .setFooter({ text: `Confidence: ${intent.confidence}` }); + + message.reply({ embeds: [embed]}); return; - } catch (e) {} + } catch (e) {console.log(e)} } }; diff --git a/bots/reddit/events/helper/aiResponse.js b/bots/reddit/events/helper/aiResponse.js index eb6dd8b..419277d 100644 --- a/bots/reddit/events/helper/aiResponse.js +++ b/bots/reddit/events/helper/aiResponse.js @@ -2,16 +2,22 @@ export default { name: 'aiResponse', once: false, async execute(client, config, aiRes) { + if (!aiRes.response) return; + if (!aiRes.response[0]) return; const ids = aiRes.id.split('/'); + const intent = aiRes.response.reduce((a, b) => a.confidence > b.confidence ? a : b); + const response = config.responses.find((res) => res.label === intent.name); + if (response.threshold > intent.confidence) return; + switch (ids[0]) { case 'comment': { - client.getComment(ids[1]).reply(aiRes.response); + client.getComment(ids[1]).reply(`${response.text}\n\n*Confidence: ${intent.confidence}*`); break; } case 'post': { - client.getSubmission(ids[1]).reply(aiRes.response); + client.getSubmission(ids[1]).reply(`${response.text}\n\n*Confidence: ${intent.confidence}*`); break; } } diff --git a/bots/telegram/events/helper/aiResponse.js b/bots/telegram/events/helper/aiResponse.js index 8aa49b2..3a217b6 100644 --- a/bots/telegram/events/helper/aiResponse.js +++ b/bots/telegram/events/helper/aiResponse.js @@ -2,11 +2,17 @@ export default { name: 'aiResponse', once: false, async execute(bot, config, aiRes) { + if (!aiRes.response) return; + if (!aiRes.response[0]) return; const ids = aiRes.id.split('/'); + const intent = aiRes.response.reduce((a, b) => a.confidence > b.confidence ? a : b); + const response = config.responses.find((res) => res.label === intent.name); + if (response.threshold > intent.confidence) return; - bot.sendMessage(ids[0], aiRes.response, { + bot.sendMessage(ids[0], `${response.text}\n\n*Confidence: ${intent.confidence}*`, { message_thread_id: ids[1], - reply_to_message_id: ids[2] + reply_to_message_id: ids[2], + parse_mode: 'HTML' }); return; diff --git a/server/config.example.json b/server/config.example.json index d4509e6..b3c5bdf 100644 --- a/server/config.example.json +++ b/server/config.example.json @@ -2,13 +2,7 @@ "server": { "port": 3000 }, - - "transformers": { - "model": "./model.onnx", - "tokenizer": "./tokenizer.json", - "instruction": "Instruction: given a dialog context and related knowledge, you need to answer the question based on the knowledge.", - "knowledge": [ - "ReVanced is a generic patcher that allows you to modify the behavior of any Dalvik based Android application" - ] + "witAI": { + "authToken": "AUTH-TOKEN" } } diff --git a/server/events/ai.js b/server/events/ai.js index 8d154f4..1344272 100644 --- a/server/events/ai.js +++ b/server/events/ai.js @@ -1,24 +1,19 @@ import { serialize } from 'bson'; -async function generateResponse(tokenizer, model, config, dialog) { - const knowledge = `[KNOWLEDGE] ${config.knowledge.join(' ')}`; - const context = `[CONTEXT] ${dialog.substring(0, 64)}`; +export default async function runAI(client, data, config) { + const witAIReq = await fetch(`https://api.wit.ai/message?v20230319&q=${encodeURI(data.text)}`, { + headers: { + authorization: `Bearer ${config.authToken}` + } + }); - const query = `${config.instruction} ${context} ${knowledge}`; - - const inputTokenIds = tokenizer.encode(query); - const outputTokenIds = await model.generate(inputTokenIds, { maxLength: 64, topK: 10 }); - return await tokenizer.decode(outputTokenIds, true); -} - -export default async function runAI(client, data, tokenizer, model, config) { - const response = await generateResponse(tokenizer, model, config, data.text); + const response = await witAIReq.json(); client.write( serialize({ op: 2, id: data.id, - response + response: response.intents }) ); diff --git a/server/index.js b/server/index.js index bdb02d2..de72460 100644 --- a/server/index.js +++ b/server/index.js @@ -1,21 +1,10 @@ import { readFileSync } from 'node:fs'; -// Fix __dirname not being defined in ES modules. (https://stackoverflow.com/a/64383997) -import { fileURLToPath } from 'node:url'; -import { dirname } from 'node:path'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - const config = JSON.parse(readFileSync('./config.json', 'utf-8')); import { createServer } from 'node:net'; import { deserialize } from 'bson'; -import transformers from 'transformers-nodejs'; import { runAI, runOCR } from './events/index.js'; -const tokenizer = await transformers.AutoTokenizer.fromPretrained(config.transformers.tokenizer); -const model = await transformers.AutoModelForSeq2SeqLM.fromPretrained(config.transformers.model); - const server = createServer(async (client) => { client.on('data', async (data) => { const eventData = deserialize(data, { @@ -24,7 +13,7 @@ const server = createServer(async (client) => { switch (eventData.op) { case 1: { - runAI(client, eventData, tokenizer, model, config.transformers); + runAI(client, eventData, config.witAI); break; }