Does ABP have a plan to support SQL Server as a vector Store in the AI Management Module?
https://learn.microsoft.com/en-us/sql/sql-server/ai/vectors?view=sql-server-ver17
Is there any update on supporting AI Management as a tenant-scoped feature?
https://abp.io/support/questions/10688/VoloAIManagementBackgroundJobsIndexDocumentJob-fails-for-tenant-uploads--blob-path-mismatch-caused-by-missing-IMultiTenant-on-IndexDocumentJobArgs
ABP / module versions:
Volo.AIManagement.VectorStores.Pgvector 10.2.0 Volo.Abp.BlobStoring.Azure 10.2.0 All other Volo packages 10.2.0 ABP Framework 10.x (matching) .NET 10.0 DB: SQL Server (Azure SQL), background-jobs provider: default Volo.Abp.BackgroundJobs.EntityFrameworkCore
When a non-host (saas tenant) user uploads a Workspace Data Source PDF, the file is correctly stored in Azure Blob Storage under the multi-tenant path:
triarch-blobs/tenants/{tenantId}/{workspaceId}/{dataSourceId}.pdf …but IndexDocumentJob runs ~minutes later as host and looks up the blob without the tenants/{tenantId}/ prefix, producing:
Volo.Abp.AbpException: Could not find the requested BLOB '{workspaceId}/{dataSourceId}.pdf' in the container 'workspace-data-sources'! at Volo.Abp.BlobStoring.BlobContainer.GetAsync(...) at Volo.AIManagement.BackgroundJobs.IndexDocumentJob.ExecuteAsync(IndexDocumentJobArgs args) The job retries until TryCount = 10, then is abandoned. The DataSource row exists in the DB and the blob exists in Azure — only the path the indexer resolves is wrong.
BackgroundJobExecuter.GetJobArgsTenantId(object jobArgs) in Volo.Abp.BackgroundJobs.Abstractions:
protected virtual Guid? GetJobArgsTenantId(object jobArgs) { return jobArgs switch { IMultiTenant multiTenantJobArgs => multiTenantJobArgs.TenantId, _ => CurrentTenant.Id }; } AbpBackgroundJobs table has no TenantId column (by design — BackgroundJobRecord does not implement IMultiTenant). So the only mechanism to carry tenant from enqueue → execute is the args class implementing IMultiTenant.
We inspected the queued args in AbpBackgroundJobs.JobArgs for our failing job:
{"dataSourceId":"c4b5d4f3-a627-e1f5-a9ab-3a2168f8944b"} — no tenantId field. Therefore IndexDocumentJobArgs does not implement IMultiTenant. The executer falls into the _ => CurrentTenant.Id branch on the worker thread (host context, CurrentTenant.Id == null), so ExecuteAsync runs as host and the blob naming normalizer omits the tenants/{tenantId}/ prefix.
Upon digging deeper into the code, we figured out the issue was due to middleware introduction for custom / forced routing. We have reverted it and are able to make it work. Apologies for the confusion.
Please close the ticket.
We can't, considering policies, but we will be available for remote troubleshooting based on your calender
[21:42:36 INF] Executed endpoint 'Volo.Chat.Users.ContactController.GetTotalUnreadMessageCountAsync (Volo.Chat.HttpApi)' [21:42:36 INF] Request finished HTTP/2 GET https://localhost:44340/api/chat/contact/total-unread-message-count - 200 null application/json; charset=utf-8 187.4404ms [21:42:36 ERR] ---------- RemoteServiceErrorInfo ---------- { "code": null, "message": "An internal error occurred during your request!", "details": null, "data": null, "validationErrors": null }
[21:42:36 ERR] The API description of the Volo.AIManagement.Workspaces.IWorkspaceAppService.GetListAsync method was not found!
Volo.Abp.AbpException: The API description of the Volo.AIManagement.Workspaces.IWorkspaceAppService.GetListAsync method was not found!
at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase1.BuildHttpProxyClientProxyContext(String methodName, ClientProxyRequestTypeValue arguments) at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase1.RequestAsync[T](String methodName, ClientProxyRequestTypeValue arguments)
at Volo.AIManagement.Workspaces.WorkspaceClientProxy.GetListAsync(WorkspaceGetListInput input)
at lambda_method2773(Closure, Object)
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.
And the warning
gETTING ERROR IN wEB PROJECT WHILE FETCHING ALL THE WORKSPACES , [21:39:48 WRN] Could not find ApiDescriptionModel for action: Create in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: Delete in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: Get in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: GetList in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: GetProviders in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: GetProviders in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: GetEmbedderProviders in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: GetEmbedderProviders in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: GetVectorStoreProviders in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: GetVectorStoreProviders in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: Update in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: Duplicate in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: GetMcpServerConnections in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: AddMcpServerConnection in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: UpdateMcpServerConnection in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: RemoveMcpServerConnection in controller: Workspace, May be the generate-proxy.json is not up to date. [21:39:48 WRN] Could not find ApiDescriptionModel for action: GetByName in controller: Workspace, May be the generate-proxy.json is not up to date.
Thank you for your quick response. Resolved.
IS there any manual steps which we can implement to avoid this blockage ?
Provide us with the following info:
1 result) at System.Threading.Tasks.ContinuationResultTaskFromResultTask2.InnerInvoke()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location ---
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.<ExecuteReaderAsync>d__22.MoveNext()
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.<ExecuteReaderAsync>d__22.MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.SplitQueryingEnumerable1.AsyncEnumerator.<InitializeReaderAsync>d__22.MoveNext() at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.<ExecuteAsync>d__72.MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.SplitQueryingEnumerable1.AsyncEnumerator.<MoveNextAsync>d__21.MoveNext() at System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable1.ConfiguredValueTaskAwaiter.GetResult()
at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.<SingleOrDefaultAsync>d__161.MoveNext() at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.<SingleOrDefaultAsync>d__161.MoveNext()
at Volo.Abp.Identity.EntityFrameworkCore.EfCoreIdentityUserRepository.<FindByNormalizedUserNameAsync>d__1.MoveNext()
at Castle.DynamicProxy.AsyncInterceptorBase.<ProceedAsynchronous>d__141.MoveNext() at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue1.<ProceedAsync>d__7.MoveNext()
at Volo.Abp.Uow.UnitOfWorkInterceptor.<InterceptAsync>d__2.MoveNext()
at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter1.<InterceptAsync>d__31.MoveNext()
at Volo.Abp.Identity.IdentityDataSeeder.<SeedAsync>d__25.MoveNext()
at Volo.Abp.Identity.UserSharing.UserSharingIdentityDataSeeder.<SeedAsync>d__8.MoveNext()
at Castle.DynamicProxy.AsyncInterceptorBase.<ProceedAsynchronous>d__141.MoveNext() at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue1.<ProceedAsync>d__7.MoveNext()
at Volo.Abp.Uow.UnitOfWorkInterceptor.<InterceptAsync>d__2.MoveNext()
at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter1.<InterceptAsync>d__31.MoveNext()
at Volo.Abp.Data.DataSeeder.<SeedAsync>d__7.MoveNext()
at Castle.DynamicProxy.AsyncInterceptorBase.<ProceedAsynchronous>d__13.MoveNext()
at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapter.<ProceedAsync>d__7.MoveNext()
at Volo.Abp.Uow.UnitOfWorkInterceptor.<InterceptAsync>d__2.MoveNext()
at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter1.<InterceptAsync>d__2.MoveNext() at AbpSolution5.Data.AbpSolution5DbMigrationService.<SeedDataAsync>d__11.MoveNext() in C:\Startups_Local\AbpSolution5\src\AbpSolution5.Domain\Data\AbpSolution5DbMigrationService.cs:line 108 at AbpSolution5.Data.AbpSolution5DbMigrationService.<MigrateAsync>d__9.MoveNext() in C:\Startups_Local\AbpSolution5\src\AbpSolution5.Domain\Data\AbpSolution5DbMigrationService.cs:line 54 at AbpSolution5.DbMigrator.DbMigratorHostedService.<StartAsync>d__3.MoveNext() in C:\Startups_Local\AbpSolution5\src\AbpSolution5.DbMigrator\DbMigratorHostedService.cs:line 36 at Microsoft.Extensions.Hosting.Internal.Host.<<StartAsync>b__14_1>d.MoveNext() at Microsoft.Extensions.Hosting.Internal.Host.<ForeachService>d__171.MoveNext()And If we run the project ignroing migration error we encounter error related to AI module fields ,
Microsoft.Data.SqlClient.SqlException
HResult=0x80131904
Message=Invalid column name 'SupportedEmbedderProviders'.
Invalid column name 'SupportedVectorStoreProviders'.
Source=Core Microsoft SqlClient Data Provider
StackTrace:
at Microsoft.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__195_0(Task1 result) at System.Threading.Tasks.ContinuationResultTaskFromResultTask2.InnerInvoke()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location ---
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.<ExecuteReaderAsync>d__22.MoveNext()
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.<ExecuteReaderAsync>d__22.MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.SplitQueryingEnumerable1.AsyncEnumerator.<InitializeReaderAsync>d__22.MoveNext() at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.<ExecuteAsync>d__72.MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.SplitQueryingEnumerable1.AsyncEnumerator.<MoveNextAsync>d__21.MoveNext() at System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable1.ConfiguredValueTaskAwaiter.GetResult()
at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.<SingleOrDefaultAsync>d__161.MoveNext() at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.<SingleOrDefaultAsync>d__161.MoveNext()
at Volo.Abp.Domain.Repositories.EntityFrameworkCore.EfCoreRepository2.<FindAsync>d__36.MoveNext() at Castle.DynamicProxy.AsyncInterceptorBase.<ProceedAsynchronous>d__141.MoveNext()
at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue1.<ProceedAsync>d__7.MoveNext() at Volo.Abp.Uow.UnitOfWorkInterceptor.<InterceptAsync>d__2.MoveNext() at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter1.<InterceptAsync>d__3`1.MoveNext()
at Volo.AIManagement.ApplicationWorkspaceProviders.ApplicationAIProviderManager.
Create a new solution using ABP Studio with V 10.2.0 RC1.