feat(cv): qualify templates and reliable local import processing

This commit is contained in:
cesnimda
2026-10-28 14:36:12 +01:00
parent 73ea888375
commit 3f4db8ca81
69 changed files with 2597 additions and 180 deletions
+7 -6
View File
@@ -155,13 +155,13 @@ public sealed class AiOperationWorker(
private readonly IReadOnlyDictionary<string, IAiOperationHandler> _handlers = registeredHandlers
.ToDictionary(handler => handler.TaskType, StringComparer.Ordinal);
public async Task<bool> RunOnceAsync(CancellationToken stoppingToken)
public async Task<bool> RunOnceAsync(CancellationToken stoppingToken, bool documentImportsOnly = false)
{
if (_handlers.Count == 0) return false;
var leaseSeconds = Math.Clamp(configuration.GetValue("AiQueue:LeaseSeconds", 120), 30, 1800);
await using var claimScope = scopes.CreateAsyncScope();
var lease = await claimScope.ServiceProvider.GetRequiredService<UserOperationStore>()
.ClaimNextAsync(TimeSpan.FromSeconds(leaseSeconds), stoppingToken, _handlers.Keys.ToArray());
.ClaimNextAsync(TimeSpan.FromSeconds(leaseSeconds), stoppingToken, _handlers.Keys.ToArray(), documentImportsOnly);
if (lease is null) return false;
await using var ownerScope = scopes.CreateAsyncScope();
@@ -255,17 +255,18 @@ public sealed class AiOperationHostedService(AiOperationWorker worker, IConfigur
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
if (!configuration.GetValue("Workers:AiOperationsEnabled", false)) return;
var aiEnabled = configuration.GetValue("Workers:AiOperationsEnabled", false);
if (!aiEnabled && !configuration.GetValue("Workers:CvDocumentImportsEnabled", false)) return;
var concurrency = Math.Clamp(configuration.GetValue("AiQueue:WorkerConcurrency", 1), 1, 4);
await Task.WhenAll(Enumerable.Range(0, concurrency).Select(_ => RunWorkerAsync(stoppingToken)));
await Task.WhenAll(Enumerable.Range(0, concurrency).Select(_ => RunWorkerAsync(stoppingToken, !aiEnabled)));
}
private async Task RunWorkerAsync(CancellationToken stoppingToken)
private async Task RunWorkerAsync(CancellationToken stoppingToken, bool documentImportsOnly)
{
var idleDelayMs = Math.Clamp(configuration.GetValue("AiQueue:IdleDelayMs", 1000), 100, 10_000);
while (!stoppingToken.IsCancellationRequested)
{
if (!await worker.RunOnceAsync(stoppingToken))
if (!await worker.RunOnceAsync(stoppingToken, documentImportsOnly))
await Task.Delay(idleDelayMs, stoppingToken);
}
}