77 lines
2.0 KiB
TypeScript
77 lines
2.0 KiB
TypeScript
import { v } from "convex/values";
|
|
import OpenAI from "openai";
|
|
|
|
import { internal } from "./_generated/api";
|
|
import { internalAction, internalMutation, query } from "./_generated/server";
|
|
import { missingEnvVariableUrl } from "./utils";
|
|
|
|
export const openaiKeySet = query({
|
|
args: {},
|
|
handler: async () => {
|
|
return !!process.env.OPENAI_API_KEY;
|
|
},
|
|
});
|
|
|
|
export const summary = internalAction({
|
|
args: {
|
|
id: v.id("notes"),
|
|
title: v.string(),
|
|
content: v.string(),
|
|
},
|
|
handler: async (ctx, { id, title, content }) => {
|
|
const prompt = `Take in the following note and return a summary: Title: ${title}, Note content: ${content}`;
|
|
|
|
const apiKey = process.env.OPENAI_API_KEY;
|
|
if (!apiKey) {
|
|
const error = missingEnvVariableUrl(
|
|
"OPENAI_API_KEY",
|
|
"https://platform.openai.com/account/api-keys",
|
|
);
|
|
console.error(error);
|
|
await ctx.runMutation(internal.openai.saveSummary, {
|
|
id: id,
|
|
summary: error,
|
|
});
|
|
return;
|
|
}
|
|
const openai = new OpenAI({ apiKey });
|
|
const output = await openai.chat.completions.create({
|
|
messages: [
|
|
{
|
|
role: "system",
|
|
content:
|
|
"You are a helpful assistant designed to output JSON in this format: {summary: string}",
|
|
},
|
|
{ role: "user", content: prompt },
|
|
],
|
|
model: "gpt-4-1106-preview",
|
|
response_format: { type: "json_object" },
|
|
});
|
|
|
|
// Pull the message content out of the response
|
|
const messageContent = output.choices[0]?.message.content;
|
|
|
|
console.log({ messageContent });
|
|
|
|
const parsedOutput = JSON.parse(messageContent!);
|
|
console.log({ parsedOutput });
|
|
|
|
await ctx.runMutation(internal.openai.saveSummary, {
|
|
id: id,
|
|
summary: parsedOutput.summary,
|
|
});
|
|
},
|
|
});
|
|
|
|
export const saveSummary = internalMutation({
|
|
args: {
|
|
id: v.id("notes"),
|
|
summary: v.string(),
|
|
},
|
|
handler: async (ctx, { id, summary }) => {
|
|
await ctx.db.patch(id, {
|
|
summary: summary,
|
|
});
|
|
},
|
|
});
|