import produce from 'immer' import { useCallback } from 'react' import { useIsChatMode } from './use-workflow' import type { ModelConfig, VisionSetting } from '@/app/components/workflow/types' import { useTextGenerationCurrentProviderAndModelAndModelList } from '@/app/components/header/account-setting/model-provider-page/hooks' import { ModelFeatureEnum, } from '@/app/components/header/account-setting/model-provider-page/declarations' import { Resolution } from '@/types/app' type Payload = { enabled: boolean configs?: VisionSetting } type Params = { payload: Payload onChange: (payload: Payload) => void } const useConfigVision = (model: ModelConfig, { payload = { enabled: false, }, onChange, }: Params) => { const { currentModel: currModel, } = useTextGenerationCurrentProviderAndModelAndModelList( { provider: model.provider, model: model.name, }, ) const isChatMode = useIsChatMode() const getIsVisionModel = useCallback(() => { return !!currModel?.features?.includes(ModelFeatureEnum.vision) }, [currModel]) const isVisionModel = getIsVisionModel() const handleVisionResolutionEnabledChange = useCallback((enabled: boolean) => { const newPayload = produce(payload, (draft) => { draft.enabled = enabled if (enabled && isChatMode) { draft.configs = { detail: Resolution.high, variable_selector: ['sys', 'files'], } } }) onChange(newPayload) }, [isChatMode, onChange, payload]) const handleVisionResolutionChange = useCallback((config: VisionSetting) => { const newPayload = produce(payload, (draft) => { draft.configs = config }) onChange(newPayload) }, [onChange, payload]) const handleModelChanged = useCallback(() => { const isVisionModel = getIsVisionModel() if (!isVisionModel) { handleVisionResolutionEnabledChange(false) return } if (payload.enabled) { onChange({ enabled: true, configs: { detail: Resolution.high, variable_selector: [], }, }) } }, [getIsVisionModel, handleVisionResolutionEnabledChange, onChange, payload.enabled]) return { isVisionModel, handleVisionResolutionEnabledChange, handleVisionResolutionChange, handleModelChanged, } } export default useConfigVision