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.

default.ts 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import type { StrategyDetail, StrategyPluginDetail } from '@/app/components/plugins/types'
  2. import { BlockEnum, type NodeDefault } from '../../types'
  3. import type { AgentNodeType } from './types'
  4. import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
  5. import { genNodeMetaData } from '../../utils'
  6. const metaData = genNodeMetaData({
  7. sort: 3,
  8. type: BlockEnum.Agent,
  9. })
  10. import { renderI18nObject } from '@/i18n-config'
  11. const nodeDefault: NodeDefault<AgentNodeType> = {
  12. metaData,
  13. defaultValue: {
  14. tool_node_version: '2',
  15. },
  16. checkValid(payload, t, moreDataForCheckValid: {
  17. strategyProvider?: StrategyPluginDetail,
  18. strategy?: StrategyDetail
  19. language: string
  20. isReadyForCheckValid: boolean
  21. }) {
  22. const { strategy, language, isReadyForCheckValid } = moreDataForCheckValid
  23. if (!isReadyForCheckValid) {
  24. return {
  25. isValid: true,
  26. errorMessage: '',
  27. }
  28. }
  29. if (!strategy) {
  30. return {
  31. isValid: false,
  32. errorMessage: t('workflow.nodes.agent.checkList.strategyNotSelected'),
  33. }
  34. }
  35. for (const param of strategy.parameters) {
  36. // single tool
  37. if (param.required && param.type === FormTypeEnum.toolSelector) {
  38. // no value
  39. const toolValue = payload.agent_parameters?.[param.name]?.value
  40. if (!toolValue) {
  41. return {
  42. isValid: false,
  43. errorMessage: t('workflow.errorMsg.fieldRequired', { field: renderI18nObject(param.label, language) }),
  44. }
  45. }
  46. // not enabled
  47. else if (!toolValue.enabled) {
  48. return {
  49. isValid: false,
  50. errorMessage: t('workflow.errorMsg.noValidTool', { field: renderI18nObject(param.label, language) }),
  51. }
  52. }
  53. // check form of tool
  54. else {
  55. const schemas = toolValue.schemas || []
  56. const userSettings = toolValue.settings
  57. const reasoningConfig = toolValue.parameters
  58. const version = payload.version
  59. const toolNodeVersion = payload.tool_node_version
  60. const mergeVersion = version || toolNodeVersion
  61. schemas.forEach((schema: any) => {
  62. if (schema?.required) {
  63. if (schema.form === 'form' && !mergeVersion && !userSettings[schema.name]?.value) {
  64. return {
  65. isValid: false,
  66. errorMessage: t('workflow.errorMsg.toolParameterRequired', { field: renderI18nObject(param.label, language), param: renderI18nObject(schema.label, language) }),
  67. }
  68. }
  69. if (schema.form === 'form' && mergeVersion && !userSettings[schema.name]?.value.value) {
  70. return {
  71. isValid: false,
  72. errorMessage: t('workflow.errorMsg.toolParameterRequired', { field: renderI18nObject(param.label, language), param: renderI18nObject(schema.label, language) }),
  73. }
  74. }
  75. if (schema.form === 'llm' && !mergeVersion && reasoningConfig[schema.name].auto === 0 && !reasoningConfig[schema.name]?.value) {
  76. return {
  77. isValid: false,
  78. errorMessage: t('workflow.errorMsg.toolParameterRequired', { field: renderI18nObject(param.label, language), param: renderI18nObject(schema.label, language) }),
  79. }
  80. }
  81. if (schema.form === 'llm' && mergeVersion && reasoningConfig[schema.name].auto === 0 && !reasoningConfig[schema.name]?.value.value) {
  82. return {
  83. isValid: false,
  84. errorMessage: t('workflow.errorMsg.toolParameterRequired', { field: renderI18nObject(param.label, language), param: renderI18nObject(schema.label, language) }),
  85. }
  86. }
  87. }
  88. })
  89. }
  90. }
  91. // multiple tools
  92. if (param.required && param.type === FormTypeEnum.multiToolSelector) {
  93. const tools = payload.agent_parameters?.[param.name]?.value || []
  94. // no value
  95. if (!tools.length) {
  96. return {
  97. isValid: false,
  98. errorMessage: t('workflow.errorMsg.fieldRequired', { field: renderI18nObject(param.label, language) }),
  99. }
  100. }
  101. // not enabled
  102. else if (tools.every((tool: any) => !tool.enabled)) {
  103. return {
  104. isValid: false,
  105. errorMessage: t('workflow.errorMsg.noValidTool', { field: renderI18nObject(param.label, language) }),
  106. }
  107. }
  108. // check form of tools
  109. else {
  110. const validState = {
  111. isValid: true,
  112. errorMessage: '',
  113. }
  114. for (const tool of tools) {
  115. const schemas = tool.schemas || []
  116. const userSettings = tool.settings
  117. const reasoningConfig = tool.parameters
  118. schemas.forEach((schema: any) => {
  119. if (schema?.required) {
  120. if (schema.form === 'form' && !userSettings[schema.name]?.value) {
  121. return {
  122. isValid: false,
  123. errorMessage: t('workflow.errorMsg.toolParameterRequired', { field: renderI18nObject(param.label, language), param: renderI18nObject(schema.label, language) }),
  124. }
  125. }
  126. if (schema.form === 'llm' && reasoningConfig[schema.name]?.auto === 0 && !reasoningConfig[schema.name]?.value) {
  127. return {
  128. isValid: false,
  129. errorMessage: t('workflow.errorMsg.toolParameterRequired', { field: renderI18nObject(param.label, language), param: renderI18nObject(schema.label, language) }),
  130. }
  131. }
  132. }
  133. })
  134. }
  135. return validState
  136. }
  137. }
  138. // common params
  139. if (param.required && !(payload.agent_parameters?.[param.name]?.value || param.default)) {
  140. return {
  141. isValid: false,
  142. errorMessage: t('workflow.errorMsg.fieldRequired', { field: renderI18nObject(param.label, language) }),
  143. }
  144. }
  145. }
  146. return {
  147. isValid: true,
  148. errorMessage: '',
  149. }
  150. },
  151. }
  152. export default nodeDefault