feat: can choose all in agent node

This commit is contained in:
Joel
2025-05-09 18:21:59 +08:00
parent aaa5309ba0
commit 4ee5156afb
9 changed files with 81 additions and 13 deletions

View File

@ -66,6 +66,19 @@ const MultipleToolSelector = ({
setOpen(false)
}
const handleAddMultiple = (val: ToolValue[]) => {
const newValue = [...value, ...val]
// deduplication
const deduplication = newValue.reduce((acc, cur) => {
if (!acc.find(item => item.provider_name === cur.provider_name && item.tool_name === cur.tool_name))
acc.push(cur)
return acc
}, [] as ToolValue[])
// update value
onChange(deduplication)
setOpen(false)
}
// delete tool
const handleDelete = (index: number) => {
const newValue = [...value]
@ -134,6 +147,7 @@ const MultipleToolSelector = ({
value={undefined}
selectedTools={value}
onSelect={handleAdd}
onSelectMultiple={handleAddMultiple}
controlledState={open}
onControlledStateChange={setOpen}
trigger={
@ -156,6 +170,7 @@ const MultipleToolSelector = ({
value={item}
selectedTools={value}
onSelect={item => handleConfigure(item, index)}
onSelectMultiple={handleAddMultiple}
onDelete={() => handleDelete(index)}
supportEnableSwitch
/>

View File

@ -55,14 +55,8 @@ type Props = {
scope?: string
value?: ToolValue
selectedTools?: ToolValue[]
onSelect: (tool: {
provider_name: string
tool_name: string
tool_label: string
settings?: Record<string, any>
parameters?: Record<string, any>
extra?: Record<string, any>
}) => void
onSelect: (tool: ToolValue) => void
onSelectMultiple: (tool: ToolValue[]) => void
onDelete?: () => void
supportEnableSwitch?: boolean
supportAddCustomTool?: boolean
@ -82,6 +76,7 @@ const ToolSelector: FC<Props> = ({
placement = 'left',
offset = 4,
onSelect,
onSelectMultiple,
onDelete,
scope,
supportEnableSwitch,
@ -119,10 +114,10 @@ const ToolSelector: FC<Props> = ({
}, [value, buildInTools, customTools, workflowTools, mcpTools])
const [isShowChooseTool, setIsShowChooseTool] = useState(false)
const handleSelectTool = (tool: ToolDefaultValue) => {
const getToolValue = (tool: ToolDefaultValue) => {
const settingValues = generateFormValue(tool.params, toolParametersToFormSchemas(tool.paramSchemas.filter(param => param.form !== 'llm') as any))
const paramValues = generateFormValue(tool.params, toolParametersToFormSchemas(tool.paramSchemas.filter(param => param.form === 'llm') as any), true)
const toolValue = {
return {
provider_name: tool.provider_id,
type: tool.provider_type,
tool_name: tool.tool_name,
@ -136,9 +131,16 @@ const ToolSelector: FC<Props> = ({
},
schemas: tool.paramSchemas,
}
}
const handleSelectTool = (tool: ToolDefaultValue) => {
const toolValue = getToolValue(tool)
onSelect(toolValue)
// setIsShowChooseTool(false)
}
const handleSelectMultipleTool = (tool: ToolDefaultValue[]) => {
const toolValues = tool.map(item => getToolValue(item))
onSelectMultiple(toolValues)
}
const handleDescriptionChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
onSelect({
@ -300,6 +302,7 @@ const ToolSelector: FC<Props> = ({
disabled={false}
supportAddCustomTool
onSelect={handleSelectTool}
onSelectMultiple={handleSelectMultipleTool}
scope={scope}
selectedTools={selectedTools}
/>

View File

@ -5,10 +5,11 @@ import {
useState,
} from 'react'
import type {
BlockEnum,
OnSelectBlock,
ToolWithProvider,
} from '../types'
import type { ToolValue } from './types'
import type { ToolDefaultValue, ToolValue } from './types'
import { ToolTypeEnum } from './types'
import Tools from './tools'
import { useToolTabs } from './hooks'
@ -31,6 +32,7 @@ type AllToolsProps = {
workflowTools: ToolWithProvider[]
mcpTools: ToolWithProvider[]
onSelect: OnSelectBlock
onSelectMultiple: (type: BlockEnum, tools: ToolDefaultValue[]) => void
selectedTools?: ToolValue[]
}
@ -42,6 +44,7 @@ const AllTools = ({
searchText,
tags = DEFAULT_TAGS,
onSelect,
onSelectMultiple,
buildInTools,
workflowTools,
customTools,
@ -136,6 +139,7 @@ const AllTools = ({
showWorkflowEmpty={activeTab === ToolTypeEnum.Workflow}
tools={tools}
onSelect={onSelect}
onSelectMultiple={onSelectMultiple}
viewType={isSupportGroupView ? activeView : ViewType.flat}
hasSearchText={!!searchText}
selectedTools={selectedTools}

View File

@ -35,6 +35,7 @@ type Props = {
isShow: boolean
onShowChange: (isShow: boolean) => void
onSelect: (tool: ToolDefaultValue) => void
onSelectMultiple: (tools: ToolDefaultValue[]) => void
supportAddCustomTool?: boolean
scope?: string
selectedTools?: ToolValue[]
@ -48,6 +49,7 @@ const ToolPicker: FC<Props> = ({
isShow,
onShowChange,
onSelect,
onSelectMultiple,
supportAddCustomTool,
scope = 'all',
selectedTools,
@ -103,6 +105,10 @@ const ToolPicker: FC<Props> = ({
onSelect(tool!)
}
const handleSelectMultiple = (_type: BlockEnum, tools: ToolDefaultValue[]) => {
onSelectMultiple(tools)
}
const [isShowEditCollectionToolModal, {
setFalse: hideEditCustomCollectionModal,
setTrue: showEditCustomCollectionModal,
@ -164,6 +170,7 @@ const ToolPicker: FC<Props> = ({
tags={tags}
searchText={searchText}
onSelect={handleSelect}
onSelectMultiple={handleSelectMultiple}
buildInTools={builtinToolList || []}
customTools={customToolList || []}
workflowTools={workflowToolList || []}

View File

@ -13,6 +13,7 @@ type Props = {
isShowLetterIndex: boolean
hasSearchText: boolean
onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
onSelectMultiple: (type: BlockEnum, tools: ToolDefaultValue[]) => void
letters: string[]
toolRefs: any
selectedTools?: ToolValue[]
@ -24,6 +25,7 @@ const ToolViewFlatView: FC<Props> = ({
isShowLetterIndex,
hasSearchText,
onSelect,
onSelectMultiple,
toolRefs,
selectedTools,
}) => {
@ -53,6 +55,7 @@ const ToolViewFlatView: FC<Props> = ({
isShowLetterIndex={isShowLetterIndex}
hasSearchText={hasSearchText}
onSelect={onSelect}
onSelectMultiple={onSelectMultiple}
selectedTools={selectedTools}
/>
</div>

View File

@ -12,6 +12,7 @@ type Props = {
toolList: ToolWithProvider[]
hasSearchText: boolean
onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
onSelectMultiple: (type: BlockEnum, tools: ToolValue[]) => void
selectedTools?: ToolValue[]
}
@ -20,6 +21,7 @@ const Item: FC<Props> = ({
toolList,
hasSearchText,
onSelect,
onSelectMultiple,
selectedTools,
}) => {
return (
@ -36,6 +38,7 @@ const Item: FC<Props> = ({
isShowLetterIndex={false}
hasSearchText={hasSearchText}
onSelect={onSelect}
onSelectMultiple={onSelectMultiple}
selectedTools={selectedTools}
/>
))}

View File

@ -12,6 +12,7 @@ type Props = {
payload: Record<string, ToolWithProvider[]>
hasSearchText: boolean
onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
onSelectMultiple: (type: BlockEnum, tools: ToolValue[]) => void
selectedTools?: ToolValue[]
}
@ -19,6 +20,7 @@ const ToolListTreeView: FC<Props> = ({
payload,
hasSearchText,
onSelect,
onSelectMultiple,
selectedTools,
}) => {
const { t } = useTranslation()
@ -46,6 +48,7 @@ const ToolListTreeView: FC<Props> = ({
toolList={payload[groupName]}
hasSearchText={hasSearchText}
onSelect={onSelect}
onSelectMultiple={onSelectMultiple}
selectedTools={selectedTools}
/>
))}

View File

@ -22,6 +22,7 @@ type Props = {
isShowLetterIndex: boolean
hasSearchText: boolean
onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
onSelectMultiple: (type: BlockEnum, tools: ToolDefaultValue[]) => void
selectedTools?: ToolValue[]
}
@ -32,6 +33,7 @@ const Tool: FC<Props> = ({
isShowLetterIndex,
hasSearchText,
onSelect,
onSelectMultiple,
selectedTools,
}) => {
const { t } = useTranslation()
@ -44,7 +46,7 @@ const Tool: FC<Props> = ({
const isHovering = useHover(ref)
const getIsDisabled = (tool: ToolType) => {
if (!selectedTools || !selectedTools.length) return false
return selectedTools.some(selectedTool => selectedTool.provider_name === payload.name && selectedTool.tool_name === tool.name)
return selectedTools.some(selectedTool => (selectedTool.provider_name === payload.name || selectedTool.provider_name === payload.id) && selectedTool.tool_name === tool.name)
}
const totalToolsNum = actions.length
@ -54,7 +56,31 @@ const Tool: FC<Props> = ({
const selectedInfo = useMemo(() => {
if (isHovering && !isAllSelected) {
return (
<span className='system-xs-regular text-components-button-secondary-accent-text'>
<span className='system-xs-regular text-components-button-secondary-accent-text'
onClick={(e) => {
onSelectMultiple(BlockEnum.Tool, actions.filter(action => !getIsDisabled(action)).map((tool) => {
const params: Record<string, string> = {}
if (tool.parameters) {
tool.parameters.forEach((item) => {
params[item.name] = ''
})
}
return {
provider_id: payload.id,
provider_type: payload.type,
provider_name: payload.name,
tool_name: tool.name,
tool_label: tool.label[language],
tool_description: tool.description[language],
title: tool.label[language],
is_team_authorization: payload.is_team_authorization,
output_schema: tool.output_schema,
paramSchemas: tool.parameters,
params,
}
}))
}}
>
{t('workflow.tabs.addAll')}
</span>
)

View File

@ -17,6 +17,7 @@ import classNames from '@/utils/classnames'
type ToolsProps = {
showWorkflowEmpty: boolean
onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
onSelectMultiple: (type: BlockEnum, tools: ToolDefaultValue[]) => void
tools: ToolWithProvider[]
viewType: ViewType
hasSearchText: boolean
@ -27,6 +28,7 @@ type ToolsProps = {
const Blocks = ({
showWorkflowEmpty,
onSelect,
onSelectMultiple,
tools,
viewType,
hasSearchText,
@ -107,6 +109,7 @@ const Blocks = ({
isShowLetterIndex={isShowLetterIndex}
hasSearchText={hasSearchText}
onSelect={onSelect}
onSelectMultiple={onSelectMultiple}
selectedTools={selectedTools}
/>
) : (
@ -114,6 +117,7 @@ const Blocks = ({
payload={treeViewToolsData}
hasSearchText={hasSearchText}
onSelect={onSelect}
onSelectMultiple={onSelectMultiple}
selectedTools={selectedTools}
/>
)