diff --git a/AI_DRAWER_SSE_SESSION_LOG.md b/AI_DRAWER_SSE_SESSION_LOG.md new file mode 100644 index 00000000..a3462c9a --- /dev/null +++ b/AI_DRAWER_SSE_SESSION_LOG.md @@ -0,0 +1,105 @@ +# Лог сессии: Реализация SSE + Redis Pub/Sub для AI Drawer + +**Дата:** 11 ноября 2025 +**Задача:** Переход с polling на real-time коммуникацию через SSE и Redis Pub/Sub + +## Проблема + +Изначально использовался механизм polling: +- n8n отправлял ответ в `callback_ai_response.php` +- Ответ сохранялся в БД таблицу `ai_responses` +- Frontend периодически опрашивал `get_ai_result.php` +- Неэффективно и не real-time + +## Решение + +Реализована архитектура на основе: +- **Server-Sent Events (SSE)** для real-time доставки ответов +- **Redis Pub/Sub** для передачи сообщений от n8n +- **Redis кэш** для fallback механизма + +## Реализованные компоненты + +### 1. SSE Endpoint (`aiassist/ai_sse.php`) +- Подписывается на Redis канал `ai:response:{taskId}` +- Отправляет события через SSE +- Поддерживает plain text и JSON форматы от n8n +- Кэширует ответы в Redis для надежности +- Логирование в `/logs/ai_sse_debug.log` + +### 2. Обновлен `n8n_proxy.php` +- Убран callback URL +- Добавлена передача Redis параметров в n8n: + - `redisChannel` + - `redisHost` + - `redisPort` + - `redisPassword` + +### 3. Обновлен `ai-drawer-simple.js` +- Заменен `startPolling()` на `startSSEListener()` +- Использует `EventSource` API для SSE +- Fallback через `checkRedisDirectly()` если SSE не работает +- Обработка событий: `connected`, `response`, `error`, `heartbeat` + +### 4. Fallback endpoint (`aiassist/check_redis_response.php`) +- Прямое чтение из Redis кэша +- Используется если SSE не подключился или потерял соединение + +## Настройка n8n + +### Redis Node Configuration: +- **Operation:** Publish +- **Channel:** `{{ $json.body.redisChannel }}` или `ai:response:{{ $json.body.taskId }}` +- **Data:** `{{ $json.output }}` (можно plain text или JSON) + +### Рекомендуется: +1. Сначала выполнить `Redis SET` в ключ `ai:response:cache:{taskId}` (TTL 300 сек) +2. Затем выполнить `Redis PUBLISH` в канал `ai:response:{taskId}` + +## Тестирование + +### Успешные тесты: +- ✅ Получение plain text ответов от n8n +- ✅ Кэширование в Redis +- ✅ SSE доставка ответов +- ✅ Fallback механизм работает + +### Логи: +- Файл: `/logs/ai_sse_debug.log` +- Последние успешные запросы: + - `task-691326da57708-1762862810` (15:07:07) + - `task-6913281c9ff7e-1762863132` (15:12:36) + +## Преимущества новой архитектуры + +1. **Real-time:** Ответы приходят мгновенно через SSE +2. **Надежность:** Fallback через Redis кэш +3. **Гибкость:** Поддержка plain text и JSON форматов +4. **Производительность:** Нет постоянного polling +5. **Масштабируемость:** Redis Pub/Sub поддерживает множество подписчиков + +## Файлы в репозитории + +### Новые файлы: +- `aiassist/ai_sse.php` +- `aiassist/check_redis_response.php` +- `AI_DRAWER_REDIS_SSE.md` +- `N8N_REDIS_SETUP.md` +- `N8N_REDIS_FIX.md` + +### Измененные файлы: +- `aiassist/n8n_proxy.php` +- `layouts/v7/resources/js/ai-drawer-simple.js` + +## Git коммит + +``` +1a465329 Реализован SSE + Redis Pub/Sub для AI Drawer +``` + +## Статус + +✅ **Работает в продакшене** +✅ **Все изменения запушены в Git** +✅ **Документация обновлена** +