using Ban.Sdaid.Notation.Documents;
namespace Ban.Sdaid.Icd.Epics.RecognitionStand.UseCases
{
/// <summary>Use-case: сравнение движков распознавания текста на полях карты.</summary>
public class CompareOcrEnginesUseCase : IUseCaseDocument, IHasStructuralLinks
{
public static string _refName = "сценарий «Сравнение движков распознавания»";
public string Name => "Сравнение движков распознавания текста";
public string Description =>
@"Аналитик прогоняет одни и те же поля/страницы через разные движки (Qwen-VL, Yandex OCR), чтобы выбрать пригодный для вида данных — печатный или рукописный текст.";
public string Version => "0.1";
public string Status => "draft";
public string[] Comments => new[]
{
"2026-08-24. Первичная фиксация: OCR-лаборатории.",
};
public string PrimaryActor => "Аналитик";
public SdaidLink[] Links => new[]
{
Rel.Realizes<EPIC_RecognitionStand>(),
};
public static string S1_Given = """
## Given
- Открыты OCR-лаборатории (`ocr-labs/`) и/или экран применения через локальный прокси.
- Реквизиты облачных API берутся из `secrets.local.js` (проходят насквозь, не сохраняются).
- Есть скан или вырезки полей карты.
""";
public static string S2_When = """
## When
1. Аналитик выбирает движок текста: Qwen-VL (локальный VLM) или Yandex OCR (модель
рукописного текста).
2. Прогоняет одни и те же поля и сравнивает распознанные значения по читаемому списку
и сырому JSON.
3. При необходимости — сверяет grounding (координаты найденного) и подсветку областей.
""";
public static string S3_Then = """
## Then
- Ясно, какой движок пригоден для данного вида полей: печатный текст надёжно берёт Yandex,
рукопись — Yandex-handwritten или Qwen-VL; на мелком низком разрешении лидирует Qwen-VL.
- Выбор фиксируется как рекомендация для продуктовой обработки.
""";
public static string S4_Alternatives = """
## Альтернативы и ошибки
| Ситуация | Поведение |
|---|---|
| Облачный Yandex недоступен или лимит | Остаётся локальный Qwen-VL; Yandex — один запрос на страницу против частых мелких |
| Рукопись неразборчива | VLM-промт запрещает выдумывать: пустая строка вместо догадки |
| Нужны координаты найденного | Yandex отдаёт измеренные боксы слов (в отличие от оценочного grounding VLM) |
""";
public static string S5_Trace = $"""
## Трассировка
| Шаг | Инструмент |
|---|---|
| Сравнение движков текста, grounding, подсветка | `ocr-labs/`, `editor/apply-template.html` |
| Прокси к Yandex/Qwen | `server/proxy.py` |
Эпик — {nameof(EPIC_RecognitionStand)}.
""";
}
}