- копия схем и примеров контракта 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
37 lines
1.4 KiB
Python
37 lines
1.4 KiB
Python
"""Запрос распознавания файла: `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
|