156 lines
4.3 KiB
Markdown
156 lines
4.3 KiB
Markdown
|
|
# 🔧 Исправление конфигурации n8n для Redis публикации
|
|||
|
|
|
|||
|
|
## ❌ Проблема в текущей конфигурации
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"channel": "=ai:response:{{ $('Edit Fields').item.json.taskId }}",
|
|||
|
|
"messageData": "={{ JSON.stringify($json.output) }}"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Проблемы:**
|
|||
|
|
1. ❌ Канал использует `$('Edit Fields').item.json.taskId` - неправильный путь
|
|||
|
|
2. ❌ `messageData` содержит `$json.output` - неправильный формат
|
|||
|
|
3. ❌ Нет сохранения в Redis ключ для fallback
|
|||
|
|
|
|||
|
|
## ✅ Правильная конфигурация
|
|||
|
|
|
|||
|
|
### Вариант 1: Если taskId в корне webhook body
|
|||
|
|
|
|||
|
|
**Channel:**
|
|||
|
|
```
|
|||
|
|
ai:response:{{ $json.taskId }}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Message (JSON объект):**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"task_id": "{{ $json.taskId }}",
|
|||
|
|
"response": "{{ $json.output }}",
|
|||
|
|
"status": "completed"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Вариант 2: Если taskId в webhook.body
|
|||
|
|
|
|||
|
|
**Channel:**
|
|||
|
|
```
|
|||
|
|
ai:response:{{ $json.webhook.body.taskId }}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Message (JSON объект):**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"task_id": "{{ $json.webhook.body.taskId }}",
|
|||
|
|
"response": "{{ $json.output }}",
|
|||
|
|
"status": "completed"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Вариант 3: Если ответ в другой ноде (например, AI Chat)
|
|||
|
|
|
|||
|
|
**Channel:**
|
|||
|
|
```
|
|||
|
|
{{ $json.webhook.body.redisChannel }}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Message (JSON объект):**
|
|||
|
|
```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:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"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:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"task_id": "{{ $json.webhook.body.taskId }}",
|
|||
|
|
"response": "{{ $json['AI Chat'].json.response }}",
|
|||
|
|
"status": "completed"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔍 Как найти правильный путь к данным
|
|||
|
|
|
|||
|
|
1. **Добавьте ноду "Set" перед Redis:**
|
|||
|
|
- Сохраните все данные из предыдущих нод
|
|||
|
|
- Посмотрите структуру данных в n8n
|
|||
|
|
|
|||
|
|
2. **Используйте Expression Editor в n8n:**
|
|||
|
|
- Нажмите на поле "Channel" или "Message"
|
|||
|
|
- Выберите "Expression"
|
|||
|
|
- Начните вводить `$json.` - увидите доступные поля
|
|||
|
|
|
|||
|
|
3. **Проверьте webhook body:**
|
|||
|
|
- В ноде Webhook посмотрите что приходит
|
|||
|
|
- `taskId` и `redisChannel` должны быть в `$json.webhook.body`
|
|||
|
|
|
|||
|
|
## ✅ Проверка
|
|||
|
|
|
|||
|
|
После настройки проверьте:
|
|||
|
|
|
|||
|
|
1. **В n8n:**
|
|||
|
|
- Запустите workflow
|
|||
|
|
- Проверьте что Redis ноды выполнились успешно
|
|||
|
|
- Посмотрите что именно публикуется в канал
|
|||
|
|
|
|||
|
|
2. **В Redis:**
|
|||
|
|
```bash
|
|||
|
|
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 ...`
|
|||
|
|
|
|||
|
|
3. **В браузере:**
|
|||
|
|
- Откройте консоль (F12)
|
|||
|
|
- Должны видеть: `AI Drawer: SSE connection opened`
|
|||
|
|
- Должны видеть: `AI Drawer: Received response via SSE`
|
|||
|
|
|
|||
|
|
## 🐛 Отладка
|
|||
|
|
|
|||
|
|
Если не работает:
|
|||
|
|
|
|||
|
|
1. **Проверьте формат сообщения:**
|
|||
|
|
- Должен быть валидный JSON
|
|||
|
|
- Должно быть поле `response` или `task_id`
|
|||
|
|
|
|||
|
|
2. **Проверьте канал:**
|
|||
|
|
- Должен совпадать с `redisChannel` из `n8n_proxy.php`
|
|||
|
|
- Формат: `ai:response:task-xxx`
|
|||
|
|
|
|||
|
|
3. **Проверьте логи PHP:**
|
|||
|
|
```bash
|
|||
|
|
tail -f /var/log/apache2/error.log | grep "AI SSE"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
4. **Проверьте что SSE endpoint доступен:**
|
|||
|
|
- Откройте в браузере: `/aiassist/ai_sse.php?task_id=test-123`
|
|||
|
|
- Должен открыться поток SSE (не ошибка)
|
|||
|
|
|