aboutsummaryrefslogtreecommitdiffstats
path: root/packages/workers/openai.ts
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-02-09 01:50:35 +0000
committerMohamedBassem <me@mbassem.com>2024-02-09 01:57:31 +0000
commit08a5694e451218f1bcb2ad9eb42fd93250afbb96 (patch)
tree2cc2351f26b0ab98268db4bc463c0c3aa3f78a3b /packages/workers/openai.ts
parentc5bfa5000f178475d0b019b5a960916134b2ecfb (diff)
downloadkarakeep-08a5694e451218f1bcb2ad9eb42fd93250afbb96.tar.zst
[refactor] Extract the bookmark model to be a high level model to support other type of bookmarks
Diffstat (limited to 'packages/workers/openai.ts')
-rw-r--r--packages/workers/openai.ts61
1 files changed, 32 insertions, 29 deletions
diff --git a/packages/workers/openai.ts b/packages/workers/openai.ts
index 893aa1af..b6044dd3 100644
--- a/packages/workers/openai.ts
+++ b/packages/workers/openai.ts
@@ -1,4 +1,4 @@
-import prisma, { BookmarkedLink, BookmarkedLinkDetails } from "@remember/db";
+import prisma, { BookmarkedLink } from "@remember/db";
import logger from "@remember/shared/logger";
import { ZOpenAIRequest, zOpenAIRequestSchema } from "@remember/shared/queues";
import { Job } from "bullmq";
@@ -9,14 +9,6 @@ const openAIResponseSchema = z.object({
tags: z.array(z.string()),
});
-let openai: OpenAI | undefined;
-
-if (process.env.OPENAI_API_KEY && process.env.OPENAI_ENABLED) {
- openai = new OpenAI({
- apiKey: process.env["OPENAI_API_KEY"], // This is the default and can be omitted
- });
-}
-
function buildPrompt(url: string, description: string) {
return `
You are a bot who given an article, extracts relevant "hashtags" out of them.
@@ -27,24 +19,19 @@ Description: ${description}
`;
}
-async function fetchLink(linkId: string) {
- return await prisma.bookmarkedLink.findUnique({
+async function fetchBookmark(linkId: string) {
+ return await prisma.bookmark.findUnique({
where: {
id: linkId,
},
include: {
- details: true,
+ link: true,
},
});
}
-async function inferTags(
- jobId: string,
- link: BookmarkedLink,
- linkDetails: BookmarkedLinkDetails | null,
- openai: OpenAI,
-) {
- const linkDescription = linkDetails?.description;
+async function inferTags(jobId: string, link: BookmarkedLink, openai: OpenAI) {
+ const linkDescription = link?.description;
if (!linkDescription) {
throw new Error(
`[openai][${jobId}] No description found for link "${link.id}". Skipping ...`,
@@ -119,14 +106,15 @@ async function createTags(tags: string[], userId: string) {
return existingTags.map((t) => t.id).concat(newTagObjects.map((t) => t.id));
}
-async function connectTags(linkId: string, tagIds: string[]) {
+async function connectTags(bookmarkId: string, tagIds: string[]) {
// TODO: Prisma doesn't support createMany in Sqlite
await Promise.all(
tagIds.map((tagId) => {
- return prisma.tagsOnLinks.create({
+ return prisma.tagsOnBookmarks.create({
data: {
tagId,
- linkId,
+ bookmarkId,
+ attachedBy: "ai",
},
});
}),
@@ -136,6 +124,13 @@ async function connectTags(linkId: string, tagIds: string[]) {
export default async function runOpenAI(job: Job<ZOpenAIRequest, void>) {
const jobId = job.id || "unknown";
+ if (!process.env.OPENAI_API_KEY || !process.env.OPENAI_ENABLED) {
+ return;
+ }
+
+ const openai = new OpenAI({
+ apiKey: process.env.OPENAI_API_KEY,
+ });
if (!openai) {
logger.debug(
`[openai][${jobId}] OpenAI is not configured, nothing to do now`,
@@ -150,14 +145,22 @@ export default async function runOpenAI(job: Job<ZOpenAIRequest, void>) {
);
}
- const { linkId } = request.data;
- const link = await fetchLink(linkId);
- if (!link) {
- throw new Error(`[openai][${jobId}] link with id ${linkId} was not found`);
+ const { bookmarkId } = request.data;
+ const bookmark = await fetchBookmark(bookmarkId);
+ if (!bookmark) {
+ throw new Error(
+ `[openai][${jobId}] bookmark with id ${bookmarkId} was not found`,
+ );
+ }
+
+ if (!bookmark.link) {
+ throw new Error(
+ `[openai][${jobId}] bookmark with id ${bookmarkId} doesn't have a link`,
+ );
}
- const tags = await inferTags(jobId, link, link.details, openai);
+ const tags = await inferTags(jobId, bookmark.link, openai);
- const tagIds = await createTags(tags, link.userId);
- await connectTags(linkId, tagIds);
+ const tagIds = await createTags(tags, bookmark.userId);
+ await connectTags(bookmarkId, tagIds);
}