arabdullah's picture
ARAbdulla-Dev2
8de10f9 verified
import { promises as fs } from 'fs';
import path from 'path';
import fetch from 'node-fetch';
import pkg from '@whiskeysockets/baileys';
const { generateWAMessageFromContent, proto } = pkg;
import config from '../../config.cjs';
const __filename = new URL(import.meta.url).pathname;
const __dirname = path.dirname(__filename);
const chatHistoryFile = path.resolve(__dirname, '../mistral_history.json');
const mistralSystemPrompt = "you are a good assistant.";
async function readChatHistoryFromFile() {
try {
const data = await fs.readFile(chatHistoryFile, "utf-8");
return JSON.parse(data);
} catch (err) {
return {};
}
}
async function writeChatHistoryToFile(chatHistory) {
try {
await fs.writeFile(chatHistoryFile, JSON.stringify(chatHistory, null, 2));
} catch (err) {
console.error('Error writing chat history to file:', err);
}
}
async function updateChatHistory(chatHistory, sender, message) {
if (!chatHistory[sender]) {
chatHistory[sender] = [];
}
chatHistory[sender].push(message);
if (chatHistory[sender].length > 20) {
chatHistory[sender].shift();
}
await writeChatHistoryToFile(chatHistory);
}
async function deleteChatHistory(chatHistory, userId) {
delete chatHistory[userId];
await writeChatHistoryToFile(chatHistory);
}
const mistral = async (m, Matrix) => {
const chatHistory = await readChatHistoryFromFile();
const text = m.body.toLowerCase();
if (text === "/forget") {
await deleteChatHistory(chatHistory, m.sender);
await Matrix.sendMessage(m.from, { text: 'Conversation deleted successfully' }, { quoted: m });
return;
}
const prefix = config.PREFIX;
const cmd = m.body.startsWith(prefix) ? m.body.slice(prefix.length).split(' ')[0].toLowerCase() : '';
const prompt = m.body.slice(prefix.length + cmd.length).trim();
const validCommands = ['ai', 'gpt', 'mistral'];
if (validCommands.includes(cmd)) {
if (!prompt) {
await Matrix.sendMessage(m.from, { text: 'Please give me a prompt' }, { quoted: m });
return;
}
try {
const senderChatHistory = chatHistory[m.sender] || [];
const messages = [
{ role: "system", content: mistralSystemPrompt },
...senderChatHistory,
{ role: "user", content: prompt }
];
await m.React("⏳");
const response = await fetch('https://matrixcoder.tech/api/ai', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
type: "text-generation",
model: "hf/meta-llama/meta-llama-3-8b-instruct",
messages: messages
})
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const responseData = await response.json();
await updateChatHistory(chatHistory, m.sender, { role: "user", content: prompt });
await updateChatHistory(chatHistory, m.sender, { role: "assistant", content: responseData.result.response });
const answer = responseData.result.response;
const codeMatch = answer.match(/```([\s\S]*?)```/);
if (codeMatch) {
const code = codeMatch[1];
let msg = generateWAMessageFromContent(m.from, {
viewOnceMessage: {
message: {
messageContextInfo: {
deviceListMetadata: {},
deviceListMetadataVersion: 2
},
interactiveMessage: proto.Message.InteractiveMessage.create({
body: proto.Message.InteractiveMessage.Body.create({
text: answer
}),
footer: proto.Message.InteractiveMessage.Footer.create({
text: "> © ᴘᴏᴡᴇʀᴇᴅ ʙʏ ᴇᴛʜɪx-ᴍᴅ"
}),
header: proto.Message.InteractiveMessage.Header.create({
title: "",
subtitle: "",
hasMediaAttachment: false
}),
nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.create({
buttons: [
{
name: "cta_copy",
buttonParamsJson: JSON.stringify({
display_text: "Copy Your Code",
id: "copy_code",
copy_code: code
})
}
]
})
})
}
}
}, {});
await Matrix.relayMessage(msg.key.remoteJid, msg.message, {
messageId: msg.key.id
});
} else {
await Matrix.sendMessage(m.from, { text: answer }, { quoted: m });
}
await m.React("✅");
} catch (err) {
await Matrix.sendMessage(m.from, { text: "Something went wrong" }, { quoted: m });
console.error('Error: ', err);
await m.React("❌");
}
}
};
export default mistral;