|
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 |
|
|