You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.tsx 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import {
  2. useMemo,
  3. } from 'react'
  4. import useSWR from 'swr'
  5. import {
  6. SupportUploadFileTypes,
  7. } from '@/app/components/workflow/types'
  8. import {
  9. useWorkflowInit,
  10. } from './hooks'
  11. import {
  12. initialEdges,
  13. initialNodes,
  14. } from '@/app/components/workflow/utils'
  15. import Loading from '@/app/components/base/loading'
  16. import { FeaturesProvider } from '@/app/components/base/features'
  17. import type { Features as FeaturesData } from '@/app/components/base/features/types'
  18. import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'
  19. import { fetchFileUploadConfig } from '@/service/common'
  20. import WorkflowWithDefaultContext from '@/app/components/workflow'
  21. import {
  22. WorkflowContextProvider,
  23. } from '@/app/components/workflow/context'
  24. import { createWorkflowSlice } from './store/workflow/workflow-slice'
  25. import WorkflowAppMain from './components/workflow-main'
  26. const WorkflowAppWithAdditionalContext = () => {
  27. const {
  28. data,
  29. isLoading,
  30. } = useWorkflowInit()
  31. const { data: fileUploadConfigResponse } = useSWR({ url: '/files/upload' }, fetchFileUploadConfig)
  32. const nodesData = useMemo(() => {
  33. if (data)
  34. return initialNodes(data.graph.nodes, data.graph.edges)
  35. return []
  36. }, [data])
  37. const edgesData = useMemo(() => {
  38. if (data)
  39. return initialEdges(data.graph.edges, data.graph.nodes)
  40. return []
  41. }, [data])
  42. if (!data || isLoading) {
  43. return (
  44. <div className='relative flex h-full w-full items-center justify-center'>
  45. <Loading />
  46. </div>
  47. )
  48. }
  49. const features = data.features || {}
  50. const initialFeatures: FeaturesData = {
  51. file: {
  52. image: {
  53. enabled: !!features.file_upload?.image?.enabled,
  54. number_limits: features.file_upload?.image?.number_limits || 3,
  55. transfer_methods: features.file_upload?.image?.transfer_methods || ['local_file', 'remote_url'],
  56. },
  57. enabled: !!(features.file_upload?.enabled || features.file_upload?.image?.enabled),
  58. allowed_file_types: features.file_upload?.allowed_file_types || [SupportUploadFileTypes.image],
  59. allowed_file_extensions: features.file_upload?.allowed_file_extensions || FILE_EXTS[SupportUploadFileTypes.image].map(ext => `.${ext}`),
  60. allowed_file_upload_methods: features.file_upload?.allowed_file_upload_methods || features.file_upload?.image?.transfer_methods || ['local_file', 'remote_url'],
  61. number_limits: features.file_upload?.number_limits || features.file_upload?.image?.number_limits || 3,
  62. fileUploadConfig: fileUploadConfigResponse,
  63. },
  64. opening: {
  65. enabled: !!features.opening_statement,
  66. opening_statement: features.opening_statement,
  67. suggested_questions: features.suggested_questions,
  68. },
  69. suggested: features.suggested_questions_after_answer || { enabled: false },
  70. speech2text: features.speech_to_text || { enabled: false },
  71. text2speech: features.text_to_speech || { enabled: false },
  72. citation: features.retriever_resource || { enabled: false },
  73. moderation: features.sensitive_word_avoidance || { enabled: false },
  74. }
  75. return (
  76. <WorkflowWithDefaultContext
  77. edges={edgesData}
  78. nodes={nodesData}
  79. >
  80. <FeaturesProvider features={initialFeatures}>
  81. <WorkflowAppMain
  82. nodes={nodesData}
  83. edges={edgesData}
  84. viewport={data.graph.viewport}
  85. />
  86. </FeaturesProvider>
  87. </WorkflowWithDefaultContext>
  88. )
  89. }
  90. const WorkflowAppWrapper = () => {
  91. return (
  92. <WorkflowContextProvider
  93. injectWorkflowStoreSliceFn={createWorkflowSlice}
  94. >
  95. <WorkflowAppWithAdditionalContext />
  96. </WorkflowContextProvider>
  97. )
  98. }
  99. export default WorkflowAppWrapper