Add ai functionality
This commit is contained in:
parent
da66cf9001
commit
dd4da06753
19 changed files with 1118 additions and 52 deletions
140
src/modules/ai/ai.ts
Normal file
140
src/modules/ai/ai.ts
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
import { MatrixClient, MsgType } from "matrix-js-sdk";
|
||||
import type { ICallbackStore } from "../types.js";
|
||||
import { config } from "../../config.js";
|
||||
import { getImageNanoBanana, getTextGemini } from "../../services/ai/ai.js";
|
||||
import type { IAnimal } from "./types.js";
|
||||
|
||||
let client: MatrixClient;
|
||||
|
||||
const registerModuleAI = (
|
||||
matrixClient: MatrixClient,
|
||||
callbackStore: ICallbackStore,
|
||||
) => {
|
||||
client = matrixClient;
|
||||
|
||||
callbackStore.messageCallbacks.push({
|
||||
startConditions: [`${config.app.triggerPrefix}ai `],
|
||||
callbackFunc: onAI,
|
||||
});
|
||||
callbackStore.messageCallbacks.push({
|
||||
startConditions: [
|
||||
`satek when `,
|
||||
`satek ked `,
|
||||
`gabor when `,
|
||||
`gabor ked `,
|
||||
`martin when `,
|
||||
`martin ked `,
|
||||
`madys when `,
|
||||
`madys ked `,
|
||||
`mandak when `,
|
||||
`mandak ked `,
|
||||
`mando when `,
|
||||
`mando ked `,
|
||||
`mandik when `,
|
||||
`mandik ked `,
|
||||
`madik when `,
|
||||
`madik ked `,
|
||||
`janys when `,
|
||||
`janys ked `,
|
||||
`jano when `,
|
||||
`jano ked `,
|
||||
],
|
||||
callbackFunc: onImageGen,
|
||||
});
|
||||
};
|
||||
|
||||
const getAnimal = (name: string): IAnimal | undefined => {
|
||||
const animals: IAnimal[] = [
|
||||
{
|
||||
name: "satek",
|
||||
animal: "black cat",
|
||||
},
|
||||
{
|
||||
name: "gabor",
|
||||
animal: "hedgehog",
|
||||
},
|
||||
{
|
||||
name: "martin",
|
||||
animal: "hedgehog",
|
||||
},
|
||||
{
|
||||
name: "madys",
|
||||
animal: "beaver",
|
||||
},
|
||||
{
|
||||
name: "mandak",
|
||||
animal: "beaver",
|
||||
},
|
||||
{
|
||||
name: "mando",
|
||||
animal: "beaver",
|
||||
},
|
||||
{
|
||||
name: "mandik",
|
||||
animal: "beaver",
|
||||
},
|
||||
{
|
||||
name: "madik",
|
||||
animal: "beaver",
|
||||
},
|
||||
{
|
||||
name: "janys",
|
||||
animal: "lion",
|
||||
},
|
||||
{
|
||||
name: "jano",
|
||||
animal: "lion",
|
||||
},
|
||||
];
|
||||
|
||||
const foundAnimals = animals
|
||||
.map((animal) => {
|
||||
if (name.includes(animal.name)) {
|
||||
return animal;
|
||||
}
|
||||
})
|
||||
.filter((animal) => animal);
|
||||
|
||||
return foundAnimals.at(0);
|
||||
};
|
||||
|
||||
const onAI = async (text: string, roomId: string) => {
|
||||
if (text.trim().length < 5) {
|
||||
return;
|
||||
}
|
||||
|
||||
const responseAI = await getTextGemini(text.replace("!ai ", ""));
|
||||
client.sendTextMessage(roomId, responseAI);
|
||||
};
|
||||
|
||||
const onImageGen = async (text: string, roomId: string) => {
|
||||
const animal = getAnimal(text.trim().split(/\s+/)[0] ?? "");
|
||||
if (!animal) {
|
||||
return;
|
||||
}
|
||||
|
||||
const textMod = text.replace(animal.name, animal.animal);
|
||||
const buffer = await getImageNanoBanana(textMod.trim());
|
||||
if (!buffer || buffer.length < 10) {
|
||||
return;
|
||||
}
|
||||
|
||||
const imageName = `photo-${animal.name}.png`;
|
||||
|
||||
const uploadResult = await client.uploadContent(buffer, {
|
||||
type: "image/png",
|
||||
name: imageName,
|
||||
});
|
||||
|
||||
await client.sendMessage(roomId, {
|
||||
msgtype: MsgType.Image,
|
||||
body: imageName,
|
||||
url: uploadResult.content_uri,
|
||||
info: {
|
||||
mimetype: "image/png",
|
||||
size: buffer.length,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
export { getAnimal, registerModuleAI, onImageGen };
|
||||
Loading…
Add table
Add a link
Reference in a new issue