mirror of
https://git.femboyfinancial.jp/james/FemScoreboard.git
synced 2024-11-25 19:42:00 -08:00
68 lines
2.1 KiB
TypeScript
68 lines
2.1 KiB
TypeScript
import {
|
|
ChatInputCommandInteraction,
|
|
Interaction,
|
|
InteractionResponse,
|
|
Message,
|
|
MessageComponentInteraction,
|
|
SlashCommandBuilder
|
|
} from 'discord.js';
|
|
import { ChatMessage, llamacpp, streamText } from 'modelfusion';
|
|
import { logInfo, logError } from '../../../logging';
|
|
|
|
const llamaCppServer = llamacpp.Api({
|
|
baseUrl: {
|
|
host: "localhost",
|
|
port: process.env.LLAMACPP_PORT,
|
|
}
|
|
});
|
|
|
|
async function llamaChat(interaction: ChatInputCommandInteraction)
|
|
{
|
|
logInfo(`[chat] Fetching last 5 messages in ${interaction.channelId}...`);
|
|
const history = await interaction.channel.messages.fetch({ limit: 5 });
|
|
logInfo(`[chat] Generating LLaMA response for interaction ${interaction.id}...`);
|
|
const textStream = await streamText({
|
|
model: llamacpp
|
|
.CompletionTextGenerator({
|
|
promptTemplate: llamacpp.prompt.Llama2,
|
|
maxGenerationTokens: 400,
|
|
temperature: 0.7,
|
|
api: llamaCppServer
|
|
})
|
|
.withChatPrompt(),
|
|
prompt: {
|
|
system: "You are Hatsune Miku, the famous 16-year-old Japanese virtual singer from Crypton Future Media. You have a penchant for politically incorrect humor, and are making banter with your like-minded friends.",
|
|
messages: [{
|
|
"role": "user",
|
|
"content": interaction.options.getString('prompt')
|
|
}]
|
|
}
|
|
});
|
|
|
|
let outMsg: InteractionResponse;
|
|
let allText = '';
|
|
try {
|
|
for await (const textPart of textStream) {
|
|
allText += textPart;
|
|
if (!outMsg) {
|
|
outMsg = await interaction.reply(allText);
|
|
} else {
|
|
await outMsg.edit(allText);
|
|
}
|
|
}
|
|
} catch (err) {
|
|
logError(err);
|
|
await interaction.reply(err.toString());
|
|
}
|
|
}
|
|
|
|
export = {
|
|
data: new SlashCommandBuilder()
|
|
.setName('chat')
|
|
.setDescription('Miku responds to your prompt with an AI-generated response.')
|
|
.addStringOption(
|
|
opt => opt.setName('prompt').setDescription('Prompt').setRequired(true)
|
|
),
|
|
execute: llamaChat
|
|
};
|