Files
aiform_prod/docs/N8N_OCR_EVENTS_MINIMAL_PAYLOAD.md

105 lines
5.0 KiB
Markdown
Raw Normal View History

# Минимальный payload для ocr_events
## Назначение
После сохранения первичного черновика в PostgreSQL через `claimsave_primary`, n8n должен пушить в Redis канал `ocr_events:{session_token}` только минимальный набор данных.
**Важно:** Канал формируется как `ocr_events:{session_token}`, где `session_token` - это токен сессии, который генерируется на фронтенде (например, `sess-1763201209156-hyjye5u9h`).
Бэкенд сам достанет полные данные из PostgreSQL по `claim_id` через эндпоинт `/api/v1/claims/wizard/load/{claim_id}`.
## Формат данных для ocr_events
```json
{
"event_type": "wizard_ready",
"status": "ready",
"message": "Wizard plan готов",
"data": {
"claim_id": "9d22d3f4-0306-4b77-a102-c0ca57b24a70",
"session_token": "sess-1763201209156-hyjye5u9h",
"status_code": "draft",
"unified_id": "usr_90599ff2-ac79-4236-b950-0df85395096c",
"contact_id": "320096",
"phone": "79262306381"
},
"timestamp": "2025-11-20T11:40:41Z"
}
```
## Поля data
- **claim_id** (string, обязательное) - UUID заявки из PostgreSQL
- **session_token** (string, обязательное) - токен сессии пользователя
- **status_code** (string, опциональное) - статус заявки (обычно "draft")
- **unified_id** (string, опциональное) - unified_id пользователя
- **contact_id** (string, опциональное) - ID контакта в CRM
- **phone** (string, опциональное) - нормализованный номер телефона
## Что НЕ нужно пушить
-`wizard_plan` - бэкенд достанет из PostgreSQL
-`problem_description` - бэкенд достанет из PostgreSQL
-`wizard_answers` - бэкенд достанет из PostgreSQL
-`ai_agent1_facts` - бэкенд достанет из PostgreSQL
-`ai_agent13_rag` - бэкенд достанет из PostgreSQL
- ❌ Любые другие данные из `payload` - всё в PostgreSQL
## Как бэкенд получает данные
1. Фронтенд подключается к SSE через `/events/{session_token}` (например, `/events/sess-1763201209156-hyjye5u9h`)
2. Бэкенд подписывается на Redis канал `ocr_events:{session_token}` (например, `ocr_events:sess-1763201209156-hyjye5u9h`)
3. n8n пушит событие в этот канал с минимальным payload (только `claim_id`, `session_token` и т.д.)
4. Бэкенд получает событие, извлекает `claim_id` из `data.claim_id`
5. Бэкенд вызывает `GET /api/v1/claims/wizard/load/{claim_id}` для получения полных данных из PostgreSQL
6. Бэкенд отправляет полные данные (wizard_plan, problem_description и т.д.) на фронтенд через SSE
## Пример использования в n8n
После выполнения `claimsave_primary`:
1. **Code Node** - формирует минимальный payload и определяет канал:
```javascript
const claimData = $('claimsave_primary').first().json.claim;
const sessionToken = claimData.session_token;
const result = {
event_type: "wizard_ready",
status: "ready",
message: "Wizard plan готов",
data: {
claim_id: claimData.claim_id,
session_token: sessionToken,
status_code: claimData.status_code,
unified_id: $('propertyName').first().json.unified_id || null,
contact_id: $('Edit Fields10').first().json.contact_id || null,
phone: $('Edit Fields10').first().json.phone || null
},
timestamp: new Date().toISOString()
};
// Сохраняем session_token для использования в URL
return [{
json: result,
session_token: sessionToken // Для использования в следующей ноде
}];
```
2. **HTTP Request Node** - пушит в бэкенд:
- URL: `http://backend:8000/api/v1/events/{{ $json.session_token }}`
- Method: POST
- Body: JSON из Code Node (весь объект `result`)
**Важно:** URL должен быть `http://backend:8000/api/v1/events/{session_token}`, где `{session_token}` берётся из предыдущей ноды (например, `sess-1763201209156-hyjye5u9h`).
Это создаст канал `ocr_events:sess-1763201209156-hyjye5u9h`, к которому подключён фронтенд через SSE.
## Преимущества
- ✅ Минимум данных в Redis (только идентификаторы)
- ✅ PostgreSQL как единственный источник истины
- ✅ Легче отлаживать (всё в одном месте)
- ✅ Меньше нагрузка на Redis
- ✅ Проще масштабировать