Browse Source

feat(ai): Add tool support for property discovery interface

pull/1457/head
colin 1 day ago
parent
commit
d8ed5fd1b2
  1. 14
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/HttpAIToolDefinitionExtenssions.cs
  2. 26
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/HttpAIToolProvider.cs
  3. 6
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/Localization/Resources/en.json
  4. 6
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/Localization/Resources/zh-Hans.json
  5. 5
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN.Abp.AI.Tools.Mcp.csproj
  6. 14
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/Localization/Resources/en.json
  7. 14
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/Localization/Resources/zh-Hans.json
  8. 12
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/McpAIToolDefinitionExtenssions.cs
  9. 35
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/McpAIToolProvider.cs
  10. 109
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AIToolPropertyDescriptor.cs
  11. 13
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/FunctionAIToolDefinitionExtenssions.cs
  12. 17
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/FunctionAIToolProvider.cs
  13. 2
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/IAIToolProvider.cs
  14. 6
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/Localization/Resources/en.json
  15. 6
      aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/Localization/Resources/zh-Hans.json

14
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/HttpAIToolDefinitionExtenssions.cs

@ -5,15 +5,15 @@ using Volo.Abp;
namespace LINGYUN.Abp.AI.Tools.Http;
public static class HttpAIToolDefinitionExtenssions
{
private const string RemoteService = "RemoteService";
private const string RemoteController = "RemoteController";
private const string RemoteMethod = "RemoteMethod";
public const string RemoteService = "RemoteService";
public const string RemoteController = "RemoteController";
public const string RemoteMethod = "RemoteMethod";
private const string Endpoint = "HttpEndpoint";
private const string Method = "HttpMethod";
private const string Headers = "HttpHeaders";
public const string Endpoint = "HttpEndpoint";
public const string Method = "HttpMethod";
public const string Headers = "HttpHeaders";
private const string CurrentAccessToken = "UseHttpCurrentAccessToken";
public const string CurrentAccessToken = "UseHttpCurrentAccessToken";
public static AIToolDefinition UseHttpCurrentAccessToken(this AIToolDefinition definition, bool useCurrentAccessToken = true)
{

26
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/HttpAIToolProvider.cs

@ -1,9 +1,12 @@
using Microsoft.Extensions.AI;
using LINGYUN.Abp.AI.Localization;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.AI.Tools.Http;
public class HttpAIToolProvider : IAIToolProvider, ITransientDependency
@ -16,6 +19,27 @@ public class HttpAIToolProvider : IAIToolProvider, ITransientDependency
ServiceProvider = serviceProvider;
}
public virtual AIToolPropertyDescriptor[] GetPropertites()
{
return [
AIToolPropertyDescriptor.CreateStringProperty(
HttpAIToolDefinitionExtenssions.Endpoint,
LocalizableString.Create<AbpAIResource>("HttpAITool:Endpoint")),
AIToolPropertyDescriptor.CreateSelectProperty(
HttpAIToolDefinitionExtenssions.Method,
LocalizableString.Create<AbpAIResource>("HttpAITool:Method"),
[
new(HttpMethod.Get.Method, HttpMethod.Get.Method),
new(HttpMethod.Post.Method, HttpMethod.Post.Method),
]),
AIToolPropertyDescriptor.CreateDictionaryProperty(
HttpAIToolDefinitionExtenssions.Headers,
LocalizableString.Create<AbpAIResource>("HttpAITool:Headers")),
AIToolPropertyDescriptor.CreateBoolProperty(
HttpAIToolDefinitionExtenssions.CurrentAccessToken,
LocalizableString.Create<AbpAIResource>("HttpAITool:CurrentAccessToken"))];
}
public virtual Task<AITool[]> CreateToolsAsync(AIToolDefinition definition)
{
string? description = null;

6
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/Localization/Resources/en.json

@ -1,6 +1,10 @@
{
"culture": "en",
"texts": {
"Tools:GetApplicationConfiguration": "Get Application Configuration"
"Tools:GetApplicationConfiguration": "Get Application Configuration",
"HttpAITool:Endpoint": "Endpoint",
"HttpAITool:Method": "Method",
"HttpAITool:Headers": "Headers",
"HttpAITool:CurrentAccessToken": "Use the current user token"
}
}

6
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/Localization/Resources/zh-Hans.json

@ -1,6 +1,10 @@
{
"culture": "zh-Hans",
"texts": {
"Tools:GetApplicationConfiguration": "获取应用程序配置"
"Tools:GetApplicationConfiguration": "获取应用程序配置",
"HttpAITool:Endpoint": "请求地址",
"HttpAITool:Method": "请求方法",
"HttpAITool:Headers": "请求头",
"HttpAITool:CurrentAccessToken": "使用当前用户Token"
}
}

5
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN.Abp.AI.Tools.Mcp.csproj

@ -14,6 +14,11 @@
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<None Remove="LINGYUN\Abp\AI\Tools\Mcp\Localization\Resources\*.json" />
<EmbeddedResource Include="LINGYUN\Abp\AI\Tools\Mcp\Localization\Resources\*.json" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Http.Client" />
<PackageReference Include="ModelContextProtocol" />

14
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/Localization/Resources/en.json

@ -0,0 +1,14 @@
{
"culture": "en",
"texts": {
"McpAITool:Endpoint": "Endpoint",
"McpAITool:Headers": "Headers",
"McpAITool:TransportMode": "Transport Mode",
"McpAITool:TransportModeDesc": "The transport mode to use for the connection. The default is: Auto Detect.",
"McpAITool:ConnectionTimeout": "Connection Timeout",
"McpAITool:ConnectionTimeoutDesc": "The timeout used to establish the initial connection to the SSE server. The default is 30 seconds.",
"McpAITool:MaxReconnectionAttempts": "Max Reconnection Attempts",
"McpAITool:MaxReconnectionAttemptsDesc": "The maximum number of reconnection attempts. The default is 5.",
"McpAITool:CurrentAccessToken": "Use the current user token"
}
}

14
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/Localization/Resources/zh-Hans.json

@ -0,0 +1,14 @@
{
"culture": "zh-Hans",
"texts": {
"McpAITool:Endpoint": "请求地址",
"McpAITool:Headers": "请求头",
"McpAITool:TransportMode": "传输方式",
"McpAITool:TransportModeDesc": "连接所采用的传输方式, 默认: Auto Detect.",
"McpAITool:ConnectionTimeout": "超时时间",
"McpAITool:ConnectionTimeoutDesc": "用于建立与 SSE 服务器初始连接的超时时间, 默认: 30秒.",
"McpAITool:MaxReconnectionAttempts": "最大重连次数",
"McpAITool:MaxReconnectionAttemptsDesc": "最大重连次数, 默认: 5次.",
"McpAITool:CurrentAccessToken": "使用当前用户Token"
}
}

12
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/McpAIToolDefinitionExtenssions.cs

@ -6,12 +6,12 @@ using Volo.Abp;
namespace LINGYUN.Abp.AI.Tools.Mcp;
public static class McpAIToolDefinitionExtenssions
{
private const string Endpoint = "McpEndpoint";
private const string Headers = "McpHeaders";
private const string TransportMode = "McpTransportMode";
private const string ConnectionTimeout = "McpConnectionTimeout";
private const string MaxReconnectionAttempts = "McpMaxReconnectionAttempts";
private const string CurrentAccessToken = "UseMcpCurrentAccessToken";
public const string Endpoint = "McpEndpoint";
public const string Headers = "McpHeaders";
public const string TransportMode = "McpTransportMode";
public const string ConnectionTimeout = "McpConnectionTimeout";
public const string MaxReconnectionAttempts = "McpMaxReconnectionAttempts";
public const string CurrentAccessToken = "UseMcpCurrentAccessToken";
public static AIToolDefinition UseMcpCurrentAccessToken(this AIToolDefinition definition, bool useCurrentAccessToken = true)
{

35
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Mcp/LINGYUN/Abp/AI/Tools/Mcp/McpAIToolProvider.cs

@ -1,4 +1,5 @@
using Microsoft.Extensions.AI;
using LINGYUN.Abp.AI.Localization;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
using ModelContextProtocol.Client;
using System;
@ -8,6 +9,7 @@ using System.Net.Http;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.Client.Authentication;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.AI.Tools.Mcp;
public class McpAIToolProvider : IAIToolProvider, ITransientDependency
@ -25,6 +27,37 @@ public class McpAIToolProvider : IAIToolProvider, ITransientDependency
HttpClientFactory = httpClientFactory;
}
public virtual AIToolPropertyDescriptor[] GetPropertites()
{
return [
AIToolPropertyDescriptor.CreateStringProperty(
McpAIToolDefinitionExtenssions.Endpoint,
LocalizableString.Create<AbpAIResource>("McpAITool:Endpoint")),
AIToolPropertyDescriptor.CreateDictionaryProperty(
McpAIToolDefinitionExtenssions.Headers,
LocalizableString.Create<AbpAIResource>("McpAITool:Headers")),
AIToolPropertyDescriptor.CreateSelectProperty(
McpAIToolDefinitionExtenssions.TransportMode,
LocalizableString.Create<AbpAIResource>("HttpAITool:TransportMode"),
[
new("Auto Detect", HttpTransportMode.AutoDetect),
new("Streamable Http", HttpTransportMode.StreamableHttp),
new("Sse", HttpTransportMode.Sse),
],
LocalizableString.Create<AbpAIResource>("HttpAITool:TransportModeDesc")),
AIToolPropertyDescriptor.CreateNumberProperty(
McpAIToolDefinitionExtenssions.ConnectionTimeout,
LocalizableString.Create<AbpAIResource>("McpAITool:ConnectionTimeout"),
LocalizableString.Create<AbpAIResource>("McpAITool:ConnectionTimeoutDesc")),
AIToolPropertyDescriptor.CreateNumberProperty(
McpAIToolDefinitionExtenssions.MaxReconnectionAttempts,
LocalizableString.Create<AbpAIResource>("McpAITool:MaxReconnectionAttempts"),
LocalizableString.Create<AbpAIResource>("McpAITool:MaxReconnectionAttemptsDesc")),
AIToolPropertyDescriptor.CreateBoolProperty(
McpAIToolDefinitionExtenssions.CurrentAccessToken,
LocalizableString.Create<AbpAIResource>("McpAITool:CurrentAccessToken"))];
}
public async virtual Task<AITool[]> CreateToolsAsync(AIToolDefinition definition)
{
var httpClient = HttpClientFactory.CreateMcpAIToolClient();

109
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AIToolPropertyDescriptor.cs

@ -0,0 +1,109 @@
using System.Collections.Generic;
using Volo.Abp;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.AI.Tools;
public enum PropertyValueType
{
String = 0,
Number = 1,
Boolean = 2,
Dictionary = 3,
Select = 4,
}
public class AIToolPropertyDescriptor
{
public string Name { get; }
public PropertyValueType ValueType { get; }
public List<NameValue<object>> Options { get; }
public ILocalizableString DisplayName { get; }
public ILocalizableString? Description { get; }
private AIToolPropertyDescriptor(
string name,
PropertyValueType valueType,
ILocalizableString displayName,
ILocalizableString? description = null)
{
Name = name;
ValueType = valueType;
DisplayName = displayName;
Description = description;
Options = new List<NameValue<object>>();
}
public static AIToolPropertyDescriptor CreateStringProperty(
string name,
ILocalizableString displayName,
ILocalizableString? description = null)
{
return new AIToolPropertyDescriptor(
name,
PropertyValueType.String,
displayName,
description);
}
public static AIToolPropertyDescriptor CreateNumberProperty(
string name,
ILocalizableString displayName,
ILocalizableString? description = null)
{
return new AIToolPropertyDescriptor(
name,
PropertyValueType.Number,
displayName,
description);
}
public static AIToolPropertyDescriptor CreateBoolProperty(
string name,
ILocalizableString displayName,
ILocalizableString? description = null)
{
return new AIToolPropertyDescriptor(
name,
PropertyValueType.Boolean,
displayName,
description);
}
public static AIToolPropertyDescriptor CreateDictionaryProperty(
string name,
ILocalizableString displayName,
ILocalizableString? description = null)
{
return new AIToolPropertyDescriptor(
name,
PropertyValueType.Dictionary,
displayName,
description);
}
public static AIToolPropertyDescriptor CreateSelectProperty(
string name,
ILocalizableString displayName,
List<NameValue<object>> options,
ILocalizableString? description = null)
{
var propertyDescriptor = new AIToolPropertyDescriptor(
name,
PropertyValueType.Select,
displayName,
description);
foreach (var option in options)
{
propertyDescriptor.WithOption(option.Name, option.Value);
}
return propertyDescriptor;
}
public void WithOption(string name, object value)
{
Options.Add(new NameValue<object>(name, value));
}
}

13
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/FunctionAIToolDefinitionExtenssions.cs

@ -5,17 +5,22 @@ using Volo.Abp;
namespace LINGYUN.Abp.AI.Tools;
public static class FunctionAIToolDefinitionExtenssions
{
private const string FunctionType = "Function";
public static AIToolDefinition WithFunction<TFunc>(this AIToolDefinition definition)
public const string FunctionType = "FunctionType";
public const string FunctionName = "FunctionName";
public static AIToolDefinition WithFunction<TFunc>(this AIToolDefinition definition, string? funcName = null)
{
return definition.WithFunction(typeof(TFunc));
return definition.WithFunction(typeof(TFunc), funcName);
}
public static AIToolDefinition WithFunction(this AIToolDefinition definition, Type funcType)
public static AIToolDefinition WithFunction(this AIToolDefinition definition, Type funcType, string? funcName = null)
{
Check.NotNull(funcType, nameof(funcType));
definition.WithProperty(FunctionType, funcType.AssemblyQualifiedName);
if (!funcName.IsNullOrWhiteSpace())
{
definition.WithProperty(FunctionName, funcName);
}
return definition;
}

17
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/FunctionAIToolProvider.cs

@ -1,10 +1,12 @@
using Microsoft.Extensions.AI;
using LINGYUN.Abp.AI.Localization;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using System;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.AI.Tools;
public class FunctionAIToolProvider : IAIToolProvider, ITransientDependency
@ -18,6 +20,19 @@ public class FunctionAIToolProvider : IAIToolProvider, ITransientDependency
ServiceProvider = serviceProvider;
}
public virtual AIToolPropertyDescriptor[] GetPropertites()
{
return [
AIToolPropertyDescriptor.CreateStringProperty(
FunctionAIToolDefinitionExtenssions.FunctionType,
LocalizableString.Create<AbpAIResource>("FunctionAITool:FunctionType"),
LocalizableString.Create<AbpAIResource>("FunctionAITool:FunctionTypeDesc")),
AIToolPropertyDescriptor.CreateStringProperty(
FunctionAIToolDefinitionExtenssions.FunctionName,
LocalizableString.Create<AbpAIResource>("FunctionAITool:FunctionName"),
LocalizableString.Create<AbpAIResource>("FunctionAITool:FunctionNameDesc"))];
}
public virtual Task<AITool[]> CreateToolsAsync(AIToolDefinition definition)
{
var aiToolType = definition.GetFunction();

2
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/IAIToolProvider.cs

@ -6,5 +6,7 @@ public interface IAIToolProvider
{
string Name { get; }
AIToolPropertyDescriptor[] GetPropertites();
Task<AITool[]> CreateToolsAsync(AIToolDefinition definition);
}

6
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/Localization/Resources/en.json

@ -5,6 +5,10 @@
"Tools:GetNowTime": "Get now time",
"Tools:GetUserInfo": "Get the current user information",
"Tools:GetSetting": "Get setting value",
"Tools:GetSettings": "Get all settings"
"Tools:GetSettings": "Get all settings",
"FunctionAITool:FunctionType": "Custom function type",
"FunctionAITool:FunctionTypeDesc": "To use the full name of the function, use Type.AssemblyQualifiedName for retrieval.",
"FunctionAITool:FunctionName": "Custom function name",
"FunctionAITool:FunctionNameDesc": "The name of the called function, if not specified, will default to Invoke (synchronous) or InvokeAsync (asynchronous) function."
}
}

6
aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/Localization/Resources/zh-Hans.json

@ -5,6 +5,10 @@
"Tools:GetNowTime": "获取当前时间",
"Tools:GetUserInfo": "获取当前用户信息",
"Tools:GetSetting": "获取设置值",
"Tools:GetSettings": "获取所有设置"
"Tools:GetSettings": "获取所有设置",
"FunctionAITool:FunctionType": "自定义函数类型",
"FunctionAITool:FunctionTypeDesc": "使用函数全名, 应使用Type.AssemblyQualifiedName获取.",
"FunctionAITool:FunctionName": "自定义函数名称",
"FunctionAITool:FunctionNameDesc": "调用的函数名称, 如未指定, 默认调用 Invoke(同步) 或 InvokeAsync(异步)函数."
}
}
Loading…
Cancel
Save