Browse Source

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

pull/1457/head
colin 6 months 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 [ return [
AIToolPropertyDescriptor.CreateStringProperty( AIToolPropertyDescriptor.CreateStringProperty(
HttpAIToolDefinitionExtenssions.Endpoint, HttpAIToolDefinitionExtenssions.Endpoint,
LocalizableString.Create<AbpAIResource>("HttpAITool:Endpoint")), LocalizableString.Create<AbpAIResource>("HttpAITool:Endpoint"),
required: true),
AIToolPropertyDescriptor.CreateSelectProperty( AIToolPropertyDescriptor.CreateSelectProperty(
HttpAIToolDefinitionExtenssions.Method, HttpAIToolDefinitionExtenssions.Method,
LocalizableString.Create<AbpAIResource>("HttpAITool: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 [ return [
AIToolPropertyDescriptor.CreateStringProperty( AIToolPropertyDescriptor.CreateStringProperty(
McpAIToolDefinitionExtenssions.Endpoint, McpAIToolDefinitionExtenssions.Endpoint,
LocalizableString.Create<AbpAIResource>("McpAITool:Endpoint")), LocalizableString.Create<AbpAIResource>("McpAITool:Endpoint"),
required: true),
AIToolPropertyDescriptor.CreateDictionaryProperty( AIToolPropertyDescriptor.CreateDictionaryProperty(
McpAIToolDefinitionExtenssions.Headers, McpAIToolDefinitionExtenssions.Headers,
LocalizableString.Create<AbpAIResource>("McpAITool:Headers")), LocalizableString.Create<AbpAIResource>("McpAITool:Headers")),
AIToolPropertyDescriptor.CreateSelectProperty( AIToolPropertyDescriptor.CreateSelectProperty(
McpAIToolDefinitionExtenssions.TransportMode, McpAIToolDefinitionExtenssions.TransportMode,
LocalizableString.Create<AbpAIResource>("HttpAITool:TransportMode"), LocalizableString.Create<AbpAIResource>("McpAITool:TransportMode"),
[ [
new("Auto Detect", HttpTransportMode.AutoDetect), new("Auto Detect", HttpTransportMode.AutoDetect),
new("Streamable Http", HttpTransportMode.StreamableHttp), new("Streamable Http", HttpTransportMode.StreamableHttp),
new("Sse", HttpTransportMode.Sse), new("Sse", HttpTransportMode.Sse),
], ],
LocalizableString.Create<AbpAIResource>("HttpAITool:TransportModeDesc")), LocalizableString.Create<AbpAIResource>("McpAITool:TransportModeDesc")),
AIToolPropertyDescriptor.CreateNumberProperty( AIToolPropertyDescriptor.CreateNumberProperty(
McpAIToolDefinitionExtenssions.ConnectionTimeout, McpAIToolDefinitionExtenssions.ConnectionTimeout,
LocalizableString.Create<AbpAIResource>("McpAITool: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 class AIToolPropertyDescriptor
{ {
public string Name { get; } public string Name { get; }
public bool Required { get; }
public PropertyValueType ValueType { get; } public PropertyValueType ValueType { get; }
public List<NameValue<object>> Options { get; } public List<NameValue<object>> Options { get; }
public ILocalizableString DisplayName { get; } public ILocalizableString DisplayName { get; }
@ -24,12 +25,14 @@ public class AIToolPropertyDescriptor
string name, string name,
PropertyValueType valueType, PropertyValueType valueType,
ILocalizableString displayName, ILocalizableString displayName,
ILocalizableString? description = null) ILocalizableString? description = null,
bool required = false)
{ {
Name = name; Name = name;
ValueType = valueType; ValueType = valueType;
DisplayName = displayName; DisplayName = displayName;
Description = description; Description = description;
Required = required;
Options = new List<NameValue<object>>(); Options = new List<NameValue<object>>();
} }
@ -37,37 +40,43 @@ public class AIToolPropertyDescriptor
public static AIToolPropertyDescriptor CreateStringProperty( public static AIToolPropertyDescriptor CreateStringProperty(
string name, string name,
ILocalizableString displayName, ILocalizableString displayName,
ILocalizableString? description = null) ILocalizableString? description = null,
bool required = false)
{ {
return new AIToolPropertyDescriptor( return new AIToolPropertyDescriptor(
name, name,
PropertyValueType.String, PropertyValueType.String,
displayName, displayName,
description); description,
required);
} }
public static AIToolPropertyDescriptor CreateNumberProperty( public static AIToolPropertyDescriptor CreateNumberProperty(
string name, string name,
ILocalizableString displayName, ILocalizableString displayName,
ILocalizableString? description = null) ILocalizableString? description = null,
bool required = false)
{ {
return new AIToolPropertyDescriptor( return new AIToolPropertyDescriptor(
name, name,
PropertyValueType.Number, PropertyValueType.Number,
displayName, displayName,
description); description,
required);
} }
public static AIToolPropertyDescriptor CreateBoolProperty( public static AIToolPropertyDescriptor CreateBoolProperty(
string name, string name,
ILocalizableString displayName, ILocalizableString displayName,
ILocalizableString? description = null) ILocalizableString? description = null,
bool required = false)
{ {
return new AIToolPropertyDescriptor( return new AIToolPropertyDescriptor(
name, name,
PropertyValueType.Boolean, PropertyValueType.Boolean,
displayName, displayName,
description); description,
required);
} }
public static AIToolPropertyDescriptor CreateDictionaryProperty( public static AIToolPropertyDescriptor CreateDictionaryProperty(
@ -86,13 +95,15 @@ public class AIToolPropertyDescriptor
string name, string name,
ILocalizableString displayName, ILocalizableString displayName,
List<NameValue<object>> options, List<NameValue<object>> options,
ILocalizableString? description = null) ILocalizableString? description = null,
bool required = false)
{ {
var propertyDescriptor = new AIToolPropertyDescriptor( var propertyDescriptor = new AIToolPropertyDescriptor(
name, name,
PropertyValueType.Select, PropertyValueType.Select,
displayName, displayName,
description); description,
required);
foreach (var option in options) 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))); 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); var aiTools = await aiToolFactory.CreateTool(aiToolDefinition);
if (aiTools.Length > 0) 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( AIToolPropertyDescriptor.CreateStringProperty(
FunctionAIToolDefinitionExtenssions.FunctionType, FunctionAIToolDefinitionExtenssions.FunctionType,
LocalizableString.Create<AbpAIResource>("FunctionAITool:FunctionType"), LocalizableString.Create<AbpAIResource>("FunctionAITool:FunctionType"),
LocalizableString.Create<AbpAIResource>("FunctionAITool:FunctionTypeDesc")), LocalizableString.Create<AbpAIResource>("FunctionAITool:FunctionTypeDesc"),
required: true),
AIToolPropertyDescriptor.CreateStringProperty( AIToolPropertyDescriptor.CreateStringProperty(
FunctionAIToolDefinitionExtenssions.FunctionName, FunctionAIToolDefinitionExtenssions.FunctionName,
LocalizableString.Create<AbpAIResource>("FunctionAITool: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 string? Filter { get; set; }
public bool? IsEnabled { get; set; }
public string? Provider { 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 class AIToolPropertyDescriptorDto
{ {
public string Name { get; set; } public string Name { get; set; }
public bool Required { get; set; }
public string ValueType { get; set; } public string ValueType { get; set; }
public List<NameValue<object>> Options { get; set; } public List<NameValue<object>> Options { get; set; }
public string DisplayName { 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 bool IsSystem { get; set; }
public string[]? Tools { get; set; } public string[] Tools { get; set; }
public string? StateCheckers { 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;
using LINGYUN.Abp.AIManagement.Workspaces.Dtos; using LINGYUN.Abp.AIManagement.Workspaces.Dtos;
using Riok.Mapperly.Abstractions; using Riok.Mapperly.Abstractions;
using System;
using Volo.Abp.Mapperly; using Volo.Abp.Mapperly;
using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending;
@ -21,9 +22,9 @@ public partial class WorkspaceDefinitionRecordToWorkspaceDefinitionRecordDtoMapp
public override partial void Map(WorkspaceDefinitionRecord source, WorkspaceDefinitionRecordDto destination); public override partial void Map(WorkspaceDefinitionRecord source, WorkspaceDefinitionRecordDto destination);
[UserMapping(Default = false)] [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.Dtos;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
namespace LINGYUN.Abp.AIManagement.Tools; namespace LINGYUN.Abp.AIManagement.Tools;
public class AIToolDefinitionAppService : public class AIToolDefinitionAppService :
@ -62,6 +63,7 @@ public class AIToolDefinitionAppService :
{ {
Name = prop.Name, Name = prop.Name,
Options = prop.Options, Options = prop.Options,
Required = prop.Required,
ValueType = prop.ValueType.ToString(), ValueType = prop.ValueType.ToString(),
DisplayName = prop.DisplayName.Localize(StringLocalizerFactory), DisplayName = prop.DisplayName.Localize(StringLocalizerFactory),
}; };
@ -97,6 +99,7 @@ public class AIToolDefinitionAppService :
var queryable = await base.CreateFilteredQueryAsync(input); var queryable = await base.CreateFilteredQueryAsync(input);
return queryable return queryable
.WhereIf(input.IsEnabled.HasValue, x => x.IsEnabled == input.IsEnabled)
.WhereIf(!input.Provider.IsNullOrWhiteSpace(), x => x.Provider == input.Provider) .WhereIf(!input.Provider.IsNullOrWhiteSpace(), x => x.Provider == input.Provider)
.WhereIf(!input.Filter.IsNullOrWhiteSpace(), x => x.Provider.Contains(input.Filter!) || .WhereIf(!input.Filter.IsNullOrWhiteSpace(), x => x.Provider.Contains(input.Filter!) ||
x.Name.Contains(input.Filter!) || x.Description!.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); throw new AIToolAlreadyExistsException(createInput.Name);
} }
var record = new AIToolDefinitionRecord( var entity = new AIToolDefinitionRecord(
GuidGenerator.Create(), GuidGenerator.Create(),
createInput.Name, createInput.Name,
createInput.Provider, createInput.Provider,
@ -120,7 +123,17 @@ public class AIToolDefinitionAppService :
IsGlobal = createInput.IsGlobal, 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) 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.Dtos;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Security.Encryption; using Volo.Abp.Security.Encryption;
namespace LINGYUN.Abp.AIManagement.Workspaces; namespace LINGYUN.Abp.AIManagement.Workspaces;
@ -101,7 +102,7 @@ public class WorkspaceDefinitionAppService :
throw new WorkspaceAlreadyExistsException(createInput.Name); throw new WorkspaceAlreadyExistsException(createInput.Name);
} }
var record = new WorkspaceDefinitionRecord( var entity = new WorkspaceDefinitionRecord(
GuidGenerator.Create(), GuidGenerator.Create(),
createInput.Name, createInput.Name,
createInput.Provider, createInput.Provider,
@ -123,10 +124,20 @@ public class WorkspaceDefinitionAppService :
if (!createInput.ApiKey.IsNullOrWhiteSpace()) if (!createInput.ApiKey.IsNullOrWhiteSpace())
{ {
var encryptApiKey = StringEncryptionService.Encrypt(createInput.ApiKey); 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) 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", "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.", "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: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": "存在惩罚", "DisplayName:PresencePenalty": "存在惩罚",
"Description:PresencePenalty": "介于 -2.0 和 2.0 之间的数字.如果该值为正,那么新 token 会根据其是否已在已有文本中出现受到相应的惩罚,从而增加模型谈论新主题的可能性.", "Description:PresencePenalty": "介于 -2.0 和 2.0 之间的数字.如果该值为正,那么新 token 会根据其是否已在已有文本中出现受到相应的惩罚,从而增加模型谈论新主题的可能性.",
"DisplayName:IsEnabled": "启用", "DisplayName:IsEnabled": "启用",
"DisplayName:Workspace": "工作区" "DisplayName:Workspace": "工作区",
"DisplayName:Tools": "工具列表",
"DisplayName:ToolProvider": "工具提供者",
"DisplayName:IsGlobal": "全局工具",
"Description:IsGlobal": "全局工具在所有工作区均可用, 可能会造成Token偏高, 请谨慎选择!",
"Tools": "工具列表",
"Propertites": "属性",
"Tools:New": "新工具",
"Tools:Edit": "编辑工具"
} }
} }
Loading…
Cancel
Save