123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- import { useCallback } from 'react'
- import { useStoreApi } from 'reactflow'
- import { useTranslation } from 'react-i18next'
- import { useWorkflowStore } from '../store'
- import {
- BlockEnum,
- WorkflowRunningStatus,
- } from '../types'
- import type { KnowledgeRetrievalNodeType } from '../nodes/knowledge-retrieval/types'
- import type { Node } from '../types'
- import { useWorkflow } from './use-workflow'
- import {
- useIsChatMode,
- useNodesSyncDraft,
- useWorkflowInteractions,
- useWorkflowRun,
- } from './index'
- import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
- import { useCurrentProviderAndModel, useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
- import { useFeaturesStore } from '@/app/components/base/features/hooks'
- import KnowledgeRetrievalDefault from '@/app/components/workflow/nodes/knowledge-retrieval/default'
- import Toast from '@/app/components/base/toast'
- export const useWorkflowStartRun = () => {
- const store = useStoreApi()
- const workflowStore = useWorkflowStore()
- const featuresStore = useFeaturesStore()
- const isChatMode = useIsChatMode()
- const { handleCancelDebugAndPreviewPanel } = useWorkflowInteractions()
- const { handleRun } = useWorkflowRun()
- const { isFromStartNode } = useWorkflow()
- const { doSyncWorkflowDraft } = useNodesSyncDraft()
- const { checkValid: checkKnowledgeRetrievalValid } = KnowledgeRetrievalDefault
- const { t } = useTranslation()
- const {
- modelList: rerankModelList,
- defaultModel: rerankDefaultModel,
- } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
- const {
- currentModel,
- } = useCurrentProviderAndModel(
- rerankModelList,
- rerankDefaultModel
- ? {
- ...rerankDefaultModel,
- provider: rerankDefaultModel.provider.provider,
- }
- : undefined,
- )
- const handleWorkflowStartRunInWorkflow = useCallback(async () => {
- const {
- workflowRunningData,
- } = workflowStore.getState()
- if (workflowRunningData?.result.status === WorkflowRunningStatus.Running)
- return
- const { getNodes } = store.getState()
- const nodes = getNodes()
- const startNode = nodes.find(node => node.data.type === BlockEnum.Start)
- const knowledgeRetrievalNodes = nodes.filter((node: Node<KnowledgeRetrievalNodeType>) =>
- node.data.type === BlockEnum.KnowledgeRetrieval,
- )
- const startVariables = startNode?.data.variables || []
- const fileSettings = featuresStore!.getState().features.file
- const {
- showDebugAndPreviewPanel,
- setShowDebugAndPreviewPanel,
- setShowInputsPanel,
- setShowEnvPanel,
- } = workflowStore.getState()
- if (knowledgeRetrievalNodes.length > 0) {
- for (const node of knowledgeRetrievalNodes) {
- if (isFromStartNode(node.id)) {
- const res = checkKnowledgeRetrievalValid(node.data, t)
- if (!res.isValid || !currentModel || !rerankDefaultModel) {
- const errorMessage = res.errorMessage
- if (errorMessage) {
- Toast.notify({
- type: 'error',
- message: errorMessage,
- })
- return false
- }
- else {
- Toast.notify({
- type: 'error',
- message: t('appDebug.datasetConfig.rerankModelRequired'),
- })
- return false
- }
- }
- }
- }
- }
- setShowEnvPanel(false)
- if (showDebugAndPreviewPanel) {
- handleCancelDebugAndPreviewPanel()
- return
- }
- if (!startVariables.length && !fileSettings?.image?.enabled) {
- await doSyncWorkflowDraft()
- handleRun({ inputs: {}, files: [] })
- setShowDebugAndPreviewPanel(true)
- setShowInputsPanel(false)
- }
- else {
- setShowDebugAndPreviewPanel(true)
- setShowInputsPanel(true)
- }
- }, [store, workflowStore, featuresStore, handleCancelDebugAndPreviewPanel, handleRun, doSyncWorkflowDraft])
- const handleWorkflowStartRunInChatflow = useCallback(async () => {
- const {
- showDebugAndPreviewPanel,
- setShowDebugAndPreviewPanel,
- setHistoryWorkflowData,
- setShowEnvPanel,
- setShowChatVariablePanel,
- } = workflowStore.getState()
- setShowEnvPanel(false)
- setShowChatVariablePanel(false)
- if (showDebugAndPreviewPanel)
- handleCancelDebugAndPreviewPanel()
- else
- setShowDebugAndPreviewPanel(true)
- setHistoryWorkflowData(undefined)
- }, [workflowStore, handleCancelDebugAndPreviewPanel])
- const handleStartWorkflowRun = useCallback(() => {
- if (!isChatMode)
- handleWorkflowStartRunInWorkflow()
- else
- handleWorkflowStartRunInChatflow()
- }, [isChatMode, handleWorkflowStartRunInWorkflow, handleWorkflowStartRunInChatflow])
- return {
- handleStartWorkflowRun,
- handleWorkflowStartRunInWorkflow,
- handleWorkflowStartRunInChatflow,
- }
- }
|