diff --git a/web/src/pages/agent/canvas/node/begin-node.tsx b/web/src/pages/agent/canvas/node/begin-node.tsx index 053ef925a..00eb41513 100644 --- a/web/src/pages/agent/canvas/node/begin-node.tsx +++ b/web/src/pages/agent/canvas/node/begin-node.tsx @@ -1,16 +1,18 @@ -import { IBeginNode } from '@/interfaces/database/flow'; +import { BaseNode } from '@/interfaces/database/flow'; import { cn } from '@/lib/utils'; import { NodeProps, Position } from '@xyflow/react'; import get from 'lodash/get'; import { memo } from 'react'; import { useTranslation } from 'react-i18next'; import { + AgentDialogueMode, BeginQueryType, BeginQueryTypeIconMap, NodeHandleId, Operator, } from '../../constant'; -import { BeginQuery } from '../../interface'; +import { BeginFormSchemaType } from '../../form/begin-form/schema'; +import { useBuildWebhookUrl } from '../../hooks/use-build-webhook-url'; import OperatorIcon from '../../operator-icon'; import { LabelCard } from './card'; import { CommonHandle } from './handle'; @@ -18,10 +20,19 @@ import { RightHandleStyle } from './handle-icon'; import styles from './index.less'; import { NodeWrapper } from './node-wrapper'; -// TODO: do not allow other nodes to connect to this node -function InnerBeginNode({ data, id, selected }: NodeProps) { +function InnerBeginNode({ + data, + id, + selected, +}: NodeProps>) { const { t } = useTranslation(); - const inputs: Record = get(data, 'form.inputs', {}); + const inputs = get(data, 'form.inputs', {}); + + const mode = data.form?.mode; + + const isWebhookMode = mode === AgentDialogueMode.Webhook; + + const url = useBuildWebhookUrl(); return ( @@ -40,23 +51,38 @@ function InnerBeginNode({ data, id, selected }: NodeProps) { {t(`flow.begin`)} -
- {Object.entries(inputs).map(([key, val], idx) => { - const Icon = BeginQueryTypeIconMap[val.type as BeginQueryType]; - return ( - - - - - {val.name} +
+ {t(`flow.${isWebhookMode ? 'webhook.name' : mode}`)} +
+ {isWebhookMode ? ( + + URL + {url} + + ) : ( +
+ {Object.entries(inputs).map(([key, val], idx) => { + const Icon = BeginQueryTypeIconMap[val.type as BeginQueryType]; + return ( + + + + + {val.name} + + {val.optional ? 'Yes' : 'No'} - {val.optional ? 'Yes' : 'No'} - - ); - })} -
+ ); + })} +
+ )}
); } diff --git a/web/src/pages/agent/form/begin-form/webhook/index.tsx b/web/src/pages/agent/form/begin-form/webhook/index.tsx index 5f1509b65..36c0f9404 100644 --- a/web/src/pages/agent/form/begin-form/webhook/index.tsx +++ b/web/src/pages/agent/form/begin-form/webhook/index.tsx @@ -3,13 +3,16 @@ import { CopyToClipboardWithText } from '@/components/copy-to-clipboard'; import NumberInput from '@/components/originui/number-input'; import { SelectWithSearch } from '@/components/originui/select-with-search'; import { RAGFlowFormItem } from '@/components/ragflow-form'; +import { Label } from '@/components/ui/label'; import { MultiSelect } from '@/components/ui/multi-select'; +import { Separator } from '@/components/ui/separator'; import { Textarea } from '@/components/ui/textarea'; +import { useBuildWebhookUrl } from '@/pages/agent/hooks/use-build-webhook-url'; import { buildOptions } from '@/utils/form'; +import { upperFirst } from 'lodash'; import { useCallback } from 'react'; import { useFormContext, useWatch } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; -import { useParams } from 'umi'; import { RateLimitPerList, WebhookMaxBodySize, @@ -22,7 +25,10 @@ import { Auth } from './auth'; import { WebhookRequestSchema } from './request-schema'; import { WebhookResponse } from './response'; -const RateLimitPerOptions = buildOptions(RateLimitPerList); +const RateLimitPerOptions = RateLimitPerList.map((x) => ({ + value: x, + label: upperFirst(x), +})); const RequestLimitMap = { [WebhookRateLimitPer.Second]: 100, @@ -33,7 +39,6 @@ const RequestLimitMap = { export function WebHook() { const { t } = useTranslation(); - const { id } = useParams(); const form = useFormContext(); const rateLimitPer = useWatch({ @@ -45,7 +50,7 @@ export function WebHook() { return RequestLimitMap[rateLimitPer as keyof typeof RequestLimitMap] ?? 100; }, []); - const text = `${location.protocol}//${location.host}/api/v1/webhook/${id}`; + const text = useBuildWebhookUrl(); return ( <> @@ -74,33 +79,36 @@ export function WebHook() { > - - - - - {(field) => ( - { - field.onChange(val); - form.setValue( - 'security.rate_limit.limit', - getLimitRateLimitPerMax(val), - ); - }} - > - )} - +
+ +
+ + + + + + {(field) => ( + { + field.onChange(val); + form.setValue( + 'security.rate_limit.limit', + getLimitRateLimitPerMax(val), + ); + }} + > + )} + +
+