use-workflow-start-run.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import { useCallback } from 'react'
  2. import { useStoreApi } from 'reactflow'
  3. import { useTranslation } from 'react-i18next'
  4. import { useWorkflowStore } from '../store'
  5. import {
  6. BlockEnum,
  7. WorkflowRunningStatus,
  8. } from '../types'
  9. import type { KnowledgeRetrievalNodeType } from '../nodes/knowledge-retrieval/types'
  10. import type { Node } from '../types'
  11. import { useWorkflow } from './use-workflow'
  12. import {
  13. useIsChatMode,
  14. useNodesSyncDraft,
  15. useWorkflowInteractions,
  16. useWorkflowRun,
  17. } from './index'
  18. import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
  19. import { useCurrentProviderAndModel, useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
  20. import { useFeaturesStore } from '@/app/components/base/features/hooks'
  21. import KnowledgeRetrievalDefault from '@/app/components/workflow/nodes/knowledge-retrieval/default'
  22. import Toast from '@/app/components/base/toast'
  23. export const useWorkflowStartRun = () => {
  24. const store = useStoreApi()
  25. const workflowStore = useWorkflowStore()
  26. const featuresStore = useFeaturesStore()
  27. const isChatMode = useIsChatMode()
  28. const { handleCancelDebugAndPreviewPanel } = useWorkflowInteractions()
  29. const { handleRun } = useWorkflowRun()
  30. const { isFromStartNode } = useWorkflow()
  31. const { doSyncWorkflowDraft } = useNodesSyncDraft()
  32. const { checkValid: checkKnowledgeRetrievalValid } = KnowledgeRetrievalDefault
  33. const { t } = useTranslation()
  34. const {
  35. modelList: rerankModelList,
  36. defaultModel: rerankDefaultModel,
  37. } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
  38. const {
  39. currentModel,
  40. } = useCurrentProviderAndModel(
  41. rerankModelList,
  42. rerankDefaultModel
  43. ? {
  44. ...rerankDefaultModel,
  45. provider: rerankDefaultModel.provider.provider,
  46. }
  47. : undefined,
  48. )
  49. const handleWorkflowStartRunInWorkflow = useCallback(async () => {
  50. const {
  51. workflowRunningData,
  52. } = workflowStore.getState()
  53. if (workflowRunningData?.result.status === WorkflowRunningStatus.Running)
  54. return
  55. const { getNodes } = store.getState()
  56. const nodes = getNodes()
  57. const startNode = nodes.find(node => node.data.type === BlockEnum.Start)
  58. const knowledgeRetrievalNodes = nodes.filter((node: Node<KnowledgeRetrievalNodeType>) =>
  59. node.data.type === BlockEnum.KnowledgeRetrieval,
  60. )
  61. const startVariables = startNode?.data.variables || []
  62. const fileSettings = featuresStore!.getState().features.file
  63. const {
  64. showDebugAndPreviewPanel,
  65. setShowDebugAndPreviewPanel,
  66. setShowInputsPanel,
  67. setShowEnvPanel,
  68. } = workflowStore.getState()
  69. if (knowledgeRetrievalNodes.length > 0) {
  70. for (const node of knowledgeRetrievalNodes) {
  71. if (isFromStartNode(node.id)) {
  72. const res = checkKnowledgeRetrievalValid(node.data, t)
  73. if (!res.isValid || !currentModel || !rerankDefaultModel) {
  74. const errorMessage = res.errorMessage
  75. if (errorMessage) {
  76. Toast.notify({
  77. type: 'error',
  78. message: errorMessage,
  79. })
  80. return false
  81. }
  82. else {
  83. Toast.notify({
  84. type: 'error',
  85. message: t('appDebug.datasetConfig.rerankModelRequired'),
  86. })
  87. return false
  88. }
  89. }
  90. }
  91. }
  92. }
  93. setShowEnvPanel(false)
  94. if (showDebugAndPreviewPanel) {
  95. handleCancelDebugAndPreviewPanel()
  96. return
  97. }
  98. if (!startVariables.length && !fileSettings?.image?.enabled) {
  99. await doSyncWorkflowDraft()
  100. handleRun({ inputs: {}, files: [] })
  101. setShowDebugAndPreviewPanel(true)
  102. setShowInputsPanel(false)
  103. }
  104. else {
  105. setShowDebugAndPreviewPanel(true)
  106. setShowInputsPanel(true)
  107. }
  108. }, [store, workflowStore, featuresStore, handleCancelDebugAndPreviewPanel, handleRun, doSyncWorkflowDraft])
  109. const handleWorkflowStartRunInChatflow = useCallback(async () => {
  110. const {
  111. showDebugAndPreviewPanel,
  112. setShowDebugAndPreviewPanel,
  113. setHistoryWorkflowData,
  114. setShowEnvPanel,
  115. setShowChatVariablePanel,
  116. } = workflowStore.getState()
  117. setShowEnvPanel(false)
  118. setShowChatVariablePanel(false)
  119. if (showDebugAndPreviewPanel)
  120. handleCancelDebugAndPreviewPanel()
  121. else
  122. setShowDebugAndPreviewPanel(true)
  123. setHistoryWorkflowData(undefined)
  124. }, [workflowStore, handleCancelDebugAndPreviewPanel])
  125. const handleStartWorkflowRun = useCallback(() => {
  126. if (!isChatMode)
  127. handleWorkflowStartRunInWorkflow()
  128. else
  129. handleWorkflowStartRunInChatflow()
  130. }, [isChatMode, handleWorkflowStartRunInWorkflow, handleWorkflowStartRunInChatflow])
  131. return {
  132. handleStartWorkflowRun,
  133. handleWorkflowStartRunInWorkflow,
  134. handleWorkflowStartRunInChatflow,
  135. }
  136. }