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.

use-config.ts 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. import { useStrategyProviderDetail } from '@/service/use-strategy'
  2. import useNodeCrud from '../_base/hooks/use-node-crud'
  3. import useVarList from '../_base/hooks/use-var-list'
  4. import useOneStepRun from '../_base/hooks/use-one-step-run'
  5. import type { AgentNodeType } from './types'
  6. import {
  7. useIsChatMode,
  8. useNodesReadOnly,
  9. } from '@/app/components/workflow/hooks'
  10. import { useCallback, useMemo } from 'react'
  11. import { type ToolVarInputs, VarType } from '../tool/types'
  12. import { useCheckInstalled, useFetchPluginsInMarketPlaceByIds } from '@/service/use-plugins'
  13. import type { Memory, Var } from '../../types'
  14. import { VarType as VarKindType } from '../../types'
  15. import useAvailableVarList from '../_base/hooks/use-available-var-list'
  16. import produce from 'immer'
  17. export type StrategyStatus = {
  18. plugin: {
  19. source: 'external' | 'marketplace'
  20. installed: boolean
  21. }
  22. isExistInPlugin: boolean
  23. }
  24. export const useStrategyInfo = (
  25. strategyProviderName?: string,
  26. strategyName?: string,
  27. ) => {
  28. const strategyProvider = useStrategyProviderDetail(
  29. strategyProviderName || '',
  30. { retry: false },
  31. )
  32. const strategy = strategyProvider.data?.declaration.strategies.find(
  33. str => str.identity.name === strategyName,
  34. )
  35. const marketplace = useFetchPluginsInMarketPlaceByIds([strategyProviderName!], {
  36. retry: false,
  37. })
  38. const strategyStatus: StrategyStatus | undefined = useMemo(() => {
  39. if (strategyProvider.isLoading || marketplace.isLoading)
  40. return undefined
  41. const strategyExist = !!strategy
  42. const isPluginInstalled = !strategyProvider.isError
  43. const isInMarketplace = !!marketplace.data?.data.plugins.at(0)
  44. return {
  45. plugin: {
  46. source: isInMarketplace ? 'marketplace' : 'external',
  47. installed: isPluginInstalled,
  48. },
  49. isExistInPlugin: strategyExist,
  50. }
  51. }, [strategy, marketplace, strategyProvider.isError, strategyProvider.isLoading])
  52. const refetch = useCallback(() => {
  53. strategyProvider.refetch()
  54. marketplace.refetch()
  55. }, [marketplace, strategyProvider])
  56. return {
  57. strategyProvider,
  58. strategy,
  59. strategyStatus,
  60. refetch,
  61. }
  62. }
  63. const useConfig = (id: string, payload: AgentNodeType) => {
  64. const { nodesReadOnly: readOnly } = useNodesReadOnly()
  65. const { inputs, setInputs } = useNodeCrud<AgentNodeType>(id, payload)
  66. // variables
  67. const { handleVarListChange, handleAddVariable } = useVarList<AgentNodeType>({
  68. inputs,
  69. setInputs,
  70. })
  71. const {
  72. strategyStatus: currentStrategyStatus,
  73. strategy: currentStrategy,
  74. strategyProvider,
  75. } = useStrategyInfo(
  76. inputs.agent_strategy_provider_name,
  77. inputs.agent_strategy_name,
  78. )
  79. const pluginId = inputs.agent_strategy_provider_name?.split('/').splice(0, 2).join('/')
  80. const pluginDetail = useCheckInstalled({
  81. pluginIds: [pluginId!],
  82. enabled: Boolean(pluginId),
  83. })
  84. const formData = useMemo(() => {
  85. const paramNameList = (currentStrategy?.parameters || []).map(item => item.name)
  86. return Object.fromEntries(
  87. Object.entries(inputs.agent_parameters || {}).filter(([name]) => paramNameList.includes(name)).map(([key, value]) => {
  88. return [key, value.value]
  89. }),
  90. )
  91. }, [inputs.agent_parameters, currentStrategy?.parameters])
  92. const onFormChange = (value: Record<string, any>) => {
  93. const res: ToolVarInputs = {}
  94. Object.entries(value).forEach(([key, val]) => {
  95. res[key] = {
  96. type: VarType.constant,
  97. value: val,
  98. }
  99. })
  100. setInputs({
  101. ...inputs,
  102. agent_parameters: res,
  103. })
  104. }
  105. // vars
  106. const filterMemoryPromptVar = useCallback((varPayload: Var) => {
  107. return [
  108. VarKindType.arrayObject,
  109. VarKindType.array,
  110. VarKindType.number,
  111. VarKindType.string,
  112. VarKindType.secret,
  113. VarKindType.arrayString,
  114. VarKindType.arrayNumber,
  115. VarKindType.file,
  116. VarKindType.arrayFile,
  117. ].includes(varPayload.type)
  118. }, [])
  119. const {
  120. availableVars,
  121. availableNodesWithParent,
  122. } = useAvailableVarList(id, {
  123. onlyLeafNodeVar: false,
  124. filterVar: filterMemoryPromptVar,
  125. })
  126. // single run
  127. const {
  128. isShowSingleRun,
  129. showSingleRun,
  130. hideSingleRun,
  131. toVarInputs,
  132. runningStatus,
  133. handleRun,
  134. handleStop,
  135. runInputData,
  136. setRunInputData,
  137. runResult,
  138. getInputVars,
  139. } = useOneStepRun<AgentNodeType>({
  140. id,
  141. data: inputs,
  142. defaultRunInputData: {},
  143. })
  144. const allVarStrArr = (() => {
  145. const arr = currentStrategy?.parameters.filter(item => item.type === 'string').map((item) => {
  146. return formData[item.name]
  147. }) || []
  148. return arr
  149. })()
  150. const varInputs = (() => {
  151. const vars = getInputVars(allVarStrArr)
  152. return vars
  153. })()
  154. const outputSchema = useMemo(() => {
  155. const res: any[] = []
  156. if (!inputs.output_schema)
  157. return []
  158. Object.keys(inputs.output_schema.properties).forEach((outputKey) => {
  159. const output = inputs.output_schema.properties[outputKey]
  160. res.push({
  161. name: outputKey,
  162. type: output.type === 'array'
  163. ? `Array[${output.items?.type.slice(0, 1).toLocaleUpperCase()}${output.items?.type.slice(1)}]`
  164. : `${output.type.slice(0, 1).toLocaleUpperCase()}${output.type.slice(1)}`,
  165. description: output.description,
  166. })
  167. })
  168. return res
  169. }, [inputs.output_schema])
  170. const handleMemoryChange = useCallback((newMemory?: Memory) => {
  171. const newInputs = produce(inputs, (draft) => {
  172. draft.memory = newMemory
  173. })
  174. setInputs(newInputs)
  175. }, [inputs, setInputs])
  176. const isChatMode = useIsChatMode()
  177. return {
  178. readOnly,
  179. inputs,
  180. setInputs,
  181. handleVarListChange,
  182. handleAddVariable,
  183. currentStrategy,
  184. formData,
  185. onFormChange,
  186. currentStrategyStatus,
  187. strategyProvider: strategyProvider.data,
  188. pluginDetail: pluginDetail.data?.plugins.at(0),
  189. availableVars,
  190. availableNodesWithParent,
  191. isShowSingleRun,
  192. showSingleRun,
  193. hideSingleRun,
  194. toVarInputs,
  195. runningStatus,
  196. handleRun,
  197. handleStop,
  198. runInputData,
  199. setRunInputData,
  200. runResult,
  201. varInputs,
  202. outputSchema,
  203. handleMemoryChange,
  204. isChatMode,
  205. }
  206. }
  207. export default useConfig