diff --git a/web/app/components/workflow/run/agent-log/agent-log-trigger.tsx b/web/app/components/workflow/run/agent-log/agent-log-trigger.tsx new file mode 100644 index 0000000000..941d5676d1 --- /dev/null +++ b/web/app/components/workflow/run/agent-log/agent-log-trigger.tsx @@ -0,0 +1,29 @@ +import { RiArrowRightLine } from '@remixicon/react' + +type AgentLogTriggerProps = { + onDetail?: () => void +} +const AgentLogTrigger = ({ + onDetail, +}: AgentLogTriggerProps) => { + return ( +
+
+ Agent strategy +
+
+
+
+
+ Detail + +
+
+
+ ) +} + +export default AgentLogTrigger diff --git a/web/app/components/workflow/run/agent-log/agent-result-panel.tsx b/web/app/components/workflow/run/agent-log/agent-result-panel.tsx new file mode 100644 index 0000000000..53eef73b3c --- /dev/null +++ b/web/app/components/workflow/run/agent-log/agent-result-panel.tsx @@ -0,0 +1,43 @@ +import Button from '@/app/components/base/button' +import { RiArrowLeftLine } from '@remixicon/react' +import TracingPanel from '../tracing-panel' + +type AgentResultPanelProps = { + onBack: () => void +} +const AgentResultPanel = ({ + onBack, +}: AgentResultPanelProps) => { + return ( +
+
+ +
/
+
+ Agent strategy +
+ +
+ +
+ ) +} + +export default AgentResultPanel diff --git a/web/app/components/workflow/run/agent-log/tool-call-result-panel.tsx b/web/app/components/workflow/run/agent-log/tool-call-result-panel.tsx new file mode 100644 index 0000000000..f10e314770 --- /dev/null +++ b/web/app/components/workflow/run/agent-log/tool-call-result-panel.tsx @@ -0,0 +1,45 @@ +import Button from '@/app/components/base/button' +import { RiArrowLeftLine } from '@remixicon/react' +import TracingPanel from '../tracing-panel' + +type ToolCallResultPanelProps = { + onBack: () => void + onClose: () => void +} +const ToolCallResultPanel = ({ + onBack, + onClose, +}: ToolCallResultPanelProps) => { + return ( +
+
+ +
/
+
+ 10 Logs +
+ +
+ +
+ ) +} + +export default ToolCallResultPanel diff --git a/web/app/components/workflow/run/hooks.ts b/web/app/components/workflow/run/hooks.ts new file mode 100644 index 0000000000..07534b911d --- /dev/null +++ b/web/app/components/workflow/run/hooks.ts @@ -0,0 +1,48 @@ +import { + useCallback, + useState, +} from 'react' +import { useBoolean } from 'ahooks' +import type { IterationDurationMap, NodeTracing } from '@/types/workflow' + +export const useLogs = () => { + const [showRetryDetail, { + setTrue: setShowRetryDetailTrue, + setFalse: setShowRetryDetailFalse, + }] = useBoolean(false) + const [retryResultList, setRetryResultList] = useState([]) + const handleShowRetryResultList = useCallback((detail: NodeTracing[]) => { + setShowRetryDetailTrue() + setRetryResultList(detail) + }, [setShowRetryDetailTrue, setRetryResultList]) + + const [showIteratingDetail, { + setTrue: setShowIteratingDetailTrue, + setFalse: setShowIteratingDetailFalse, + }] = useBoolean(false) + const [iterationResultList, setIterationResultList] = useState([]) + const [iterationResultDurationMap, setIterationResultDurationMap] = useState({}) + const handleShowIterationResultList = useCallback((detail: NodeTracing[][], iterDurationMap: IterationDurationMap) => { + setShowIteratingDetailTrue() + setIterationResultList(detail) + setIterationResultDurationMap(iterDurationMap) + }, [setShowIteratingDetailTrue, setIterationResultList, setIterationResultDurationMap]) + + return { + showSpecialResultPanel: !showRetryDetail && !showIteratingDetail, + showRetryDetail, + setShowRetryDetailTrue, + setShowRetryDetailFalse, + retryResultList, + setRetryResultList, + handleShowRetryResultList, + showIteratingDetail, + setShowIteratingDetailTrue, + setShowIteratingDetailFalse, + iterationResultList, + setIterationResultList, + iterationResultDurationMap, + setIterationResultDurationMap, + handleShowIterationResultList, + } +} diff --git a/web/app/components/workflow/run/index.tsx b/web/app/components/workflow/run/index.tsx index 5bfcf56dad..f81c2defe7 100644 --- a/web/app/components/workflow/run/index.tsx +++ b/web/app/components/workflow/run/index.tsx @@ -3,17 +3,16 @@ import type { FC } from 'react' import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useContext } from 'use-context-selector' import { useTranslation } from 'react-i18next' -import { useBoolean } from 'ahooks' import OutputPanel from './output-panel' import ResultPanel from './result-panel' import TracingPanel from './tracing-panel' -import IterationResultPanel from './iteration-result-panel' -import RetryResultPanel from './retry-result-panel' +import SpecialResultPanel from './special-result-panel' +import { useLogs } from './hooks' import cn from '@/utils/classnames' import { ToastContext } from '@/app/components/base/toast' import Loading from '@/app/components/base/loading' import { fetchRunDetail, fetchTracingList } from '@/service/log' -import type { IterationDurationMap, NodeTracing } from '@/types/workflow' +import type { NodeTracing } from '@/types/workflow' import type { WorkflowRunDetailResponse } from '@/models/log' import { useStore as useAppStore } from '@/app/components/app/store' import formatNodeList from './utils/format-log' @@ -106,41 +105,18 @@ const RunPanel: FC = ({ hideResult, activeTab = 'RESULT', runID, getRe adjustResultHeight() }, [loading]) - const [iterationRunResult, setIterationRunResult] = useState([]) - const [iterDurationMap, setIterDurationMap] = useState({}) - const [retryRunResult, setRetryRunResult] = useState([]) - const [isShowIterationDetail, { - setTrue: doShowIterationDetail, - setFalse: doHideIterationDetail, - }] = useBoolean(false) - const [isShowRetryDetail, { - setTrue: doShowRetryDetail, - setFalse: doHideRetryDetail, - }] = useBoolean(false) - - const handleShowIterationDetail = useCallback((detail: NodeTracing[][], iterDurationMap: IterationDurationMap) => { - setIterationRunResult(detail) - doShowIterationDetail() - setIterDurationMap(iterDurationMap) - }, [doShowIterationDetail, setIterationRunResult, setIterDurationMap]) - - const handleShowRetryDetail = useCallback((detail: NodeTracing[]) => { - setRetryRunResult(detail) - doShowRetryDetail() - }, [doShowRetryDetail, setRetryRunResult]) - - if (isShowIterationDetail) { - return ( -
- -
- ) - } + const { + showRetryDetail, + setShowRetryDetailFalse, + retryResultList, + handleShowRetryResultList, + showIteratingDetail, + setShowIteratingDetailFalse, + iterationResultList, + iterationResultDurationMap, + handleShowIterationResultList, + showSpecialResultPanel, + } = useLogs() return (
@@ -198,19 +174,25 @@ const RunPanel: FC = ({ hideResult, activeTab = 'RESULT', runID, getRe exceptionCounts={runDetail.exceptions_count} /> )} - {!loading && currentTab === 'TRACING' && !isShowRetryDetail && ( + {!loading && currentTab === 'TRACING' && !showSpecialResultPanel && ( )} { - !loading && currentTab === 'TRACING' && isShowRetryDetail && ( - ) } diff --git a/web/app/components/workflow/run/node.tsx b/web/app/components/workflow/run/node.tsx index 2081c61e60..25e3802107 100644 --- a/web/app/components/workflow/run/node.tsx +++ b/web/app/components/workflow/run/node.tsx @@ -187,10 +187,10 @@ const NodePanel: FC = ({ onClick={handleOnShowRetryDetail} >
- + {t('workflow.nodes.common.retry.retries', { num: nodeInfo.retryDetail?.length })}
- + )}
diff --git a/web/app/components/workflow/run/special-result-panel.tsx b/web/app/components/workflow/run/special-result-panel.tsx new file mode 100644 index 0000000000..c8918e897e --- /dev/null +++ b/web/app/components/workflow/run/special-result-panel.tsx @@ -0,0 +1,49 @@ +import RetryResultPanel from './retry-result-panel' +import IterationResultPanel from './iteration-result-panel' +import type { IterationDurationMap, NodeTracing } from '@/types/workflow' + +type SpecialResultPanelProps = { + showRetryDetail: boolean + setShowRetryDetailFalse: () => void + retryResultList: NodeTracing[] + + showIteratingDetail: boolean + setShowIteratingDetailFalse: () => void + iterationResultList: NodeTracing[][] + iterationResultDurationMap: IterationDurationMap +} +const SpecialResultPanel = ({ + showRetryDetail, + setShowRetryDetailFalse, + retryResultList, + + showIteratingDetail, + setShowIteratingDetailFalse, + iterationResultList, + iterationResultDurationMap, +}: SpecialResultPanelProps) => { + return ( + <> + { + showRetryDetail && ( + + ) + } + { + showIteratingDetail && ( + + ) + } + + ) +} + +export default SpecialResultPanel