From dfa3198314c6b2dd056535f379b5005c9b7760bf Mon Sep 17 00:00:00 2001 From: Alexander Song Date: Sun, 27 Apr 2025 18:16:33 -0700 Subject: [PATCH 1/3] feat(datasets): support json dataset upload via the ui --- .../pages/datasets/DatasetFromJSONForm.tsx | 249 ++++++++++++++++++ app/src/pages/datasets/DatasetsPage.tsx | 36 +++ 2 files changed, 285 insertions(+) create mode 100644 app/src/pages/datasets/DatasetFromJSONForm.tsx diff --git a/app/src/pages/datasets/DatasetFromJSONForm.tsx b/app/src/pages/datasets/DatasetFromJSONForm.tsx new file mode 100644 index 0000000000..35cd0c70d4 --- /dev/null +++ b/app/src/pages/datasets/DatasetFromJSONForm.tsx @@ -0,0 +1,249 @@ +import React, { useCallback, useState } from "react"; +import { Controller, useForm } from "react-hook-form"; +import { css } from "@emotion/react"; + +import { + Button, + FieldError, + Flex, + Form, + Input, + Label, + Text, + TextArea, + TextField, + View, +} from "@phoenix/components"; +import { JSONBlock } from "@phoenix/components/code"; +import { prependBasename } from "@phoenix/utils/routingUtils"; + +type CreateDatasetFromJSONParams = { + file: FileList; + name: string; + description: string; +}; + +type JsonData = { + name: string; + description: string; + inputs: Record[]; + outputs: Record[]; + metadata: Record[]; +}; + +export type CreateDatasetFromJSONFormProps = { + onDatasetCreated: (dataset: { id: string; name: string }) => void; + onDatasetCreateError: (error: Error) => void; +}; + +export function DatasetFromJSONForm(props: CreateDatasetFromJSONFormProps) { + const { onDatasetCreated, onDatasetCreateError } = props; + const [jsonData, setJsonData] = useState(null); + const { + control, + handleSubmit, + formState: { isDirty, isValid }, + } = useForm({ + defaultValues: { + name: "Dataset " + new Date().toISOString(), + description: "", + file: undefined, + }, + }); + + const onSubmit = useCallback( + (data: CreateDatasetFromJSONParams) => { + if (!jsonData) { + onDatasetCreateError(new Error("No JSON data available")); + return; + } + + return fetch(prependBasename("/v1/datasets/upload?sync=true"), { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + ...jsonData, + name: data.name, + description: data.description, + }), + }) + .then((response) => { + if (!response.ok) { + throw new Error(response.statusText || "Failed to create dataset"); + } + return response.json(); + }) + .then((res) => { + onDatasetCreated({ + name: data.name, + id: res["data"]["dataset_id"], + }); + }) + .catch((error) => { + onDatasetCreateError(error); + }); + }, + [onDatasetCreateError, onDatasetCreated, jsonData] + ); + + return ( +
+
+ ( + + + + {error?.message ? ( + {error.message} + ) : ( + The name of the dataset + )} + + )} + /> + ( + + +