diff --git a/aspnet-core/LINGYUN.MicroService.Aspire.slnx b/aspnet-core/LINGYUN.MicroService.Aspire.slnx
index 5a0522e3b..cdfeaa94b 100644
--- a/aspnet-core/LINGYUN.MicroService.Aspire.slnx
+++ b/aspnet-core/LINGYUN.MicroService.Aspire.slnx
@@ -285,6 +285,8 @@
+
+
diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/AIServiceModule.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/AIServiceModule.cs
index 6d3dc38f6..b190eadcb 100644
--- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/AIServiceModule.cs
+++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/AIServiceModule.cs
@@ -1,5 +1,6 @@
using LINGYUN.Abp.AI.Ollama;
using LINGYUN.Abp.AI.Tools;
+using LINGYUN.Abp.AI.Tools.Http;
using LINGYUN.Abp.AIManagement;
using LINGYUN.Abp.AspNetCore.HttpOverrides;
using LINGYUN.Abp.AspNetCore.Mvc.Localization;
@@ -23,6 +24,7 @@ using Volo.Abp.AspNetCore.Serilog;
using Volo.Abp.Autofac;
using Volo.Abp.Caching.StackExchangeRedis;
using Volo.Abp.Http.Client;
+using Volo.Abp.Http.Client.IdentityModel.Web;
using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement.Identity;
using Volo.Abp.PermissionManagement.OpenIddict;
@@ -50,13 +52,14 @@ namespace LINGYUN.Abp.MicroService.AIService;
typeof(AbpAIOllamaModule),
typeof(AbpAIToolsModule),
+ typeof(AbpAIToolsHttpModule),
typeof(AbpAIManagementApplicationModule),
typeof(AbpAIManagementHttpApiModule),
typeof(AIServiceMigrationsEntityFrameworkCoreModule),
typeof(AbpDataDbMigratorModule),
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
typeof(AbpEmailingExceptionHandlingModule),
- typeof(AbpHttpClientModule),
+ typeof(AbpHttpClientIdentityModelWebModule),
typeof(AbpSmsPlatformModule),
typeof(AbpEmailingPlatformModule),
typeof(AbpCachingStackExchangeRedisModule),
diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/LINGYUN.Abp.MicroService.AIService.csproj b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/LINGYUN.Abp.MicroService.AIService.csproj
index 994165395..5457d9300 100644
--- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/LINGYUN.Abp.MicroService.AIService.csproj
+++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/LINGYUN.Abp.MicroService.AIService.csproj
@@ -31,6 +31,7 @@
+
@@ -58,6 +59,7 @@
+
diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/appsettings.Development.json b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/appsettings.Development.json
index c9a9d8327..3d9679901 100644
--- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/appsettings.Development.json
+++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/appsettings.Development.json
@@ -7,6 +7,14 @@
"Auditing": {
"AllEntitiesSelector": true
},
+ "AITools": {
+ "Http": {
+ "ApplicationConfiguration": {
+ "IsEnabled": true,
+ "EndPoint": "http://localhost:30010/api/abp/application-configuration"
+ }
+ }
+ },
"DistributedCache": {
"HideErrors": true,
"KeyPrefix": "LINGYUN.Abp.Application",
diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/FodyWeavers.xml b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/FodyWeavers.xml
new file mode 100644
index 000000000..1715698cc
--- /dev/null
+++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/FodyWeavers.xsd b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/FodyWeavers.xsd
new file mode 100644
index 000000000..3f3946e28
--- /dev/null
+++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/FodyWeavers.xsd
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.
+
+
+
+
+ A comma-separated list of error codes that can be safely ignored in assembly verification.
+
+
+
+
+ 'false' to turn off automatic generation of the XML Schema file.
+
+
+
+
+
\ No newline at end of file
diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN.Abp.AI.Tools.Http.csproj b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN.Abp.AI.Tools.Http.csproj
new file mode 100644
index 000000000..42e278639
--- /dev/null
+++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN.Abp.AI.Tools.Http.csproj
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+ net8.0;net9.0;net10.0
+ LINGYUN.Abp.AI.Tools.Http
+ LINGYUN.Abp.AI.Tools.Http
+ false
+ false
+ false
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/AbpAIToolsHttpModule.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/AbpAIToolsHttpModule.cs
new file mode 100644
index 000000000..7d7f713c9
--- /dev/null
+++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/AbpAIToolsHttpModule.cs
@@ -0,0 +1,42 @@
+using LINGYUN.Abp.AI.Localization;
+using LINGYUN.Abp.AI.Tools.Http.ApplicationConfigurations;
+using Microsoft.Extensions.DependencyInjection;
+using Volo.Abp.AspNetCore.Mvc;
+using Volo.Abp.Http.Client;
+using Volo.Abp.Localization;
+using Volo.Abp.Modularity;
+using Volo.Abp.VirtualFileSystem;
+
+namespace LINGYUN.Abp.AI.Tools.Http;
+
+[DependsOn(
+ typeof(AbpAIToolsModule),
+ typeof(AbpHttpClientModule),
+ typeof(AbpAspNetCoreMvcContractsModule))]
+public class AbpAIToolsHttpModule : AbpModule
+{
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ Configure(context.Configuration.GetSection("AITools:Http:ApplicationConfiguration"));
+
+ Configure(options =>
+ {
+ options.FileSets.AddEmbedded();
+ });
+
+ Configure(options =>
+ {
+ // Http工具
+ options.AIToolProviders.Add();
+ });
+
+ Configure(options =>
+ {
+ options.Resources
+ .Get()
+ .AddVirtualJson("/LINGYUN/Abp/AI/Tools/Http/Localization/Resources");
+ });
+
+ context.Services.AddHttpAIToolClient();
+ }
+}
diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/AbpAIToolsHttpOptiions.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/AbpAIToolsHttpOptiions.cs
new file mode 100644
index 000000000..55b447b8c
--- /dev/null
+++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/AbpAIToolsHttpOptiions.cs
@@ -0,0 +1,31 @@
+using Microsoft.Extensions.DependencyInjection;
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Threading.Tasks;
+
+namespace LINGYUN.Abp.AI.Tools.Http;
+public class AbpAIToolsHttpOptiions
+{
+ public List> ClientBuildActions { get; }
+
+ public List> ClientActions { get; }
+
+ public List> ClientHandlerActions { get; }
+ ///
+ /// 自定义Http请求响应处理
+ ///
+ ///
+ /// 参数1: HttpAITool工具名称
+ /// 参数2: IServiceProvider
+ /// 参数3: 请求响应
+ ///
+ public IDictionary>> HttpResponseActions { get; }
+ public AbpAIToolsHttpOptiions()
+ {
+ ClientBuildActions = new List>();
+ ClientActions = new List>();
+ ClientHandlerActions = new List>();
+ HttpResponseActions = new Dictionary>>();
+ }
+}
diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/ApplicationConfigurations/AbpAIToolsApplicationConfigurationOptions.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/ApplicationConfigurations/AbpAIToolsApplicationConfigurationOptions.cs
new file mode 100644
index 000000000..3a3bda315
--- /dev/null
+++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/ApplicationConfigurations/AbpAIToolsApplicationConfigurationOptions.cs
@@ -0,0 +1,11 @@
+namespace LINGYUN.Abp.AI.Tools.Http.ApplicationConfigurations;
+public class AbpAIToolsApplicationConfigurationOptions
+{
+ public bool IsEnabled { get; set; }
+ public string EndPoint { get; set; }
+ public AbpAIToolsApplicationConfigurationOptions()
+ {
+ IsEnabled = false;
+ EndPoint = "http://localhost:8080/api/abp/application-configuration";
+ }
+}
diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/GlobalHttpAIToolDefinitionProvider.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/GlobalHttpAIToolDefinitionProvider.cs
new file mode 100644
index 000000000..baab188cd
--- /dev/null
+++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/GlobalHttpAIToolDefinitionProvider.cs
@@ -0,0 +1,36 @@
+using LINGYUN.Abp.AI.Localization;
+using LINGYUN.Abp.AI.Tools.Http.ApplicationConfigurations;
+using Microsoft.Extensions.Options;
+using System.Net.Http;
+using Volo.Abp.Localization;
+
+namespace LINGYUN.Abp.AI.Tools.Http;
+public class GlobalHttpAIToolDefinitionProvider : AIToolDefinitionProvider
+{
+ protected AbpAIToolsApplicationConfigurationOptions Options { get; }
+ public GlobalHttpAIToolDefinitionProvider(IOptions options)
+ {
+ Options = options.Value;
+ }
+
+ public override void Define(IAIToolDefinitionContext context)
+ {
+ if (Options.IsEnabled)
+ {
+ context.Add(
+ new AIToolDefinition(
+ "GetApplicationConfiguration",
+ HttpAIToolProvider.ProviderName,
+ L("Tools:GetApplicationConfiguration"))
+ .WithHttpEndpoint(Options.EndPoint)
+ .WithHttpMethod(HttpMethod.Get)
+ .WithHttpHeaders("_AbpDontWrapResult", "true")// 无需包装结果
+ .UseHttpCurrentAccessToken());
+ }
+ }
+
+ private static LocalizableString L(string name)
+ {
+ return LocalizableString.Create(name);
+ }
+}
diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/HttpAITool.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/HttpAITool.cs
new file mode 100644
index 000000000..c265ef9a9
--- /dev/null
+++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools.Http/LINGYUN/Abp/AI/Tools/Http/HttpAITool.cs
@@ -0,0 +1,136 @@
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+using System;
+using System.Globalization;
+using System.Net.Http;
+using System.Net.Http.Headers;
+using System.Threading.Tasks;
+using Volo.Abp.Http.Client.Authentication;
+using Volo.Abp.MultiTenancy;
+using Volo.Abp.Timing;
+using Volo.Abp.Tracing;
+
+namespace LINGYUN.Abp.AI.Tools.Http;
+public class HttpAITool
+{
+ protected HttpAIToolInvokeContext Context { get; }
+
+ public HttpAITool(HttpAIToolInvokeContext context)
+ {
+ Context = context;
+ }
+
+ public async virtual Task