| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  | import type { StrategyDetail, StrategyPluginDetail } from '@/app/components/plugins/types' | 
					
						
							|  |  |  | import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks' | 
					
						
							|  |  |  | import type { NodeDefault } from '../../types' | 
					
						
							|  |  |  | import type { AgentNodeType } from './types' | 
					
						
							|  |  |  | import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' | 
					
						
							| 
									
										
										
										
											2025-04-10 10:03:19 +08:00
										 |  |  | import { renderI18nObject } from '@/i18n' | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | const nodeDefault: NodeDefault<AgentNodeType> = { | 
					
						
							|  |  |  |   defaultValue: { | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   getAvailablePrevNodes(isChatMode) { | 
					
						
							|  |  |  |     return isChatMode | 
					
						
							|  |  |  |       ? ALL_CHAT_AVAILABLE_BLOCKS | 
					
						
							|  |  |  |       : ALL_COMPLETION_AVAILABLE_BLOCKS | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   getAvailableNextNodes(isChatMode) { | 
					
						
							|  |  |  |     return isChatMode | 
					
						
							|  |  |  |       ? ALL_CHAT_AVAILABLE_BLOCKS | 
					
						
							|  |  |  |       : ALL_COMPLETION_AVAILABLE_BLOCKS | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   checkValid(payload, t, moreDataForCheckValid: { | 
					
						
							|  |  |  |     strategyProvider?: StrategyPluginDetail, | 
					
						
							|  |  |  |     strategy?: StrategyDetail | 
					
						
							|  |  |  |     language: string | 
					
						
							|  |  |  |     isReadyForCheckValid: boolean | 
					
						
							|  |  |  |   }) { | 
					
						
							|  |  |  |     const { strategy, language, isReadyForCheckValid } = moreDataForCheckValid | 
					
						
							|  |  |  |     if (!isReadyForCheckValid) { | 
					
						
							|  |  |  |       return { | 
					
						
							|  |  |  |         isValid: true, | 
					
						
							|  |  |  |         errorMessage: '', | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (!strategy) { | 
					
						
							|  |  |  |       return { | 
					
						
							|  |  |  |         isValid: false, | 
					
						
							|  |  |  |         errorMessage: t('workflow.nodes.agent.checkList.strategyNotSelected'), | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     for (const param of strategy.parameters) { | 
					
						
							|  |  |  |       // single tool
 | 
					
						
							|  |  |  |       if (param.required && param.type === FormTypeEnum.toolSelector) { | 
					
						
							|  |  |  |         // no value
 | 
					
						
							|  |  |  |         const toolValue = payload.agent_parameters?.[param.name]?.value | 
					
						
							|  |  |  |         if (!toolValue) { | 
					
						
							|  |  |  |           return { | 
					
						
							|  |  |  |             isValid: false, | 
					
						
							|  |  |  |             errorMessage: t('workflow.errorMsg.fieldRequired', { field: renderI18nObject(param.label, language) }), | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // not enabled
 | 
					
						
							|  |  |  |         else if (!toolValue.enabled) { | 
					
						
							|  |  |  |           return { | 
					
						
							|  |  |  |             isValid: false, | 
					
						
							|  |  |  |             errorMessage: t('workflow.errorMsg.noValidTool', { field: renderI18nObject(param.label, language) }), | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // check form of tool
 | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |           const schemas = toolValue.schemas || [] | 
					
						
							|  |  |  |           const userSettings = toolValue.settings | 
					
						
							|  |  |  |           const reasoningConfig = toolValue.parameters | 
					
						
							|  |  |  |           schemas.forEach((schema: any) => { | 
					
						
							|  |  |  |             if (schema?.required) { | 
					
						
							|  |  |  |               if (schema.form === 'form' && !userSettings[schema.name]?.value) { | 
					
						
							|  |  |  |                 return { | 
					
						
							|  |  |  |                   isValid: false, | 
					
						
							|  |  |  |                   errorMessage: t('workflow.errorMsg.toolParameterRequired', { field: renderI18nObject(param.label, language), param: renderI18nObject(schema.label, language) }), | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |               if (schema.form === 'llm' && reasoningConfig[schema.name].auto === 0 && !userSettings[schema.name]?.value) { | 
					
						
							|  |  |  |                 return { | 
					
						
							|  |  |  |                   isValid: false, | 
					
						
							|  |  |  |                   errorMessage: t('workflow.errorMsg.toolParameterRequired', { field: renderI18nObject(param.label, language), param: renderI18nObject(schema.label, language) }), | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       // multiple tools
 | 
					
						
							|  |  |  |       if (param.required && param.type === FormTypeEnum.multiToolSelector) { | 
					
						
							|  |  |  |         const tools = payload.agent_parameters?.[param.name]?.value || [] | 
					
						
							|  |  |  |         // no value
 | 
					
						
							|  |  |  |         if (!tools.length) { | 
					
						
							|  |  |  |           return { | 
					
						
							|  |  |  |             isValid: false, | 
					
						
							|  |  |  |             errorMessage: t('workflow.errorMsg.fieldRequired', { field: renderI18nObject(param.label, language) }), | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // not enabled
 | 
					
						
							|  |  |  |         else if (tools.every((tool: any) => !tool.enabled)) { | 
					
						
							|  |  |  |           return { | 
					
						
							|  |  |  |             isValid: false, | 
					
						
							|  |  |  |             errorMessage: t('workflow.errorMsg.noValidTool', { field: renderI18nObject(param.label, language) }), | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // check form of tools
 | 
					
						
							|  |  |  |         else { | 
					
						
							| 
									
										
										
										
											2025-04-14 15:28:20 +08:00
										 |  |  |           const validState = { | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  |             isValid: true, | 
					
						
							|  |  |  |             errorMessage: '', | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           for (const tool of tools) { | 
					
						
							|  |  |  |             const schemas = tool.schemas || [] | 
					
						
							|  |  |  |             const userSettings = tool.settings | 
					
						
							|  |  |  |             const reasoningConfig = tool.parameters | 
					
						
							|  |  |  |             schemas.forEach((schema: any) => { | 
					
						
							|  |  |  |               if (schema?.required) { | 
					
						
							|  |  |  |                 if (schema.form === 'form' && !userSettings[schema.name]?.value) { | 
					
						
							| 
									
										
										
										
											2025-04-14 15:28:20 +08:00
										 |  |  |                   return { | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  |                     isValid: false, | 
					
						
							|  |  |  |                     errorMessage: t('workflow.errorMsg.toolParameterRequired', { field: renderI18nObject(param.label, language), param: renderI18nObject(schema.label, language) }), | 
					
						
							|  |  |  |                   } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 if (schema.form === 'llm' && reasoningConfig[schema.name]?.auto === 0 && !reasoningConfig[schema.name]?.value) { | 
					
						
							| 
									
										
										
										
											2025-04-14 15:28:20 +08:00
										 |  |  |                   return { | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  |                     isValid: false, | 
					
						
							|  |  |  |                     errorMessage: t('workflow.errorMsg.toolParameterRequired', { field: renderI18nObject(param.label, language), param: renderI18nObject(schema.label, language) }), | 
					
						
							|  |  |  |                   } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           return validState | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       // common params
 | 
					
						
							| 
									
										
										
										
											2025-05-26 16:28:29 +08:00
										 |  |  |       if (param.required && !(payload.agent_parameters?.[param.name]?.value || param.default)) { | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  |         return { | 
					
						
							|  |  |  |           isValid: false, | 
					
						
							|  |  |  |           errorMessage: t('workflow.errorMsg.fieldRequired', { field: renderI18nObject(param.label, language) }), | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       isValid: true, | 
					
						
							|  |  |  |       errorMessage: '', | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default nodeDefault |