'use client' import type { FC } from 'react' import type { Node } from 'reactflow' import type { Tool } from '@/app/components/tools/types' import type { ToolValue } from '@/app/components/workflow/block-selector/types' import type { NodeOutPutVar, ToolWithProvider } from '@/app/components/workflow/types' import * as React from 'react' import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import Divider from '@/app/components/base/divider' import TabSlider from '@/app/components/base/tab-slider-plain' import ReasoningConfigForm from '@/app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form' import { getPlainValue, getStructureValue, toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema' import ToolForm from '@/app/components/workflow/nodes/tool/components/tool-form' type ToolSettingsSectionProps = { currentProvider?: ToolWithProvider currentTool?: Tool value?: ToolValue nodeId?: string nodeOutputVars?: NodeOutPutVar[] availableNodes?: Node[] onChange?: (value: ToolValue) => void } const ToolSettingsSection: FC = ({ currentProvider, currentTool, value, nodeId, nodeOutputVars = [], availableNodes = [], onChange, }) => { const { t } = useTranslation() const [currType, setCurrType] = useState<'settings' | 'params'>('settings') const safeNodeId = nodeId ?? '' const currentToolSettings = useMemo(() => { if (!currentTool) return [] return currentTool.parameters?.filter(param => param.form !== 'llm') || [] }, [currentTool]) const currentToolParams = useMemo(() => { if (!currentTool) return [] return currentTool.parameters?.filter(param => param.form === 'llm') || [] }, [currentTool]) const settingsFormSchemas = useMemo(() => toolParametersToFormSchemas(currentToolSettings), [currentToolSettings]) const paramsFormSchemas = useMemo(() => toolParametersToFormSchemas(currentToolParams), [currentToolParams]) const allowReasoning = !!safeNodeId const showTabSlider = allowReasoning && currentToolSettings.length > 0 && currentToolParams.length > 0 const userSettingsOnly = currentToolSettings.length > 0 && (!allowReasoning || !currentToolParams.length) const reasoningConfigOnly = allowReasoning && currentToolParams.length > 0 && currentToolSettings.length === 0 const handleSettingsFormChange = (v: Record) => { if (!value || !onChange) return const newValue = getStructureValue(v) onChange({ ...value, settings: newValue, }) } const handleParamsFormChange = (v: Record) => { if (!value || !onChange) return onChange({ ...value, parameters: v, }) } if (!currentProvider?.is_team_authorization) return null if (!currentToolSettings.length && !currentToolParams.length) return null return ( <> {/* tabs */} {showTabSlider && ( { setCurrType(value as 'settings' | 'params') }} options={[ { value: 'settings', text: t('detailPanel.toolSelector.settings', { ns: 'plugin' })! }, { value: 'params', text: t('detailPanel.toolSelector.params', { ns: 'plugin' })! }, ]} /> )} {showTabSlider && currType === 'params' && (
{t('detailPanel.toolSelector.paramsTip1', { ns: 'plugin' })}
{t('detailPanel.toolSelector.paramsTip2', { ns: 'plugin' })}
)} {/* user settings only */} {userSettingsOnly && (
{t('detailPanel.toolSelector.settings', { ns: 'plugin' })}
)} {/* reasoning config only */} {reasoningConfigOnly && (
{t('detailPanel.toolSelector.params', { ns: 'plugin' })}
{t('detailPanel.toolSelector.paramsTip1', { ns: 'plugin' })}
{t('detailPanel.toolSelector.paramsTip2', { ns: 'plugin' })}
)} {/* user settings form */} {(currType === 'settings' || userSettingsOnly) && (
)} {/* reasoning config form */} {allowReasoning && (currType === 'params' || reasoningConfigOnly) && ( )} ) } export default React.memo(ToolSettingsSection)