This commit is contained in:
2024-09-13 15:09:11 -04:00
parent 66ccf666b0
commit 2ab44224b4
5 changed files with 200 additions and 52 deletions

67
nodejs/controller/ai.js Normal file
View File

@ -0,0 +1,67 @@
'use strict';
const conf = require('../conf');
const {
GoogleGenerativeAI,
HarmCategory,
HarmBlockThreshold,
} = require("@google/generative-ai");
const genAI = new GoogleGenerativeAI(conf.ai.key);
const model = genAI.getGenerativeModel({
model: "gemini-1.5-flash",
});
const generationConfig = {
temperature: 1,
topP: 0.95,
topK: 64,
maxOutputTokens: 8192,
responseMimeType: "application/json",
};
async function run(name, interval, players) {
const chatSession = model.startChat({
generationConfig,
safetySettings:[
// See https://ai.google.dev/gemini-api/docs/safety-settings
{
category: HarmCategory.HARM_CATEGORY_HARASSMENT,
threshold: HarmBlockThreshold.BLOCK_NONE,
},
{
category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,
threshold: HarmBlockThreshold.BLOCK_NONE,
},
{
category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
threshold: HarmBlockThreshold.BLOCK_NONE,
},
{
category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
threshold: HarmBlockThreshold.BLOCK_NONE,
},
],
history: [
{
role: "user",
parts: [
{text: conf.ai.prompt(name, interval, players)},
],
},
{
role: "model",
parts: [
{text: "Chat stuff"},
],
}
],
});
return chatSession;
}
module.exports = {run};
// run();

View File

@ -7,7 +7,9 @@ const {CJbot} = require('../model/minecraft');
const inventoryViewer = require('mineflayer-web-inventory');
const commands = require('./commands');
const {onJoin} = require('./player_list')
const {onJoin} = require('./player_list');
const ai = require('./ai');
for(let name in conf.mc.bots){
if(CJbot.bots[name]) continue;
@ -22,21 +24,72 @@ for(let name in conf.mc.bots){
bot.on('onReady', async function(argument) {
// inventoryViewer(bot.bot);
try{
// onJoin(bot);
// await sleep(1000);
// bot.bot.setControlState('jump', true);
// setTimeout(()=> bot.bot.setControlState('jump', false), 5000);
if(bot.hasAi){
console.log(`${bot.bot.entity.username} has AI`);
let messages = [];
onJoin(bot);
await sleep(1000);
bot.bot.setControlState('jump', true);
setTimeout(()=> bot.bot.setControlState('jump', false), 5000)
bot.bot.on('message', (message, type)=>{
if(type === 'game_info') return;
if(message.toString().startsWith('<') && message.toString().split('>')[0].includes(bot.bot.entity.username)) return;
console.log(`Message ${type}: ${message.toString()}`)
messages.push('>', message.toString());
});
})
await sleep(500);
let aiChat = await ai.run(
bot.bot.entity.username,
conf.ai.interval,
Object.values(bot.getPlayers()).map(player=>`<[${player.lvl}] ${player.username}>`).join('\n')
);
setInterval(async ()=>{
let result;
if(messages.length ===0) return;
try{
result = await aiChat.sendMessage(messages);
}catch(error){
console.log('error AI API', error, result);
messages = [];
return ;
}
// bot.on('message', function(...args){
// console.log('message | ', ...args)
// })
try{
messages = [];
if(!result.response.text()) return;
for(let message of JSON.parse(result.response.text())){
console.log('toSay', message.delay, message.text);
if(message.text === '___') return;
setTimeout(async (message)=>{
await bot.sayAiSafe(message.text);
}, message.delay*1000, message);
}
}catch(error){
console.log('Error in AI message loop', error, result);
}
}, conf.ai.interval*1000);
}
}catch(error){
console.log('error in onReady', error);
}
});
bot.on('error', console.log);
// bot.on('message', function(message, type){
// console.log(`${type}: ${message.toString()}`)
// });
}
(async ()=>{
try{
(async ()=>{try{
for(let name in CJbot.bots){
let bot = CJbot.bots[name];
if(bot.autoConnect){