- Добавлен SSE endpoint (aiassist/ai_sse.php) для real-time получения ответов от n8n - Обновлен n8n_proxy.php: убран callback, добавлена передача Redis параметров в n8n - Обновлен ai-drawer-simple.js: переход с polling на SSE с fallback через Redis - Добавлен check_redis_response.php для прямого чтения из Redis кэша - Добавлена документация: N8N_REDIS_SETUP.md, N8N_REDIS_FIX.md, AI_DRAWER_REDIS_SSE.md - Поддержка plain text ответов от n8n (автоматическое определение формата) - Кэширование ответов в Redis для надежности (TTL 5 минут)
4.3 KiB
4.3 KiB
🔧 Исправление конфигурации n8n для Redis публикации
❌ Проблема в текущей конфигурации
{
"channel": "=ai:response:{{ $('Edit Fields').item.json.taskId }}",
"messageData": "={{ JSON.stringify($json.output) }}"
}
Проблемы:
- ❌ Канал использует
$('Edit Fields').item.json.taskId- неправильный путь - ❌
messageDataсодержит$json.output- неправильный формат - ❌ Нет сохранения в Redis ключ для fallback
✅ Правильная конфигурация
Вариант 1: Если taskId в корне webhook body
Channel:
ai:response:{{ $json.taskId }}
Message (JSON объект):
{
"task_id": "{{ $json.taskId }}",
"response": "{{ $json.output }}",
"status": "completed"
}
Вариант 2: Если taskId в webhook.body
Channel:
ai:response:{{ $json.webhook.body.taskId }}
Message (JSON объект):
{
"task_id": "{{ $json.webhook.body.taskId }}",
"response": "{{ $json.output }}",
"status": "completed"
}
Вариант 3: Если ответ в другой ноде (например, AI Chat)
Channel:
{{ $json.webhook.body.redisChannel }}
Message (JSON объект):
{
"task_id": "{{ $json.webhook.body.taskId }}",
"response": "{{ $json['AI Chat'].json.response }}",
"status": "completed"
}
📋 Полная настройка n8n workflow
Шаг 1: Redis SET (сохранить в ключ для fallback)
Operation: Set
Key: ai:response:cache:{{ $json.webhook.body.taskId }}
Value:
{
"task_id": "{{ $json.webhook.body.taskId }}",
"response": "{{ $json['AI Chat'].json.response }}",
"status": "completed",
"timestamp": "{{ $now.toISO() }}"
}
TTL: 300 секунд
Шаг 2: Redis PUBLISH (опубликовать в канал для SSE)
Operation: Publish
Channel: {{ $json.webhook.body.redisChannel }}
Message:
{
"task_id": "{{ $json.webhook.body.taskId }}",
"response": "{{ $json['AI Chat'].json.response }}",
"status": "completed"
}
🔍 Как найти правильный путь к данным
-
Добавьте ноду "Set" перед Redis:
- Сохраните все данные из предыдущих нод
- Посмотрите структуру данных в n8n
-
Используйте Expression Editor в n8n:
- Нажмите на поле "Channel" или "Message"
- Выберите "Expression"
- Начните вводить
$json.- увидите доступные поля
-
Проверьте webhook body:
- В ноде Webhook посмотрите что приходит
taskIdиredisChannelдолжны быть в$json.webhook.body
✅ Проверка
После настройки проверьте:
-
В n8n:
- Запустите workflow
- Проверьте что Redis ноды выполнились успешно
- Посмотрите что именно публикуется в канал
-
В Redis:
redis-cli -h crm.clientright.ru -p 6379 -a 'CRM_Redis_Pass_2025_Secure!' \ MONITORДолжны видеть:
SET ai:response:cache:task-xxx ...PUBLISH ai:response:task-xxx ...
-
В браузере:
- Откройте консоль (F12)
- Должны видеть:
AI Drawer: SSE connection opened - Должны видеть:
AI Drawer: Received response via SSE
🐛 Отладка
Если не работает:
-
Проверьте формат сообщения:
- Должен быть валидный JSON
- Должно быть поле
responseилиtask_id
-
Проверьте канал:
- Должен совпадать с
redisChannelизn8n_proxy.php - Формат:
ai:response:task-xxx
- Должен совпадать с
-
Проверьте логи PHP:
tail -f /var/log/apache2/error.log | grep "AI SSE" -
Проверьте что SSE endpoint доступен:
- Откройте в браузере:
/aiassist/ai_sse.php?task_id=test-123 - Должен открыться поток SSE (не ошибка)
- Откройте в браузере: