Daily Sync
Раз на добу (тригериться при першому кліку оператора в діалозі за день) — оновити статичні дані діалогу у векторній базі і зафіксувати snapshot у Supabase.
Що синхронізуємо
| Джерело | Дія |
|---|---|
| Профіль RU | Запит через ProfileService.fetchRu() → hash JSON → порівняти з останнім snapshot → якщо змінився, оновити profile/photo chunks у векторі. |
| Профіль TU | Так само через ProfileService.fetchTu(). |
| Фото профілю | URL витягується з профілю. Якщо hash URL змінився — profile/photo chunks перебудовуються. TODO: додати vision-аналіз фото і запис текстового опису в source='photo'. |
| AI-нотатки | NotesService.fetchFresh(since=lastNoteAt) → ingest у вектор як source: 'note' + snapshot. |
Чому так
- Профіль і фото міняються рідко — щоденного перерахунку достатньо, нема сенсу робити це на кожен запит.
- Нотатки за добу формуються асинхронно (AI-pipeline над діалогом). Daily sync — точка дотику між тим pipeline і нашою памʼяттю.
- Переписка не входить у daily sync — її дотягуємо ліниво при кліку «Згенерувати» (generation-pipeline), бо її свіжість критично важлива.
Кроки
- Перевірити
tips_daily_entity_snapshotsдляdialog_key + sync_date=today + entity_type=profile. Якщо сьогодні вже є RU і TU profiles, скіпаємо daily sync і повертаємо cached profiles. - Профіль:
- GET profile from upstream (RU + TU).
- Прочитати останні
profilesnapshots з Supabase. - Hash diff → якщо змінилось, видалити старі
profile/photochunks з вектора + ingest нові.
- Фото:
- Порівняти hash
{ url }з останнімphotosnapshot. - Якщо змінилось разом з profile refresh — перебудувати photo/profile chunks.
TODO: якщо URL новий або photo analysis відсутній, запустити photo-analysis-ingest і записати текстовий опис фото уclient_memory_chunks.
- Порівняти hash
- Нотатки:
- Запит до upstream API:
getNotes(ruId, tuId, since=lastNoteAt). - Нові нотатки → ingest у вектор як
source: 'note'.
- Запит до upstream API:
- Upsert snapshots у
tips_daily_entity_snapshots:profile,photo,note, markerdaily_sync.
Дані
tips_daily_entity_snapshots зберігає короткоживучий audit/cache на 14 днів:
dialog_key,family,ru_id,tu_idsync_date,entity_type,source_role,source_idpayload,content_hash,entity_at,text- unique key:
(dialog_key, sync_date, entity_type, source_role, source_id)
Зв’язки
- Перед usage запускається з generation-pipeline (lazy, перший клік за день).
- Пише chunks у memory-chunk через memory-service.
- Кешує snapshots у supabase таблиці
tips_daily_entity_snapshots.
TODO
- Перевірити cleanup для
expires_atуtips_daily_entity_snapshots. - Вирішити чи photo hash має бути тільки URL, чи content hash картинки.
- Додати
PhotoAnalysisService: не передавати тільки screenshot/photoUrl, а зберігати vision summary у базу.