Purpose: отдать текущее состояние job и поток событий её выполнения в рамках конкретной RagSession.
Actor: внешний клиент модуля RAG.
Trigger: polling или live-monitoring после запуска snapshot/change indexing.
Endpoint: GET /api/rag/sessions/{rag_session_id}/jobs/{index_job_id} и GET /api/rag/sessions/{rag_session_id}/jobs/{index_job_id}/events
Main entities: RagSession, IndexJob.
Main logic: чтение job по id, проверка принадлежности сессии, возврат status payload или SSE stream.
Main errors: not_found при отсутствии job или несовпадении rag_session_id.
Source of truth: src/app/modules/rag/module.py, src/app/modules/rag/job_store.py.
Назначение
Документ описывает два связанных метода наблюдения: синхронный status endpoint и потоковый SSE endpoint. Оба работают поверх одной сущности IndexJob.
Контекст
Create и changes endpoints возвращают только стартовый статус задачи, поэтому клиенту нужны отдельные методы для отслеживания выполнения. SSE-поток даёт live progress, а status endpoint нужен для простого polling.
Технический use case
Основной сценарий
Клиент вызывает status endpoint или открывает SSE stream по index_job_id.
Endpoint читает job из IndexJobStore.
Если job отсутствует или принадлежит другой rag_session_id, возвращается not_found.
Status endpoint отдаёт снимок counters и error payload.
SSE endpoint подписывается на EventBus c replay=True и транслирует index_status, index_progress, terminal.
Альтернативные ветки
При отсутствии новых событий SSE endpoint каждые 10 секунд отправляет : keepalive.
После события terminal поток завершается и отписывается от EventBus.
Функциональные требования
Request validation
rag_session_id и index_job_id обязательны как path parameters.
Job должна существовать и принадлежать переданной сессии.
Processing rules
Status endpoint не подписывается на события и читает только текущее состояние job.
SSE endpoint использует replay=True, чтобы клиент получил уже опубликованные события.
Оба метода защищают от доступа к job другой сессии.
State changes
Методы не меняют состояние job.
Side effects
SSE endpoint создаёт временную подписку на EventBus.
При завершении или разрыве соединения выполняется unsubscribe.
Contract
Endpoint
Method: GET
Path: /api/rag/sessions/{rag_session_id}/jobs/{index_job_id} и /api/rag/sessions/{rag_session_id}/jobs/{index_job_id}/events
Auth: определяется внешним слоем приложения.
Idempotent: да.
Timeout: status endpoint короткий; SSE stream долгоживущий.
Retry: polling можно повторять безопасно; SSE можно переподключать.
Request
Field
Type
Required
Constraints
Description
rag_session_id
string
yes
path param
идентификатор сессии
index_job_id
string
yes
path param
идентификатор задачи
Response
Field
Type
Description
rag_session_id
string
идентификатор сессии, только для status endpoint
index_job_id
string
идентификатор задачи
status
IndexJobStatus
текущее состояние job
indexed_files
integer
число успешно обработанных файлов
failed_files
integer
число файлов с ошибками
cache_hit_files
integer
число cache hit
cache_miss_files
integer
число cache miss
error
object | null
ошибка, если job завершилась с error
External contract refs
OpenAPI: status endpoint использует response_model=RagSessionJobResponse; SSE endpoint отдаёт text/event-stream.