AI-консультант по напольным покрытиям для сайта и Telegram. Диалог ведёт FSM-агент,
товары ищутся в SQLite-базе products.db, доступность берётся только из складской
таблицы stock.
app/main.py— FastAPI:GET /отдаётstatic/chat.html,POST /chatзапускает агента.app/tg_bot.py— Telegram-интерфейс через aiogram 3.app/agent_fsm.py— сценарий консультанта: discovery → selection → calculation → closing.app/db.py— поиск товаров, выбор по ID и расчёт упаковок.app/scrape_products.py— загрузка каталога midiltd.ru в таблицуproducts.app/parse_products_gpt.py— разбор названий товаров через YandexGPT вfloor_covering_specs.app/load_stock.py— загрузка остатков 1С из.xlsxв таблицуstock.
Таблица stock — единственный источник доступности для консультанта.
Товар показывается и выбирается только если:
products.article = stock.article AND stock.quantity > 0Товары без артикула, без строки в stock или с остатком <= 0 не попадают в поиск
и не проходят выбор по ID.
pip install -r requirements.txt
cp .env.example .envЗаполните .env:
LLM_PROVIDER=openai
LLM_API_KEY=...
LLM_BASE_URL=https://api.openai.com/v1
LLM_MODEL=gpt-4o-mini
# Для YandexGPT и парсера товаров
YC_API_KEY=...
YC_FOLDER_ID=...
# Для Telegram-бота
TELEGRAM_BOT_TOKEN=...Запускайте шаги по порядку:
python3 -m app.scrape_products
python3 -m app.parse_products_gpt
python3 -m app.load_stock "Остатки на 09.08.26.xlsx"Что делают шаги:
scrape_productsполностью пересобираетproductsи сохраняетname,url,price,article.parse_products_gptзаполняетfloor_covering_specs; артикул не угадывает, а переносит изproducts.article.load_stockполностью пересобираетstockиз выгрузки 1С: A — артикул, C — номенклатура, G — ед. изм., K — конечный остаток.
Подробности пайплайна: PARSER_README.md.
Web-интерфейс:
uvicorn app.main:app --reloadTelegram-бот:
python3 -m app.tg_botКонсультант хранит состояние пользователя в памяти процесса: тип покрытия, цвет, бренд, площадь, выбранный товар и стадию диалога.
Поиск поддерживает:
- тип покрытия по
floor_covering_specs.product_typeиproducts.name; - бренд по
floor_covering_specs.brand; - цвет с группами синонимов, например
темныйищет такжечерный,венге,графит; - нормализацию
ё → еи игнорирование строкового"null".
Расчёт материалов использует area_per_pack_m2 выбранного товара и запас 10%.
python3 -m pytest tests/ -vПарсер пишет подробные логи в logs/parser_YYYY-MM-DD.log; каталог logs/
исключён из git.
.env содержит ключи API и Telegram-токен. Не коммитьте его; файл исключён через
.gitignore.