diff --git a/commands/message/genai/gemini-vision.js b/commands/message/genai/gemini-vision.js index 78feeec..41ea5c6 100644 --- a/commands/message/genai/gemini-vision.js +++ b/commands/message/genai/gemini-vision.js @@ -46,7 +46,7 @@ module.exports = { if(res.response.body.message) return editOrReply(context, createEmbed("error", context, e.response.body.message)) let output = res.response.body.gemini?.candidates[0]?.content?.parts[0]?.text - if(!output) return editOrReply(context, createEmbed("error", context, `PaLM 2 returned an error. Try again later.`)) + if(!output) return editOrReply(context, createEmbed("error", context, `Gemini returned an error. Try again later.`)) if(output.length <= 4000) description.push(output) diff --git a/commands/message/genai/gemini.js b/commands/message/genai/gemini.js new file mode 100644 index 0000000..0ed7509 --- /dev/null +++ b/commands/message/genai/gemini.js @@ -0,0 +1,71 @@ +const { gemini } = require("../../../labscore/api/obelisk"); +const { createEmbed } = require("../../../labscore/utils/embed"); +const { editOrReply } = require("../../../labscore/utils/message"); + +const { Permissions } = require("detritus-client/lib/constants"); + +const { STATIC_ICONS } = require("../../../labscore/utils/statics"); +const { stringwrap } = require("../../../labscore/utils/markdown"); +const { canUseLimitedTestCommands } = require("../../../labscore/utils/testing"); +module.exports = { + name: 'gemini', + label: 'text', + aliases: ['gem'], + metadata: { + description: 'Run Gemini Pro with a custom prompt.', + description_short: 'Gemini', + examples: ['gem why do they call it oven when you of in the cold food of out hot eat the food'], + category: 'limited', + usage: 'gemini ' + }, + permissionsClient: [Permissions.EMBED_LINKS, Permissions.SEND_MESSAGES, Permissions.USE_EXTERNAL_EMOJIS, Permissions.ATTACH_FILES, Permissions.READ_MESSAGE_HISTORY], + run: async (context, args) => { + context.triggerTyping(); + if(!canUseLimitedTestCommands(context)) return; + context.triggerTyping(); + + if(!args.text) return editOrReply(context, createEmbed("warning", context, `Missing Parameter (text).`)) + + let input = args.text; + + try{ + await editOrReply(context, createEmbed("ai_custom", context, STATIC_ICONS.ai_gemini)) + + let res = await gemini(context, input) + + let description = [] + let files = []; + + if(res.response.body.message) return editOrReply(context, createEmbed("error", context, e.response.body.message)) + + let output = res.response.body.gemini?.candidates[0]?.content?.parts[0]?.text + if(!output) return editOrReply(context, createEmbed("error", context, `Gemini returned an error. Try again later.`)) + + if(output.length <= 4000) description.push(output) + else { + files.push({ + filename: `gemini.${Date.now().toString(36)}.txt`, + value: Buffer.from(output) + }) + } + + return editOrReply(context, { + embeds:[createEmbed("defaultNoFooter", context, { + author: { + name: stringwrap(input, 50, false), + iconUrl: STATIC_ICONS.ai_gemini + }, + description: description.join('\n'), + footer: { + text: `Generative AI is experimental • Data submitted to Gemini may be used by Google for training.` + } + })], + files + }) + } catch(e){ + console.log(e) + if(e.response?.body?.message) return editOrReply(context, createEmbed("error", context, e.response.body.message)) + return editOrReply(context, createEmbed("error", context, `Unable to generate response.`)) + } + } +}; \ No newline at end of file diff --git a/labscore/api/obelisk/endpoints.js b/labscore/api/obelisk/endpoints.js index a6cae29..1694111 100644 --- a/labscore/api/obelisk/endpoints.js +++ b/labscore/api/obelisk/endpoints.js @@ -7,6 +7,7 @@ const ObeliskApi = Object.freeze({ HOST: ObeliskHosts.prod, GOOGLE_BARD: "/parrot/v1/google:bard", + GEMINI_PRO: "/parrot/v1/google:gemini", GEMINI_PRO_VISION: "/parrot/v1/google:geminiVision", SUMMARIZE_WEBPAGES: "/flamingo/v1/web:summarize" diff --git a/labscore/api/obelisk/index.js b/labscore/api/obelisk/index.js index 5f7f4cb..a4161df 100644 --- a/labscore/api/obelisk/index.js +++ b/labscore/api/obelisk/index.js @@ -47,6 +47,12 @@ module.exports.bard = async function(context, input){ }) } +module.exports.gemini = async function(context, prompt){ + return await request(ObeliskApi.GEMINI_PRO, "POST", {}, { + prompt + }) +} + module.exports.geminiVision = async function(context, input, url){ return await request(ObeliskApi.GEMINI_PRO_VISION, "POST", {}, { input,