diff --git a/src/renderer/components/Experiment/Workflows/index.tsx b/src/renderer/components/Experiment/Workflows/index.tsx index 08d848b5cce5fa9765120bf2031635cd5fc58b2c..f51d8f1eb7c48d8442a9f11ba6cf62b82b4c66c8 100644 --- a/src/renderer/components/Experiment/Workflows/index.tsx +++ b/src/renderer/components/Experiment/Workflows/index.tsx @@ -15,6 +15,9 @@ import '@xyflow/react/dist/style.css'; import { PlayIcon, WorkflowIcon } from 'lucide-react'; import { useState } from 'react'; +import * as chatAPI from '../../../lib/transformerlab-api-sdk'; +import useSWR from 'swr'; + const initialNodes = [ { id: '1', @@ -60,9 +63,65 @@ const initialEdges = [ }, ]; +const fetcher = (url : any) => fetch(url).then((res) => res.json()); + export default function Workflows({ experimentInfo }) { const [selectedWorkflow, setSelectedWorkflow] = useState(null); + const { + data: workflowsData, + error: workflowsError, + isLoading: isLoading, + } = useSWR(chatAPI.Endpoints.Workflows.List(), fetcher); + + const workflows = workflowsData; + + function generateNodes(workflow: any){ + let out : any[] = []; + let currentTask = "0"; + let position = 0; + + const workflowConfig = JSON.parse(workflow.config); + console.log(workflowConfig); + + while (currentTask<workflowConfig.nodes.length) { + out.push({ + id: currentTask, + position: { x: 0, y: position }, + data: { label: workflowConfig.nodes[currentTask].name }, + }) + position += 100; + currentTask = workflowConfig.nodes[currentTask].out; + } + + return out; + } + + function generateEdges(workflow: any){ + let out : any[] = []; + let currentTask = "0"; + let ids = "0"; + + const workflowConfig = JSON.parse(workflow.config); + console.log(workflowConfig); + + while (currentTask<workflowConfig.nodes.length) { + + out.push({ + id: ids, + source: currentTask, + target: workflowConfig.nodes[currentTask].out, + markerEnd: { + type: 'arrow', + }, + }) + ids += 1; + currentTask = workflowConfig.nodes[currentTask].out; + } + + return out; + } + return ( <Sheet sx={{ @@ -90,24 +149,29 @@ export default function Workflows({ experimentInfo }) { <Typography level="title-lg" mb={2}> Workflows </Typography> + {workflows && <List> - {[1, 2, 3].map((i) => ( - <ListItem key={i}> - <ListItemButton onClick={() => setSelectedWorkflow(i)}> + {workflows.map((workflow) => ( + <ListItem key={workflow.id}> + <ListItemButton onClick={() => setSelectedWorkflow(workflow)}> <ListItemDecorator> <WorkflowIcon /> </ListItemDecorator> - <ListItemContent>Workflow {i}</ListItemContent> + <ListItemContent>{workflow.name}</ListItemContent> → </ListItemButton> </ListItem> ))} </List> + } </Box> + + {selectedWorkflow && <Box flex={3} display="flex" flexDirection="column"> <Typography level="title-lg" mb={2}> - Workflow {selectedWorkflow} + Workflow {selectedWorkflow.name} </Typography> + <Box sx={{ display: 'flex', @@ -118,8 +182,8 @@ export default function Workflows({ experimentInfo }) { }} > <ReactFlow - nodes={initialNodes} - edges={initialEdges} + nodes={generateNodes(selectedWorkflow)} + edges={generateEdges(selectedWorkflow)} fitView style={{ backgroundColor: '#F7F9FB' }} > @@ -140,7 +204,7 @@ export default function Workflows({ experimentInfo }) { <Button variant="outlined">Fight</Button> </Box> </Box> - </Box> + </Box>} </Sheet> </Sheet> ); diff --git a/src/renderer/lib/transformerlab-api-sdk.ts b/src/renderer/lib/transformerlab-api-sdk.ts index 6ec0a82b46cfa540ce391a50f13bfdbf93ea3428..b09b876d2e1a536c8f4950dcfa32b77121a9181c 100644 --- a/src/renderer/lib/transformerlab-api-sdk.ts +++ b/src/renderer/lib/transformerlab-api-sdk.ts @@ -1008,6 +1008,9 @@ function convertSlashInUrl(url: string) { return url.replace(/\//g, '~~~'); } +Endpoints.Workflows = { + List: () => API_URL() + 'workflows/list', +} Endpoints.Dataset = { Gallery: () => API_URL() + 'data/gallery',