chore: pause and stopped

pull/21369/head
Joel 11 months ago
parent 544b92810b
commit 87bbc3c9f8

@ -8,6 +8,7 @@ import {
useCallback, useCallback,
useEffect, useEffect,
useMemo, useMemo,
useState,
} from 'react' } from 'react'
import { import {
RiCloseLine, RiCloseLine,
@ -146,6 +147,19 @@ const BasePanel: FC<BasePanelProps> = ({
const isSupportSingleRun = canRunBySingle(data.type, isChildNode) const isSupportSingleRun = canRunBySingle(data.type, isChildNode)
const appDetail = useAppStore(state => state.appDetail) const appDetail = useAppStore(state => state.appDetail)
const [hasClickRunning, setHasClickRunning] = useState(false)
const [isPaused, setIsPaused] = useState(false)
useEffect(() => {
if(data._singleRunningStatus === NodeRunningStatus.Running) {
setHasClickRunning(true)
setIsPaused(false)
}
else if(data._singleRunningStatus === undefined) {
setIsPaused(true)
setHasClickRunning(false)
}
}, [data._singleRunningStatus])
const { const {
isShowSingleRun, isShowSingleRun,
hideSingleRun, hideSingleRun,
@ -170,8 +184,13 @@ const BasePanel: FC<BasePanelProps> = ({
id, id,
data, data,
defaultRunInputData: NODES_EXTRA_DATA[data.type]?.defaultRunInputData || {}, defaultRunInputData: NODES_EXTRA_DATA[data.type]?.defaultRunInputData || {},
isPaused,
}) })
useEffect(() => {
setIsPaused(false)
}, [tabType])
const logParams = useLogs() const logParams = useLogs()
const passedLogParams = (() => { const passedLogParams = (() => {
if ([BlockEnum.Tool, BlockEnum.Agent, BlockEnum.Iteration, BlockEnum.Loop].includes(data.type)) if ([BlockEnum.Tool, BlockEnum.Agent, BlockEnum.Iteration, BlockEnum.Loop].includes(data.type))
@ -380,6 +399,7 @@ const BasePanel: FC<BasePanelProps> = ({
onSingleRunClicked={handleSingleRun} onSingleRunClicked={handleSingleRun}
nodeInfo={nodeInfo} nodeInfo={nodeInfo}
singleRunResult={runResult!} singleRunResult={runResult!}
isPaused={isPaused}
{...passedLogParams} {...passedLogParams}
/> />
)} )}

@ -18,6 +18,7 @@ type Props = {
runningStatus?: NodeRunningStatus runningStatus?: NodeRunningStatus
onSingleRunClicked: () => void onSingleRunClicked: () => void
singleRunResult?: NodeTracing singleRunResult?: NodeTracing
isPaused?: boolean
} & Partial<ResultPanelProps> } & Partial<ResultPanelProps>
const LastRun: FC<Props> = ({ const LastRun: FC<Props> = ({
@ -29,6 +30,7 @@ const LastRun: FC<Props> = ({
runningStatus: oneStepRunRunningStatus, runningStatus: oneStepRunRunningStatus,
onSingleRunClicked, onSingleRunClicked,
singleRunResult, singleRunResult,
isPaused,
...otherResultPanelProps ...otherResultPanelProps
}) => { }) => {
const isOneStepRunSucceed = oneStepRunRunningStatus === NodeRunningStatus.Succeeded const isOneStepRunSucceed = oneStepRunRunningStatus === NodeRunningStatus.Succeeded
@ -36,10 +38,13 @@ const LastRun: FC<Props> = ({
const canRunLastRun = !isRunAfterSingleRun || isOneStepRunSucceed || isOneStepRunFailed const canRunLastRun = !isRunAfterSingleRun || isOneStepRunSucceed || isOneStepRunFailed
const { data: lastRunResult, isFetching, error } = useLastRun(appId, nodeId, canRunLastRun) const { data: lastRunResult, isFetching, error } = useLastRun(appId, nodeId, canRunLastRun)
const isRunning = useMemo(() => { const isRunning = useMemo(() => {
if(isPaused)
return false
if(!isRunAfterSingleRun) if(!isRunAfterSingleRun)
return isFetching return isFetching
return [NodeRunningStatus.Running, NodeRunningStatus.NotStart].includes(oneStepRunRunningStatus!) return [NodeRunningStatus.Running, NodeRunningStatus.NotStart].includes(oneStepRunRunningStatus!)
}, [isFetching, isRunAfterSingleRun, oneStepRunRunningStatus]) }, [isFetching, isPaused, isRunAfterSingleRun, oneStepRunRunningStatus])
const noLastRun = (error as any)?.status === 404 const noLastRun = (error as any)?.status === 404
const runResult = (canRunLastRun ? lastRunResult : singleRunResult) || {} const runResult = (canRunLastRun ? lastRunResult : singleRunResult) || {}
@ -64,6 +69,7 @@ const LastRun: FC<Props> = ({
<ResultPanel <ResultPanel
{...runResult as any} {...runResult as any}
{...otherResultPanelProps} {...otherResultPanelProps}
status={isPaused ? NodeRunningStatus.Stopped : ((runResult as any).status || otherResultPanelProps.status)}
total_tokens={(runResult as any)?.execution_metadata?.total_tokens || otherResultPanelProps?.total_tokens} total_tokens={(runResult as any)?.execution_metadata?.total_tokens || otherResultPanelProps?.total_tokens}
created_by={(runResult as any)?.created_by_account?.created_by || otherResultPanelProps?.created_by} created_by={(runResult as any)?.created_by_account?.created_by || otherResultPanelProps?.created_by}
nodeInfo={nodeInfo} nodeInfo={nodeInfo}

@ -78,6 +78,7 @@ export type Params<T> = {
iteratorInputKey?: string iteratorInputKey?: string
loopInputKey?: string loopInputKey?: string
isRunAfterSingleRun: boolean isRunAfterSingleRun: boolean
isPaused: boolean
} }
const varTypeToInputVarType = (type: VarType, { const varTypeToInputVarType = (type: VarType, {
@ -111,6 +112,7 @@ const useOneStepRun = <T>({
iteratorInputKey, iteratorInputKey,
loopInputKey, loopInputKey,
isRunAfterSingleRun, isRunAfterSingleRun,
isPaused,
}: Params<T>) => { }: Params<T>) => {
const { t } = useTranslation() const { t } = useTranslation()
const { getBeforeNodesInSameBranch, getBeforeNodesInSameBranchIncludeParent } = useWorkflow() as any const { getBeforeNodesInSameBranch, getBeforeNodesInSameBranchIncludeParent } = useWorkflow() as any
@ -173,8 +175,14 @@ const useOneStepRun = <T>({
invalidateConversationVarValues, invalidateConversationVarValues,
} = useInspectVarsCrud() } = useInspectVarsCrud()
const runningStatus = data._singleRunningStatus || NodeRunningStatus.NotStart const runningStatus = data._singleRunningStatus || NodeRunningStatus.NotStart
const isPaused = !data._isSingleRun const isPausedRef = useRef(isPaused)
useEffect(() => {
isPausedRef.current = isPaused
}, [isPaused])
const setRunResult = useCallback(async (data: NodeRunResult | null) => { const setRunResult = useCallback(async (data: NodeRunResult | null) => {
const isPaused = isPausedRef.current
// The backend don't support pause the single run, so the frontend handle the pause state. // The backend don't support pause the single run, so the frontend handle the pause state.
if(isPaused) if(isPaused)
return return
@ -196,7 +204,7 @@ const useOneStepRun = <T>({
invalidateSysVarValues() invalidateSysVarValues()
invalidateConversationVarValues() // loop, iteration, variable assigner node can update the conversation variables, but to simple the logic(some nodes may also can update in the future), all nodes refresh. invalidateConversationVarValues() // loop, iteration, variable assigner node can update the conversation variables, but to simple the logic(some nodes may also can update in the future), all nodes refresh.
} }
}, [isPaused, isRunAfterSingleRun, runningStatus, appId, id, store, appendNodeInspectVars, invalidLastRun, isStartNode, invalidateSysVarValues, invalidateConversationVarValues]) }, [isRunAfterSingleRun, runningStatus, appId, id, store, appendNodeInspectVars, invalidLastRun, isStartNode, invalidateSysVarValues, invalidateConversationVarValues])
const { handleNodeDataUpdate }: { handleNodeDataUpdate: (data: any) => void } = useNodeDataUpdate() const { handleNodeDataUpdate }: { handleNodeDataUpdate: (data: any) => void } = useNodeDataUpdate()
const setNodeRunning = () => { const setNodeRunning = () => {
@ -303,6 +311,8 @@ const useOneStepRun = <T>({
{ {
onWorkflowStarted: noop, onWorkflowStarted: noop,
onWorkflowFinished: (params) => { onWorkflowFinished: (params) => {
if(isPausedRef.current)
return
handleNodeDataUpdate({ handleNodeDataUpdate({
id, id,
data: { data: {
@ -380,6 +390,8 @@ const useOneStepRun = <T>({
setIterationRunResult(newIterationRunResult) setIterationRunResult(newIterationRunResult)
}, },
onError: () => { onError: () => {
if(isPausedRef.current)
return
handleNodeDataUpdate({ handleNodeDataUpdate({
id, id,
data: { data: {
@ -402,6 +414,8 @@ const useOneStepRun = <T>({
{ {
onWorkflowStarted: noop, onWorkflowStarted: noop,
onWorkflowFinished: (params) => { onWorkflowFinished: (params) => {
if(isPausedRef.current)
return
handleNodeDataUpdate({ handleNodeDataUpdate({
id, id,
data: { data: {
@ -480,6 +494,8 @@ const useOneStepRun = <T>({
setLoopRunResult(newLoopRunResult) setLoopRunResult(newLoopRunResult)
}, },
onError: () => { onError: () => {
if(isPausedRef.current)
return
handleNodeDataUpdate({ handleNodeDataUpdate({
id, id,
data: { data: {
@ -500,6 +516,8 @@ const useOneStepRun = <T>({
hasError = true hasError = true
invalidLastRun() invalidLastRun()
if (!isIteration && !isLoop) { if (!isIteration && !isLoop) {
if(isPausedRef.current)
return
handleNodeDataUpdate({ handleNodeDataUpdate({
id, id,
data: { data: {
@ -512,7 +530,7 @@ const useOneStepRun = <T>({
} }
} }
finally { finally {
if (!isIteration && !isLoop && res) { if (!isPausedRef.current && !isIteration && !isLoop && res) {
setRunResult({ setRunResult({
...res, ...res,
total_tokens: res.execution_metadata?.total_tokens || 0, total_tokens: res.execution_metadata?.total_tokens || 0,
@ -520,7 +538,12 @@ const useOneStepRun = <T>({
}) })
} }
} }
if(isPausedRef.current)
return
if (!isIteration && !isLoop && !hasError) { if (!isIteration && !isLoop && !hasError) {
if(isPausedRef.current)
return
handleNodeDataUpdate({ handleNodeDataUpdate({
id, id,
data: { data: {

@ -329,6 +329,7 @@ export enum NodeRunningStatus {
Failed = 'failed', Failed = 'failed',
Exception = 'exception', Exception = 'exception',
Retry = 'retry', Retry = 'retry',
Stopped = 'stopped',
} }
export type OnNodeAdd = ( export type OnNodeAdd = (

Loading…
Cancel
Save