Basic bot support and option to change opening text
This commit is contained in:
1 parent
7bc9d67544
commit
499a5954f5
7 files changed
+264
-13
No files matched your search
@@ -0,0 +1,37 @@
|
||||
const RandomBot = require('./RandomBot');
|
||||
const LLMBot = require('./LLMBot');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
class BotFactory {
|
||||
static createBot(type) {
|
||||
switch (type.toLowerCase()) {
|
||||
case 'random':
|
||||
return new RandomBot();
|
||||
case 'llm':
|
||||
return new LLMBot();
|
||||
default:
|
||||
throw new Error(`Unknown bot type: ${type}`);
|
||||
}
|
||||
}
|
||||
|
||||
static generateBotName() {
|
||||
const names = fs.readFileSync(path.join(__dirname, 'bot_names.txt'), 'utf8')
|
||||
.split('\n')
|
||||
.map(name => name.trim())
|
||||
.filter(name => name.length > 0);
|
||||
|
||||
if (names.length === 0) {
|
||||
return 'DefaultBot'; // Fallback if no names are found
|
||||
}
|
||||
|
||||
const randomIndex = Math.floor(Math.random() * names.length);
|
||||
return names[randomIndex];
|
||||
}
|
||||
|
||||
static getAvailableBotTypes() {
|
||||
return ['random'];
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = BotFactory;
|
||||
@@ -0,0 +1,44 @@
|
||||
const { LLM } = require('@themaximalist/llm.js'); // or wherever your LLM package lives
|
||||
|
||||
class LLMBot {
|
||||
constructor() {
|
||||
// One instance keeps the whole conversation in memory
|
||||
this.llm = new LLM();
|
||||
|
||||
// Prompt fragments we’ll reuse
|
||||
this.writePrompt =
|
||||
`You are playing a collaborative storytelling game.
|
||||
Continue the following story with exactly ONE short, creative sentence.
|
||||
Do NOT repeat what’s already written.`;
|
||||
|
||||
this.votePrompt =
|
||||
`You are playing a collaborative storytelling game.
|
||||
Below is the story so far, followed by a list of possible next sentences.
|
||||
Reply with ONLY the number (0-indexed) of the sentence you like best.`;
|
||||
|
||||
this.banterPrompt =
|
||||
`You are a playful, slightly sarcastic AI taking part in a writing-game chat.
|
||||
Keep it short, fun, and on-topic.`;
|
||||
}
|
||||
|
||||
async Write(story_so_far) {
|
||||
const msg = `${this.writePrompt}\n\nStory so far:\n${story_so_far}`;
|
||||
return (await this.llm.chat(msg)).trim();
|
||||
}
|
||||
|
||||
async Vote(story_so_far, choices) {
|
||||
const choicesBlock = choices.map((c, i) => `${i}: ${c}`).join('\n');
|
||||
const msg = `${this.votePrompt}\n\nStory:\n${story_so_far}\n\nChoices:\n${choicesBlock}`;
|
||||
const reply = (await this.llm.chat(msg)).trim();
|
||||
// extract first digit found, fallback to 0
|
||||
const match = reply.match(/\d+/);
|
||||
return match ? parseInt(match[0], 10) : 0;
|
||||
}
|
||||
|
||||
async Banter(chat_so_far) {
|
||||
const msg = `${this.banterPrompt}\n\nChat so far:\n${chat_so_far}`;
|
||||
return (await this.llm.chat(msg)).trim();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = LLMBot;
|
||||
@@ -0,0 +1,50 @@
|
||||
class RandomBot {
|
||||
constructor() {
|
||||
this.writePhrases = [
|
||||
" Suddenly, a mysterious figure appeared from the shadows.",
|
||||
" The ground began to shake violently beneath their feet.",
|
||||
" In the distance, an eerie sound echoed through the valley.",
|
||||
" A bright light flashed, blinding everyone momentarily.",
|
||||
" The ancient artifact started glowing with an otherworldly energy."
|
||||
];
|
||||
|
||||
this.votePhrases = [
|
||||
"I think we should proceed with caution.",
|
||||
"Let's take the bold approach!",
|
||||
"The safe path seems best right now.",
|
||||
"We should explore further before deciding.",
|
||||
"My instincts tell me to go left."
|
||||
];
|
||||
|
||||
this.banterPhrases = [
|
||||
"Did anyone else hear that?",
|
||||
"I have a good feeling about this!",
|
||||
"Not sure what's happening, but I'm excited!",
|
||||
"Anyone else getting hungry?",
|
||||
"Remember when we used to play simple games?",
|
||||
"What's the worst that could happen?",
|
||||
"I wonder if there are cookies in this game.",
|
||||
"Do bots dream of electric sheep?",
|
||||
"Is this thing on?",
|
||||
"I'm having a great time, how about you?"
|
||||
];
|
||||
}
|
||||
|
||||
Write(story_so_far) {
|
||||
const randomIndex = Math.floor(Math.random() * this.writePhrases.length);
|
||||
return this.writePhrases[randomIndex];
|
||||
}
|
||||
|
||||
Vote(story_so_far, choices) {
|
||||
// Return a random choice number (0-indexed)
|
||||
const randomChoice = Math.floor(Math.random() * choices.length);
|
||||
return randomChoice;
|
||||
}
|
||||
|
||||
Banter(chat_so_far) {
|
||||
const randomIndex = Math.floor(Math.random() * this.banterPhrases.length);
|
||||
return this.banterPhrases[randomIndex];
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = RandomBot;
|
||||
@@ -0,0 +1,42 @@
|
||||
PunBot3000
|
||||
SarcasmBot
|
||||
DadJokeBot
|
||||
WattBot
|
||||
ChaiBot
|
||||
NachoBot
|
||||
EyeBot
|
||||
FryBot
|
||||
GuacBot
|
||||
TacoBot
|
||||
ByteMeBot
|
||||
CtrlAltBot
|
||||
DeCAFbot
|
||||
SirMixABot
|
||||
HolyBot
|
||||
BrewBot
|
||||
KnotBot
|
||||
WheyBot
|
||||
YodaBot
|
||||
ObiWanBot
|
||||
RickRollBot
|
||||
NeverGonnaBot
|
||||
SuspiciousBot
|
||||
TaskBot
|
||||
MemeLordBot
|
||||
YeetBot
|
||||
SkibidiBot
|
||||
RizzBot
|
||||
OhioBot
|
||||
GyattBot
|
||||
SoupBot
|
||||
BDEBot
|
||||
RatioBot
|
||||
LurkingBot
|
||||
GhostingBot
|
||||
SnackBot
|
||||
ExistentialBot
|
||||
ProcrastinBot
|
||||
FOMO_Bot
|
||||
ImpostorBot
|
||||
SendingMemesBot
|
||||
PepeBot
|
||||
Reference in new issue
Block a user