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

use-config.ts 5.2KB

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