Browse Source

feat(ai): Tool prop discovery: Add the "Required" field

pull/1457/head
colin 2 days ago
parent
commit
e3bf283429
  1. 3
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/HttpAIToolProvider.cs
  2. 7
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/McpAIToolProvider.cs
  3. 29
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AIToolPropertyDescriptor.cs
  4. 10
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AbpAIToolsModule.cs
  5. 3
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/FunctionAIToolProvider.cs
  6. 2
      aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Tools/Dtos/AIToolDefinitionRecordGetPagedListInput.cs
  7. 1
      aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Tools/Dtos/AIToolPropertyDescriptorDto.cs
  8. 2
      aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Workspaces/Dtos/WorkspaceDefinitionRecordDto.cs
  9. 5
      aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/AbpAIManagementApplicationMappers.cs
  10. 17
      aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Tools/AIToolDefinitionAppService.cs
  11. 17
      aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Workspaces/WorkspaceDefinitionAppService.cs
  12. 10
      aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/en.json
  13. 10
      aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/zh-Hans.json

3
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<AbpAIResource>("HttpAITool:Endpoint")),
LocalizableString.Create<AbpAIResource>("HttpAITool:Endpoint"),
required: true),
AIToolPropertyDescriptor.CreateSelectProperty(
HttpAIToolDefinitionExtenssions.Method,
LocalizableString.Create<AbpAIResource>("HttpAITool:Method"),

7
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<AbpAIResource>("McpAITool:Endpoint")),
LocalizableString.Create<AbpAIResource>("McpAITool:Endpoint"),
required: true),
AIToolPropertyDescriptor.CreateDictionaryProperty(
McpAIToolDefinitionExtenssions.Headers,
LocalizableString.Create<AbpAIResource>("McpAITool:Headers")),
AIToolPropertyDescriptor.CreateSelectProperty(
McpAIToolDefinitionExtenssions.TransportMode,
LocalizableString.Create<AbpAIResource>("HttpAITool:TransportMode"),
LocalizableString.Create<AbpAIResource>("McpAITool:TransportMode"),
[
new("Auto Detect", HttpTransportMode.AutoDetect),
new("Streamable Http", HttpTransportMode.StreamableHttp),
new("Sse", HttpTransportMode.Sse),
],
LocalizableString.Create<AbpAIResource>("HttpAITool:TransportModeDesc")),
LocalizableString.Create<AbpAIResource>("McpAITool:TransportModeDesc")),
AIToolPropertyDescriptor.CreateNumberProperty(
McpAIToolDefinitionExtenssions.ConnectionTimeout,
LocalizableString.Create<AbpAIResource>("McpAITool:ConnectionTimeout"),

29
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<NameValue<object>> 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<NameValue<object>>();
}
@ -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<NameValue<object>> 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)
{

10
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)

3
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<AbpAIResource>("FunctionAITool:FunctionType"),
LocalizableString.Create<AbpAIResource>("FunctionAITool:FunctionTypeDesc")),
LocalizableString.Create<AbpAIResource>("FunctionAITool:FunctionTypeDesc"),
required: true),
AIToolPropertyDescriptor.CreateStringProperty(
FunctionAIToolDefinitionExtenssions.FunctionName,
LocalizableString.Create<AbpAIResource>("FunctionAITool:FunctionName"),

2
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; }
}

1
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<NameValue<object>> Options { get; set; }
public string DisplayName { get; set; }

2
aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Workspaces/Dtos/WorkspaceDefinitionRecordDto.cs

@ -35,7 +35,7 @@ public class WorkspaceDefinitionRecordDto : ExtensibleAuditedEntityDto<Guid>, IH
public bool IsSystem { get; set; }
public string[]? Tools { get; set; }
public string[] Tools { get; set; }
public string? StateCheckers { get; set; }

5
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(",") : [];
}
}

17
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)

17
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)

10
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"
}
}

10
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": "编辑工具"
}
}
Loading…
Cancel
Save