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 };