/** * @copyright nhcarrigan * @license Naomi's Public License * @author Naomi Carrigan */ import { MessageFlags, type ChatInputCommandInteraction } from "discord.js"; import { personality } from "../config/personality.js"; import { ai } from "../utils/ai.js"; import { calculateCost } from "../utils/calculateCost.js"; import { isSubscribed } from "../utils/isSubscribed.js"; /** * Accepts a text snippet from the user. Submits it to Anthropic * to be summarised. * @param interaction -- The interaction payload from Discord. */ export const summarise = async( interaction: ChatInputCommandInteraction, ): Promise => { await interaction.deferReply({ flags: [ MessageFlags.Ephemeral ] }); const sub = await isSubscribed(interaction); if (!sub) { return; } const prompt = interaction.options.getString("text", true); const messages = await ai.messages.create({ // eslint-disable-next-line @typescript-eslint/naming-convention -- Required key format for SDK. max_tokens: 2000, messages: [ { content: prompt, role: "user" } ], model: "claude-3-5-sonnet-latest", system: `${personality} Your role in this conversation is to summarise the text the user has provided. Your goal is to reach 250 words or less. Wrap ONLY THE SUMMARY in multi-line code block so it is easy to copy.`, temperature: 1, }); const response = messages.content.find((message) => { return message.type === "text"; }); await interaction.editReply( response?.text ?? "I'm sorry, I don't have an answer for that. Please try again later.", ); const { usage } = messages; await calculateCost(usage, interaction.user.username, "summarise"); };