@@ -112,6 +112,9 @@ export default function QueueTaskModal({
112112 const [ sweepMetric , setSweepMetric ] = React . useState ( 'eval/loss' ) ;
113113 const [ lowerIsBetter , setLowerIsBetter ] = React . useState ( true ) ;
114114 const [ jobSlurmFlags , setJobSlurmFlags ] = React . useState < string [ ] > ( [ '' ] ) ;
115+ const [ jobDockerImage , setJobDockerImage ] = React . useState ( '' ) ;
116+ const [ jobRegion , setJobRegion ] = React . useState ( '' ) ;
117+ const [ jobUseSpot , setJobUseSpot ] = React . useState ( false ) ;
115118 const [ useTrackio , setUseTrackio ] = React . useState ( false ) ;
116119 const [ useProfiling , setUseProfiling ] = React . useState ( false ) ;
117120 const [ useProfilingTorch , setUseProfilingTorch ] = React . useState ( false ) ;
@@ -215,6 +218,7 @@ export default function QueueTaskModal({
215218 ) ;
216219 const isLocalProvider = selectedProvider ?. type === 'local' ;
217220 const isSlurmProvider = selectedProvider ?. type === 'slurm' ;
221+ const isSkypilotProvider = selectedProvider ?. type === 'skypilot' ;
218222
219223 // Fetch user-specific provider settings (including default custom SBATCH flags)
220224 const slurmUserSettingsKey =
@@ -632,6 +636,15 @@ export default function QueueTaskModal({
632636 setJobSlurmFlags ( lines . length > 0 ? lines : [ '' ] ) ;
633637 } , [ open , isSlurmProvider , selectedProviderId , slurmUserSettings ] ) ;
634638
639+ // Initialize SkyPilot per-job defaults from provider config when a SkyPilot provider is selected.
640+ React . useEffect ( ( ) => {
641+ if ( ! open || ! isSkypilotProvider || ! selectedProvider ) return ;
642+ const cfg = selectedProvider . config || { } ;
643+ setJobDockerImage ( cfg . docker_image || '' ) ;
644+ setJobRegion ( cfg . default_region || '' ) ;
645+ setJobUseSpot ( cfg . use_spot === true ) ;
646+ } , [ open , isSkypilotProvider , selectedProviderId , selectedProvider ] ) ;
647+
635648 // Helper function to validate constraints
636649 const validateParameter = ( param : ProcessedParameter ) : string | null => {
637650 const { schema, value } = param ;
@@ -744,6 +757,19 @@ export default function QueueTaskModal({
744757 }
745758 }
746759
760+ // For SkyPilot providers, add optional per-job overrides
761+ if ( provider ?. type === 'skypilot' ) {
762+ if ( jobDockerImage . trim ( ) ) {
763+ config . docker_image = jobDockerImage . trim ( ) ;
764+ }
765+ if ( jobRegion . trim ( ) ) {
766+ config . region = jobRegion . trim ( ) ;
767+ }
768+ if ( jobUseSpot ) {
769+ config . use_spot = true ;
770+ }
771+ }
772+
747773 // Add sweep configuration if enabled
748774 if ( runSweeps ) {
749775 config . run_sweeps = true ;
@@ -1580,6 +1606,53 @@ export default function QueueTaskModal({
15801606 the template default.
15811607 </ FormHelperText >
15821608
1609+ { /* SkyPilot per-job overrides */ }
1610+ { isSkypilotProvider && (
1611+ < >
1612+ < Divider />
1613+ < Typography level = "title-sm" >
1614+ SkyPilot Job Overrides
1615+ </ Typography >
1616+ < FormControl >
1617+ < FormLabel > Docker Image (optional)</ FormLabel >
1618+ < Input
1619+ value = { jobDockerImage }
1620+ onChange = { ( e ) => setJobDockerImage ( e . target . value ) }
1621+ placeholder = "docker:nvcr.io/nvidia/pytorch:23.10-py3"
1622+ sx = { { fontFamily : 'monospace' , fontSize : 'sm' } }
1623+ disabled = { isSubmitting }
1624+ />
1625+ < FormHelperText >
1626+ Prefix with "docker:" to run inside a
1627+ container. Defaults to the provider's global
1628+ setting.
1629+ </ FormHelperText >
1630+ </ FormControl >
1631+ < FormControl >
1632+ < FormLabel > Region (optional)</ FormLabel >
1633+ < Input
1634+ value = { jobRegion }
1635+ onChange = { ( e ) => setJobRegion ( e . target . value ) }
1636+ placeholder = "e.g. us-east-1"
1637+ disabled = { isSubmitting }
1638+ />
1639+ </ FormControl >
1640+ < FormControl
1641+ sx = { { flexDirection : 'row' , alignItems : 'center' } }
1642+ >
1643+ < Switch
1644+ checked = { jobUseSpot }
1645+ onChange = { ( e ) => setJobUseSpot ( e . target . checked ) }
1646+ disabled = { isSubmitting }
1647+ sx = { { mr : 1 } }
1648+ />
1649+ < FormLabel sx = { { m : 0 } } >
1650+ Use Spot / Preemptible Instances
1651+ </ FormLabel >
1652+ </ FormControl >
1653+ </ >
1654+ ) }
1655+
15831656 { /* Incompatibility Warning */ }
15841657 { selectedProvider &&
15851658 effectiveResources ?. accelerators &&
0 commit comments