Решение владельца 08.10.2026: recognition.tabular.request → files.tabular_uploaded, recognition.image.request → files.img_uploaded, recognition.result → files.tabular_parsed (общий subject ack и результатов; files.img_parsed не используется). Тела сообщений, Nats-Msg-Id, queue group'ы и schema_version не меняются. Константы api/src/contract/subjects.py, докстринги, тесты, README, CLAUDE.md; копии схем api/contracts/ из docs/contracts/ побайтно; change nats-files-subjects с дельтой спеки. Сквозной change — RSHB/arm-ka-docs#74. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
29 lines
2.7 KiB
JSON
29 lines
2.7 KiB
JSON
{
|
||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||
"$id": "arm-ka/recognition-request/v1",
|
||
"title": "Запрос распознавания файла (arm-core → tabular-parser / scan-gateway), контракт v1.0",
|
||
"description": "Тело сообщения на subject files.tabular_uploaded или files.img_uploaded; subject должен соответствовать полю pipeline (tabular → files.tabular_uploaded, image → files.img_uploaded). Заголовок Nats-Msg-Id = <job_id>:<attempt> (не поле тела). Один файл (stored_file) → один job.",
|
||
"$comment": "Версионирование: schema_version = MAJOR.MINOR. MINOR (1.1) — необязательные поля и новые значения enum; MAJOR (2.0) — удаление/переименование полей, смена типов или семантики. Потребитель принимает тот же MAJOR и любой MINOR. Новый MINOR раскатывается сначала на потребителей (ядро и сервисы обновляют копии схем раньше, чем производитель начнёт слать 1.1), потому что закрытые enum отвергают незнакомые значения.",
|
||
"type": "object",
|
||
"required": ["schema_version", "job_id", "file_id", "pipeline", "file_type", "original_name", "s3", "reply_deadline", "attempt"],
|
||
"properties": {
|
||
"schema_version": { "type": "string", "pattern": "^1\\.\\d+$", "description": "MAJOR.MINOR; производитель контракта v1.0 пишет \"1.0\"" },
|
||
"job_id": { "type": "string", "format": "uuid", "description": "recognition_job.id" },
|
||
"file_id": { "type": "string", "format": "uuid", "description": "stored_file.id" },
|
||
"pipeline": { "enum": ["tabular", "image"], "description": "конвейер распознавания; определяет subject запроса" },
|
||
"file_type": { "enum": ["XLS", "XLSX", "XLSB", "PDF", "PNG", "JPG"] },
|
||
"original_name": { "type": "string", "minLength": 1, "description": "имя файла, как загрузил пользователь" },
|
||
"s3": {
|
||
"type": "object",
|
||
"description": "исходный файл в роли uploads",
|
||
"required": ["bucket", "key"],
|
||
"properties": {
|
||
"bucket": { "type": "string", "minLength": 1 },
|
||
"key": { "type": "string", "minLength": 1 }
|
||
}
|
||
},
|
||
"reply_deadline": { "type": "string", "format": "date-time", "description": "срок ответа, UTC" },
|
||
"attempt": { "type": "integer", "minimum": 1, "description": "номер попытки, с 1" }
|
||
}
|
||
}
|