Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

use-workflow-init.ts 4.7KB

3 månader sedan
5 månader sedan
3 månader sedan
3 månader sedan
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 })
  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. // eslint-disable-next-line react-hooks/exhaustive-deps
  92. }, [])
  93. const handleFetchPreloadData = useCallback(async () => {
  94. try {
  95. const nodesDefaultConfigsData = await fetchNodesDefaultConfigs(`/apps/${appDetail?.id}/workflows/default-workflow-block-configs`)
  96. const publishedWorkflow = await fetchPublishedWorkflow(`/apps/${appDetail?.id}/workflows/publish`)
  97. workflowStore.setState({
  98. nodesDefaultConfigs: nodesDefaultConfigsData.reduce((acc, block) => {
  99. if (!acc[block.type])
  100. acc[block.type] = { ...block.config }
  101. return acc
  102. }, {} as Record<string, any>),
  103. })
  104. workflowStore.getState().setPublishedAt(publishedWorkflow?.created_at)
  105. }
  106. catch (e) {
  107. console.error(e)
  108. }
  109. }, [workflowStore, appDetail])
  110. useEffect(() => {
  111. handleFetchPreloadData()
  112. }, [handleFetchPreloadData])
  113. useEffect(() => {
  114. if (data) {
  115. workflowStore.getState().setDraftUpdatedAt(data.updated_at)
  116. workflowStore.getState().setToolPublished(data.tool_published)
  117. }
  118. }, [data, workflowStore])
  119. return {
  120. data,
  121. isLoading: isLoading || isFileUploadConfigLoading,
  122. fileUploadConfigResponse,
  123. }
  124. }