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