/** * API functions for file uploads */ import { getBackendBaseURL } from "../config"; export interface UploadedFileInfo { filename: string; size: number; path: string; virtual_path: string; artifact_url: string; extension?: string; modified?: number; markdown_file?: string; markdown_path?: string; markdown_virtual_path?: string; markdown_artifact_url?: string; } export interface UploadResponse { success: boolean; files: UploadedFileInfo[]; message: string; } export interface ListFilesResponse { files: UploadedFileInfo[]; count: number; } /** * Upload files to a thread */ export async function uploadFiles( threadId: string, files: File[], ): Promise { const formData = new FormData(); files.forEach((file) => { formData.append("files", file); }); const response = await fetch( `${getBackendBaseURL()}/api/threads/${threadId}/uploads`, { method: "POST", body: formData, }, ); if (!response.ok) { const error = await response .json() .catch(() => ({ detail: "Upload failed" })); throw new Error(error.detail ?? "Upload failed"); } return response.json(); } /** * List all uploaded files for a thread */ export async function listUploadedFiles( threadId: string, ): Promise { const response = await fetch( `${getBackendBaseURL()}/api/threads/${threadId}/uploads/list`, ); if (!response.ok) { throw new Error("Failed to list uploaded files"); } return response.json(); } /** * Delete an uploaded file */ export async function deleteUploadedFile( threadId: string, filename: string, ): Promise<{ success: boolean; message: string }> { const response = await fetch( `${getBackendBaseURL()}/api/threads/${threadId}/uploads/${filename}`, { method: "DELETE", }, ); if (!response.ok) { throw new Error("Failed to delete file"); } return response.json(); }