From 926f85ce4fb342750ceed6c80e6943a05d44eff7 Mon Sep 17 00:00:00 2001 From: JzoNg Date: Wed, 13 Nov 2024 16:43:43 +0800 Subject: [PATCH] tool selector trigger --- .../model-provider-page/model-modal/Form.tsx | 2 +- .../model-provider-page/model-modal/Input.tsx | 4 +- .../plugin-detail-panel/endpoint-modal.tsx | 9 +- .../components/tools/tool-selector/index.tsx | 111 ++++++++++++++++++ .../tools/tool-selector/tool-trigger.tsx | 45 +++++++ .../workflow/block-selector/tool-picker.tsx | 1 - .../block-selector/tool/action-item.tsx | 3 +- 7 files changed, 168 insertions(+), 7 deletions(-) create mode 100644 web/app/components/tools/tool-selector/index.tsx create mode 100644 web/app/components/tools/tool-selector/tool-trigger.tsx diff --git a/web/app/components/header/account-setting/model-provider-page/model-modal/Form.tsx b/web/app/components/header/account-setting/model-provider-page/model-modal/Form.tsx index 90d0688db0..b1788b89bc 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-modal/Form.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-modal/Form.tsx @@ -73,7 +73,7 @@ const Form: FC = ({ const newValue = { ...value[key], provider: model.provider, - name: model.modelId, + model: model.modelId, mode: model.mode, } onChange({ ...value, [key]: newValue }) diff --git a/web/app/components/header/account-setting/model-provider-page/model-modal/Input.tsx b/web/app/components/header/account-setting/model-provider-page/model-modal/Input.tsx index ee9d75becc..041b44a507 100644 --- a/web/app/components/header/account-setting/model-provider-page/model-modal/Input.tsx +++ b/web/app/components/header/account-setting/model-provider-page/model-modal/Input.tsx @@ -41,9 +41,9 @@ const Input: FC = ({ = ({ onSaved(tempCredential) } + const [mockTool, setTool] = useState() + return ( = ({ isEditMode={true} showOnVariableMap={{}} validating={false} - inputClassName='!bg-gray-50' + inputClassName='bg-components-input-bg-normal hover:bg-state-base-hover-alt' fieldMoreInfo={item => item.url ? ( = ({ ) : null} /> +
diff --git a/web/app/components/tools/tool-selector/index.tsx b/web/app/components/tools/tool-selector/index.tsx new file mode 100644 index 0000000000..af78695740 --- /dev/null +++ b/web/app/components/tools/tool-selector/index.tsx @@ -0,0 +1,111 @@ +'use client' +import type { FC } from 'react' +import React, { useMemo, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { + PortalToFollowElem, + PortalToFollowElemContent, + PortalToFollowElemTrigger, +} from '@/app/components/base/portal-to-follow-elem' +import ToolTrigger from '@/app/components/tools/tool-selector/tool-trigger' +import ToolPicker from '@/app/components/workflow/block-selector/tool-picker' + +import { useAllBuiltInTools, useAllCustomTools, useAllWorkflowTools } from '@/service/use-tools' +// import AddToolModal from '@/app/components/tools/add-tool-modal' +import type { ToolDefaultValue } from '@/app/components/workflow/block-selector/types' +import type { + OffsetOptions, + Placement, +} from '@floating-ui/react' + +type Props = { + value?: { + provider: string + tool_name: string + } + disabled: boolean + placement?: Placement + offset?: OffsetOptions + onSelect: (tool: { + provider: string + tool_name: string + }) => void + supportAddCustomTool?: boolean +} +const ToolSelector: FC = ({ + value, + disabled, + placement = 'bottom', + offset = 0, + onSelect, +}) => { + const { t } = useTranslation() + const [isShow, onShowChange] = useState(false) + const handleTriggerClick = () => { + if (disabled) return + onShowChange(true) + } + const { data: buildInTools } = useAllBuiltInTools() + const { data: customTools } = useAllCustomTools() + const { data: workflowTools } = useAllWorkflowTools() + const currentProvider = useMemo(() => { + const mergedTools = [...(buildInTools || []), ...(customTools || []), ...(workflowTools || [])] + return mergedTools.find((toolWithProvider) => { + return toolWithProvider.id === value?.provider && toolWithProvider.tools.some(tool => tool.name === value?.tool_name) + }) + }, [value, buildInTools, customTools, workflowTools]) + const [isShowChooseTool, setIsShowChooseTool] = useState(false) + const [isShowSettingAuth, setShowSettingAuth] = useState(false) + + const handleToolAuthSetting = (value: any) => { + // const newModelConfig = produce(modelConfig, (draft) => { + // const tool = (draft.agentConfig.tools).find((item: any) => item.provider_id === value?.collection?.id && item.tool_name === value?.tool_name) + // if (tool) + // (tool as AgentTool).notAuthor = false + // }) + // setModelConfig(newModelConfig) + } + + const handleSelectTool = (tool: ToolDefaultValue) => { + const toolValue = { + provider: tool.provider_id, + tool_name: tool.tool_name, + } + onSelect(toolValue) + } + + return ( + <> + + + + + +
+
+
Tool
+ } + isShow={isShowChooseTool} + onShowChange={setIsShowChooseTool} + disabled={false} + supportAddCustomTool + onSelect={handleSelectTool} + /> +
+
+
+
+ + ) +} +export default React.memo(ToolSelector) diff --git a/web/app/components/tools/tool-selector/tool-trigger.tsx b/web/app/components/tools/tool-selector/tool-trigger.tsx new file mode 100644 index 0000000000..79efa4a06a --- /dev/null +++ b/web/app/components/tools/tool-selector/tool-trigger.tsx @@ -0,0 +1,45 @@ +'use client' +import React from 'react' +import { + RiArrowDownSLine, +} from '@remixicon/react' +import BlockIcon from '@/app/components/workflow/block-icon' +import { BlockEnum } from '@/app/components/workflow/types' +import type { ToolWithProvider } from '@/app/components/workflow/types' +import cn from '@/utils/classnames' + +type Props = { + open: boolean + provider?: ToolWithProvider + value?: { + provider: string + tool_name: string + } +} + +const ToolTrigger = ({ + open, + provider, + value, +}: Props) => { + return ( +
+ {value && provider && ( + + )} + {value && ( +
{value.tool_name}
+ )} + {!value && ( +
Select a tool ...
+ )} + +
+ ) +} + +export default ToolTrigger diff --git a/web/app/components/workflow/block-selector/tool-picker.tsx b/web/app/components/workflow/block-selector/tool-picker.tsx index 44f7c73e80..1990c6daca 100644 --- a/web/app/components/workflow/block-selector/tool-picker.tsx +++ b/web/app/components/workflow/block-selector/tool-picker.tsx @@ -106,7 +106,6 @@ const ToolPicker: FC = ({ - { }
void + onSelect: (type: BlockEnum, tool?: ToolDefaultValue & { is_team_authorization: boolean }) => void } const ToolItem: FC = ({ @@ -57,6 +57,7 @@ const ToolItem: FC = ({ tool_name: payload.name, tool_label: payload.label[language], title: payload.label[language], + is_team_authorization: provider.is_team_authorization, params, }) }}