import type { TriggerEventParameter } from '../../plugins/types' import type { ToolCredential, ToolParameter } from '../types' import type { TypeWithI18N } from '@/app/components/header/account-setting/model-provider-page/declarations' import type { SchemaRoot } from '@/app/components/workflow/nodes/llm/types' import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' import { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types' // Type for form value input with type and value properties type FormValueInput = { type?: string value?: unknown } /** * Form schema type for tool credentials. * This type represents the schema returned by toolCredentialToFormSchemas. */ export type ToolCredentialFormSchema = { name: string variable: string label: TypeWithI18N type: string required: boolean default?: string tooltip?: TypeWithI18N placeholder?: TypeWithI18N show_on: { variable: string; value: string }[] options?: { label: TypeWithI18N value: string show_on: { variable: string; value: string }[] }[] help?: TypeWithI18N | null url?: string } /** * Form schema type for tool parameters. * This type represents the schema returned by toolParametersToFormSchemas. */ export type ToolFormSchema = { name: string variable: string label: TypeWithI18N type: string _type: string form: string required: boolean default?: string tooltip?: TypeWithI18N show_on: { variable: string; value: string }[] options?: { label: TypeWithI18N value: string show_on: { variable: string; value: string }[] }[] placeholder?: TypeWithI18N min?: number max?: number llm_description?: string human_description?: TypeWithI18N multiple?: boolean url?: string scope?: string input_schema?: SchemaRoot } export const toType = (type: string) => { switch (type) { case 'string': return 'text-input' case 'number': return 'number-input' case 'boolean': return 'checkbox' default: return type } } export const triggerEventParametersToFormSchemas = (parameters: TriggerEventParameter[]) => { if (!parameters?.length) return [] return parameters.map((parameter) => { return { ...parameter, type: toType(parameter.type), _type: parameter.type, tooltip: parameter.description, } }) } export const toolParametersToFormSchemas = (parameters: ToolParameter[]): ToolFormSchema[] => { if (!parameters) return [] const formSchemas = parameters.map((parameter): ToolFormSchema => { return { ...parameter, variable: parameter.name, type: toType(parameter.type), _type: parameter.type, show_on: [], options: parameter.options?.map((option) => { return { ...option, show_on: [], } }), tooltip: parameter.human_description, } }) return formSchemas } export const toolCredentialToFormSchemas = ( parameters: ToolCredential[], ): ToolCredentialFormSchema[] => { if (!parameters) return [] const formSchemas = parameters.map((parameter): ToolCredentialFormSchema => { return { ...parameter, variable: parameter.name, type: toType(parameter.type), label: parameter.label, tooltip: parameter.help ?? undefined, show_on: [], options: parameter.options?.map((option) => { return { ...option, show_on: [], } }), } }) return formSchemas } export const addDefaultValue = ( value: Record, formSchemas: { variable: string; type: string; default?: unknown }[], ) => { const newValues = { ...value } formSchemas.forEach((formSchema) => { const itemValue = value[formSchema.variable] if ( formSchema.default !== undefined && (value === undefined || itemValue === null || itemValue === '' || itemValue === undefined) ) newValues[formSchema.variable] = formSchema.default // Fix: Convert boolean field values to proper boolean type if ( formSchema.type === 'boolean' && itemValue !== undefined && itemValue !== null && itemValue !== '' ) { if (typeof itemValue === 'string') newValues[formSchema.variable] = itemValue === 'true' || itemValue === '1' || itemValue === 'True' else if (typeof itemValue === 'number') newValues[formSchema.variable] = itemValue === 1 else if (typeof itemValue === 'boolean') newValues[formSchema.variable] = itemValue } }) return newValues } const correctInitialData = ( type: string, target: FormValueInput, defaultValue: unknown, ): FormValueInput => { if (type === 'text-input' || type === 'secret-input') target.type = 'mixed' if (type === 'boolean') { if (typeof defaultValue === 'string') target.value = defaultValue === 'true' || defaultValue === '1' if (typeof defaultValue === 'boolean') target.value = defaultValue if (typeof defaultValue === 'number') target.value = defaultValue === 1 } if (type === 'number-input') { if (typeof defaultValue === 'string' && defaultValue !== '') target.value = Number.parseFloat(defaultValue) } if (type === 'app-selector' || type === 'model-selector') target.value = defaultValue return target } export const generateFormValue = ( value: Record, formSchemas: { variable: string; default?: unknown; type: string }[], isReasoning = false, ) => { const newValues: Record = {} formSchemas.forEach((formSchema) => { const itemValue = value[formSchema.variable] if ( formSchema.default !== undefined && (value === undefined || itemValue === null || itemValue === '' || itemValue === undefined) ) { const defaultVal = formSchema.default if (isReasoning) { newValues[formSchema.variable] = { auto: 1, value: null } } else { const initialValue: FormValueInput = { type: 'constant', value: formSchema.default } newValues[formSchema.variable] = { value: correctInitialData(formSchema.type, initialValue, defaultVal), } } } }) return newValues } export const getPlainValue = (value: Record) => { const plainValue: Record = {} Object.keys(value).forEach((key) => { plainValue[key] = { ...(value[key]!.value as object), } }) return plainValue } export const getStructureValue = ( value: Record, ): Record => { const newValue: Record = {} Object.keys(value).forEach((key) => { newValue[key] = { value: value[key], } }) return newValue } export const getConfiguredValue = ( value: Record, formSchemas: { variable: string; type: string; default?: unknown }[], ) => { const newValues: Record = { ...value } formSchemas.forEach((formSchema) => { const itemValue = value[formSchema.variable] if ( formSchema.default !== undefined && (value === undefined || itemValue === null || itemValue === '' || itemValue === undefined) ) { const defaultVal = formSchema.default const initialValue: FormValueInput = { type: 'constant', value: typeof formSchema.default === 'string' ? formSchema.default.replace(/\n/g, '\\n') : formSchema.default, } newValues[formSchema.variable] = correctInitialData(formSchema.type, initialValue, defaultVal) } }) return newValues } const getVarKindType = (type: FormTypeEnum) => { if (type === FormTypeEnum.file || type === FormTypeEnum.files) return VarKindType.variable if ( type === FormTypeEnum.select || type === FormTypeEnum.checkbox || type === FormTypeEnum.textNumber ) return VarKindType.constant if (type === FormTypeEnum.textInput || type === FormTypeEnum.secretInput) return VarKindType.mixed } export const generateAgentToolValue = ( value: Record, formSchemas: { variable: string; default?: unknown; type: string }[], isReasoning = false, ) => { const newValues: Record = {} if (!isReasoning) { formSchemas.forEach((formSchema) => { const itemValue = value[formSchema.variable] newValues[formSchema.variable] = { value: { type: 'constant', value: itemValue?.value, }, } newValues[formSchema.variable]!.value = correctInitialData( formSchema.type, newValues[formSchema.variable]!.value!, itemValue?.value, ) }) } else { formSchemas.forEach((formSchema) => { const itemValue = value[formSchema.variable] if (itemValue?.auto === 1) { newValues[formSchema.variable] = { auto: 1, value: null, } } else { newValues[formSchema.variable] = { auto: 0, value: (itemValue?.value as FormValueInput) || { type: getVarKindType(formSchema.type as FormTypeEnum), value: null, }, } } }) } return newValues }