Files
aiform_dev/N8N_INTEGRATION.md
AI Assistant 647abf6578 feat: Интеграция n8n + Redis Pub/Sub + SSE для real-time обработки заявок
🎯 Основные изменения:

Backend:
-  Добавлен SSE endpoint для real-time событий (/api/v1/events/{task_id})
-  Redis Pub/Sub для публикации/подписки на события OCR/Vision
-  Удален aioboto3 из requirements.txt (конфликт зависимостей)
-  Добавлен OCR worker (deprecated, логика перенесена в n8n)

Frontend (React):
-  Автогенерация claim_id и session_id
-  Клиентская конвертация файлов в PDF (JPG/PNG/HEIC/WEBP)
-  Сжатие изображений до 2MB перед конвертацией
-  SSE подписка на события OCR/Vision в Step1Policy
-  Валидация документов (полис vs неподходящий контент)
-  Real-time прогресс загрузки и обработки файлов
-  Интеграция с n8n webhooks для проверки полиса и загрузки файлов

n8n Workflows:
-  Проверка полиса в MySQL + запись в PostgreSQL
-  Загрузка файлов в S3 + OCR + Vision AI
-  Публикация событий в Redis через backend API
-  Валидация документов (распознавание полисов ERV)

Документация:
- 📝 N8N_INTEGRATION.md - интеграция с n8n
- 📝 N8N_SQL_QUERIES.md - SQL запросы для workflows
- 📝 N8N_PDF_COMPRESS.md - сжатие PDF
- 📝 N8N_STIRLING_COMPRESS.md - интеграция Stirling-PDF

Утилиты:
- 🔧 monitor_redis.py/sh - мониторинг Redis Pub/Sub
- 🔧 test_redis_events.sh - тестирование событий
- 🔧 pdfConverter.ts - клиентская конвертация в PDF

Архитектура:
React → n8n webhooks (sync) → MySQL/PostgreSQL/S3
      → n8n workflows (async) → OCR/Vision → Redis Pub/Sub → SSE → React
2025-10-27 08:33:16 +03:00

5.4 KiB
Raw Permalink Blame History

🔌 Интеграция n8n с React Frontend

📡 Redis Pub/Sub для real-time событий

Публикация события из n8n (HTTP Request Node)

POST http://147.45.146.17:8100/api/v1/events/{task_id}

{
  "status": "processing|ocr_started|ocr_completed|ai_started|completed|error",
  "message": "Описание для пользователя",
  "data": {
    "chars": 1500,
    "confidence": 0.95,
    "document_type": "policy",
    "extracted_data": {...}
  }
}

Примеры:

  1. Начало обработки:
POST /api/v1/events/abc-123-def
{
  "status": "processing",
  "message": "Начата обработка файла",
  "data": {
    "filename": "Policy_123.pdf"
  }
}
  1. OCR завершён:
POST /api/v1/events/abc-123-def
{
  "status": "ocr_completed",
  "message": "Распознано 1500 символов",
  "data": {
    "chars": 1500,
    "ocr_text_preview": "ЕВРОИНС ПОЛИС E1000-..."
  }
}
  1. AI анализ:
POST /api/v1/events/abc-123-def
{
  "status": "ai_started",
  "message": "Запущен AI анализ документа",
  "data": {}
}
  1. Завершено:
POST /api/v1/events/abc-123-def
{
  "status": "completed",
  "message": "Обработка завершена",
  "data": {
    "document_type": "policy",
    "is_valid": true,
    "confidence": 0.95,
    "extracted_data": {
      "voucher": "E1000-302545808",
      "holder_name": "ROMANOVA ANASTASIIA",
      "insured_from": "22.09.2025",
      "insured_to": "30.09.2025"
    }
  }
}
  1. Ошибка:
POST /api/v1/events/abc-123-def
{
  "status": "error",
  "message": "Ошибка обработки: файл повреждён",
  "data": {
    "error_code": "OCR_FAILED"
  }
}

🎯 Вебхуки для n8n

1. Проверка полиса (MySQL)

POST /webhook/check-policy

Request:

{
  "policy_number": "E1000-302545808",
  "inn": "123456789012"
}

Response:

{
  "found": true,
  "policy": {
    "voucher": "E1000-302545808",
    "holder_name": "ROMANOVA ANASTASIIA",
    "status": "active"
  }
}

2. Загрузка файла в S3

POST /webhook/upload-file

Request (multipart/form-data):

  • file: File
  • folder: "policies" | "documents" | "tickets"

Response:

{
  "success": true,
  "task_id": "abc-123-def",
  "s3_url": "https://s3.twcstorage.ru/bucket/policies/file.pdf",
  "message": "Файл загружен, обработка началась"
}

n8n Flow:

  1. Загрузить в S3
  2. Сгенерировать task_id (UUID)
  3. Положить задачу в RabbitMQ (erv_ocr_processing)
  4. Вернуть task_id

3. OCR Worker (RabbitMQ Trigger)

n8n Workflow:

RabbitMQ Trigger (erv_ocr_processing)
    ↓
Скачать файл из S3
    ↓
POST /api/v1/events/{task_id}
    status: "processing"
    ↓
HTTP Request → OCR API
    POST http://147.45.146.17:8001/analyze-file
    ↓
POST /api/v1/events/{task_id}
    status: "ocr_completed"
    data: {chars: ..., ocr_text: "..."}
    ↓
HTTP Request → Gemini Vision (OpenRouter)
    ↓
POST /api/v1/events/{task_id}
    status: "completed"
    data: {document_type, is_valid, extracted_data}
    ↓
Сохранить результат в Redis
    key: "ocr_result:{task_id}"
    ttl: 3600

4. Получение результата OCR

GET /webhook/ocr-result/{task_id}

Response:

{
  "success": true,
  "result": {
    "document_type": "policy",
    "is_valid": true,
    "confidence": 0.95,
    "ocr_text": "...",
    "extracted_data": {...}
  }
}

n8n: Читает из Redis ocr_result:{task_id}


5. Создание заявки (финал)

POST /webhook/create-claim

Request:

{
  "voucher": "E1000-302545808",
  "email": "user@example.com",
  "phone": "+79001234567",
  "incident": {
    "type": "flight_delay",
    "date": "2025-10-25",
    "flight_number": "SU123",
    "description": "Задержка более 3 часов"
  },
  "payment": {
    "method": "sbp",
    "bank": "sberbank"
  },
  "documents": [
    "https://s3.../ticket1.pdf",
    "https://s3.../boarding_pass.pdf"
  ]
}

Response:

{
  "success": true,
  "claim_id": "CLM-2025-001",
  "crm_id": "12345",
  "message": "Заявка успешно создана"
}

n8n Flow:

  1. Проверить все данные
  2. Создать запись в PostgreSQL
  3. Отправить в Vtiger CRM
  4. Отправить email подтверждение
  5. Вернуть claim_id

📊 Draft (автосохранение)

POST /webhook/draft/save

{
  "session_id": "sess-abc-123",
  "step": 1,
  "form_data": {...}
}

GET /webhook/draft/stats

Возвращает статистику: сколько людей бросили на каждом шаге.


🔗 Redis Connection

Host: crm.clientright.ru
Port: 6379
Password: CRM_Redis_Pass_2025_Secure!
DB: 0

Channels:

  • ocr_events:{task_id} - события обработки

📝 Примечания

  1. task_id - генерируется как UUID в n8n
  2. Redis TTL - результаты хранятся 1 час
  3. RabbitMQ - 185.197.75.249:5672 (admin/tyejvtej)
  4. S3 - TWC Storage, креды в .env

Готово для n8n! 🚀