feat: can choose all in agent node

pull/22091/head
Joel 1 year ago
parent aaa5309ba0
commit 4ee5156afb

@ -66,6 +66,19 @@ const MultipleToolSelector = ({
setOpen(false) 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 // delete tool
const handleDelete = (index: number) => { const handleDelete = (index: number) => {
const newValue = [...value] const newValue = [...value]
@ -134,6 +147,7 @@ const MultipleToolSelector = ({
value={undefined} value={undefined}
selectedTools={value} selectedTools={value}
onSelect={handleAdd} onSelect={handleAdd}
onSelectMultiple={handleAddMultiple}
controlledState={open} controlledState={open}
onControlledStateChange={setOpen} onControlledStateChange={setOpen}
trigger={ trigger={
@ -156,6 +170,7 @@ const MultipleToolSelector = ({
value={item} value={item}
selectedTools={value} selectedTools={value}
onSelect={item => handleConfigure(item, index)} onSelect={item => handleConfigure(item, index)}
onSelectMultiple={handleAddMultiple}
onDelete={() => handleDelete(index)} onDelete={() => handleDelete(index)}
supportEnableSwitch supportEnableSwitch
/> />

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

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

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

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

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

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

@ -22,6 +22,7 @@ type Props = {
isShowLetterIndex: boolean isShowLetterIndex: boolean
hasSearchText: boolean hasSearchText: boolean
onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
onSelectMultiple: (type: BlockEnum, tools: ToolDefaultValue[]) => void
selectedTools?: ToolValue[] selectedTools?: ToolValue[]
} }
@ -32,6 +33,7 @@ const Tool: FC<Props> = ({
isShowLetterIndex, isShowLetterIndex,
hasSearchText, hasSearchText,
onSelect, onSelect,
onSelectMultiple,
selectedTools, selectedTools,
}) => { }) => {
const { t } = useTranslation() const { t } = useTranslation()
@ -44,7 +46,7 @@ const Tool: FC<Props> = ({
const isHovering = useHover(ref) const isHovering = useHover(ref)
const getIsDisabled = (tool: ToolType) => { const getIsDisabled = (tool: ToolType) => {
if (!selectedTools || !selectedTools.length) return false 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 const totalToolsNum = actions.length
@ -54,7 +56,31 @@ const Tool: FC<Props> = ({
const selectedInfo = useMemo(() => { const selectedInfo = useMemo(() => {
if (isHovering && !isAllSelected) { if (isHovering && !isAllSelected) {
return ( 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')} {t('workflow.tabs.addAll')}
</span> </span>
) )

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

Loading…
Cancel
Save