| import type { FC } from 'react' | |
| import React from 'react' | |
| import { useTranslation } from 'react-i18next' | |
| import MemoryConfig from '../_base/components/memory-config' | |
| import VarReferencePicker from '../_base/components/variable/var-reference-picker' | |
| import Editor from '../_base/components/prompt/editor' | |
| import ResultPanel from '../../run/result-panel' | |
| import ConfigVision from '../_base/components/config-vision' | |
| import useConfig from './use-config' | |
| import type { ParameterExtractorNodeType } from './types' | |
| import ExtractParameter from './components/extract-parameter/list' | |
| import ImportFromTool from './components/extract-parameter/import-from-tool' | |
| import AddExtractParameter from './components/extract-parameter/update' | |
| import ReasoningModePicker from './components/reasoning-mode-picker' | |
| import Field from '@/app/components/workflow/nodes/_base/components/field' | |
| import Split from '@/app/components/workflow/nodes/_base/components/split' | |
| import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal' | |
| import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars' | |
| import { InputVarType, type NodePanelProps } from '@/app/components/workflow/types' | |
| import Tooltip from '@/app/components/base/tooltip' | |
| import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form' | |
| import { VarType } from '@/app/components/workflow/types' | |
| const i18nPrefix = 'workflow.nodes.parameterExtractor' | |
| const i18nCommonPrefix = 'workflow.common' | |
| const Panel: FC<NodePanelProps<ParameterExtractorNodeType>> = ({ | |
| id, | |
| data, | |
| }) => { | |
| const { t } = useTranslation() | |
| const { | |
| readOnly, | |
| inputs, | |
| handleInputVarChange, | |
| filterVar, | |
| isChatModel, | |
| isChatMode, | |
| isCompletionModel, | |
| handleModelChanged, | |
| handleImportFromTool, | |
| handleCompletionParamsChange, | |
| addExtractParameter, | |
| handleExactParamsChange, | |
| handleInstructionChange, | |
| hasSetBlockStatus, | |
| handleMemoryChange, | |
| isSupportFunctionCall, | |
| handleReasoningModeChange, | |
| availableVars, | |
| availableNodesWithParent, | |
| inputVarValues, | |
| varInputs, | |
| isVisionModel, | |
| handleVisionResolutionChange, | |
| handleVisionResolutionEnabledChange, | |
| isShowSingleRun, | |
| hideSingleRun, | |
| runningStatus, | |
| handleRun, | |
| handleStop, | |
| runResult, | |
| setInputVarValues, | |
| } = useConfig(id, data) | |
| const model = inputs.model | |
| return ( | |
| <div className='mt-2'> | |
| <div className='px-4 pb-4 space-y-4'> | |
| <Field | |
| title={t(`${i18nCommonPrefix}.model`)} | |
| > | |
| <ModelParameterModal | |
| popupClassName='!w-[387px]' | |
| isInWorkflow | |
| isAdvancedMode={true} | |
| mode={model?.mode} | |
| provider={model?.provider} | |
| completionParams={model?.completion_params} | |
| modelId={model?.name} | |
| setModel={handleModelChanged} | |
| onCompletionParamsChange={handleCompletionParamsChange} | |
| hideDebugWithMultipleModel | |
| debugWithMultipleModel={false} | |
| readonly={readOnly} | |
| /> | |
| </Field> | |
| <Field | |
| title={t(`${i18nPrefix}.inputVar`)} | |
| > | |
| <> | |
| <VarReferencePicker | |
| readonly={readOnly} | |
| nodeId={id} | |
| isShowNodeName | |
| value={inputs.query || []} | |
| onChange={handleInputVarChange} | |
| filterVar={filterVar} | |
| /> | |
| </> | |
| </Field> | |
| <Split /> | |
| <ConfigVision | |
| nodeId={id} | |
| readOnly={readOnly} | |
| isVisionModel={isVisionModel} | |
| enabled={inputs.vision?.enabled} | |
| onEnabledChange={handleVisionResolutionEnabledChange} | |
| config={inputs.vision?.configs} | |
| onConfigChange={handleVisionResolutionChange} | |
| /> | |
| <Field | |
| title={t(`${i18nPrefix}.extractParameters`)} | |
| operations={ | |
| !readOnly | |
| ? ( | |
| <div className='flex items-center space-x-1'> | |
| {!readOnly && ( | |
| <ImportFromTool onImport={handleImportFromTool} /> | |
| )} | |
| {!readOnly && (<div className='w-px h-3 bg-gray-200'></div>)} | |
| <AddExtractParameter type='add' onSave={addExtractParameter} /> | |
| </div> | |
| ) | |
| : undefined | |
| } | |
| > | |
| <ExtractParameter | |
| readonly={readOnly} | |
| list={inputs.parameters || []} | |
| onChange={handleExactParamsChange} | |
| /> | |
| </Field> | |
| <Editor | |
| title={ | |
| <div className='flex items-center space-x-1'> | |
| <span className='uppercase'>{t(`${i18nPrefix}.instruction`)}</span> | |
| <Tooltip | |
| popupContent={ | |
| <div className='w-[120px]'> | |
| {t(`${i18nPrefix}.instructionTip`)} | |
| </div> | |
| } | |
| triggerClassName='w-3.5 h-3.5 ml-0.5' | |
| /> | |
| </div> | |
| } | |
| value={inputs.instruction} | |
| onChange={handleInstructionChange} | |
| readOnly={readOnly} | |
| isChatModel={isChatModel} | |
| isChatApp={isChatMode} | |
| isShowContext={false} | |
| hasSetBlockStatus={hasSetBlockStatus} | |
| nodesOutputVars={availableVars} | |
| availableNodes={availableNodesWithParent} | |
| /> | |
| <Field | |
| title={t(`${i18nPrefix}.advancedSetting`)} | |
| supportFold | |
| > | |
| <> | |
| {/* Memory */} | |
| {isChatMode && ( | |
| <div className='mt-4'> | |
| <MemoryConfig | |
| readonly={readOnly} | |
| config={{ data: inputs.memory }} | |
| onChange={handleMemoryChange} | |
| canSetRoleName={isCompletionModel} | |
| /> | |
| </div> | |
| )} | |
| {isSupportFunctionCall && ( | |
| <div className='mt-2'> | |
| <ReasoningModePicker | |
| type={inputs.reasoning_mode} | |
| onChange={handleReasoningModeChange} | |
| /> | |
| </div> | |
| )} | |
| </> | |
| </Field> | |
| </div> | |
| {inputs.parameters?.length > 0 && (<> | |
| <Split /> | |
| <div className='px-4 pt-4 pb-2'> | |
| <OutputVars> | |
| <> | |
| {inputs.parameters.map((param, index) => ( | |
| <VarItem | |
| key={index} | |
| name={param.name} | |
| type={param.type} | |
| description={param.description} | |
| /> | |
| ))} | |
| <VarItem | |
| name='__is_success' | |
| type={VarType.number} | |
| description={t(`${i18nPrefix}.isSuccess`)} | |
| /> | |
| <VarItem | |
| name='__reason' | |
| type={VarType.string} | |
| description={t(`${i18nPrefix}.errorReason`)} | |
| /> | |
| </> | |
| </OutputVars> | |
| </div> | |
| </>)} | |
| {isShowSingleRun && ( | |
| <BeforeRunForm | |
| nodeName={inputs.title} | |
| onHide={hideSingleRun} | |
| forms={[ | |
| { | |
| inputs: [{ | |
| label: t(`${i18nPrefix}.inputVar`)!, | |
| variable: 'query', | |
| type: InputVarType.paragraph, | |
| required: true, | |
| }, ...varInputs], | |
| values: inputVarValues, | |
| onChange: setInputVarValues, | |
| }, | |
| ]} | |
| runningStatus={runningStatus} | |
| onRun={handleRun} | |
| onStop={handleStop} | |
| result={<ResultPanel {...runResult} showSteps={false} />} | |
| /> | |
| )} | |
| </div> | |
| ) | |
| } | |
| export default React.memo(Panel) | |