diff --git a/src/renderer/components/Experiment/Eval/EvalModal.tsx b/src/renderer/components/Experiment/Eval/EvalModal.tsx index dce12372243da3b782cfe75636b324e43a49683f..f958ff2ff210b9743783f8e195d58a02a9dffe82 100644 --- a/src/renderer/components/Experiment/Eval/EvalModal.tsx +++ b/src/renderer/components/Experiment/Eval/EvalModal.tsx @@ -18,6 +18,7 @@ import { TabPanel, Tabs, Sheet, + Checkbox, } from '@mui/joy'; import DynamicPluginForm from '../DynamicPluginForm'; import TrainingModalDataTab from '../Train/TraningModalDataTab'; @@ -70,6 +71,8 @@ export default function EvalModal({ const [nameInput, setNameInput] = useState(''); const [currentTab, setCurrentTab] = useState(0); const [datasetDisplayMessage, setDatasetDisplayMessage] = useState(''); + const [selectedTasks, setSelectedTasks] = useState<string[]>([]); + const [taskOptions, setTaskOptions] = useState<string[]>([]); // Fetch available datasets from the API const { @@ -102,6 +105,7 @@ export default function EvalModal({ // setNameInput(generateFriendlyName()); // }}, []); + useEffect(() => { if (open) { if (!currentEvalName || currentEvalName === '') { @@ -110,6 +114,9 @@ export default function EvalModal({ } else { setNameInput(''); + setHasDatasetKey(false); + setTaskOptions([]); + setSelectedTasks([]); } }, [open]); @@ -141,6 +148,21 @@ export default function EvalModal({ evalConfig.script_parameters._dataset_display_message ); } + const tasksKeyExists = Object.keys(evalConfig.script_parameters).some( + (key) => key.toLowerCase().includes('tasks') + ); + if (tasksKeyExists) { + setSelectedTasks(evalConfig.script_parameters.tasks.split(',')); + let parsedData; + parsedData = JSON.parse(data); //Parsing data for easy access to parameters} + const tasksColumnName = Object.keys(parsedData.parameters).find((key) => key.toLowerCase().includes('tflabcustomui_tasks')); + const tempTaskOptions = parsedData.parameters[tasksColumnName].enum; + // console.log('tempTaskOptions:', tempTaskOptions); + setTaskOptions(tempTaskOptions); + delete evalConfig.script_parameters.tasks; + setConfig(evalConfig.script_parameters); + } + if (hasDatasetKey && evalConfig.script_parameters.dataset_name.length > 0) { setSelectedDataset(evalConfig.script_parameters.dataset_name); } @@ -148,7 +170,6 @@ export default function EvalModal({ setNameInput(evalConfig.name); } } - // setNameInput(evalConfig?.name); // if (!nameInput && evalConfig?.script_parameters.run_name) { // setNameInput(evalConfig.script_parameters.run_name); // } @@ -182,6 +203,18 @@ export default function EvalModal({ // Add dataset display message to the config parameters } } + // Check if parsed data parameters has a key that includes 'docs' + if (parsedData && parsedData.parameters) { + const tasksKeyExists = Object.keys(parsedData.parameters).some( + (key) => key.toLowerCase().includes('tflabcustomui_tasks') + ); + if (tasksKeyExists) { + const tasksColumnName = Object.keys(parsedData.parameters).find((key) => key.toLowerCase().includes('tflabcustomui_tasks')); + const tempTaskOptions = parsedData.parameters[tasksColumnName].enum; + // console.log('tempTaskOptions:', tempTaskOptions); + setTaskOptions(tempTaskOptions); + delete tempconfig[tasksColumnName]; + } } setConfig(tempconfig); // Set hasDataset to true in the parsed data, the dataset key is `true` @@ -189,7 +222,8 @@ export default function EvalModal({ // if (tempconfig && Object.keys(tempconfig).length > 0) { // setNameInput(generateFriendlyName()); // } - } catch (e) { + } + } catch (e) { console.error('Error parsing data', e); parsedData = ''; } @@ -249,6 +283,34 @@ export default function EvalModal({ </Stack> ); } + + function TasksTab(options) { + const taskOptions = options.options + + const handleToggleTask = (option: string) => { + if (selectedTasks.includes(option)) { + setSelectedTasks(selectedTasks.filter((t) => t !== option)); + } else { + setSelectedTasks([...selectedTasks, option]); + } + }; + + return ( + <Stack spacing={2}> + {taskOptions.map((option) => ( + <FormControl key={option}> + <Checkbox + checked={selectedTasks.includes(option)} + onChange={() => handleToggleTask(option)} + label={option} + /> + </FormControl> + ))} + </Stack> + ); + } + + const handleSubmit = async (event: FormEvent<HTMLFormElement>) => { event.preventDefault(); const formData = new FormData(event.currentTarget); @@ -257,6 +319,9 @@ export default function EvalModal({ if (datasetDisplayMessage.length > 0) { formJson._dataset_display_message = datasetDisplayMessage; } + if (selectedTasks.length > 0) { + formJson.tasks = selectedTasks.join(','); + } try { if (!formJson.run_name) { formJson.run_name = formJson.template_name; @@ -270,7 +335,11 @@ export default function EvalModal({ formJson ); setNameInput(''); + setHasDatasetKey(false); + setTaskOptions([]); + setSelectedTasks([]); } else { + console.log('formJson:', formJson); const template_name = formJson.template_name; delete formJson.template_name; const result = await chatAPI.EXPERIMENT_ADD_EVALUATION( @@ -281,6 +350,9 @@ export default function EvalModal({ ); // alert(JSON.stringify(formJson, null, 2)); setNameInput(generateFriendlyName()); + setHasDatasetKey(false); + setTaskOptions([]); + setSelectedTasks([]); } experimentInfoMutate(); onClose(); @@ -328,6 +400,7 @@ export default function EvalModal({ <TabList> <Tab>Introduction</Tab> <Tab>Name</Tab> + <Tab>Tasks</Tab> <Tab>Plugin Config</Tab> {hasDatasetKey && <Tab>Dataset</Tab>} </TabList> @@ -341,6 +414,9 @@ export default function EvalModal({ <TrainingModalFirstTab /> </TabPanel> <TabPanel value={2} sx={{ p: 2, overflow: 'auto' }} keepMounted> + <TasksTab options={taskOptions}/> + </TabPanel> + <TabPanel value={3} sx={{ p: 2, overflow: 'auto' }} keepMounted> <DynamicPluginForm experimentInfo={experimentInfo} plugin={pluginId} @@ -348,7 +424,7 @@ export default function EvalModal({ /> </TabPanel> {hasDatasetKey && ( - <TabPanel value={3} sx={{ p: 2, overflow: 'auto' }} keepMounted> + <TabPanel value={4} sx={{ p: 2, overflow: 'auto' }} keepMounted> <> <TrainingModalDataTab datasetsIsLoading={datasetsIsLoading} diff --git a/src/renderer/components/Experiment/Eval/EvalTasksTable.tsx b/src/renderer/components/Experiment/Eval/EvalTasksTable.tsx index b2bdb9cb78b31ed768edc36b0960a9f2fab4bc49..20b8861dad8e6dd94844c63727342dcf5e4ba8ef 100644 --- a/src/renderer/components/Experiment/Eval/EvalTasksTable.tsx +++ b/src/renderer/components/Experiment/Eval/EvalTasksTable.tsx @@ -13,26 +13,34 @@ function listEvals(evalString) { return result; } + function formatTemplateConfig(script_parameters): ReactElement { // const c = JSON.parse(script_parameters); // Remove the author/full path from the model name for cleanliness // const short_model_name = c.model_name.split('/').pop(); // Set main_task as either or the metric name from the script parameters - const main_task = script_parameters.metrics - ? script_parameters.metrics - : script_parameters.task; + const main_task = script_parameters.tasks const dataset_name = script_parameters.dataset_name ? script_parameters.dataset_name : 'N/A'; + const judge_model = script_parameters.judge_model? script_parameters.judge_model : 'N/A'; + const is_model = judge_model !== 'N/A'; + const is_dataset = dataset_name !== 'N/A'; + const r = ( <> - <b>Metric/Task:</b> {main_task} <br /> - <b>Dataset:</b> {dataset_name} <FileTextIcon size={14} /> - <br /> - {/* <b>Adaptor:</b> {c.adaptor_name} <br /> */} - {/* {JSON.stringify(c)} */} + <b>Metrics/Tasks:</b> {main_task} <br /> + {is_dataset && (<><b>Dataset:</b> {dataset_name} <FileTextIcon size={14} /> + <br /></>)} + {is_model && ( + <> + <b>Model:</b> {judge_model} + <br /> + </> + )} + </> ); return r;