aff0bc29901a972dbf3343642da55589010791e6
GorychBot
Набор сервисов для Telegram-бота шаурмечной "Горыч" с отдельным парсером меню и отдельным RAG API.
Проект разделён на независимые части:
tgbot— основной Telegram-бот наaiogram.menu_scraper— сервис, который парсит меню сhttps://gorych34.ru/.rag_api— FastAPI-сервис с RAG, локальными эмбеддингамиsergeyzh/rubert-mini-fridaи function calling для подбора блюд.redisdb— Redis для бота.postgredb— PostgreSQL для бота.
Что делает проект
menu_scraperзабирает меню с сайта Горыча и сохраняет нормализованный JSON вdata/menu/gorich_menu.json.rag_apiиндексирует:- знания о заведении: описание, контакты, режим, доставка, соцсети;
- меню: названия, описания, ингредиенты, цены, размеры, фото.
rag_apiумеет:- отвечать на вопросы о заведении через RAG;
- вызывать tool
find_menu_itemsдля подбора блюд по бюджету, категории и ингредиентам.
tgbotработает отдельно от RAG API и использует PostgreSQL + Redis.
Сервисы
tgbot
Назначение:
- Telegram-бот на
aiogram. - Хранит данные в PostgreSQL.
- Использует Redis для FSM/storage.
Файл env:
bot/.env
Зависимости:
redisdbpostgredb
Стартовая команда:
python aiogram_run.py
menu_scraper
Назначение:
- Парсит меню с сайта Горыча.
- Берёт встроенный каталог товаров из JSON на странице
gorych34.ru. - Пишет результат в
data/menu/gorich_menu.json.
Файл env:
menu_scraper/.env
Порт:
8010
Основные endpoints:
GET /healthPOST /scrapeGET /itemsGET /items/{item_id}
Пример ответа:
- один snapshot меню с
total_itemsи массивомitems
rag_api
Назначение:
- Отдельный API для вопросов о заведении.
- RAG по сайту, доставке, контактам и соцсетям.
- Локальные эмбеддинги через
sergeyzh/rubert-mini-fridaна CPU. - Function calling через OpenRouter для подбора блюд из меню.
Файл env:
rag_api/.env
Порт:
- внешний
8001 - внутренний контейнерный
8000
Основные endpoints:
GET /healthPOST /chatPOST /admin/reindexGET /menu/search
POST /chat принимает:
{
"message": "Посоветуй что-нибудь острое из пиццы до 400 рублей",
"history": []
}
GET /menu/search умеет:
querymax_pricecategorymust_includemust_not_includelimit
Пример:
curl "http://localhost:8001/menu/search?query=острая%20пицца&max_price=450&category=пицца&limit=3"
Структура данных
data/menu/gorich_menu.json
Содержит:
item_idnamecategorydescriptioningredientspriceprice_labelsizephoto_urlsource_urlscraped_at
data/chroma/
Локальная база ChromaDB для RAG:
- коллекция знаний о заведении;
- коллекция документов меню.
Настройка
В проекте используются отдельные env-файлы по сервисам:
bot/.envmenu_scraper/.envrag_api/.env
Примеры:
.env.examplebot/.env.examplemenu_scraper/.env.examplerag_api/.env.example
Минимум для запуска:
- Заполнить
bot/.env - Заполнить
rag_api/.env - При необходимости поправить
menu_scraper/.env
Важно:
OPENROUTER_API_KEYнужен только дляrag_api.- Для OpenRouter лучше использовать модель, которая нормально работает с tools в вашем регионе. Сейчас в конфиге стоит
mistralai/mistral-medium-3-5.
Запуск
Поднять всё:
docker compose up -d --build
Проверка сервисов:
curl http://localhost:8010/health
curl http://localhost:8001/health
Пересобрать индекс RAG вручную:
curl -X POST http://localhost:8001/admin/reindex
Перепарсить меню вручную:
curl -X POST http://localhost:8010/scrape
Что уже реализовано
- отдельный парсер меню;
- сохранение меню в JSON;
- отдельный RAG API;
- ChromaDB;
- локальные эмбеддинги
rubert-mini-frida; - function calling для подбора блюд;
- подбор по семантике + лексическим признакам меню;
- Docker Compose для всех сервисов.
Что важно знать
rag_apiсейчас не вшит напрямую вtgbot; это отдельный сервис с HTTP API.rag_apiна первом старте может подниматься дольше из-за загрузки модели эмбеддингов.data/хранит runtime-данные и не должен коммититься в git.
Description
Languages
Python
99.1%
Dockerfile
0.9%