11'use client'
22
3- import { useId , useMemo , useState } from 'react'
3+ import { useMemo , useState } from 'react'
44import { ChipCombobox , type ComboboxOption } from '@sim/emcn'
5+ import { useDeploymentShape } from '@/lib/core/config/deployment-shape'
56import type { PermissionGroupConfig } from '@/lib/permission-groups/fields'
6- import { createModelAccessGate } from '@/lib/permission-groups/model-access'
7+ import {
8+ createModelAccessGate ,
9+ resolveAgentDefaultModel ,
10+ } from '@/lib/permission-groups/model-access'
711import { SettingRow } from '@/ee/components/setting-row'
812import { useProviderModelLists } from '@/hooks/queries/providers'
913import {
1014 DYNAMIC_MODEL_PROVIDERS ,
1115 getModelSunsetStatus ,
1216 getProviderIcon ,
1317 getProviderModels ,
18+ SIM_AUTO_MODEL_ID ,
1419} from '@/providers/models'
1520import type { ProviderId } from '@/providers/types'
1621
@@ -25,7 +30,7 @@ interface AgentDefaultProps {
2530
2631/** Selects an allowed default for new Agent blocks governed by this group. */
2732export function AgentDefault ( { config, providerIds, workspaceId, onChange } : AgentDefaultProps ) {
28- const id = useId ( )
33+ const { hosted } = useDeploymentShape ( )
2934 const [ open , setOpen ] = useState ( false )
3035 const dynamicModels = useProviderModelLists (
3136 DYNAMIC_MODEL_PROVIDERS . filter ( ( provider ) => providerIds . includes ( provider ) ) ,
@@ -38,8 +43,11 @@ export function AgentDefault({ config, providerIds, workspaceId, onChange }: Age
3843 ...providerIds . flatMap ( ( provider ) => getProviderModels ( provider ) ) ,
3944 ...dynamicModels ,
4045 ] )
41- return [
46+ const modelOptions : ComboboxOption [ ] = [
4247 { label : 'Platform default' , value : PLATFORM_DEFAULT } ,
48+ ...( hosted && isAllowed ( SIM_AUTO_MODEL_ID )
49+ ? [ { label : 'Auto' , value : SIM_AUTO_MODEL_ID } ]
50+ : [ ] ) ,
4351 ...[ ...models ]
4452 . filter ( ( model ) => isAllowed ( model ) && getModelSunsetStatus ( model ) !== 'deprecated' )
4553 . map ( ( model ) => ( {
@@ -48,17 +56,28 @@ export function AgentDefault({ config, providerIds, workspaceId, onChange }: Age
4856 icon : getProviderIcon ( model ) ?? undefined ,
4957 } ) ) ,
5058 ]
51- } , [ config , providerIds , dynamicModels ] )
59+ const savedModel = config . defaultAgentModel
60+ if ( savedModel && ! modelOptions . some ( ( option ) => option . value === savedModel ) ) {
61+ modelOptions . push ( {
62+ label : savedModel ,
63+ value : savedModel ,
64+ icon : getProviderIcon ( savedModel ) ?? undefined ,
65+ hidden : true ,
66+ } )
67+ }
68+ return modelOptions
69+ } , [ config , providerIds , dynamicModels , hosted ] )
5270
5371 const error =
54- config . defaultAgentModel && ! createModelAccessGate ( config ) ( config . defaultAgentModel )
55- ? 'Agent default must be an allowed model'
72+ config . defaultAgentModel &&
73+ ! resolveAgentDefaultModel ( config , { allowAuto : hosted , availableProviderIds : providerIds } )
74+ ? 'Agent default must be an available, allowed model'
5675 : undefined
5776
5877 return (
59- < SettingRow label = 'Agent default' htmlFor = { id } error = { error } >
78+ < SettingRow label = 'Agent default' error = { error } >
6079 < ChipCombobox
61- id = { id }
80+ aria-label = 'Agent default'
6281 options = { options }
6382 value = { config . defaultAgentModel ?? PLATFORM_DEFAULT }
6483 onChange = { ( model ) => onChange ( model === PLATFORM_DEFAULT ? null : model ) }
0 commit comments