Тест: пауза магазина + ИИ-ответы в Telegram (локальный контейнер) #139
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Задача
Остановить бота на продакшине и запустить локально в контейнере с теми же Telegram API, чтобы протестировать:
Статус
Ключевой факт
main-бот (Node.js) НЕ имеет ИИ-интеграции — sleep mode и /api/chat живут только в Next.js админке (feat/nextjs-admin). Нужен мост: бот вызывает POST /api/chat админки (localhost:3100).
✅ Прогресс: локальный контейнер запущен
Что сделано:
Продакшн-бот остановлен — через Gitea Actions workflow (раннер orange-pi-arm64) выполнен
docker stop telegram_shop_prod+docker update --restart=no. Контейнер на 192.168.2.74 остановлен, restart отключён.Локальный контейнер запущен (
telegram-shop-local, host-сеть):db/shop.dbМост бот → ИИ реализован:
src/services/chatbotService.js— вызов POST /api/chat админкиhandleStart(пауза магазина)messageRouter.dispatchтеперь возвращает признак обработкиz-ai-web-dev-sdk удалён — только реальный Ollama Cloud API:
reasoning_effort: 'none'добавлен в callOllamaНастройки в site_settings: chatbot_enabled=true, sleep_mode=false (тест), api_key=bbox, model=glm-5.2
Проверено:
Осталось: реальный тест в Telegram (отправить /start и сообщение боту).
✅ Тестирование завершено
Пауза магазина (sleep mode):
ИИ-ответы:
Инфраструктура:
Статус: ГОТОВО к тесту в Telegram. Отправьте /start и сообщение боту @dfhfghfghfghfghfgdhdfg_bot — получите sleep-сообщение (пауза) или ИИ-ответ (после выключения sleep).
🔧 Исправлены 3 бага
Баг 1: Заглушка сработала частично
Проблема: sleep mode давал жёсткое «Магазин на паузе» — клиент думал, что сервис мёртв.
Исправление: В /api/chat (route.ts) sleep mode теперь = мягкая инструкция: живой диалог, отвечает на вопросы о товарах и качестве, при попытке купить объясняет что резервы позже и предлагает оставить контакт. handleStart показывает ИИ-приветствие вместо заглушки.
Баг 2: Меню не убирались
Проблема: при нажатии «📦 Products» открывался каталог (страны/категории).
Исправление: в routes.js при sleep mode кнопка Магазин сразу переключает на ИИ-диалог + reply_markup: { remove_keyboard: true } — меню убирается, клиент остаётся в диалоге с ботом.
Баг 3: Полный JSON каталога в контекст
Проблема: в контекст ИИ шёл упрощённый список (name, price, category).
Исправление: в /api/chat теперь полный JSON каталога: id, name, description, price, quantityInStock, isMono, category, subcategory, location (страна/город/район). Добавлена инструкция: работает только общение, резервы позже, может расспросить по качеству.
Проверено:
Статус:
Готово к тесту в Telegram: @dfhfghfghfghfghfgdhdfg_bot (sleep_mode=true — тест паузы; выключить в #/chatbot для теста ИИ-продаж).
🔗 Объединение Users и Leads (расширенный профиль)
Исследование: users (финансы: баланс, покупки, кошельки, страна) и leads (коммуникации: переписки с ИИ, AI-профиль, статус) — одна сущность по telegram_id (пример: lead #5 = user #13 neroworm).
Реализовано объединение на уровне API + UI (без изменения схемы БД):
API
GET /api/leads/[id]→ теперь возвращает{ lead, user }— связанный пользователь (баланс, покупки, кошельки, страна)GET /api/users/[id]→ теперь возвращает{ ...user, lead }— связанный лид (сессии, customerProfile, статус лида)GET /api/leads/bulk→ каждый лид обогащён полемuser(баланс, статус, покупки)GET /api/users/bulk→ каждый пользователь обогащён полемlead(сессии, статус лида)UI Лиды (#/leads)
UI Пользователи (#/users)
Проверено (Playwright)
Теперь и в Пользователях, и в Лидах виден расширенный профиль с привязанными переписками и финансами.
✅ 4 правки по административному разделу
1. Очистка тестовых данных
2. Просмотр переписок
3. Лид → полная страница (вместо Sheet)
4. Тепловая карта активности
Проверено (Playwright)
🔧 Исправлены 2 бага в таблице лидов
Баг 1: Не отображались никнейм и Telegram ID
Причина: API возвращает поле
telegram(@neroworm), а компонент читал устаревшееtelegramUsername— которого в ответе нет. Колонки Telegram ID в таблице вообще не было.Исправление: таблица теперь читает
lead.telegram(никнейм) + добавлена колонка «Telegram ID» (lead.telegramId).Баг 2: Откуда взялось имя «happy to answer»
Причина: ложное срабатывание regex в
extractLeadData(api/chat/route.ts). Фраза ИИ-агента «I'm happy to answer...» матчилась паттерном(?:i am|i'm)\s+([A-Z][a-z]+...)и записывалась как имя лида. Причём функция анализировала ВСЕ сообщения (включая ответы ассистента), а не только клиента.Исправление:
role === 'user')Проверено (Playwright)