import { generateFeatures } from "@/lib/prompts"; import { v4 as uuidv4 } from "uuid"; import { NextRequest, NextResponse } from "next/server"; import { createRouteHandlerClient } from "@supabase/auth-helpers-nextjs"; import { cookies } from "next/headers"; import { Database } from "@/types/supabase"; import { prisma } from "@/lib/prisma"; import { OpenAIEmbeddings } from "langchain/embeddings/openai"; import { completion } from "zod-gpt"; import * as z from "zod"; import { OpenAIChatApi } from "llm-api"; const MIN_FEATURES_PER_PROJECT = 6; const MAX_FEATURES_PER_PROJECT = 12; const OPENAI_MODEL = "gpt-3.5-turbo-16k"; const openai = new OpenAIChatApi( { apiKey: process.env.OPENAI_API_KEY!, }, { model: OPENAI_MODEL, } ); async function getSession(supabase: any) { const { data: { session }, } = await supabase.auth.getSession(); return session; } export async function POST(req: NextRequest) { const supabase = createRouteHandlerClient({ cookies }); const session = await getSession(supabase); if (!session) return NextResponse.redirect("/auth"); try { const formData = await req.json(); const project_name = String(formData.project_name); const project_description = String(formData.project_description); const project_stack = formData.tech_stack; // console.log("SERVER FORM DATA ===>", project_stack); const feature_gen_prompt = generateFeatures( project_name, project_description, project_stack ); const res = await completion(openai, feature_gen_prompt, { schema: z.object({ features: z .array( z.object({ name: z.string().describe("The name of the feature"), description: z .string() .describe("The description of the feature"), }) ) .min(MIN_FEATURES_PER_PROJECT) .max(MAX_FEATURES_PER_PROJECT), }), }); const featuresWithUUID = res.data.features.map((feature) => ({ ...feature, uid: uuidv4(), // Add a UUID to each feature object })); console.log("SERVER RES ===>", featuresWithUUID); return NextResponse.json({ features: featuresWithUUID }, { status: 200 }); } catch (err) { console.log(err); return NextResponse.json({ error: err }, { status: 500 }); } }