Skip to content

Commit 59116a1

Browse files
committed
feat: added nano
1 parent f947139 commit 59116a1

3 files changed

Lines changed: 66 additions & 2 deletions

File tree

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"email": "mrepol742@gmail.com"
2828
},
2929
"dependencies": {
30-
"@google/genai": "^1.11.0",
30+
"@google/genai": "^1.19.0",
3131
"@openrouter/ai-sdk-provider": "^0.7.2",
3232
"@prisma/client": "^6.12.0",
3333
"ai": "^4.3.19",

src/commands/nano.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { GoogleGenAI, Modality } from "@google/genai";
2+
import fs from "fs/promises";
3+
import { Message, MessageMedia } from "whatsapp-web.js";
4+
import log from "../components/utils/log";
5+
import { gemini } from "../components/ai/gemini";
6+
7+
export const info = {
8+
command: "nano",
9+
description: "Create a picture using nano banana model.",
10+
usage: "nano <prompt>",
11+
example:
12+
"nano Create a picture of a nano banana dish in a fancy restaurant with a Gemini theme",
13+
role: "user",
14+
cooldown: 5000,
15+
};
16+
17+
export default async function (msg: Message) {
18+
const query = msg.body.replace(/^nano\s+/i, "").trim();
19+
if (query.length === 0) {
20+
await msg.reply("Please provide a prompt.");
21+
return;
22+
}
23+
24+
if (!gemini) {
25+
return log.error(
26+
"nano",
27+
"Unable to process `nano` Gemini is not yet setup.",
28+
);
29+
}
30+
31+
const response = await gemini.models.generateContent({
32+
model: "gemini-2.5-flash-image-preview",
33+
contents: [
34+
{
35+
role: "user",
36+
parts: [{ text: query }],
37+
},
38+
],
39+
});
40+
41+
const candidate = response.candidates?.[0];
42+
if (!candidate?.content?.parts) {
43+
await msg.reply("No image was generated. Try a different prompt.");
44+
return;
45+
}
46+
47+
const tempDir = "./.temp";
48+
await fs.mkdir(tempDir, { recursive: true });
49+
const tempPath = `${tempDir}/${Date.now()}.png`;
50+
51+
for (const part of candidate.content.parts) {
52+
if (part.text) {
53+
await msg.reply(part.text);
54+
} else if (part.inlineData?.data) {
55+
const buffer = Buffer.from(part.inlineData.data, "base64");
56+
57+
await fs.writeFile(tempPath, buffer);
58+
59+
const media = MessageMedia.fromFilePath(tempPath);
60+
await msg.reply(media);
61+
await fs.unlink(tempPath);
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)