run is Node-based, so we need a Node entrypoint. server.js: 1) pip install -r requirements.txt (idempotent, --break-system-packages) 2) spawn python3 -m src.dashboard.run on PORT 8000 3) http proxy 3000 → 8000 This makes the dashboard visible at /proxy/3000/. |
||
|---|---|---|
| config | ||
| data | ||
| design-system | ||
| src | ||
| .env.example | ||
| .gitignore | ||
| .vibe42-design.json | ||
| agent.js | ||
| AGENTS.md | ||
| data.json | ||
| design.md | ||
| index.html | ||
| index.legacy.html | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| requirements.txt | ||
| screenshot-20260924-113732.png | ||
| server.js | ||
chto-ty-takoe-na-baze-kakih — AgroMarket Price Agent
MVP ИИ-агента, который ежедневно собирает открытые агро-цены (KZ/TJ/UZ/RU), нормализует и категоризирует их, строит аналитику и отдаёт дашборд + дайджест.
Стек
- Python 3.12, SQLite (переносимо на PostgreSQL), APScheduler, FastAPI + Plotly
- ИИ (LLM) — только выписывает число из фрагмента источника, сверка посимвольно
- Каждая цена — со ссылкой на источник и датой сбора
Запуск
python3 -m pip install -r requirements.txt
export $(grep -v '^#' .env | xargs) # секреты в .env
python3 -m src.dashboard.run # дашборд на $PORT (дефолт 8000)
python3 -m src.scheduler --once # один прогон пайплайна + дайджест
python3 -m src.scheduler --daemon # демон (ежедневно 07:30)
python3 -m src.demo_data # синтетические данные (60 дней)
python3 -m src.export_excel # отчёт в data/agromarket_report.xlsx
python3 -m pytest src/tests -q # тесты
Дополнительно:
- На странице Источники — форма ручной загрузки CSV/HTML (Arbuz.kz, Sharyn и аналоги без API). Запись идёт через тот же пайплайн; низкая уверенность → очередь на проверку.
- На странице Страны — кнопка «Скачать в Excel» (SheetJS, выгрузка раскладок прямо из браузера).
- CLI-отчёт
python3 -m src.export_excelкладёт.xlsx(динамика по товарам + раскладки + алерты) вdata/— скачивается из вкладки Файлы.
Структура
src/pipeline/— fetch, extract, normalize, categorize, validate, llm_extract, raw, orchestratorsrc/analytics/— dynamics, spreads/arbitrage, seasonality, anomalies, alerts, forecastsrc/dashboard/— FastAPI: overview, products, product, countries, alerts, quality, sourcessrc/— db.py (SQL), config.py, taxonomy.py, models.py, cache.py, scheduler.py, digest.py, demo_data.pyconfig/— taxonomy.yaml, synonyms.yaml, sources.yaml
Принципы (железо)
- Искренность: LLM не выдумывает цены — только цитирует число из фрагмента, затем строковая сверка. Не прошло — запись отбрасывается (не в карантин).
- Корректность: «нет данных» ≠ «цена 0». Подозрительные значения — в карантин, не в аналитику. Ниже порога (floor по категории) → quarantine.
- Легальность: tier-3 / новые источники —
legal_status: pending_review(выключены по умолчанию). Никакого обходa captcha/роботов; честный User-Agent, robots.txt, rate-limit, кеш. - Идентичность: повторный запуск не дублирует записи (ключ по source+region+product+price_type+as_of+фрагмент+snapshot).
Ограничения MVP
- КЗ-официальные источники (stat.gov.kz/uz/tj) недоступны из run-контейнера (DNS) — только заглушки-адаптеры; нужен прогон из сети с доступом.
- Arbuz.kz / Sharyn — нет публичного API →
pending_review+ ручной CSV-дамп. - Прогнозы — базовые (seasonal naive, SARIMA) с честным доверительным интервалом и меткой «низкая уверенность».
- Модель арбитража (груз/тариф/комиссия) — предположения, помечены в UI как «assumptions».