diff --git a/src/components/thread/index.tsx b/src/components/thread/index.tsx index bf46ea9..5d7a0ae 100644 --- a/src/components/thread/index.tsx +++ b/src/components/thread/index.tsx @@ -181,12 +181,12 @@ export function Thread() { e.preventDefault(); if (!input.trim() || isLoading) return; setFirstTokenReceived(false); - - // TODO: check configurable object for modelname camelcase or snakecase else do openai format - const isOpenAI = true + + // TODO: check configurable object for modelname camelcase or snakecase else do openai format + const isOpenAI = true; const pdfBlocks = pdfUrlList.map(toOpenAIPDFBlock); - + const newHumanMessage: Message = { id: uuidv4(), type: "human", @@ -224,7 +224,7 @@ export function Thread() { const files = e.target.files; if (files) { const imageBlocks = await Promise.all( - Array.from(files).map(fileToImageBlock) + Array.from(files).map(fileToImageBlock), ); setImageUrlList((prev) => [...prev, ...imageBlocks]); } @@ -235,7 +235,7 @@ export function Thread() { const files = e.target.files; if (files) { const pdfBlocks = await Promise.all( - Array.from(files).map(fileToPDFBlock) + Array.from(files).map(fileToPDFBlock), ); setPdfUrlList((prev) => [...prev, ...pdfBlocks]); } @@ -277,25 +277,26 @@ export function Thread() { const imageFiles = files.filter((file) => file.type.startsWith("image/")); const pdfFiles = files.filter((file) => file.type === "application/pdf"); const invalidFiles = files.filter( - (file) => !file.type.startsWith("image/") && file.type !== "application/pdf" + (file) => + !file.type.startsWith("image/") && file.type !== "application/pdf", ); if (invalidFiles.length > 0) { toast.error( - "You have uploaded invalid file type. Please upload an image or a PDF." + "You have uploaded invalid file type. Please upload an image or a PDF.", ); } if (imageFiles.length) { const imageBlocks: Base64ContentBlock[] = await Promise.all( - imageFiles.map(fileToImageBlock) + imageFiles.map(fileToImageBlock), ); setImageUrlList((prev) => [...prev, ...imageBlocks]); } if (pdfFiles.length) { const pdfBlocks: Base64ContentBlock[] = await Promise.all( - pdfFiles.map(fileToPDFBlock) + pdfFiles.map(fileToPDFBlock), ); setPdfUrlList((prev) => [...prev, ...pdfBlocks]); } @@ -521,7 +522,10 @@ export function Thread() { {imageUrlList.map((imageBlock, idx) => { const imageUrlString = `data:${imageBlock.mime_type};base64,${imageBlock.data}`; return ( -
+
uploaded - setImageUrlList(imageUrlList.filter((_, i) => i !== idx)) + setImageUrlList( + imageUrlList.filter((_, i) => i !== idx), + ) } />
@@ -546,12 +552,18 @@ export function Thread() { key={idx} > - {String(pdfBlock.metadata?.filename ?? pdfBlock.metadata?.name ?? "")} + {String( + pdfBlock.metadata?.filename ?? + pdfBlock.metadata?.name ?? + "", + )} - setPdfUrlList(pdfUrlList.filter((_, i) => i !== idx)) + setPdfUrlList( + pdfUrlList.filter((_, i) => i !== idx), + ) } />
diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index e54b5b9..0000000 --- a/src/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { - Annotation, - MessagesAnnotation, - START, - StateGraph, -} from "@langchain/langgraph"; -import { ChatOpenAI } from "@langchain/openai"; - -const ChatAgentAnnotation = Annotation.Root({ - messages: MessagesAnnotation.spec["messages"], -}); - -const graph = new StateGraph(ChatAgentAnnotation) - .addNode("chat", async (state) => { - const model = new ChatOpenAI({ - model: "gpt-4o-mini", - }); - - const response = await model.invoke([ - { role: "system", content: "You are a helpful assistant." }, - ...state.messages, - ]); - - return { - messages: response, - }; - }) - .addEdge(START, "chat"); - -export const agent = graph.compile(); -agent.name = "Chat Agent"; diff --git a/src/lib/multimodal-utils.ts b/src/lib/multimodal-utils.ts index 8765f35..233bc41 100644 --- a/src/lib/multimodal-utils.ts +++ b/src/lib/multimodal-utils.ts @@ -1,9 +1,11 @@ import type { Base64ContentBlock } from "@langchain/core/messages"; import { convertToOpenAIImageBlock } from "@langchain/core/messages"; -import { v4 as uuidv4 } from 'uuid'; +import { v4 as uuidv4 } from "uuid"; // Returns a Promise of a typed multimodal block for images -export async function fileToImageBlock(file: File): Promise { +export async function fileToImageBlock( + file: File, +): Promise { const data = await fileToBase64(file); return { type: "image", @@ -15,7 +17,7 @@ export async function fileToImageBlock(file: File): Promise } // Returns a Promise of a typed multimodal block for PDFs -export async function fileToPDFBlock(file: File): Promise{ +export async function fileToPDFBlock(file: File): Promise { const data = await fileToBase64(file); return { type: "file", @@ -35,7 +37,7 @@ export function toOpenAIPDFBlock(block: Base64ContentBlock) { data: block.data, mime_type: block.mime_type ?? "application/pdf", filename: block.metadata?.name ?? block.metadata?.filename ?? "file.pdf", - } + }, }; } @@ -53,7 +55,6 @@ export async function fileToBase64(file: File): Promise { }); } - // Utility to convert base64 image blocks to OpenAI image_url format export function toOpenAIImageBlock(block: Base64ContentBlock | any) { if (block.type === "image" && block.source_type === "base64") { @@ -64,4 +65,4 @@ export function toOpenAIImageBlock(block: Base64ContentBlock | any) { const cleanBase64 = (base64String: string): string => { return base64String.replace(/^data:.*?;base64,/, ""); -}; \ No newline at end of file +};