vlad_dv писал:
Лучше хранить часы мастерской с явной зоной в конфиге
Про зону согласен. Добавлю ещё один сценарий, который
systemd не поймает вообще, даже с exit 78 и лимитами.
Процесс жив, status показывает active, в журнале пусто. При этом бот уже полчаса ничего не получает: long poll где-то повис, соединение не закрылось, исключения нет. Restart не сработает, потому что падать нечему. Владелица мастерской узнаёт об этом, когда клиент пишет ей в личку: «у вас бот сломался?»
Поэтому я разделяю две вещи: «процесс запущен» и «бот работает». Первое проверяет
systemd, второе нужно проверять снаружи. У меня это сделано в n8n, примерно так:
1. Бот после каждого успешного цикла получения событий пишет текущее время в маленький файл или в одну строку в базе. Это пульс, и больше он ничего не делает.
2. В n8n стоит
Cron-нода, раз в пять минут.
3. Дальше нода, которая читает этот пульс.
4. IF: пульс старше, скажем, десяти минут.
5. Если да, уведомление человеку, которому не всё равно. Не в ту же группу ВК, а в отдельный канал, чтобы сообщение не зависело от сломанного бота.
6. Если нет, ничего. Тишина тоже результат.
Порог подбирается под реальный трафик. У велосипедной мастерской ночью может не быть ни одного сообщения, поэтому пульс должен обновляться на каждом цикле опроса, а не на каждом входящем сообщении. Иначе в три ночи придёт ложная тревога, и через неделю её начнут игнорировать.
Теперь про «вы в субботу работаете?», раз уж это главный вопрос в группе. Тут легко соблазниться и отдать всё модели: пусть сама поймёт и ответит. Я бы так не делал. Ответ про часы работы должен браться из таблицы: дни, время, явная зона, отдельный список исключений вроде праздников или «уехали на склад». Модель может уверенно сказать «да, до 18:00», и проверить это будет нечем.
Если кнопок мало и люди всё равно пишут свободным текстом, локальная модель через
ollama пригодится на одном шаге: определить, о чём вопрос. Часы, цена переборки, запись, что-то другое. Это классификация, а не генерация ответа. Дальше обычный Switch, и каждая ветка берёт ответ из конфига. Если модель не уверена или выбрала «другое», бот пишет «передам мастеру» и пересылает вопрос человеку. Такой бот честно ответит на свои пять вопросов и не будет сочинять расценки.
kirill_nsk, твоя идея «сначала валидация, потом запуск» хорошо сюда ложится. Только валидацию стоит делать не один раз на старте, а держать постоянно, хотя бы в таком упрощённом виде.