diff --git a/apps/ui/src/Route.tsx b/apps/ui/src/Route.tsx index 6a0d8550..35a49207 100644 --- a/apps/ui/src/Route.tsx +++ b/apps/ui/src/Route.tsx @@ -109,6 +109,7 @@ import EditScheduleModal from 'modals/EditScheduleModal' import VoiceOptionsModal from 'modals/VoiceOptionsModal' import LlmSettingsModal from 'modals/LlmSettingsModal' import { InviteUsers, CreateUserAccess } from 'pages/InviteUsers' +import { Pods, PodsContent } from 'pages/Pods' const Route = () => { const { loading } = useContext(AuthContext) @@ -411,6 +412,20 @@ const Route = () => { key={document.location.href} /> */} + + } key={document.location.href}> + {/* } key={document.location.href} /> */} + } + key={document.location.href} + /> + {/* } + key={document.location.href} + /> */} + {/* } key={document.location.href}> } key={document.location.href} /> */} diff --git a/apps/ui/src/pages/Datasource/Datasource.tsx b/apps/ui/src/pages/Datasource/Datasource.tsx index 1735172a..04ba753f 100644 --- a/apps/ui/src/pages/Datasource/Datasource.tsx +++ b/apps/ui/src/pages/Datasource/Datasource.tsx @@ -58,6 +58,7 @@ const Datasource = () => { + { {outlet} + diff --git a/apps/ui/src/pages/Navigation/MainNavigation.tsx b/apps/ui/src/pages/Navigation/MainNavigation.tsx index ee1a64d8..bc20ba77 100644 --- a/apps/ui/src/pages/Navigation/MainNavigation.tsx +++ b/apps/ui/src/pages/Navigation/MainNavigation.tsx @@ -35,6 +35,7 @@ import Tooltip from 'share-ui/components/Tooltip/Tooltip' import Chats from 'share-ui/components/Icon/Icons/components/Chats' import Integrations from 'share-ui/components/Icon/Icons/components/integrations' import FineTuning from 'share-ui/components/Icon/Icons/components/FineTuning' +import Book from 'share-ui/components/Icon/Icons/components/Book' const MainNavigation = ({ user }: { user: any }) => { const { getDomainConfig } = useDomainConfig() @@ -183,6 +184,16 @@ const MainNavigation = ({ user }: { user: any }) => { )} + + + onHandleClick('/pods')} + > + + {includes(active, 'pods') && } + + {/* {isDiscover && ( diff --git a/apps/ui/src/pages/Pods/Card.tsx b/apps/ui/src/pages/Pods/Card.tsx new file mode 100644 index 00000000..fcc26755 --- /dev/null +++ b/apps/ui/src/pages/Pods/Card.tsx @@ -0,0 +1,76 @@ +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import Typography from '@mui/material/Typography'; +import { CardActionArea } from '@mui/material'; +import Box from '@mui/material/Box' + +export default function ActionAreaCard({ item, selected, selectCard }: any) { + const color = 'rgba(34, 51, 84, 0.7)' + const isSelected = selected && selected === item.id + return ( + selectCard(item.id)}> + + + + + + {item.name} + + + {item.price} + + + + + + {item.ram} + + + 8 max + + + + + + {item.vram} * {item.cram} + + + High + + + + + + + ); +} \ No newline at end of file diff --git a/apps/ui/src/pages/Pods/Details.tsx b/apps/ui/src/pages/Pods/Details.tsx new file mode 100644 index 00000000..2e799db1 --- /dev/null +++ b/apps/ui/src/pages/Pods/Details.tsx @@ -0,0 +1,216 @@ +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import TextField from '@mui/material/TextField' +import Typography from '@mui/material/Typography'; +import Button from '@mui/material/Button' +import { borderBoxStyles, chipStyles, buttonStyles } from './styles' +import styled from 'styled-components'; +import Slider from '@mui/material/Slider' +import Card from '@mui/material/Card'; +import { CardActionArea } from '@mui/material'; +import FormGroup from '@mui/material/FormGroup'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Checkbox from '@mui/material/Checkbox'; + +const sliderMarks = [ + { value: 1, label: '1' }, + { value: 2, label: '2' }, + { value: 3, label: '3' }, + { value: 4, label: '4' }, + { value: 5, label: '5' }, +] + +const Details = () => { + return ( + + + + Configure Deployment + + + + + + + Pod Template + + + + + + + + RunPod Pytorch 2.0.1 + + + runpod/pytorch:2.0.1-py3.10-cuda11.8.0-devel-ubuntu22.04 + + + + + + + + + + + + + + + GPU Count + + `${value}`} + valueLabelDisplay="auto" + step={1} + max={5} + min={1} + marks={sliderMarks} + sx={{ color: '#000000' }} + /> + + + + + Instance Pricing + + + + + + + + + On-Demand + + + Non-Interruptible + + + $0.74/hr + + + Pay as you go, with costs based on actual usage time. + + + + + + + + + + + + On-Demand + + + Non-Interruptible + + + $0.74/hr + + + Pay as you go, with costs based on actual usage time. + + + + + + + + + + + + + } label="Encrypt Volume" /> + } label="SSH Terminal Access" /> + } label="Start Jupyter Notebook" /> + + + + + + + + ) +} + +export default Details + + +const StyledPodTemplate = styled.div` + width: 100%; + background: #ffffff; + border-radius: 10px; + padding: 5px 2rem 5px 2rem; + display: flex; + justify-content: space-between; + align-items: center; +` \ No newline at end of file diff --git a/apps/ui/src/pages/Pods/FilterPods.tsx b/apps/ui/src/pages/Pods/FilterPods.tsx new file mode 100644 index 00000000..68b54549 --- /dev/null +++ b/apps/ui/src/pages/Pods/FilterPods.tsx @@ -0,0 +1,130 @@ +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Slider from '@mui/material/Slider' +// import ButtonGroup from '@mui/material/ButtonGroup'; +import Button from '@mui/material/Button'; +import ToggleButton from '@mui/material/ToggleButton'; +import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; +// import IconButton from '@mui/material/IconButton' +// import Fingerprint from '@mui/icons-material/Fingerprint' +import { black, white } from './styles' +const sliderMarks = [ + { value: 1, label: '1' }, + { value: 2, label: '2' }, + { value: 3, label: '3' }, + { value: 4, label: '4' }, + { value: 5, label: '5' }, + { value: 8, label: '8' }, + { value: 10, label: '10' }, +] + + +const buttonStyles = { + color: black, + textTransform: 'capitalize', + fontSize: '0.8125rem', + fontWeight: 'bold', +} + +const FilterPods = () => { + return ( + + + {}} + aria-label="Platform" + > + + GPU + + + + CPU + + + + + + + + + + + + + + + + + + + Filter GPUs by VRAM + + `${value}`} + valueLabelDisplay="auto" + step={1} + max={10} + min={1} + marks={sliderMarks} + sx={{ color: black }} + size='small' + /> + + + ) +} + +export default FilterPods \ No newline at end of file diff --git a/apps/ui/src/pages/Pods/Pods.tsx b/apps/ui/src/pages/Pods/Pods.tsx new file mode 100644 index 00000000..42949b81 --- /dev/null +++ b/apps/ui/src/pages/Pods/Pods.tsx @@ -0,0 +1,121 @@ +import { StyledAppContainer } from 'components/Layout/LayoutStyle' +import ListHeader from 'routes/components/ListHeader' + +import { + StyledChatWrapper, + StyledContainer, + StyledLeftColumn, + StyledMainWrapper, + } from 'routes/ChatRouteLayout' +import { useNavigate, useOutlet } from 'react-router-dom' +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; + +const cpu = [ + { cpu: 'runpod/base:0.5.1-cpu', ram: '46 GB', running: true }, + { cpu: 'runpod/base:0.5.1-cpu', ram: '32 GB', running: false }, + { cpu: 'runpod/base:0.5.1-cpu', ram: '16 GB', running: true }, + { cpu: 'runpod/base:0.5.1-cpu', ram: '128 GB', running: false }, + { cpu: 'runpod/base:0.5.1-cpu', ram: '46 GB', running: false }, + { cpu: 'runpod/base:0.5.1-cpu', ram: '50 GB', running: true }, +] + + +const Pods = () => { + const navigate = useNavigate() + const outlet = useOutlet() + + return ( + + + + + + navigate('/pods/create-pod'), + }, + ]} + /> + + {cpu.map((item, index) => ( + + + + + Compute + + + CPU: {item.cpu} + + + RAM: {item.ram} + + + + + + + {item.running ? 'Running' : 'Stopped'} + + + + + ))} + + + + + {outlet} + + + + + ) +} + +export default Pods + + +// export const StyledContainer = styled.div` +// display: flex; +// justify-content: space-between; +// width: 100%; +// height: 100%; +// overflow: hidden; +// position: relative; +// ` +// export const StyledMainWrapper = styled.div` +// padding: 16px; +// padding-right: 0; +// margin-right: 20px; +// border-radius: 16px; +// background: ${({ theme }) => theme.body.componentsWrapperBg}; +// display: flex; +// justify-content: center; +// width: 100%; +// height: 100%; +// ` \ No newline at end of file diff --git a/apps/ui/src/pages/Pods/PodsContent.tsx b/apps/ui/src/pages/Pods/PodsContent.tsx new file mode 100644 index 00000000..e8931dd0 --- /dev/null +++ b/apps/ui/src/pages/Pods/PodsContent.tsx @@ -0,0 +1,141 @@ +import styled from 'styled-components' +import Box from '@mui/material/Box'; +import Grid from '@mui/material/Grid'; +import Chip from '@mui/material/Chip'; +import Stack from '@mui/material/Stack'; + +import ActionAreaCard from './Card' +import Details from './Details' +import FilterPods from './FilterPods' +import Price from './Price' + +import { chipStyles, borderBoxStyles } from './styles' +import React from 'react'; + +const Line = ({ label }: { label: string }) => { + return ( + + + + + + + ) +} + +const temp_data = { + 'NVIDIA': [ + { name: 'RTX 4090', price: '$0.74/hr', ram: '48 GB RAM', vram: '125 GB RAM', cram: '28 vCPU', id: 1 }, + { name: 'H100 SXM', price: '$1/hr', ram: '23 GB RAM', vram: '90 GB RAM', cram: '24 vCPU', id: 2 }, + { name: 'H100 PCIe', price: '$0.32/hr', ram: '44 GB RAM', vram: '140 GB RAM', cram: '32 vCPU', id: 3 }, + { name: 'L40', price: '$0.74/hr', ram: '55 GB RAM', vram: '130 GB RAM', cram: '22 vCPU', id: 4 }, + { name: 'RTX 6000 Ada', price: '$2.01/hr', ram: '32 GB RAM', vram: '150 GB RAM', cram: '32 vCPU', id: 5 }, + { name: 'RTX 4000 Ada', price: '$1.4/hr', ram: '16 GB RAM', vram: '100 GB RAM', cram: '64 vCPU', id: 6 }, + { name: 'RTX 3090', price: '$0.20/hr', ram: '12 GB RAM', vram: '250 GB RAM', cram: '56 vCPU', id: 7 }, + { name: 'RTX A4500', price: '$0.32/hr', ram: '8 GB RAM', vram: '300 GB RAM', cram: '12 vCPU', id: 8 }, + ], + 'AMD': [ + { name: 'RTX', price: '$0.74/hr', ram: '48 GB RAM', vram: '125 GB RAM', cram: '32 vCPU', id: 9 }, + { name: 'RTX A4000', price: '$0.74/hr', ram: '48 GB RAM', vram: '125 GB RAM', cram: '32 vCPU', id: 10 }, + { name: 'A100 SXM', price: '$0.74/hr', ram: '48 GB RAM', vram: '125 GB RAM', cram: '32 vCPU', id: 11 }, + { name: 'RTX 6000 Ada', price: '$0.74/hr', ram: '48 GB RAM', vram: '125 GB RAM', cram: '32 vCPU', id: 12 }, + { name: 'A100 PCIe', price: '$0.74/hr', ram: '48 GB RAM', vram: '125 GB RAM', cram: '32 vCPU', id: 13 }, + { name: 'H100 PCIe', price: '$0.74/hr', ram: '48 GB RAM', vram: '125 GB RAM', cram: '32 vCPU', id: 14 }, + { name: 'RTX', price: '$0.74/hr', ram: '48 GB RAM', vram: '125 GB RAM', cram: '32 vCPU', id: 15 }, + ] +} + + +const PodsContent = () => { + const [selectPod, setSelectPod] = React.useState(1) + + const data_keys = Object.keys(temp_data) + return ( + + + + + + Select an Instance + + + + + + + + + {data_keys.map((key: string, index: number) => ( + + + + {temp_data[key].map((item, i) => ( + + + + ))} + + + ))} + + + + {selectPod && + <> +
+ + + } + + + + ) +} + +export default PodsContent + +const StyledBox = styled.div` + width: 100%; + overflow-y: auto; +` + +const StyledContainer = styled.div` + display: flex; + flex-direction: column; + gap: 27px; + max-width: 80rem; + margin-left: auto; + margin-right: auto; + @media (min-width: 960px) { + padding-left: 36px; + padding-right: 36px; + } +` + +const StyledLineContainer = styled.div` + display: flex; + align-items: center; + justify-content: space-between; +` +const StyledLine = styled.div` + width: 94%; + height: 1px; + background: rgba(34, 51, 84, 0.1); +` \ No newline at end of file diff --git a/apps/ui/src/pages/Pods/Price.tsx b/apps/ui/src/pages/Pods/Price.tsx new file mode 100644 index 00000000..eca50b40 --- /dev/null +++ b/apps/ui/src/pages/Pods/Price.tsx @@ -0,0 +1,57 @@ +import Box from '@mui/material/Box'; +import { borderBoxStyles } from './styles' +import Typography from '@mui/material/Typography'; + + +const Price = () => { + return ( + + + + + Pricing Summary + + + GPU Cost: $0.74 / hr + + + Running Disk Cost: $0.006 / hr + + + Exited Disk Cost: $0.006 / hr + + + + + Pricing Summary + + + GPU Cost: $0.74 / hr + + + Running Disk Cost: $0.006 / hr + + + Exited Disk Cost: $0.006 / hr + + + + ) +} + +export default Price \ No newline at end of file diff --git a/apps/ui/src/pages/Pods/index.ts b/apps/ui/src/pages/Pods/index.ts new file mode 100644 index 00000000..c60760d7 --- /dev/null +++ b/apps/ui/src/pages/Pods/index.ts @@ -0,0 +1,2 @@ +export { default as Pods } from './Pods' +export { default as PodsContent } from './PodsContent' \ No newline at end of file diff --git a/apps/ui/src/pages/Pods/styles.ts b/apps/ui/src/pages/Pods/styles.ts new file mode 100644 index 00000000..85670f1e --- /dev/null +++ b/apps/ui/src/pages/Pods/styles.ts @@ -0,0 +1,53 @@ + +export const chipStyles = { + maxWidth: '100%', + fontFamily: `Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"`, + display: 'inline-flex', + alignItems: 'center', + justifyContent: 'center', + height: '32px', + color: 'rgb(34, 51, 84)', + backgroundColor: 'rgba(34, 51, 84, 0.1)', + whiteSpace: 'nowrap', + cursor: 'default', + outline: '0px', + textDecoration: 'none', + border: '0px', + padding: '10px', + verticalAlign: 'middle', + boxSizing: 'border-box', + borderRadius: '0px 10px', + fontSize: '14px', + marginTop: '-18px', + position: 'absolute', + right: '0px' +} + +export const borderBoxStyles = { + color: 'rgb(34, 51, 84)', + transition: 'box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms', + borderRadius: '10px', + overflow: 'hidden', + border: '1px solid rgba(34, 51, 84, 0.2)', + boxShadow: 'none', + background: 'rgb(242, 245, 249)', + padding: '18px', + position: 'relative', + width: '100%' +} + + +export const buttonStyles = { + background: 'transparent', + color: 'rgba(34, 51, 84, 0.7)', + borderRadius: '10px', + boxShadow: 'none', + border: '1px solid rgba(34, 51, 84, 0.7)', + '&:hover': { + background: 'transparent', + boxShadow: 'none', + } +} + +export const black = '#000000' +export const white = 'rgb(255, 255, 255)' \ No newline at end of file