diff --git a/web/app/components/workflow/hooks/use-config-vision.ts b/web/app/components/workflow/hooks/use-config-vision.ts index d952ae6114..bc0f45a9e9 100644 --- a/web/app/components/workflow/hooks/use-config-vision.ts +++ b/web/app/components/workflow/hooks/use-config-vision.ts @@ -17,7 +17,9 @@ type Params = { onChange: (payload: Payload) => void } const useConfigVision = (model: ModelConfig, { - payload, + payload = { + enabled: false, + }, onChange, }: Params) => { const { diff --git a/web/app/components/workflow/nodes/question-classifier/default.ts b/web/app/components/workflow/nodes/question-classifier/default.ts index bd3f665868..201699b95e 100644 --- a/web/app/components/workflow/nodes/question-classifier/default.ts +++ b/web/app/components/workflow/nodes/question-classifier/default.ts @@ -26,6 +26,9 @@ const nodeDefault: NodeDefault = { name: '', }, ], + vision: { + enabled: false, + }, }, getAvailablePrevNodes(isChatMode: boolean) { const nodes = isChatMode diff --git a/web/app/components/workflow/nodes/question-classifier/panel.tsx b/web/app/components/workflow/nodes/question-classifier/panel.tsx index 59c40c8f5a..dfd7f19908 100644 --- a/web/app/components/workflow/nodes/question-classifier/panel.tsx +++ b/web/app/components/workflow/nodes/question-classifier/panel.tsx @@ -2,6 +2,7 @@ import type { FC } from 'react' import React from 'react' import { useTranslation } from 'react-i18next' import VarReferencePicker from '../_base/components/variable/var-reference-picker' +import ConfigVision from '../_base/components/config-vision' import useConfig from './use-config' import ClassList from './components/class-list' import AdvancedSetting from './components/advanced-setting' @@ -39,6 +40,9 @@ const Panel: FC> = ({ varInputs, setInputVarValues, handleMemoryChange, + isVisionModel, + handleVisionResolutionChange, + handleVisionResolutionEnabledChange, isShowSingleRun, hideSingleRun, runningStatus, @@ -53,18 +57,6 @@ const Panel: FC> = ({ return (
- - - @@ -83,6 +75,28 @@ const Panel: FC> = ({ readonly={readOnly} /> + + + + + diff --git a/web/app/components/workflow/nodes/question-classifier/types.ts b/web/app/components/workflow/nodes/question-classifier/types.ts index 08d9135586..ddc16b4501 100644 --- a/web/app/components/workflow/nodes/question-classifier/types.ts +++ b/web/app/components/workflow/nodes/question-classifier/types.ts @@ -1,4 +1,4 @@ -import type { CommonNodeType, Memory, ModelConfig, ValueSelector } from '@/app/components/workflow/types' +import type { CommonNodeType, Memory, ModelConfig, ValueSelector, VisionSetting } from '@/app/components/workflow/types' export type Topic = { id: string @@ -11,4 +11,8 @@ export type QuestionClassifierNodeType = CommonNodeType & { classes: Topic[] instruction: string memory?: Memory + vision: { + enabled: boolean + configs?: VisionSetting + } } diff --git a/web/app/components/workflow/nodes/question-classifier/use-config.ts b/web/app/components/workflow/nodes/question-classifier/use-config.ts index 883ce85f43..b5f3c3accd 100644 --- a/web/app/components/workflow/nodes/question-classifier/use-config.ts +++ b/web/app/components/workflow/nodes/question-classifier/use-config.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useRef } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import produce from 'immer' import { BlockEnum, VarType } from '../../types' import type { Memory, ValueSelector, Var } from '../../types' @@ -8,6 +8,7 @@ import { } from '../../hooks' import { useStore } from '../../store' import useAvailableVarList from '../_base/hooks/use-available-var-list' +import useConfigVision from '../../hooks/use-config-vision' import type { QuestionClassifierNodeType } from './types' import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run' @@ -28,7 +29,7 @@ const useConfig = (id: string, payload: QuestionClassifierNodeType) => { inputRef.current = inputs }, [inputs]) - // model + const [modelChanged, setModelChanged] = useState(false) const { currentProvider, currentModel, @@ -38,6 +39,21 @@ const useConfig = (id: string, payload: QuestionClassifierNodeType) => { const modelMode = inputs.model?.mode const isChatModel = modelMode === 'chat' + const { + isVisionModel, + handleVisionResolutionEnabledChange, + handleVisionResolutionChange, + handleModelChanged: handleVisionConfigAfterModelChanged, + } = useConfigVision(model, { + payload: inputs.vision, + onChange: (newPayload) => { + const newInputs = produce(inputs, (draft) => { + draft.vision = newPayload + }) + setInputs(newInputs) + }, + }) + const handleModelChanged = useCallback((model: { provider: string; modelId: string; mode?: string }) => { const newInputs = produce(inputRef.current, (draft) => { draft.model.provider = model.provider @@ -45,6 +61,7 @@ const useConfig = (id: string, payload: QuestionClassifierNodeType) => { draft.model.mode = model.mode! }) setInputs(newInputs) + setModelChanged(true) }, [setInputs]) useEffect(() => { @@ -64,6 +81,15 @@ const useConfig = (id: string, payload: QuestionClassifierNodeType) => { setInputs(newInputs) }, [inputs, setInputs]) + // change to vision model to set vision enabled, else disabled + useEffect(() => { + if (!modelChanged) + return + setModelChanged(false) + handleVisionConfigAfterModelChanged() + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isVisionModel, modelChanged]) + const handleQueryVarChange = useCallback((newVar: ValueSelector | string) => { const newInputs = produce(inputs, (draft) => { draft.query_variable_selector = newVar as ValueSelector @@ -191,6 +217,9 @@ const useConfig = (id: string, payload: QuestionClassifierNodeType) => { inputVarValues, setInputVarValues, handleMemoryChange, + isVisionModel, + handleVisionResolutionEnabledChange, + handleVisionResolutionChange, isShowSingleRun, hideSingleRun, runningStatus,