Задача 006: Единый контракт конверта (Redis и API)
Приоритет: Средний Статус: Запланировано Категория: Ядро / Архитектура
🎯 Цель
Стандартизировать обмен данными между ботом и внешними системами (Redis Streams, REST API, Webhooks). Каждое сообщение должно рассматриваться как «Конверт» (Envelope), содержащий системные метаданные и бизнес-нагрузку.
🛠 Единая структура
Система примет симметричную структуру для всех каналов связи:
1. Структура (JSON)
{
"meta": {
"type": "event.type",
"user_id": 12345,
"__next_scene__": "target_feature",
"trace_id": "uuid-string"
},
"payload": {
"data_field_1": "value",
"data_field_2": 42
}
}
2. Маппинг HTTP/API
Для REST-ответов BaseApiClient будет отвечать за сборку этого конверта:
- Meta: Извлекается из кастомных HTTP-заголовков (например, X-Bot-*) И/ИЛИ поля meta в теле JSON.
- Payload: Основные данные из тела ответа.
3. Маппинг Redis Stream
BotRedisDispatcher будет ожидать такую же структуру JSON в сообщении стрима.
🚀 Преимущества
- Полная симметрия: Логика переключения сцен или идентификации пользователей идентична как для фоновых задач, так и для прямых вызовов API.
- Упрощенные Оркестраторы: Оркестраторы получают предварительно распарсенный Конверт и им не нужно знать источник данных.
- Масштабируемость: Новые системные поля (например, подсказки для кэширования или теги аналитики) могут быть добавлены в
metaбез поломки логики фич.
✅ Определение готовности
- Реализован
EnvelopeDTOвcodex_bot.base. BaseApiClientподдерживает сборку конверта из заголовков и тела.BotRedisDispatcherподдерживает диспетчеризацию на основе конвертов.