您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

use-workflow-init.ts 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import {
  2. useCallback,
  3. useEffect,
  4. useState,
  5. } from 'react'
  6. import {
  7. useStore,
  8. useWorkflowStore,
  9. } from '@/app/components/workflow/store'
  10. import { useWorkflowTemplate } from './use-workflow-template'
  11. import { useStore as useAppStore } from '@/app/components/app/store'
  12. import {
  13. fetchNodesDefaultConfigs,
  14. fetchPublishedWorkflow,
  15. fetchWorkflowDraft,
  16. syncWorkflowDraft,
  17. } from '@/service/workflow'
  18. import type { FetchWorkflowDraftResponse } from '@/types/workflow'
  19. import { useWorkflowConfig } from '@/service/use-workflow'
  20. import type { FileUploadConfigResponse } from '@/models/common'
  21. export const useWorkflowInit = () => {
  22. const workflowStore = useWorkflowStore()
  23. const {
  24. nodes: nodesTemplate,
  25. edges: edgesTemplate,
  26. } = useWorkflowTemplate()
  27. const appDetail = useAppStore(state => state.appDetail)!
  28. const setSyncWorkflowDraftHash = useStore(s => s.setSyncWorkflowDraftHash)
  29. const [data, setData] = useState<FetchWorkflowDraftResponse>()
  30. const [isLoading, setIsLoading] = useState(true)
  31. useEffect(() => {
  32. workflowStore.setState({ appId: appDetail.id, appName: appDetail.name })
  33. }, [appDetail.id, workflowStore])
  34. const handleUpdateWorkflowConfig = useCallback((config: Record<string, any>) => {
  35. const { setWorkflowConfig } = workflowStore.getState()
  36. setWorkflowConfig(config)
  37. }, [workflowStore])
  38. useWorkflowConfig(`/apps/${appDetail.id}/workflows/draft/config`, handleUpdateWorkflowConfig)
  39. const handleUpdateWorkflowFileUploadConfig = useCallback((config: FileUploadConfigResponse) => {
  40. const { setFileUploadConfig } = workflowStore.getState()
  41. setFileUploadConfig(config)
  42. }, [workflowStore])
  43. const {
  44. data: fileUploadConfigResponse,
  45. isLoading: isFileUploadConfigLoading,
  46. } = useWorkflowConfig('/files/upload', handleUpdateWorkflowFileUploadConfig)
  47. const handleGetInitialWorkflowData = useCallback(async () => {
  48. try {
  49. const res = await fetchWorkflowDraft(`/apps/${appDetail.id}/workflows/draft`)
  50. setData(res)
  51. workflowStore.setState({
  52. envSecrets: (res.environment_variables || []).filter(env => env.value_type === 'secret').reduce((acc, env) => {
  53. acc[env.id] = env.value
  54. return acc
  55. }, {} as Record<string, string>),
  56. environmentVariables: res.environment_variables?.map(env => env.value_type === 'secret' ? { ...env, value: '[__HIDDEN__]' } : env) || [],
  57. conversationVariables: res.conversation_variables || [],
  58. })
  59. setSyncWorkflowDraftHash(res.hash)
  60. setIsLoading(false)
  61. }
  62. catch (error: any) {
  63. if (error && error.json && !error.bodyUsed && appDetail) {
  64. error.json().then((err: any) => {
  65. if (err.code === 'draft_workflow_not_exist') {
  66. workflowStore.setState({ notInitialWorkflow: true })
  67. syncWorkflowDraft({
  68. url: `/apps/${appDetail.id}/workflows/draft`,
  69. params: {
  70. graph: {
  71. nodes: nodesTemplate,
  72. edges: edgesTemplate,
  73. },
  74. features: {
  75. retriever_resource: { enabled: true },
  76. },
  77. environment_variables: [],
  78. conversation_variables: [],
  79. },
  80. }).then((res) => {
  81. workflowStore.getState().setDraftUpdatedAt(res.updated_at)
  82. handleGetInitialWorkflowData()
  83. })
  84. }
  85. })
  86. }
  87. }
  88. }, [appDetail, nodesTemplate, edgesTemplate, workflowStore, setSyncWorkflowDraftHash])
  89. useEffect(() => {
  90. handleGetInitialWorkflowData()
  91. }, [])
  92. const handleFetchPreloadData = useCallback(async () => {
  93. try {
  94. const nodesDefaultConfigsData = await fetchNodesDefaultConfigs(`/apps/${appDetail?.id}/workflows/default-workflow-block-configs`)
  95. const publishedWorkflow = await fetchPublishedWorkflow(`/apps/${appDetail?.id}/workflows/publish`)
  96. workflowStore.setState({
  97. nodesDefaultConfigs: nodesDefaultConfigsData.reduce((acc, block) => {
  98. if (!acc[block.type])
  99. acc[block.type] = { ...block.config }
  100. return acc
  101. }, {} as Record<string, any>),
  102. })
  103. workflowStore.getState().setPublishedAt(publishedWorkflow?.created_at)
  104. }
  105. catch (e) {
  106. console.error(e)
  107. }
  108. }, [workflowStore, appDetail])
  109. useEffect(() => {
  110. handleFetchPreloadData()
  111. }, [handleFetchPreloadData])
  112. useEffect(() => {
  113. if (data) {
  114. workflowStore.getState().setDraftUpdatedAt(data.updated_at)
  115. workflowStore.getState().setToolPublished(data.tool_published)
  116. }
  117. }, [data, workflowStore])
  118. return {
  119. data,
  120. isLoading: isLoading || isFileUploadConfigLoading,
  121. fileUploadConfigResponse,
  122. }
  123. }