Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

use-pipeline-run.ts 8.5KB

il y a 6 mois
il y a 3 mois
il y a 6 mois
il y a 3 mois
il y a 6 mois
il y a 5 mois
il y a 6 mois
il y a 3 mois
il y a 6 mois
il y a 6 mois
il y a 3 mois
il y a 6 mois
il y a 6 mois
il y a 6 mois
il y a 6 mois
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. import { useCallback } from 'react'
  2. import {
  3. useReactFlow,
  4. useStoreApi,
  5. } from 'reactflow'
  6. import produce from 'immer'
  7. import { useStore, useWorkflowStore } from '@/app/components/workflow/store'
  8. import { WorkflowRunningStatus } from '@/app/components/workflow/types'
  9. import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-interactions'
  10. import { useWorkflowRunEvent } from '@/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event'
  11. import type { IOtherOptions } from '@/service/base'
  12. import { ssePost } from '@/service/base'
  13. import { stopWorkflowRun } from '@/service/workflow'
  14. import type { VersionHistory } from '@/types/workflow'
  15. import { useNodesSyncDraft } from './use-nodes-sync-draft'
  16. import { useSetWorkflowVarsWithValue } from '@/app/components/workflow/hooks/use-fetch-workflow-inspect-vars'
  17. import { useInvalidAllLastRun } from '@/service/use-workflow'
  18. import { FlowType } from '@/types/common'
  19. export const usePipelineRun = () => {
  20. const store = useStoreApi()
  21. const workflowStore = useWorkflowStore()
  22. const reactflow = useReactFlow()
  23. const { doSyncWorkflowDraft } = useNodesSyncDraft()
  24. const { handleUpdateWorkflowCanvas } = useWorkflowUpdate()
  25. const {
  26. handleWorkflowStarted,
  27. handleWorkflowFinished,
  28. handleWorkflowFailed,
  29. handleWorkflowNodeStarted,
  30. handleWorkflowNodeFinished,
  31. handleWorkflowNodeIterationStarted,
  32. handleWorkflowNodeIterationNext,
  33. handleWorkflowNodeIterationFinished,
  34. handleWorkflowNodeLoopStarted,
  35. handleWorkflowNodeLoopNext,
  36. handleWorkflowNodeLoopFinished,
  37. handleWorkflowNodeRetry,
  38. handleWorkflowAgentLog,
  39. handleWorkflowTextChunk,
  40. handleWorkflowTextReplace,
  41. } = useWorkflowRunEvent()
  42. const handleBackupDraft = useCallback(() => {
  43. const {
  44. getNodes,
  45. edges,
  46. } = store.getState()
  47. const { getViewport } = reactflow
  48. const {
  49. backupDraft,
  50. setBackupDraft,
  51. environmentVariables,
  52. } = workflowStore.getState()
  53. if (!backupDraft) {
  54. setBackupDraft({
  55. nodes: getNodes(),
  56. edges,
  57. viewport: getViewport(),
  58. environmentVariables,
  59. })
  60. doSyncWorkflowDraft()
  61. }
  62. }, [reactflow, workflowStore, store, doSyncWorkflowDraft])
  63. const handleLoadBackupDraft = useCallback(() => {
  64. const {
  65. backupDraft,
  66. setBackupDraft,
  67. setEnvironmentVariables,
  68. } = workflowStore.getState()
  69. if (backupDraft) {
  70. const {
  71. nodes,
  72. edges,
  73. viewport,
  74. environmentVariables,
  75. } = backupDraft
  76. handleUpdateWorkflowCanvas({
  77. nodes,
  78. edges,
  79. viewport,
  80. })
  81. setEnvironmentVariables(environmentVariables)
  82. setBackupDraft(undefined)
  83. }
  84. }, [handleUpdateWorkflowCanvas, workflowStore])
  85. const pipelineId = useStore(s => s.pipelineId)
  86. const invalidAllLastRun = useInvalidAllLastRun(FlowType.ragPipeline, pipelineId)
  87. const { fetchInspectVars } = useSetWorkflowVarsWithValue({
  88. flowType: FlowType.ragPipeline,
  89. flowId: pipelineId!,
  90. })
  91. const handleRun = useCallback(async (
  92. params: any,
  93. callback?: IOtherOptions,
  94. ) => {
  95. const {
  96. getNodes,
  97. setNodes,
  98. } = store.getState()
  99. const newNodes = produce(getNodes(), (draft) => {
  100. draft.forEach((node) => {
  101. node.data.selected = false
  102. node.data._runningStatus = undefined
  103. })
  104. })
  105. setNodes(newNodes)
  106. await doSyncWorkflowDraft()
  107. const {
  108. onWorkflowStarted,
  109. onWorkflowFinished,
  110. onNodeStarted,
  111. onNodeFinished,
  112. onIterationStart,
  113. onIterationNext,
  114. onIterationFinish,
  115. onLoopStart,
  116. onLoopNext,
  117. onLoopFinish,
  118. onNodeRetry,
  119. onAgentLog,
  120. onError,
  121. ...restCallback
  122. } = callback || {}
  123. const { pipelineId } = workflowStore.getState()
  124. workflowStore.setState({ historyWorkflowData: undefined })
  125. const workflowContainer = document.getElementById('workflow-container')
  126. const {
  127. clientWidth,
  128. clientHeight,
  129. } = workflowContainer!
  130. const url = `/rag/pipelines/${pipelineId}/workflows/draft/run`
  131. const {
  132. setWorkflowRunningData,
  133. } = workflowStore.getState()
  134. setWorkflowRunningData({
  135. result: {
  136. status: WorkflowRunningStatus.Running,
  137. },
  138. tracing: [],
  139. resultText: '',
  140. })
  141. ssePost(
  142. url,
  143. {
  144. body: params,
  145. },
  146. {
  147. onWorkflowStarted: (params) => {
  148. handleWorkflowStarted(params)
  149. if (onWorkflowStarted)
  150. onWorkflowStarted(params)
  151. },
  152. onWorkflowFinished: (params) => {
  153. handleWorkflowFinished(params)
  154. fetchInspectVars()
  155. invalidAllLastRun()
  156. if (onWorkflowFinished)
  157. onWorkflowFinished(params)
  158. },
  159. onError: (params) => {
  160. handleWorkflowFailed()
  161. if (onError)
  162. onError(params)
  163. },
  164. onNodeStarted: (params) => {
  165. handleWorkflowNodeStarted(
  166. params,
  167. {
  168. clientWidth,
  169. clientHeight,
  170. },
  171. )
  172. if (onNodeStarted)
  173. onNodeStarted(params)
  174. },
  175. onNodeFinished: (params) => {
  176. handleWorkflowNodeFinished(params)
  177. if (onNodeFinished)
  178. onNodeFinished(params)
  179. },
  180. onIterationStart: (params) => {
  181. handleWorkflowNodeIterationStarted(
  182. params,
  183. {
  184. clientWidth,
  185. clientHeight,
  186. },
  187. )
  188. if (onIterationStart)
  189. onIterationStart(params)
  190. },
  191. onIterationNext: (params) => {
  192. handleWorkflowNodeIterationNext(params)
  193. if (onIterationNext)
  194. onIterationNext(params)
  195. },
  196. onIterationFinish: (params) => {
  197. handleWorkflowNodeIterationFinished(params)
  198. if (onIterationFinish)
  199. onIterationFinish(params)
  200. },
  201. onLoopStart: (params) => {
  202. handleWorkflowNodeLoopStarted(
  203. params,
  204. {
  205. clientWidth,
  206. clientHeight,
  207. },
  208. )
  209. if (onLoopStart)
  210. onLoopStart(params)
  211. },
  212. onLoopNext: (params) => {
  213. handleWorkflowNodeLoopNext(params)
  214. if (onLoopNext)
  215. onLoopNext(params)
  216. },
  217. onLoopFinish: (params) => {
  218. handleWorkflowNodeLoopFinished(params)
  219. if (onLoopFinish)
  220. onLoopFinish(params)
  221. },
  222. onNodeRetry: (params) => {
  223. handleWorkflowNodeRetry(params)
  224. if (onNodeRetry)
  225. onNodeRetry(params)
  226. },
  227. onAgentLog: (params) => {
  228. handleWorkflowAgentLog(params)
  229. if (onAgentLog)
  230. onAgentLog(params)
  231. },
  232. onTextChunk: (params) => {
  233. handleWorkflowTextChunk(params)
  234. },
  235. onTextReplace: (params) => {
  236. handleWorkflowTextReplace(params)
  237. },
  238. ...restCallback,
  239. },
  240. )
  241. }, [
  242. store,
  243. workflowStore,
  244. doSyncWorkflowDraft,
  245. handleWorkflowStarted,
  246. handleWorkflowFinished,
  247. handleWorkflowFailed,
  248. handleWorkflowNodeStarted,
  249. handleWorkflowNodeFinished,
  250. handleWorkflowNodeIterationStarted,
  251. handleWorkflowNodeIterationNext,
  252. handleWorkflowNodeIterationFinished,
  253. handleWorkflowNodeLoopStarted,
  254. handleWorkflowNodeLoopNext,
  255. handleWorkflowNodeLoopFinished,
  256. handleWorkflowNodeRetry,
  257. handleWorkflowTextChunk,
  258. handleWorkflowTextReplace,
  259. handleWorkflowAgentLog,
  260. ],
  261. )
  262. const handleStopRun = useCallback((taskId: string) => {
  263. const { pipelineId } = workflowStore.getState()
  264. stopWorkflowRun(`/rag/pipeline/${pipelineId}/workflow-runs/tasks/${taskId}/stop`)
  265. }, [workflowStore])
  266. const handleRestoreFromPublishedWorkflow = useCallback((publishedWorkflow: VersionHistory) => {
  267. const nodes = publishedWorkflow.graph.nodes.map(node => ({ ...node, selected: false, data: { ...node.data, selected: false } }))
  268. const edges = publishedWorkflow.graph.edges
  269. const viewport = publishedWorkflow.graph.viewport!
  270. handleUpdateWorkflowCanvas({
  271. nodes,
  272. edges,
  273. viewport,
  274. })
  275. workflowStore.getState().setEnvironmentVariables(publishedWorkflow.environment_variables || [])
  276. workflowStore.getState().setRagPipelineVariables?.(publishedWorkflow.rag_pipeline_variables || [])
  277. }, [handleUpdateWorkflowCanvas, workflowStore])
  278. return {
  279. handleBackupDraft,
  280. handleLoadBackupDraft,
  281. handleRun,
  282. handleStopRun,
  283. handleRestoreFromPublishedWorkflow,
  284. }
  285. }