diff --git a/web/app/components/app/workflow-log/detail.tsx b/web/app/components/app/workflow-log/detail.tsx index dc3eb89a2a..bb5b268d5d 100644 --- a/web/app/components/app/workflow-log/detail.tsx +++ b/web/app/components/app/workflow-log/detail.tsx @@ -3,6 +3,7 @@ import type { FC } from 'react' import { useTranslation } from 'react-i18next' import { RiCloseLine } from '@remixicon/react' import Run from '@/app/components/workflow/run' +import { useStore } from '@/app/components/app/store' type ILogDetail = { runID: string @@ -11,6 +12,7 @@ type ILogDetail = { const DetailPanel: FC = ({ runID, onClose }) => { const { t } = useTranslation() + const appDetail = useStore(state => state.appDetail) return (
@@ -18,7 +20,10 @@ const DetailPanel: FC = ({ runID, onClose }) => {

{t('appLog.runDetail.workflowTitle')}

- +
) } diff --git a/web/app/components/base/message-log-modal/index.tsx b/web/app/components/base/message-log-modal/index.tsx index d5ff8189e6..12746f5982 100644 --- a/web/app/components/base/message-log-modal/index.tsx +++ b/web/app/components/base/message-log-modal/index.tsx @@ -6,6 +6,7 @@ import { RiCloseLine } from '@remixicon/react' import cn from '@/utils/classnames' import type { IChatItem } from '@/app/components/base/chat/chat/type' import Run from '@/app/components/workflow/run' +import { useStore } from '@/app/components/app/store' type MessageLogModalProps = { currentLogItem?: IChatItem @@ -24,6 +25,7 @@ const MessageLogModal: FC = ({ const { t } = useTranslation() const ref = useRef(null) const [mounted, setMounted] = useState(false) + const appDetail = useStore(state => state.appDetail) useClickAway(() => { if (mounted) @@ -62,7 +64,8 @@ const MessageLogModal: FC = ({ ) diff --git a/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx b/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx index 9b02b99636..53de99609e 100644 --- a/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx +++ b/web/app/components/rag-pipeline/components/rag-pipeline-main.tsx @@ -6,6 +6,7 @@ import type { WorkflowProps } from '@/app/components/workflow' import RagPipelineChildren from './rag-pipeline-children' import { useAvailableNodesMetaData, + useGetRunAndTraceUrl, useNodesSyncDraft, usePipelineRefreshDraft, usePipelineRun, @@ -35,6 +36,7 @@ const RagPipelineMain = ({ handleWorkflowStartRunInWorkflow, } = usePipelineStartRun() const availableNodesMetaData = useAvailableNodesMetaData() + const { getWorkflowRunAndTraceUrl } = useGetRunAndTraceUrl() const hooksStore = useMemo(() => { return { @@ -49,6 +51,7 @@ const RagPipelineMain = ({ handleStopRun, handleStartWorkflowRun, handleWorkflowStartRunInWorkflow, + getWorkflowRunAndTraceUrl, } }, [ availableNodesMetaData, @@ -62,6 +65,7 @@ const RagPipelineMain = ({ handleStopRun, handleStartWorkflowRun, handleWorkflowStartRunInWorkflow, + getWorkflowRunAndTraceUrl, ]) return ( diff --git a/web/app/components/rag-pipeline/hooks/index.ts b/web/app/components/rag-pipeline/hooks/index.ts index 011424bd6c..216a6d51cb 100644 --- a/web/app/components/rag-pipeline/hooks/index.ts +++ b/web/app/components/rag-pipeline/hooks/index.ts @@ -4,3 +4,4 @@ export * from './use-nodes-sync-draft' export * from './use-pipeline-run' export * from './use-pipeline-start-run' export * from './use-pipeline-init' +export * from './use-get-run-and-trace-url' diff --git a/web/app/components/rag-pipeline/hooks/use-get-run-and-trace-url.tsx b/web/app/components/rag-pipeline/hooks/use-get-run-and-trace-url.tsx new file mode 100644 index 0000000000..f9988b60f8 --- /dev/null +++ b/web/app/components/rag-pipeline/hooks/use-get-run-and-trace-url.tsx @@ -0,0 +1,18 @@ +import { useCallback } from 'react' +import { useWorkflowStore } from '@/app/components/workflow/store' + +export const useGetRunAndTraceUrl = () => { + const workflowStore = useWorkflowStore() + const getWorkflowRunAndTraceUrl = useCallback((runId: string) => { + const { pipelineId } = workflowStore.getState() + + return { + runUrl: `/rag/pipelines/${pipelineId}/workflow-runs/${runId}`, + traceUrl: `/rag/pipelines/${pipelineId}/workflow-runs/${runId}/node-executions`, + } + }, [workflowStore]) + + return { + getWorkflowRunAndTraceUrl, + } +} diff --git a/web/app/components/workflow-app/components/workflow-main.tsx b/web/app/components/workflow-app/components/workflow-main.tsx index b748d3bc2f..50ae6ed35c 100644 --- a/web/app/components/workflow-app/components/workflow-main.tsx +++ b/web/app/components/workflow-app/components/workflow-main.tsx @@ -8,6 +8,7 @@ import type { WorkflowProps } from '@/app/components/workflow' import WorkflowChildren from './workflow-children' import { useAvailableNodesMetaData, + useGetRunAndTraceUrl, useNodesSyncDraft, useWorkflowRefreshDraft, useWorkflowRun, @@ -48,6 +49,7 @@ const WorkflowMain = ({ handleWorkflowStartRunInWorkflow, } = useWorkflowStartRun() const availableNodesMetaData = useAvailableNodesMetaData() + const { getWorkflowRunAndTraceUrl } = useGetRunAndTraceUrl() const hooksStore = useMemo(() => { return { @@ -63,6 +65,7 @@ const WorkflowMain = ({ handleWorkflowStartRunInChatflow, handleWorkflowStartRunInWorkflow, availableNodesMetaData, + getWorkflowRunAndTraceUrl, } }, [ syncWorkflowDraftWhenPageClose, @@ -77,6 +80,7 @@ const WorkflowMain = ({ handleWorkflowStartRunInChatflow, handleWorkflowStartRunInWorkflow, availableNodesMetaData, + getWorkflowRunAndTraceUrl, ]) return ( diff --git a/web/app/components/workflow-app/hooks/index.ts b/web/app/components/workflow-app/hooks/index.ts index 146a7e4490..3b4a587d8f 100644 --- a/web/app/components/workflow-app/hooks/index.ts +++ b/web/app/components/workflow-app/hooks/index.ts @@ -6,3 +6,4 @@ export * from './use-workflow-start-run' export * from './use-is-chat-mode' export * from './use-available-nodes-meta-data' export * from './use-workflow-refresh-draft' +export * from './use-get-run-and-trace-url' diff --git a/web/app/components/workflow-app/hooks/use-get-run-and-trace-url.tsx b/web/app/components/workflow-app/hooks/use-get-run-and-trace-url.tsx new file mode 100644 index 0000000000..28bcd017f8 --- /dev/null +++ b/web/app/components/workflow-app/hooks/use-get-run-and-trace-url.tsx @@ -0,0 +1,18 @@ +import { useCallback } from 'react' +import { useWorkflowStore } from '@/app/components/workflow/store' + +export const useGetRunAndTraceUrl = () => { + const workflowStore = useWorkflowStore() + const getWorkflowRunAndTraceUrl = useCallback((runId: string) => { + const { appId } = workflowStore.getState() + + return { + runUrl: `/apps/${appId}/workflow-runs/${runId}`, + traceUrl: `/apps/${appId}/workflow-runs/${runId}/node-executions`, + } + }, [workflowStore]) + + return { + getWorkflowRunAndTraceUrl, + } +} diff --git a/web/app/components/workflow/hooks-store/store.ts b/web/app/components/workflow/hooks-store/store.ts index 41a56290ab..cea8f3a248 100644 --- a/web/app/components/workflow/hooks-store/store.ts +++ b/web/app/components/workflow/hooks-store/store.ts @@ -36,6 +36,7 @@ export type CommonHooksFnMap = { handleWorkflowStartRunInWorkflow: () => void handleWorkflowStartRunInChatflow: () => void availableNodesMetaData?: AvailableNodesMetaData + getWorkflowRunAndTraceUrl: (runId?: string) => { runUrl: string; traceUrl: string } } export type Shape = { @@ -57,6 +58,10 @@ export const createHooksStore = ({ availableNodesMetaData = { nodes: [], }, + getWorkflowRunAndTraceUrl = () => ({ + runUrl: '', + traceUrl: '', + }), }: Partial) => { return createStore(set => ({ refreshAll: props => set(state => ({ ...state, ...props })), @@ -72,6 +77,7 @@ export const createHooksStore = ({ handleWorkflowStartRunInWorkflow, handleWorkflowStartRunInChatflow, availableNodesMetaData, + getWorkflowRunAndTraceUrl, })) } diff --git a/web/app/components/workflow/panel/record.tsx b/web/app/components/workflow/panel/record.tsx index 70fe9c44e0..2613872781 100644 --- a/web/app/components/workflow/panel/record.tsx +++ b/web/app/components/workflow/panel/record.tsx @@ -3,10 +3,12 @@ import type { WorkflowDataUpdater } from '../types' import Run from '../run' import { useStore } from '../store' import { useWorkflowUpdate } from '../hooks' +import { useHooksStore } from '../hooks-store' const Record = () => { const historyWorkflowData = useStore(s => s.historyWorkflowData) const { handleUpdateWorkflowCanvas } = useWorkflowUpdate() + const getWorkflowRunAndTraceUrl = useHooksStore(s => s.getWorkflowRunAndTraceUrl) const handleResultCallback = useCallback((res: any) => { const graph: WorkflowDataUpdater = res.graph @@ -23,7 +25,8 @@ const Record = () => { {`Test Run#${historyWorkflowData?.sequence_number}`} diff --git a/web/app/components/workflow/run/index.tsx b/web/app/components/workflow/run/index.tsx index 8b996032e2..b887448e1a 100644 --- a/web/app/components/workflow/run/index.tsx +++ b/web/app/components/workflow/run/index.tsx @@ -12,19 +12,24 @@ import Loading from '@/app/components/base/loading' import { fetchRunDetail, fetchTracingList } from '@/service/log' import type { NodeTracing } from '@/types/workflow' import type { WorkflowRunDetailResponse } from '@/models/log' -import { useStore as useAppStore } from '@/app/components/app/store' export type RunProps = { hideResult?: boolean activeTab?: 'RESULT' | 'DETAIL' | 'TRACING' - runID: string getResultCallback?: (result: WorkflowRunDetailResponse) => void + runDetailUrl: string + tracingListUrl: string } -const RunPanel: FC = ({ hideResult, activeTab = 'RESULT', runID, getResultCallback }) => { +const RunPanel: FC = ({ + hideResult, + activeTab = 'RESULT', + getResultCallback, + runDetailUrl, + tracingListUrl, +}) => { const { t } = useTranslation() const { notify } = useContext(ToastContext) const [currentTab, setCurrentTab] = useState(activeTab) - const appDetail = useAppStore(state => state.appDetail) const [loading, setLoading] = useState(true) const [runDetail, setRunDetail] = useState() const [list, setList] = useState([]) @@ -37,12 +42,9 @@ const RunPanel: FC = ({ hideResult, activeTab = 'RESULT', runID, getRe return 'N/A' }, [runDetail]) - const getResult = useCallback(async (appID: string, runID: string) => { + const getResult = useCallback(async () => { try { - const res = await fetchRunDetail({ - appID, - runID, - }) + const res = await fetchRunDetail(runDetailUrl) setRunDetail(res) if (getResultCallback) getResultCallback(res) @@ -53,12 +55,12 @@ const RunPanel: FC = ({ hideResult, activeTab = 'RESULT', runID, getRe message: `${err}`, }) } - }, [notify, getResultCallback]) + }, [notify, getResultCallback, runDetailUrl]) - const getTracingList = useCallback(async (appID: string, runID: string) => { + const getTracingList = useCallback(async () => { try { const { data: nodeList } = await fetchTracingList({ - url: `/apps/${appID}/workflow-runs/${runID}/node-executions`, + url: tracingListUrl, }) setList(nodeList) } @@ -68,27 +70,27 @@ const RunPanel: FC = ({ hideResult, activeTab = 'RESULT', runID, getRe message: `${err}`, }) } - }, [notify]) + }, [notify, tracingListUrl]) - const getData = async (appID: string, runID: string) => { + const getData = useCallback(async () => { setLoading(true) - await getResult(appID, runID) - await getTracingList(appID, runID) + await getResult() + await getTracingList() setLoading(false) - } + }, [getResult, getTracingList]) const switchTab = async (tab: string) => { setCurrentTab(tab) if (tab === 'RESULT') - appDetail?.id && await getResult(appDetail.id, runID) - appDetail?.id && await getTracingList(appDetail.id, runID) + runDetailUrl && await getResult() + tracingListUrl && await getTracingList() } useEffect(() => { // fetch data - if (appDetail && runID) - getData(appDetail.id, runID) - }, [appDetail, runID]) + if (runDetailUrl && tracingListUrl) + getData() + }, [getData, runDetailUrl, tracingListUrl]) const [height, setHeight] = useState(0) const ref = useRef(null) diff --git a/web/service/log.ts b/web/service/log.ts index 4bb4626b87..f54e93630f 100644 --- a/web/service/log.ts +++ b/web/service/log.ts @@ -67,8 +67,8 @@ export const fetchWorkflowLogs: Fetcher(url, { params }) } -export const fetchRunDetail = ({ appID, runID }: { appID: string; runID: string }) => { - return get(`/apps/${appID}/workflow-runs/${runID}`) +export const fetchRunDetail = (url: string) => { + return get(url) } export const fetchTracingList: Fetcher = ({ url }) => {