diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/HttpAIToolProvider.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/HttpAIToolProvider.cs index dfb2455aa..6eba86317 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/HttpAIToolProvider.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/HttpAIToolProvider.cs @@ -24,7 +24,8 @@ public class HttpAIToolProvider : IAIToolProvider, ITransientDependency return [ AIToolPropertyDescriptor.CreateStringProperty( HttpAIToolDefinitionExtenssions.Endpoint, - LocalizableString.Create("HttpAITool:Endpoint")), + LocalizableString.Create("HttpAITool:Endpoint"), + required: true), AIToolPropertyDescriptor.CreateSelectProperty( HttpAIToolDefinitionExtenssions.Method, LocalizableString.Create("HttpAITool:Method"), diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/McpAIToolProvider.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/McpAIToolProvider.cs index b56abbd34..29b905a7d 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/McpAIToolProvider.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/McpAIToolProvider.cs @@ -32,19 +32,20 @@ public class McpAIToolProvider : IAIToolProvider, ITransientDependency return [ AIToolPropertyDescriptor.CreateStringProperty( McpAIToolDefinitionExtenssions.Endpoint, - LocalizableString.Create("McpAITool:Endpoint")), + LocalizableString.Create("McpAITool:Endpoint"), + required: true), AIToolPropertyDescriptor.CreateDictionaryProperty( McpAIToolDefinitionExtenssions.Headers, LocalizableString.Create("McpAITool:Headers")), AIToolPropertyDescriptor.CreateSelectProperty( McpAIToolDefinitionExtenssions.TransportMode, - LocalizableString.Create("HttpAITool:TransportMode"), + LocalizableString.Create("McpAITool:TransportMode"), [ new("Auto Detect", HttpTransportMode.AutoDetect), new("Streamable Http", HttpTransportMode.StreamableHttp), new("Sse", HttpTransportMode.Sse), ], - LocalizableString.Create("HttpAITool:TransportModeDesc")), + LocalizableString.Create("McpAITool:TransportModeDesc")), AIToolPropertyDescriptor.CreateNumberProperty( McpAIToolDefinitionExtenssions.ConnectionTimeout, LocalizableString.Create("McpAITool:ConnectionTimeout"), diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AIToolPropertyDescriptor.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AIToolPropertyDescriptor.cs index d3f44c9d1..9d0194509 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AIToolPropertyDescriptor.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AIToolPropertyDescriptor.cs @@ -16,6 +16,7 @@ public enum PropertyValueType public class AIToolPropertyDescriptor { public string Name { get; } + public bool Required { get; } public PropertyValueType ValueType { get; } public List> Options { get; } public ILocalizableString DisplayName { get; } @@ -24,12 +25,14 @@ public class AIToolPropertyDescriptor string name, PropertyValueType valueType, ILocalizableString displayName, - ILocalizableString? description = null) + ILocalizableString? description = null, + bool required = false) { Name = name; ValueType = valueType; DisplayName = displayName; Description = description; + Required = required; Options = new List>(); } @@ -37,37 +40,43 @@ public class AIToolPropertyDescriptor public static AIToolPropertyDescriptor CreateStringProperty( string name, ILocalizableString displayName, - ILocalizableString? description = null) + ILocalizableString? description = null, + bool required = false) { return new AIToolPropertyDescriptor( name, PropertyValueType.String, displayName, - description); + description, + required); } public static AIToolPropertyDescriptor CreateNumberProperty( string name, ILocalizableString displayName, - ILocalizableString? description = null) + ILocalizableString? description = null, + bool required = false) { return new AIToolPropertyDescriptor( name, PropertyValueType.Number, displayName, - description); + description, + required); } public static AIToolPropertyDescriptor CreateBoolProperty( string name, ILocalizableString displayName, - ILocalizableString? description = null) + ILocalizableString? description = null, + bool required = false) { return new AIToolPropertyDescriptor( name, PropertyValueType.Boolean, displayName, - description); + description, + required); } public static AIToolPropertyDescriptor CreateDictionaryProperty( @@ -86,13 +95,15 @@ public class AIToolPropertyDescriptor string name, ILocalizableString displayName, List> options, - ILocalizableString? description = null) + ILocalizableString? description = null, + bool required = false) { var propertyDescriptor = new AIToolPropertyDescriptor( name, PropertyValueType.Select, displayName, - description); + description, + required); foreach (var option in options) { diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AbpAIToolsModule.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AbpAIToolsModule.cs index 553362fd5..1a10266eb 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AbpAIToolsModule.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AbpAIToolsModule.cs @@ -45,12 +45,16 @@ public class AbpAIToolsModule : AbpModule { useAIToolDefinitions.AddRange(aiToolDefinitions.Where(aiTool => workspace.Tools.Contains(aiTool.Name))); } - else + + foreach (var globalAIToolDefinition in aiToolDefinitions.Where(aiTool => aiTool.IsGlobal)) { - useAIToolDefinitions.AddRange(aiToolDefinitions.Where(aiTool => aiTool.IsGlobal)); + if (!useAIToolDefinitions.Any(tool => tool.Name == globalAIToolDefinition.Name)) + { + useAIToolDefinitions.Add(globalAIToolDefinition); + } } - foreach (var aiToolDefinition in aiToolDefinitions) + foreach (var aiToolDefinition in useAIToolDefinitions) { var aiTools = await aiToolFactory.CreateTool(aiToolDefinition); if (aiTools.Length > 0) diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/FunctionAIToolProvider.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/FunctionAIToolProvider.cs index a1b584dfb..af9b3335c 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/FunctionAIToolProvider.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/FunctionAIToolProvider.cs @@ -26,7 +26,8 @@ public class FunctionAIToolProvider : IAIToolProvider, ITransientDependency AIToolPropertyDescriptor.CreateStringProperty( FunctionAIToolDefinitionExtenssions.FunctionType, LocalizableString.Create("FunctionAITool:FunctionType"), - LocalizableString.Create("FunctionAITool:FunctionTypeDesc")), + LocalizableString.Create("FunctionAITool:FunctionTypeDesc"), + required: true), AIToolPropertyDescriptor.CreateStringProperty( FunctionAIToolDefinitionExtenssions.FunctionName, LocalizableString.Create("FunctionAITool:FunctionName"), diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Tools/Dtos/AIToolDefinitionRecordGetPagedListInput.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Tools/Dtos/AIToolDefinitionRecordGetPagedListInput.cs index fb28e286f..f19a6b3d6 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Tools/Dtos/AIToolDefinitionRecordGetPagedListInput.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Tools/Dtos/AIToolDefinitionRecordGetPagedListInput.cs @@ -8,5 +8,7 @@ public class AIToolDefinitionRecordGetPagedListInput : PagedAndSortedResultReque { public string? Filter { get; set; } + public bool? IsEnabled { get; set; } + public string? Provider { get; set; } } diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Tools/Dtos/AIToolPropertyDescriptorDto.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Tools/Dtos/AIToolPropertyDescriptorDto.cs index 9c914a812..4874482c3 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Tools/Dtos/AIToolPropertyDescriptorDto.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Tools/Dtos/AIToolPropertyDescriptorDto.cs @@ -5,6 +5,7 @@ namespace LINGYUN.Abp.AIManagement.Tools.Dtos; public class AIToolPropertyDescriptorDto { public string Name { get; set; } + public bool Required { get; set; } public string ValueType { get; set; } public List> Options { get; set; } public string DisplayName { get; set; } diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Workspaces/Dtos/WorkspaceDefinitionRecordDto.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Workspaces/Dtos/WorkspaceDefinitionRecordDto.cs index 455ce4e2a..140959dc7 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Workspaces/Dtos/WorkspaceDefinitionRecordDto.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Workspaces/Dtos/WorkspaceDefinitionRecordDto.cs @@ -35,7 +35,7 @@ public class WorkspaceDefinitionRecordDto : ExtensibleAuditedEntityDto, IH public bool IsSystem { get; set; } - public string[]? Tools { get; set; } + public string[] Tools { get; set; } public string? StateCheckers { get; set; } diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/AbpAIManagementApplicationMappers.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/AbpAIManagementApplicationMappers.cs index bad789db5..dc0e6377b 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/AbpAIManagementApplicationMappers.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/AbpAIManagementApplicationMappers.cs @@ -5,6 +5,7 @@ using LINGYUN.Abp.AIManagement.Tools.Dtos; using LINGYUN.Abp.AIManagement.Workspaces; using LINGYUN.Abp.AIManagement.Workspaces.Dtos; using Riok.Mapperly.Abstractions; +using System; using Volo.Abp.Mapperly; using Volo.Abp.ObjectExtending; @@ -21,9 +22,9 @@ public partial class WorkspaceDefinitionRecordToWorkspaceDefinitionRecordDtoMapp public override partial void Map(WorkspaceDefinitionRecord source, WorkspaceDefinitionRecordDto destination); [UserMapping(Default = false)] - private static string[]? ConvertTools(WorkspaceDefinitionRecord record) + private static string[] ConvertTools(WorkspaceDefinitionRecord record) { - return record.Tools?.Split(","); + return !record.Tools.IsNullOrWhiteSpace() ? record.Tools.Split(",") : []; } } diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Tools/AIToolDefinitionAppService.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Tools/AIToolDefinitionAppService.cs index 519951788..c4ebf5987 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Tools/AIToolDefinitionAppService.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Tools/AIToolDefinitionAppService.cs @@ -12,6 +12,7 @@ using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Data; +using Volo.Abp.Domain.Entities; namespace LINGYUN.Abp.AIManagement.Tools; public class AIToolDefinitionAppService : @@ -62,6 +63,7 @@ public class AIToolDefinitionAppService : { Name = prop.Name, Options = prop.Options, + Required = prop.Required, ValueType = prop.ValueType.ToString(), DisplayName = prop.DisplayName.Localize(StringLocalizerFactory), }; @@ -97,6 +99,7 @@ public class AIToolDefinitionAppService : var queryable = await base.CreateFilteredQueryAsync(input); return queryable + .WhereIf(input.IsEnabled.HasValue, x => x.IsEnabled == input.IsEnabled) .WhereIf(!input.Provider.IsNullOrWhiteSpace(), x => x.Provider == input.Provider) .WhereIf(!input.Filter.IsNullOrWhiteSpace(), x => x.Provider.Contains(input.Filter!) || x.Name.Contains(input.Filter!) || x.Description!.Contains(input.Filter!)); @@ -109,7 +112,7 @@ public class AIToolDefinitionAppService : throw new AIToolAlreadyExistsException(createInput.Name); } - var record = new AIToolDefinitionRecord( + var entity = new AIToolDefinitionRecord( GuidGenerator.Create(), createInput.Name, createInput.Provider, @@ -120,7 +123,17 @@ public class AIToolDefinitionAppService : IsGlobal = createInput.IsGlobal, }; - return record; + if (!entity.HasSameExtraProperties(createInput)) + { + entity.ExtraProperties.Clear(); + + foreach (var property in createInput.ExtraProperties) + { + entity.ExtraProperties.Add(property.Key, property.Value); + } + } + + return entity; } protected override void MapToEntity(AIToolDefinitionRecordUpdateDto updateInput, AIToolDefinitionRecord entity) diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Workspaces/WorkspaceDefinitionAppService.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Workspaces/WorkspaceDefinitionAppService.cs index d1b046c72..f4337fb02 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Workspaces/WorkspaceDefinitionAppService.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Workspaces/WorkspaceDefinitionAppService.cs @@ -13,6 +13,7 @@ using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Data; +using Volo.Abp.Domain.Entities; using Volo.Abp.Security.Encryption; namespace LINGYUN.Abp.AIManagement.Workspaces; @@ -101,7 +102,7 @@ public class WorkspaceDefinitionAppService : throw new WorkspaceAlreadyExistsException(createInput.Name); } - var record = new WorkspaceDefinitionRecord( + var entity = new WorkspaceDefinitionRecord( GuidGenerator.Create(), createInput.Name, createInput.Provider, @@ -123,10 +124,20 @@ public class WorkspaceDefinitionAppService : if (!createInput.ApiKey.IsNullOrWhiteSpace()) { var encryptApiKey = StringEncryptionService.Encrypt(createInput.ApiKey); - record.SetApiKey(encryptApiKey, createInput.ApiBaseUrl); + entity.SetApiKey(encryptApiKey, createInput.ApiBaseUrl); } - return record; + if (!entity.HasSameExtraProperties(createInput)) + { + entity.ExtraProperties.Clear(); + + foreach (var property in createInput.ExtraProperties) + { + entity.ExtraProperties.Add(property.Key, property.Value); + } + } + + return entity; } protected override void MapToEntity(WorkspaceDefinitionRecordUpdateDto updateInput, WorkspaceDefinitionRecord entity) diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/en.json b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/en.json index 0651e8971..ee4925d27 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/en.json +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/en.json @@ -51,6 +51,14 @@ "DisplayName:PresencePenalty": "Presence Penalty", "Description:PresencePenalty": "Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics.", "DisplayName:IsEnabled": "Is Enabled", - "DisplayName:Workspace": "Workspace" + "DisplayName:Workspace": "Workspace", + "DisplayName:Tools": "Tools", + "DisplayName:ToolProvider": "Tool Provider", + "DisplayName:IsGlobal": "Is Global", + "Description:IsGlobal": "The global tool is available in all workspaces and may result in a higher token value. Please exercise caution when choosing!", + "Tools": "Tools", + "Propertites": "Propertites", + "Tools:New": "New Tool", + "Tools:Edit": "Edit Tool" } } \ No newline at end of file diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/zh-Hans.json b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/zh-Hans.json index c1bf535de..f840feb14 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/zh-Hans.json +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/zh-Hans.json @@ -51,6 +51,14 @@ "DisplayName:PresencePenalty": "存在惩罚", "Description:PresencePenalty": "介于 -2.0 和 2.0 之间的数字.如果该值为正,那么新 token 会根据其是否已在已有文本中出现受到相应的惩罚,从而增加模型谈论新主题的可能性.", "DisplayName:IsEnabled": "启用", - "DisplayName:Workspace": "工作区" + "DisplayName:Workspace": "工作区", + "DisplayName:Tools": "工具列表", + "DisplayName:ToolProvider": "工具提供者", + "DisplayName:IsGlobal": "全局工具", + "Description:IsGlobal": "全局工具在所有工作区均可用, 可能会造成Token偏高, 请谨慎选择!", + "Tools": "工具列表", + "Propertites": "属性", + "Tools:New": "新工具", + "Tools:Edit": "编辑工具" } } \ No newline at end of file