supermemory/apps/web/app/routes/action.chat.tsx
2025-01-20 17:50:45 -07:00

60 lines
1.4 KiB
TypeScript

import { ActionFunctionArgs, redirect } from "@remix-run/cloudflare";
import { CoreMessage, UserContent } from "ai";
import { assertNotString } from "~/lib/types/safety";
export async function action({ request, context }: ActionFunctionArgs) {
const formData = await request.formData();
const input = formData.get("input") as string;
const fileURLs = (JSON.parse(formData.get("fileURLs") as string) as string[])?.map((url) =>
decodeURIComponent(url),
);
const messages = [
{
role: "user",
content: [
{
type: "text",
text: input,
},
],
},
] satisfies CoreMessage[];
function getMimeType(url: string) {
const extension = url.split(".").pop();
switch (extension) {
case "pdf":
return "application/pdf";
case "jpg":
case "jpeg":
return "image/jpeg";
case "png":
return "image/png";
default:
return "application/pdf";
}
}
fileURLs?.forEach((url) => {
// Decide the mimetype properly b ased on the file extension
const mimeType = getMimeType(url);
if (typeof messages[0].content !== "string") {
assertNotString(messages[0].content as UserContent).push({
type: "file",
data: encodeURI(url),
mimeType,
});
}
});
const base64Messages = btoa(JSON.stringify(messages));
return redirect(`/chat/new?q=${base64Messages}`);
}
export const loader = () => redirect("/", { status: 404 });