Compare commits

...

4 Commits

5 changed files with 43 additions and 14 deletions

View File

@ -0,0 +1,19 @@
-- RedefineTables
PRAGMA defer_foreign_keys=ON;
PRAGMA foreign_keys=OFF;
CREATE TABLE "new_Response" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"pleromaNotificationId" TEXT NOT NULL DEFAULT 'null',
"to" TEXT NOT NULL DEFAULT 'null',
"request" TEXT NOT NULL DEFAULT 'null',
"response" TEXT NOT NULL DEFAULT 'null',
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"processedAt" DATETIME,
"isProcessing" BOOLEAN NOT NULL DEFAULT true,
"isComplete" BOOLEAN NOT NULL DEFAULT true
);
INSERT INTO "new_Response" ("createdAt", "id", "isProcessing", "pleromaNotificationId", "processedAt", "request", "response", "to") SELECT "createdAt", "id", "isProcessing", "pleromaNotificationId", "processedAt", "request", "response", "to" FROM "Response";
DROP TABLE "Response";
ALTER TABLE "new_Response" RENAME TO "Response";
PRAGMA foreign_keys=ON;
PRAGMA defer_foreign_keys=OFF;

View File

@ -20,6 +20,7 @@ model Response {
createdAt DateTime @default(now()) createdAt DateTime @default(now())
processedAt DateTime? processedAt DateTime?
isProcessing Boolean @default(true) isProcessing Boolean @default(true)
isComplete Boolean @default(true)
} }
model User { model User {

View File

@ -26,7 +26,7 @@ export const prisma = new PrismaClient();
export const envConfig = { export const envConfig = {
pleromaInstanceUrl: process.env.PLEROMA_INSTANCE_URL || "", pleromaInstanceUrl: process.env.PLEROMA_INSTANCE_URL || "",
pleromaInstanceDomain: process.env.PLEROMA_INSTANCE_DOMAIN || "", pleromaInstanceDomain: process.env.PLEROMA_INSTANCE_DOMAIN || "",
whitelistOnly: process.env.ONLY_WHITELIST === "true" ? true : false || "true", whitelistOnly: process.env.ONLY_WHITELIST === "true" ? true : false,
whitelistedDomains: process.env.WHITELISTED_DOMAINS whitelistedDomains: process.env.WHITELISTED_DOMAINS
? process.env.WHITELISTED_DOMAINS.split(",") ? process.env.WHITELISTED_DOMAINS.split(",")
: [process.env.PLEROMA_INSTANCE_DOMAIN], : [process.env.PLEROMA_INSTANCE_DOMAIN],
@ -42,9 +42,14 @@ export const envConfig = {
}; };
const ollamaConfig: OllamaConfigOptions = { const ollamaConfig: OllamaConfigOptions = {
temperature: 1.2, temperature: 1.4,
top_k: 100,
top_p: 0.8,
}; };
// this could be helpful
// https://replicate.com/blog/how-to-prompt-llama
const generateOllamaRequest = async ( const generateOllamaRequest = async (
notification: Notification notification: Notification
): Promise<OllamaResponse | undefined> => { ): Promise<OllamaResponse | undefined> => {
@ -55,9 +60,10 @@ const generateOllamaRequest = async (
striptags(notification.status.content).includes("!prompt") && striptags(notification.status.content).includes("!prompt") &&
!notification.status.account.bot && // sanity check, sort of !notification.status.account.bot && // sanity check, sort of
notification.type === "mention" && notification.type === "mention" &&
notification.status.visibility === "public" // for safety, let's only respond to public messages notification.status.visibility !== "private" // for safety, let's only respond to public messages
) { ) {
if (whitelistOnly && !isFromWhitelistedDomain(notification)) { if (whitelistOnly && !isFromWhitelistedDomain(notification)) {
await deleteNotification(notification);
return; return;
} }
if (await alreadyRespondedTo(notification)) { if (await alreadyRespondedTo(notification)) {
@ -68,9 +74,9 @@ const generateOllamaRequest = async (
const ollamaRequestBody: OllamaRequest = { const ollamaRequestBody: OllamaRequest = {
model: ollamaModel, model: ollamaModel,
system: ollamaSystemPrompt, system: ollamaSystemPrompt,
prompt: `@${notification.status.account.fqn} says: ${trimInputData( prompt: `[INST] @${
notification.status.content notification.status.account.fqn
)}`, } says: ${trimInputData(notification.status.content)} [/INST]`,
stream: false, stream: false,
options: ollamaConfig, options: ollamaConfig,
}; };
@ -162,4 +168,9 @@ console.log(
console.log( console.log(
`Accepting prompts from: ${envConfig.whitelistedDomains.join(", ")}` `Accepting prompts from: ${envConfig.whitelistedDomains.join(", ")}`
); );
console.log(
`Using model: ${envConfig.ollamaModel}\nConfig: ${JSON.stringify(
ollamaConfig
)}`
);
await beginFetchCycle(); await beginFetchCycle();

View File

@ -14,6 +14,7 @@ const storePromptData = async (
request: trimInputData(notification.status.content), request: trimInputData(notification.status.content),
to: notification.account.fqn, to: notification.account.fqn,
isProcessing: false, isProcessing: false,
isComplete: true,
}, },
}); });
} catch (error: any) { } catch (error: any) {

View File

@ -2,7 +2,6 @@ import striptags from "striptags";
import { prisma } from "./main.js"; import { prisma } from "./main.js";
import { envConfig } from "./main.js"; import { envConfig } from "./main.js";
import { Notification } from "../types.js"; import { Notification } from "../types.js";
import { deleteNotification } from "./api.js";
const trimInputData = (input: string): string => { const trimInputData = (input: string): string => {
const strippedInput = striptags(input); const strippedInput = striptags(input);
@ -17,6 +16,8 @@ const recordPendingResponse = async (notification: Notification) => {
await prisma.response.create({ await prisma.response.create({
data: { data: {
pleromaNotificationId: notification.id, pleromaNotificationId: notification.id,
isProcessing: true,
isComplete: false,
}, },
}); });
} catch (error: any) { } catch (error: any) {
@ -24,9 +25,7 @@ const recordPendingResponse = async (notification: Notification) => {
} }
}; };
const isFromWhitelistedDomain = async ( const isFromWhitelistedDomain = (notification: Notification): boolean => {
notification: Notification
): Promise<boolean> => {
try { try {
const domain = notification.status.account.fqn.split("@")[1]; const domain = notification.status.account.fqn.split("@")[1];
if (envConfig.whitelistedDomains.includes(domain)) { if (envConfig.whitelistedDomains.includes(domain)) {
@ -35,8 +34,6 @@ const isFromWhitelistedDomain = async (
console.log( console.log(
`Rejecting prompt request from non-whitelisted domain: ${domain}` `Rejecting prompt request from non-whitelisted domain: ${domain}`
); );
// delete the notification so we don't keep trying to fetch it
await deleteNotification(notification);
return false; return false;
} catch (error: any) { } catch (error: any) {
console.error(`Error with domain check: ${error.message}`); console.error(`Error with domain check: ${error.message}`);
@ -49,9 +46,9 @@ const alreadyRespondedTo = async (
): Promise<boolean> => { ): Promise<boolean> => {
try { try {
const duplicate = await prisma.response.findFirst({ const duplicate = await prisma.response.findFirst({
where: { pleromaNotificationId: notification.id, isProcessing: true }, where: { pleromaNotificationId: notification.id },
}); });
if (duplicate) { if (duplicate?.isProcessing || duplicate?.isComplete) {
return true; return true;
} }
return false; return false;