mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 19:03:09 +00:00 
			
		
		
		
	
		
			
	
	
		
			89 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|   | 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 |