pissbot-9000/commands/message/genai/gpt.js

96 lines
No EOL
3.8 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const { gpt } = require('#api');
const { PERMISSION_GROUPS } = require('#constants');
const { createEmbed } = require('#utils/embed')
const { editOrReply } = require('#utils/message')
const { iconPill, stringwrap, smallIconPill } = require('#utils/markdown')
const { STATICS, STATIC_ASSETS } = require('#utils/statics');
const { hasFeature } = require('#utils/testing');
const { acknowledge } = require('#utils/interactions');
module.exports = {
name: 'gpt',
label: 'text',
aliases: ['chatgpt', 'openai'],
metadata: {
description: `${iconPill("generative_ai", "LIMITED TESTING")}\n${smallIconPill("reply", "Supports Replies")}\n\nTalk to GPT-4o.`,
description_short: 'Chat with GPT-4o.',
examples: ['gpt How many otter species are there?'],
category: 'limited',
usage: 'gpt <input> [-prompt <prompt override>]'
},
args: [
{ name: 'prompt', default: '', required: false, help: "The starting system prompt." },
// { name: 'temperature', default: 0.25, required: false, help: "Model temperature." },
],
permissionsClient: [...PERMISSION_GROUPS.baseline, ...PERMISSION_GROUPS.attachments],
run: async (context, args) => {
if(!await hasFeature(context, "ai/gpt")) return;
await acknowledge(context);
if(!args.text) return editOrReply(context, createEmbed("warning", context, `Missing Parameter (text).`))
let input = args.text;
let prompt = `You are a friendly chat bot designed to help people.\n- Today\'s date is ${new Date().toLocaleDateString('en-us', { weekday:"long", year:"numeric", month:"long", day:"numeric"})}\n- You should always use gender neutral pronouns when possible.\n- When answering a question, be concise and to the point.\n- Try to keep responses below 1000 characters. This does not apply to subjects that require more exhaustive or in-depth explanation.`
if(args.prompt !== "") prompt = args.prompt
// Get content if the user replies to anything
if(context.message.messageReference) {
let msg = await context.message.channel.fetchMessage(context.message.messageReference.messageId);
if(msg.content && msg.content.length) input = msg.content
else if(msg.embeds?.length) for(const e of msg.embeds) if(e[1].description?.length) { input = e[1].description; break; }
prompt = args.text
if(args.prompt !== "") return editOrReply(context, createEmbed("warning", context, `Prompt parameter is unsupported for message replies.`))
}
try{
await editOrReply(context, createEmbed("defaultNoFooter", context, {
author: {
iconUrl: STATICS.openai,
name: ``
},
image: {
url: STATIC_ASSETS.chat_loading_small
}
}))
let res = await gpt(context, prompt, input)
res = res.response;
let description = []
let files = [];
if(!res.body.response) return editOrReply(context, createEmbed("error", context, `GPT-4o returned an error. Try again later.`))
if(res.body.response.length <= 4000) description.push(res.body.response)
else {
files.push({
filename: `chat.${Date.now().toString(36)}.txt`,
value: Buffer.from(res.body.response)
})
}
return editOrReply(context, {
embeds:[createEmbed("defaultNoFooter", context, {
author: {
name: stringwrap(input, 50, false),
iconUrl: STATICS.openai
},
description: description.join('\n'),
footer: {
text: `GPT-4o • Response may be factually wrong or completely made up.`
}
})],
files
})
}catch(e){
console.log(e)
if(e.response.body?.message) return editOrReply(context, createEmbed("warning", context, e.response.body.message))
return editOrReply(context, createEmbed("error", context, `Unable to generate text.`))
}
}
};