Refactor to use hooks (#436)

This commit is contained in:
Jeremy 2024-10-11 18:00:22 +05:30 committed by GitHub
parent 124efca9a1
commit cb60f8b143
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
139 changed files with 8871 additions and 8726 deletions

View file

@ -0,0 +1,94 @@
import { convertToCoreMessages, Message, streamText } from "ai";
import { z } from "zod";
import { customModel } from "@/ai";
import { auth } from "@/app/(auth)/auth";
import { deleteChatById, getChatById, saveChat } from "@/db/queries";
export async function POST(request: Request) {
const { id, messages }: { id: string; messages: Array<Message> } =
await request.json();
const session = await auth();
if (!session) {
return new Response("Unauthorized", { status: 401 });
}
const coreMessages = convertToCoreMessages(messages);
const result = await streamText({
model: customModel,
system:
"you are a friendly assistant! keep your responses concise and helpful.",
messages: coreMessages,
maxSteps: 5,
tools: {
getWeather: {
description: "Get the current weather at a location",
parameters: z.object({
latitude: z.number(),
longitude: z.number(),
}),
execute: async ({ latitude, longitude }) => {
const response = await fetch(
`https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}&current=temperature_2m&hourly=temperature_2m&daily=sunrise,sunset&timezone=auto`,
);
const weatherData = await response.json();
return weatherData;
},
},
},
onFinish: async ({ responseMessages }) => {
if (session.user && session.user.id) {
try {
await saveChat({
id,
messages: [...coreMessages, ...responseMessages],
userId: session.user.id,
});
} catch (error) {
console.error("Failed to save chat");
}
}
},
experimental_telemetry: {
isEnabled: true,
functionId: "stream-text",
},
});
return result.toDataStreamResponse({});
}
export async function DELETE(request: Request) {
const { searchParams } = new URL(request.url);
const id = searchParams.get("id");
if (!id) {
return new Response("Not Found", { status: 404 });
}
const session = await auth();
if (!session || !session.user) {
return new Response("Unauthorized", { status: 401 });
}
try {
const chat = await getChatById({ id });
if (chat.userId !== session.user.id) {
return new Response("Unauthorized", { status: 401 });
}
await deleteChatById({ id });
return new Response("Chat deleted", { status: 200 });
} catch (error) {
return new Response("An error occurred while processing your request", {
status: 500,
});
}
}

View file

@ -0,0 +1,69 @@
import { put } from "@vercel/blob";
import { NextResponse } from "next/server";
import { z } from "zod";
import { auth } from "@/app/(auth)/auth";
const FileSchema = z.object({
file: z
.instanceof(File)
.refine((file) => file.size <= 5 * 1024 * 1024, {
message: "File size should be less than 5MB",
})
.refine(
(file) =>
["image/jpeg", "image/png", "application/pdf"].includes(file.type),
{
message: "File type should be JPEG, PNG, or PDF",
},
),
});
export async function POST(request: Request) {
const session = await auth();
if (!session) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
if (request.body === null) {
return new Response("Request body is empty", { status: 400 });
}
try {
const formData = await request.formData();
const file = formData.get("file") as File;
if (!file) {
return NextResponse.json({ error: "No file uploaded" }, { status: 400 });
}
const validatedFile = FileSchema.safeParse({ file });
if (!validatedFile.success) {
const errorMessage = validatedFile.error.errors
.map((error) => error.message)
.join(", ");
return NextResponse.json({ error: errorMessage }, { status: 400 });
}
const filename = file.name;
const fileBuffer = await file.arrayBuffer();
try {
const data = await put(`${filename}`, fileBuffer, {
access: "public",
});
return NextResponse.json(data);
} catch (error) {
return NextResponse.json({ error: "Upload failed" }, { status: 500 });
}
} catch (error) {
return NextResponse.json(
{ error: "Failed to process request" },
{ status: 500 },
);
}
}

View file

@ -0,0 +1,13 @@
import { auth } from "@/app/(auth)/auth";
import { getChatsByUserId } from "@/db/queries";
export async function GET() {
const session = await auth();
if (!session || !session.user) {
return Response.json("Unauthorized!", { status: 401 });
}
const chats = await getChatsByUserId({ id: session.user.id! });
return Response.json(chats);
}