use-config.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import { useCallback, useEffect, useRef } from 'react'
  2. import produce from 'immer'
  3. import { BlockEnum, VarType } from '../../types'
  4. import type { Memory, ValueSelector, Var } from '../../types'
  5. import {
  6. useIsChatMode, useNodesReadOnly,
  7. useWorkflow,
  8. } from '../../hooks'
  9. import { useStore } from '../../store'
  10. import type { QuestionClassifierNodeType } from './types'
  11. import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
  12. import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run'
  13. import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
  14. import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
  15. const useConfig = (id: string, payload: QuestionClassifierNodeType) => {
  16. const { nodesReadOnly: readOnly } = useNodesReadOnly()
  17. const isChatMode = useIsChatMode()
  18. const defaultConfig = useStore(s => s.nodesDefaultConfigs)[payload.type]
  19. const { getBeforeNodesInSameBranch } = useWorkflow()
  20. const startNode = getBeforeNodesInSameBranch(id).find(node => node.data.type === BlockEnum.Start)
  21. const startNodeId = startNode?.id
  22. const { inputs, setInputs } = useNodeCrud<QuestionClassifierNodeType>(id, payload)
  23. const inputRef = useRef(inputs)
  24. useEffect(() => {
  25. inputRef.current = inputs
  26. }, [inputs])
  27. // model
  28. const {
  29. currentProvider,
  30. currentModel,
  31. } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.textGeneration)
  32. const model = inputs.model
  33. const modelMode = inputs.model?.mode
  34. const isChatModel = modelMode === 'chat'
  35. const handleModelChanged = useCallback((model: { provider: string; modelId: string; mode?: string }) => {
  36. const newInputs = produce(inputRef.current, (draft) => {
  37. draft.model.provider = model.provider
  38. draft.model.name = model.modelId
  39. draft.model.mode = model.mode!
  40. })
  41. setInputs(newInputs)
  42. }, [setInputs])
  43. useEffect(() => {
  44. if (currentProvider?.provider && currentModel?.model && !model.provider) {
  45. handleModelChanged({
  46. provider: currentProvider?.provider,
  47. modelId: currentModel?.model,
  48. mode: currentModel?.model_properties?.mode as string,
  49. })
  50. }
  51. }, [model.provider, currentProvider, currentModel, handleModelChanged])
  52. const handleCompletionParamsChange = useCallback((newParams: Record<string, any>) => {
  53. const newInputs = produce(inputs, (draft) => {
  54. draft.model.completion_params = newParams
  55. })
  56. setInputs(newInputs)
  57. }, [inputs, setInputs])
  58. const handleQueryVarChange = useCallback((newVar: ValueSelector | string) => {
  59. const newInputs = produce(inputs, (draft) => {
  60. draft.query_variable_selector = newVar as ValueSelector
  61. })
  62. setInputs(newInputs)
  63. // console.log(newInputs.query_variable_selector)
  64. }, [inputs, setInputs])
  65. useEffect(() => {
  66. const isReady = defaultConfig && Object.keys(defaultConfig).length > 0
  67. if (isReady) {
  68. let query_variable_selector: ValueSelector = []
  69. if (isChatMode && inputs.query_variable_selector.length === 0 && startNodeId)
  70. query_variable_selector = [startNodeId, 'sys.query']
  71. setInputs({
  72. ...inputs,
  73. ...defaultConfig,
  74. query_variable_selector: inputs.query_variable_selector.length > 0 ? inputs.query_variable_selector : query_variable_selector,
  75. })
  76. }
  77. // eslint-disable-next-line react-hooks/exhaustive-deps
  78. }, [defaultConfig])
  79. const handleClassesChange = useCallback((newClasses: any) => {
  80. const newInputs = produce(inputs, (draft) => {
  81. draft.classes = newClasses
  82. draft._targetBranches = newClasses
  83. })
  84. setInputs(newInputs)
  85. }, [inputs, setInputs])
  86. const handleInstructionChange = useCallback((instruction: string) => {
  87. const newInputs = produce(inputs, (draft) => {
  88. draft.instruction = instruction
  89. })
  90. setInputs(newInputs)
  91. }, [inputs, setInputs])
  92. const handleMemoryChange = useCallback((memory?: Memory) => {
  93. const newInputs = produce(inputs, (draft) => {
  94. draft.memory = memory
  95. })
  96. setInputs(newInputs)
  97. }, [inputs, setInputs])
  98. // single run
  99. const {
  100. isShowSingleRun,
  101. hideSingleRun,
  102. runningStatus,
  103. handleRun,
  104. handleStop,
  105. runInputData,
  106. setRunInputData,
  107. runResult,
  108. } = useOneStepRun<QuestionClassifierNodeType>({
  109. id,
  110. data: inputs,
  111. defaultRunInputData: {
  112. query: '',
  113. },
  114. })
  115. const query = runInputData.query
  116. const setQuery = useCallback((newQuery: string) => {
  117. setRunInputData({
  118. ...runInputData,
  119. query: newQuery,
  120. })
  121. }, [runInputData, setRunInputData])
  122. const filterVar = useCallback((varPayload: Var) => {
  123. return varPayload.type === VarType.string
  124. }, [])
  125. return {
  126. readOnly,
  127. inputs,
  128. handleModelChanged,
  129. isChatMode,
  130. isChatModel,
  131. handleCompletionParamsChange,
  132. handleQueryVarChange,
  133. filterVar,
  134. handleTopicsChange: handleClassesChange,
  135. handleInstructionChange,
  136. handleMemoryChange,
  137. isShowSingleRun,
  138. hideSingleRun,
  139. runningStatus,
  140. handleRun,
  141. handleStop,
  142. query,
  143. setQuery,
  144. runResult,
  145. }
  146. }
  147. export default useConfig