Andrey Epifancev 71f596cdb7 feat: формы через arm_statements, контракт результата и конверта v2.0, статус и OSV_* у ОСВ (#54)
- копия схем и примеров контракта v2.0 (запрос остаётся v1.0), модели result/common/message/request;
  ResultWarning/FileWarning, статус и предупреждения у документов, строки forms v2.0, service.statements_version
- statements/pipeline.py: кандидаты адаптера -> normalize_candidate -> to_contract / warning_to_contract
- BookParser: статус книги через envelope_status, SHEET_OTHER / FILE_TYPE_MISMATCH / XLS_NO_CODEPAGE как предупреждения
  файла, OSV_* и OSV_XLSB_NO_OUTLINE в документах ОСВ, тексты иерархии по спеке
- воркер, app и CLI получают statements_version из require_statements_version()
- старые модели документа формы вынесены в statements/legacy_models.py до удаления старого конвейера (задача 9)
- OpenSpec: MODIFIED «Парсер — заменяемый интерфейс» в дельте tabular-recognition-service

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 20:52:52 +04:00

37 lines
1.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Запрос распознавания файла: `recognition-request.schema.json` v1.0.
tabular-parser принимает этот запрос из `files.tabular_uploaded` (производитель — arm-core); один файл — один job.
Модель намеренно совпадает с копией в arm-core (контракт — `../docs/contracts`, обзор —
`docs/context/03-architecture.md`). Subject — по `pipeline` (`request_subject`); заголовок
`Nats-Msg-Id = <job_id>:<attempt>` (`request_msg_id`) — не поле тела.
"""
from typing import Annotated, Literal
from pydantic import Field
from src.contract.common import (
ContractModel,
ContractUUID,
IntLike,
NonEmptyStr,
RequestSchemaVersion,
S3Ref,
UtcDatetime,
)
from src.contract.subjects import Pipeline
FileType = Literal["XLS", "XLSX", "XLSB", "PDF", "PNG", "JPG"]
class RecognitionRequest(ContractModel):
schema_version: RequestSchemaVersion
job_id: ContractUUID # recognition_job.id
file_id: ContractUUID # stored_file.id
pipeline: Pipeline
file_type: FileType
original_name: NonEmptyStr # имя файла, как загрузил пользователь
s3: S3Ref # исходный файл в роли uploads
reply_deadline: UtcDatetime # срок ответа, UTC
attempt: Annotated[IntLike, Field(ge=1)] # номер попытки, с 1