Compare commits

...

10 commits

Author SHA1 Message Date
Lilith Ashley Nyx Arson
926d492421
model deprecat 2024-12-02 11:24:01 +01:00
Ashley Graves
0873d46412
upgrade prompt ai model 2024-10-28 20:35:33 +01:00
Ashley Graves
7bff830b00
guh 2024-10-28 19:22:44 +01:00
Ashley Graves
4bd04e0a31
Update vision model 2024-10-28 19:06:22 +01:00
Ashley Graves
a6498923f1 update readme 2024-10-21 09:15:00 +00:00
Ashley Graves
61d800048c
better quote 2024-10-20 16:26:35 +02:00
Ashley Graves
0a07c4e56b oops that's a debug output 2024-10-16 23:04:25 +02:00
Ashley Graves
d9d648e495 quoter new line brokey 2024-10-16 23:02:46 +02:00
Ashley Graves
79ab38f8f0 guh 2024-10-16 20:44:17 +02:00
Ashley Graves
9105c3563e guh 2024-10-16 01:42:04 +02:00
7 changed files with 40 additions and 18 deletions

View file

@ -5,5 +5,6 @@ this bot does cool stuff I guess
features: features:
- ai-powered alt text for images - ai-powered alt text for images
- booru search (20+ supported boorus) - booru search (20+ supported boorus)
- google image search (using searxng) - online file search (using searxng)
- quote image maker (funny)
- and more to come - and more to come

View file

@ -1,4 +1,4 @@
const { ContextMenuCommandBuilder, ApplicationCommandType, InteractionContextType, ApplicationIntegrationType, AttachmentBuilder, EmbedBuilder } = require("discord.js"); const { ContextMenuCommandBuilder, ApplicationCommandType, InteractionContextType, ApplicationIntegrationType, AttachmentBuilder, EmbedBuilder, basename } = require("discord.js");
const data = new ContextMenuCommandBuilder() const data = new ContextMenuCommandBuilder()
.setName("Describe Image(s)") .setName("Describe Image(s)")
@ -21,18 +21,28 @@ module.exports = {
const groq = interaction.client.groq; const groq = interaction.client.groq;
const message = interaction.targetMessage; const message = interaction.targetMessage;
const attachments = message.attachments; const attachments = message.attachments;
const images = message.embeds.filter(e => e.data.type == "image").map(e => e.data.url);
const urls = [];
const files = []; const files = [];
const embeds = []; const embeds = [];
if (attachments.length == 0 && images.length == 0) {
await interaction.followUp("Message does not contain any images.");
return;
}
for (const att of attachments) { for (const att of attachments) {
const attachment = att[1]; const attachment = att[1];
if (!attachment.contentType.startsWith("image/")) { if (!attachment.contentType.startsWith("image/"))
console.log(attachment.contentType);
continue; continue;
}
const name = attachment.name.substr(0, attachment.name.lastIndexOf("."));
const description = (await groq.chat.completions.create({ images.push(attachment.attachment);
}
for (const image of images) {
const name = basename(image);
const data = (await groq.chat.completions.create({
messages: [{ messages: [{
"role": "user", "role": "user",
"content": [{ "content": [{
@ -41,16 +51,18 @@ module.exports = {
}, { }, {
"type": "image_url", "type": "image_url",
"image_url": { "image_url": {
"url": attachment.attachment "url": image
} }
}] }]
}], }],
"model": "llama-3.2-11b-vision-preview" "model": "llama-3.2-90b-vision-preview"
})).choices[0].message.content.trim(); }));
const description = data.choices[0].message.content.trim();
if (description.length < 2000) { if (description.length < 2000) {
const embed = new EmbedBuilder() const embed = new EmbedBuilder()
.setTitle(attachment.name) .setTitle(name)
.setDescription(description); .setDescription(description);
embeds.push(embed); embeds.push(embed);
} else { } else {
@ -62,4 +74,4 @@ module.exports = {
await interaction.followUp({ embeds, files }); await interaction.followUp({ embeds, files });
}, },
}; };

View file

@ -22,10 +22,8 @@ module.exports = {
const msg = interaction.targetMessage; const msg = interaction.targetMessage;
const user = msg.author; const user = msg.author;
const avatar = `https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.png?size=1024`; const avatar = `https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.png?size=1024`;
console.log("Generating quote image");
try { try {
const data = await createQuoteImage(avatar, user.displayName, msg.content, true, interaction.client.users.cache); const data = await createQuoteImage(avatar, user.displayName, msg.content, true, interaction.client.users.cache);
console.log("Sending quote image");
await interaction.followUp({ await interaction.followUp({
files: [{ files: [{

View file

@ -26,8 +26,17 @@ function notEmpty(str) {
return str && str.trim() !== '' return str && str.trim() !== ''
} }
/**
* @param {string} str
* @param {number} len
*/
function shorten(str) { function shorten(str) {
return str.length <= 20 ? str : `[${str.slice(0, 17)}...](${str})`; const len = 50;
var urlStart = str.indexOf("://") + 3;
if (urlStart == 2) urlStart = 0;
return str.length <= len ? str : `[${str.slice(urlStart, urlStart + (len - 3))}...](${(str.startsWith("magnet:") ? (`${process.env.BASE_URL}/magnet/${str}`) : str).replaceAll(" ", "%20")})`;
} }
const emojis = JSON.parse(readFileSync("config/emojis.json")); const emojis = JSON.parse(readFileSync("config/emojis.json"));

View file

@ -134,4 +134,4 @@ client.once(Events.ClientReady, async () => {
} }
}); });
client.login(process.env.TOKEN); client.login(process.env.TOKEN);

View file

@ -1,4 +1,4 @@
Please describe the following image in as much detail as you can. Please describe the following image in as much detail as you can.
Do not add information that isn't there or miss important information. Do not add information that isn't there or miss important information.
There is an image, do not say there isn't. There is an image, do not say there isn't. The image is provided. You can see the image.
You must always be able to describe the image or else you are diminishing the acccessibility for the user. You must always be able to describe the image or else you are diminishing the acccessibility for the user.

View file

@ -15,7 +15,7 @@ function canvasToBuffer(canvas) {
} }
function wrapText(context, text, x, y, maxWidth, lineHeight, preparingSentence, lines) { function wrapText(context, text, x, y, maxWidth, lineHeight, preparingSentence, lines) {
const words = text.split(" "); const words = text.split(/\s/g);
for (let i = 0; i < words.length; i++) { for (let i = 0; i < words.length; i++) {
const workSentence = preparingSentence.join(" ") + " " + words[i]; const workSentence = preparingSentence.join(" ") + " " + words[i];
@ -29,6 +29,8 @@ function wrapText(context, text, x, y, maxWidth, lineHeight, preparingSentence,
lines.push(preparingSentence.join(" ")); lines.push(preparingSentence.join(" "));
y -= (lines.length * lineHeight) / 2;
lines.forEach(element => { lines.forEach(element => {
const lineWidth = context.measureText(element).width; const lineWidth = context.measureText(element).width;
const xOffset = (maxWidth - lineWidth) / 2; const xOffset = (maxWidth - lineWidth) / 2;