Introduce reusable ParserProfile and ParseChannel, pair jobs with enqueue flatten, Events admin CRUD, and drop inline/legacy parser-builder UI and aliases. Co-authored-by: Cursor <cursoragent@cursor.com>
3.8 KiB
Contracts — общие схемы
Каталог contracts/ — shared truth для формы данных и маршрутизации между ЦА и ЦП.
Правило платформы: сначала contracts, потом реализация в CA/CP/UI.
Модули
| Файл | Назначение |
|---|---|
jobs.py |
Контракт задания. Payload задания в Redis |
ingest.py |
Контракт результата. Событие и пакет ingest |
sources.py |
Контракт настроек парсера. Схемы source_config по source_type |
queues.py |
Контракт доставки задания нужному воркеру. source_type → family → Redis key |
ЦА при admin CRUD валидирует конфиг через parse_source_config.
ЦП адаптеры должны отдавать dict, совместимые с IngestEventItem.
На практике CA дублирует часть DTO в
app/schemas.pyдля FastAPI; при изменении формы сверяйте оба места и UI.
JobPayload (jobs.py)
class JobPayload(BaseModel):
job_id: int
source_type: str
source_config: dict = {}
Уходит в Redis как JSON. Семейство очереди выбирается по source_type, не по содержимому config.
Ingest (ingest.py)
Ключевые поля IngestEventItem:
| Поле | Обязательность | Заметка |
|---|---|---|
source_url |
да | Стабильный URL; дедуп в ЦА |
source_type |
да (часто default) | Должен соответствовать адаптеру |
raw_text / title / description |
нет | Текст события |
latitude / longitude |
нет | Без них точка на карту не создаётся |
event_date, locality, region, topic |
нет | Фильтры карты и ПИ |
tags, metadata |
нет | Расширения |
Пакет: { job_id?, events: [...] }.
Listener добавляет флаг listener: true на стороне CA API (см. internal schemas).
Source config (sources.py)
| source_type | Модель | Главные поля |
|---|---|---|
telegram |
TelegramSourceConfig |
channel, limit, extract_mode (heuristic|llm|profile), heuristic_profile |
crawl4ai |
Crawl4AISourceConfig |
urls, extract_mode, extract_schema, domain_profile |
viina |
ViinaSourceConfig |
urls / texts, input_mode |
Реестр: CONFIG_MODELS + parse_source_config(source_type, raw).
Профиль парсера: contracts/heuristic_profile.py (HeuristicProfile, apply_profile). Сущности Profile/Channel живут в БД ЦА; в Redis уходит плоский heuristic_profile.
Очереди (queues.py)
SOURCE_FAMILY = {
"telegram": "telegram", # cp:jobs:telegram
"crawl4ai": "web", # cp:jobs:web
"viina": "nlp", # cp:jobs:nlp
}
queue_key_for_source(source_type)— куда enqueue из ЦА.- Legacy-ключ
cp:jobsещё может дренироваться telegram-воркерами (совместимость).
При добавлении нового source_type обязательно:
- схема в
sources.py; - запись в
SOURCE_FAMILY; - адаптер + registry + (при необходимости) новый Docker-сервис;
- поля формы в
ParsersView.vue.
Чеклист: .cursor/skills/add-parser-adapter/.