| 'invoke_from': invoke_from, | 'invoke_from': invoke_from, | ||||
| 'tool_invoke_from': tool_invoke_from, | 'tool_invoke_from': tool_invoke_from, | ||||
| }) | }) | ||||
| elif provider_type == 'api': | elif provider_type == 'api': | ||||
| if tenant_id is None: | if tenant_id is None: | ||||
| raise ValueError('tenant id is required for api provider') | raise ValueError('tenant id is required for api provider') | ||||
| init runtime parameter | init runtime parameter | ||||
| """ | """ | ||||
| parameter_value = parameters.get(parameter_rule.name) | parameter_value = parameters.get(parameter_rule.name) | ||||
| if not parameter_value: | |||||
| if not parameter_value and parameter_value != 0: | |||||
| # get default value | # get default value | ||||
| parameter_value = parameter_rule.default | parameter_value = parameter_rule.default | ||||
| if not parameter_value and parameter_rule.required: | if not parameter_value and parameter_rule.required: | ||||
| if cls._builtin_providers_loaded: | if cls._builtin_providers_loaded: | ||||
| yield from list(cls._builtin_providers.values()) | yield from list(cls._builtin_providers.values()) | ||||
| return | return | ||||
| with cls._builtin_provider_lock: | with cls._builtin_provider_lock: | ||||
| if cls._builtin_providers_loaded: | if cls._builtin_providers_loaded: | ||||
| yield from list(cls._builtin_providers.values()) | yield from list(cls._builtin_providers.values()) | ||||
| return | return | ||||
| yield from cls._list_builtin_providers() | yield from cls._list_builtin_providers() | ||||
| @classmethod | @classmethod | ||||
| def _list_builtin_providers(cls) -> Generator[BuiltinToolProviderController, None, None]: | def _list_builtin_providers(cls) -> Generator[BuiltinToolProviderController, None, None]: | ||||
| """ | """ | ||||
| controller = ApiToolProviderController.from_db( | controller = ApiToolProviderController.from_db( | ||||
| provider, | provider, | ||||
| ApiProviderAuthType.API_KEY if provider.credentials['auth_type'] == 'api_key' else | |||||
| ApiProviderAuthType.API_KEY if provider.credentials['auth_type'] == 'api_key' else | |||||
| ApiProviderAuthType.NONE | ApiProviderAuthType.NONE | ||||
| ) | ) | ||||
| controller.load_bundled_tools(provider.tools) | controller.load_bundled_tools(provider.tools) |
| onClick={(e) => { | onClick={(e) => { | ||||
| e.stopPropagation() | e.stopPropagation() | ||||
| setSelectedItem(null) | setSelectedItem(null) | ||||
| onSelect({ value: null }) | |||||
| }} | }} | ||||
| className="h-5 w-5 text-gray-400 cursor-pointer" | className="h-5 w-5 text-gray-400 cursor-pointer" | ||||
| aria-hidden="false" | aria-hidden="false" |
| validated={validatedSuccess} | validated={validatedSuccess} | ||||
| placeholder={placeholder?.[language] || placeholder?.en_US} | placeholder={placeholder?.[language] || placeholder?.en_US} | ||||
| disabled={disabed} | disabled={disabed} | ||||
| type={formSchema.type === FormTypeEnum.textNumber ? 'number' : 'text'} | |||||
| type={formSchema.type === FormTypeEnum.textNumber ? 'number' : formSchema.type === FormTypeEnum.secretInput ? 'password' : 'text'} | |||||
| {...(formSchema.type === FormTypeEnum.textNumber ? { min: (formSchema as CredentialFormSchemaNumberInput).min, max: (formSchema as CredentialFormSchemaNumberInput).max } : {})} | {...(formSchema.type === FormTypeEnum.textNumber ? { min: (formSchema as CredentialFormSchemaNumberInput).min, max: (formSchema as CredentialFormSchemaNumberInput).max } : {})} | ||||
| /> | /> | ||||
| {fieldMoreInfo?.(formSchema)} | {fieldMoreInfo?.(formSchema)} | ||||
| variable, | variable, | ||||
| label, | label, | ||||
| show_on, | show_on, | ||||
| required, | |||||
| } = formSchema as CredentialFormSchemaRadio | } = formSchema as CredentialFormSchemaRadio | ||||
| if (show_on.length && !show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value)) | if (show_on.length && !show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value)) | ||||
| <div className='flex items-center justify-between py-2 text-sm text-gray-900'> | <div className='flex items-center justify-between py-2 text-sm text-gray-900'> | ||||
| <div className='flex items-center space-x-2'> | <div className='flex items-center space-x-2'> | ||||
| <span className={cn(fieldLabelClassName, 'py-2 text-sm text-gray-900')}>{label[language] || label.en_US}</span> | <span className={cn(fieldLabelClassName, 'py-2 text-sm text-gray-900')}>{label[language] || label.en_US}</span> | ||||
| { | |||||
| required && ( | |||||
| <span className='ml-1 text-red-500'>*</span> | |||||
| ) | |||||
| } | |||||
| {tooltipContent} | {tooltipContent} | ||||
| </div> | </div> | ||||
| <Radio.Group | <Radio.Group | ||||
| className='flex items-center' | className='flex items-center' | ||||
| value={value[variable] ? 1 : 0} | |||||
| value={value[variable] === null ? undefined : (value[variable] ? 1 : 0)} | |||||
| onChange={val => handleFormChange(variable, val === 1)} | onChange={val => handleFormChange(variable, val === 1)} | ||||
| > | > | ||||
| <Radio value={1} className='!mr-1'>True</Radio> | <Radio value={1} className='!mr-1'>True</Radio> |
| onChange={e => onChange(e.target.value)} | onChange={e => onChange(e.target.value)} | ||||
| onBlur={e => toLimit(e.target.value)} | onBlur={e => toLimit(e.target.value)} | ||||
| onFocus={onFocus} | onFocus={onFocus} | ||||
| value={value || ''} | |||||
| value={value} | |||||
| disabled={disabled} | disabled={disabled} | ||||
| type={type} | type={type} | ||||
| min={min} | min={min} |