Почистить комментарии от упоминаний процесса
Удалены <remarks>, <summary> сжаты до короткой фразы, вырезаны ссылки на Task/Ruling/этап/python/прототип; //-комментарии со ссылками на процесс удалены; то же в .proto. Правила обновлены в docs/spec/Код-стайл-Дейл.md. Строк комментариев 27210 -> ~19100.
This commit is contained in:
@@ -11,49 +11,30 @@ using Microsoft.Extensions.Logging;
|
||||
namespace Deal.Infrastructure.Integrations.Services;
|
||||
|
||||
/// <summary>
|
||||
/// gRPC-адаптер порта <see cref="IAiTools"/> к автономному ai-service (Ruling 9, план Task 15/18/19).
|
||||
/// gRPC-адаптер порта <see cref="IAiTools"/> к автономному ai-service.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Регистрируется вместо Local-реализации при <c>Services:Ai:UseLocal=false</c> (Ruling 6). Поведение 1:1 с
|
||||
/// ai.proto GenerateKeywords/EvaluateFit и прототипом:
|
||||
/// <list type="bullet">
|
||||
/// <item><see cref="GenerateKeywordsAsync"/> — RPC GenerateKeywords (deadline 120 с): конфиг провайдера из
|
||||
/// настроек, описание ≤4000 (discovery_routes L29); недоступность — мягкий {ok:false, keywords:[], error}
|
||||
/// (Ruling 11: generate-keywords-эндпоинт отдаёт HTTP 200 {keywords: [], error});</item>
|
||||
/// <item><see cref="EvaluateFitAsync"/> — RPC EvaluateFit: текст ≤4000 (discovery_eval L41) + описание и ключи
|
||||
/// задачи; сбой — <see cref="AiUnavailableException"/> (воркер Discovery падает в эвристику, Ruling 10);
|
||||
/// успех — {fit, reason} (потолок причины 200 задаёт сервис, _AI_REASON_LIMIT L43);</item>
|
||||
/// <item>usage ответов списывается с бюджета тенанта в tenant_limits и копится в lifetime-KV aiTokenUsage
|
||||
/// (<see cref="TokenUsageRecorder"/>, Ruling 3 этапа 7), как у классификатора.</item>
|
||||
/// </list>
|
||||
/// Каждый вызов несёт metadata tenant-id + service-token (<see cref="AiGrpcConnection"/>, Ruling 1). Scoped:
|
||||
/// настройки провайдера читаются через scoped-хранилище тенанта (ISettingsStore), как GrpcAiClassifier.
|
||||
/// Выключатель aiEnabled порт не читает — его отрабатывает вызывающий (воркер/эндпоинт Discovery, Ruling 10/11).
|
||||
/// </remarks>
|
||||
public sealed class GrpcAiTools : IAiTools
|
||||
{
|
||||
/// <summary>
|
||||
/// Deadline RPC ai-service — 120 с (README контрактов: провайдер 90/60 с + ретраи 0.8/2 с).
|
||||
/// Deadline RPC ai-service — 120 с
|
||||
/// </summary>
|
||||
public const int RpcDeadlineSeconds = 120;
|
||||
|
||||
/// <summary>
|
||||
/// Лимит описания ниши generate-keywords (discovery_routes L29: обрезает до 4000).
|
||||
/// Лимит описания ниши generate-keywords.
|
||||
/// </summary>
|
||||
public const int MaxDescriptionCodePoints = 4000;
|
||||
|
||||
/// <summary>
|
||||
/// Лимит текста сообщения evaluate-fit (discovery_eval L41: _AI_TEXT_LIMIT=4000).
|
||||
/// Лимит текста сообщения evaluate-fit.
|
||||
/// </summary>
|
||||
public const int MaxEvalTextCodePoints = 4000;
|
||||
|
||||
// Текст фолбэк-ошибки, когда RPC-ошибка не несёт detail (сервис недоступен).
|
||||
private const string ServiceUnavailableText = "ai-service недоступен — повторите попытку через несколько секунд";
|
||||
|
||||
// Причина по умолчанию при fit=true, если сервис причину не вернул (1:1 _AI_REASON_LIMIT L170).
|
||||
private const string FitReasonDefault = "подходит";
|
||||
|
||||
// Причина по умолчанию при fit=false, если сервис причину не вернул (1:1 L170).
|
||||
private const string NotFitReasonDefault = "не подходит";
|
||||
|
||||
private readonly ITenantContext _tenantContext;
|
||||
@@ -112,7 +93,6 @@ public sealed class GrpcAiTools : IAiTools
|
||||
}
|
||||
catch (RpcException exception)
|
||||
{
|
||||
// Мягкая ошибка для UI (Ruling 11): {ok:false, keywords:[], error} — эндпоинт отвечает HTTP 200.
|
||||
_logger.LogDebug(exception, "generate-keywords недоступен (тенант {TenantId})", tenantId.Value);
|
||||
return new AiGenerateKeywordsResultDto(Ok: false, Keywords: Array.Empty<string>(), Error: ErrorText(exception));
|
||||
}
|
||||
@@ -160,7 +140,6 @@ public sealed class GrpcAiTools : IAiTools
|
||||
}
|
||||
catch (RpcException exception)
|
||||
{
|
||||
// Сбой ИИ-оценки не роняет оценку кандидата — воркер падает в эвристику (Ruling 10, python L191–192).
|
||||
_logger.LogDebug(exception, "evaluate-fit недоступен (тенант {TenantId})", tenantId.Value);
|
||||
throw new AiUnavailableException(ErrorText(exception));
|
||||
}
|
||||
@@ -179,7 +158,6 @@ public sealed class GrpcAiTools : IAiTools
|
||||
?? throw new InvalidOperationException(
|
||||
"GrpcAiTools запрошен вне tenant-контекста (ITenantContext.TenantId == null).");
|
||||
|
||||
// CallOptions вызова: metadata tenant-id/service-token + deadline + токен отмены (Ruling 1).
|
||||
// tenantId: Id тенанта (формат N).
|
||||
// ct: Токен отмены вызова.
|
||||
// Возвращает: Опции вызова с заголовками, deadline и отменой.
|
||||
@@ -189,7 +167,6 @@ public sealed class GrpcAiTools : IAiTools
|
||||
deadline: DateTime.UtcNow.Add(TimeSpan.FromSeconds(RpcDeadlineSeconds)),
|
||||
cancellationToken: ct);
|
||||
|
||||
// Краткий текст ошибки: detail gRPC-ошибки (дружелюбный текст ai-service) либо фолбэк (Ruling 13:
|
||||
// секреты/тела ответов не логируются и в текст не попадают).
|
||||
// exception: Исключение RPC-вызова.
|
||||
// Возвращает: Текст ошибки.
|
||||
@@ -199,7 +176,6 @@ public sealed class GrpcAiTools : IAiTools
|
||||
return detail.Length > 0 ? detail : ServiceUnavailableText;
|
||||
}
|
||||
|
||||
// Первые max кодовых точек строки (python-срез без разрыва суррогатных пар).
|
||||
// text: Строка.
|
||||
// max: Лимит.
|
||||
// Возвращает: Усечённая строка.
|
||||
|
||||
Reference in New Issue
Block a user