import { APIApplicationCommandOption , ApplicationCommandOptionType , ApplicationCommandType , ChatInputCommandInteraction } from "discord.js"; import { ChatCompletionMessageParam } from "openai/resources"; import Command ,{ApplicationIntegrationType , InteractionContextTypes } from "../command"; import { config } from "../index"; import { executeChatCompletion, replyInMultiMessage } from "../execution"; import { formatName } from "../toOpenAIMessages"; export default class Ask extends Command implements Command { name = "ask"; description = "Promts the bot to reply to a single message without any history context"; type = ApplicationCommandType.ChatInput; options: APIApplicationCommandOption[] = [ { name: "content", description: "The content of the prompt", type: ApplicationCommandOptionType.String, required: true, }, { name: "ephemeral", description: "if true, only you can see the response (default true)", type: ApplicationCommandOptionType.Boolean, required: false, } ]; integration_types = [ ApplicationIntegrationType.Guild_Install, ApplicationIntegrationType.User_Install, ]; contexts = [ InteractionContextTypes.Guild, InteractionContextTypes.BotDM, InteractionContextTypes.PrivateChannel, ]; async execute(interaction: ChatInputCommandInteraction) { const content = interaction.options.getString("content", true); const ephemeral = interaction.options.getBoolean("ephemeral", false) ?? true; if (!interaction.channel && !interaction.channelId) { console.error("No channel found in interaction"); console.error(interaction); await interaction.reply({ content: "No channel found in interaction???", ephemeral: true }); return; } // TODO: check content in moderation API const messages: ChatCompletionMessageParam[] = [ ...config.systemPrompt(interaction), { role: "user", name: formatName(interaction.user.displayName), content } ]; const [answer] = await Promise.all([ executeChatCompletion(messages, interaction), interaction.deferReply({ ephemeral }), ]); await replyInMultiMessage(answer.choices[0].message.content, interaction); } }