DocUA commited on
Commit
81f922c
·
1 Parent(s): 44ee8e7

Docs: cleanup and create current architecture guide

Browse files

- Removed 10 outdated .md files (old logic, deprecated guides)
- Created CURRENT_ARCHITECTURE.md with K/V/T system overview
- Updated README.md with current Entry Classifier architecture
- Cleaned up documentation to reflect actual system state

CURRENT_ARCHITECTURE.md ADDED
@@ -0,0 +1,247 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 🏗️ Поточна архітектура Lifestyle Journey
2
+
3
+ ## 🎯 Огляд системи
4
+
5
+ **Lifestyle Journey** - медичний чат-бот з lifestyle коучингом на базі Gemini API, що використовує розумну класифікацію повідомлень та м'який медичний тріаж.
6
+
7
+ ## 🔧 Ключові компоненти
8
+
9
+ ### 📋 Класифікатори
10
+
11
+ #### 1. **EntryClassifier** - K/V/T формат
12
+ **Призначення:** Класифікує повідомлення пацієнта на початку взаємодії
13
+
14
+ **Формат відповіді:**
15
+ ```json
16
+ {
17
+ "K": "Lifestyle Mode",
18
+ "V": "on|off|hybrid",
19
+ "T": "2025-09-04T11:30:00Z"
20
+ }
21
+ ```
22
+
23
+ **Значення V:**
24
+ - **off** - медичні скарги, симптоми, вітання → м'який медичний тріаж
25
+ - **on** - lifestyle питання → активація lifestyle режиму
26
+ - **hybrid** - містить і lifestyle теми, і медичні скарги → гібридний потік
27
+
28
+ #### 2. **TriageExitClassifier**
29
+ **Призначення:** Після медичного тріажу оцінює готовність до lifestyle
30
+
31
+ **Критерії для lifestyle:**
32
+ - Медичні скарги стабілізовані
33
+ - Пацієнт готовий до lifestyle активностей
34
+ - Немає активних симптомів
35
+
36
+ #### 3. **LifestyleExitClassifier** (deprecated)
37
+ **Призначення:** Контролює вихід з lifestyle режиму
38
+ **Статус:** Замінено на MainLifestyleAssistant логіку
39
+
40
+ ### 🤖 Асистенти
41
+
42
+ #### 1. **SoftMedicalTriage** - М'який тріаж
43
+ **Призначення:** Делікатна перевірка стану пацієнта на початку взаємодії
44
+
45
+ **Принципи:**
46
+ - Дружній, не нав'язливий тон
47
+ - 1-2 коротких питання про самопочуття
48
+ - Швидка оцінка потреби в медичній допомозі
49
+ - Готовність перейти до lifestyle якщо все добре
50
+
51
+ #### 2. **MedicalAssistant** - Повний медичний режим
52
+ **Призначення:** Медичні консультації з урахуванням хронічних станів
53
+
54
+ **Функції:**
55
+ - Безпечні рекомендації та тріаж
56
+ - Направлення до лікарів при red flags
57
+ - Урахування медичного анамнезу та медикаментів
58
+
59
+ #### 3. **MainLifestyleAssistant** - Розумний lifestyle коуч
60
+ **Призначення:** Аналізує повідомлення і визначає найкращу дію для lifestyle сесії
61
+
62
+ **3 типи дій:**
63
+ ```json
64
+ {
65
+ "message": "відповідь пацієнту",
66
+ "action": "gather_info|lifestyle_dialog|close",
67
+ "reasoning": "пояснення вибору дії"
68
+ }
69
+ ```
70
+
71
+ - **gather_info** - збір додаткової інформації про стан, уподобання
72
+ - **lifestyle_dialog** - lifestyle коучинг та рекомендації
73
+ - **close** - завершення lifestyle сесії (медичні скарги, прохання, довга сесія)
74
+
75
+ ### 🔄 Менеджери
76
+
77
+ #### **LifestyleSessionManager**
78
+ **Призначення:** Управляє lifecycle lifestyle сесій та розумно оновлює профіль
79
+
80
+ **Функції:**
81
+ - Суммаризація сесії без розростання даних
82
+ - Контроль розміру `journey_summary` (максимум 800 символів)
83
+ - Логування ключових моментів з датами
84
+ - Уникнення повторів інструкцій
85
+
86
+ ## 🔄 Потік обробки повідомлень
87
+
88
+ ### 1. **Entry Classification**
89
+ ```
90
+ Повідомлення → EntryClassifier → K/V/T формат
91
+ ├── V="off" → SoftMedicalTriage
92
+ ├── V="on" → MainLifestyleAssistant
93
+ └── V="hybrid" → Гібридний потік
94
+ ```
95
+
96
+ ### 2. **Гібридний потік**
97
+ ```
98
+ V="hybrid" → MedicalAssistant (тріаж)
99
+ → TriageExitClassifier (оцінка готовності)
100
+ → [lifestyle або medical режим]
101
+ ```
102
+
103
+ ### 3. **Lifestyle режим**
104
+ ```
105
+ MainLifestyleAssistant → action
106
+ ├── "gather_info" → збір інформації (продовжити lifestyle)
107
+ ├── "lifestyle_dialog" → коучинг (продовжити lifestyle)
108
+ └── "close" → завершення → LifestyleSessionManager → medical режим
109
+ ```
110
+
111
+ ### 4. **Оновлення профілю**
112
+ ```
113
+ Завершення lifestyle → LifestyleSessionManager
114
+ → Аналіз сесії
115
+ → Оновлення last_session_summary
116
+ → Додавання до journey_summary
117
+ → Контроль розміру даних
118
+ ```
119
+
120
+ ## 📊 Структура даних
121
+
122
+ ### **SessionState**
123
+ ```python
124
+ @dataclass
125
+ class SessionState:
126
+ current_mode: str # "medical" | "lifestyle" | "none"
127
+ is_active_session: bool
128
+ session_start_time: Optional[str]
129
+ last_controller_decision: Dict
130
+ lifestyle_session_length: int = 0 # Лічильник lifestyle повідомлень
131
+ last_triage_summary: str = "" # Результат медичного тріажу
132
+ entry_classification: Dict = None # K/V/T класифікація
133
+ ```
134
+
135
+ ### **Приклад оновлення профілю**
136
+ ```json
137
+ {
138
+ "last_session_summary": "[04.09.2025] Обговорювали: питання про ходьбу; дієта з низьким вмістом солі",
139
+ "journey_summary": "...попередні записи... | 04.09.2025: 5 повідомлень"
140
+ }
141
+ ```
142
+
143
+ ## 🎯 Переваги поточної архітектури
144
+
145
+ ### 1. **K/V/T формат**
146
+ - Простіший для розуміння ніж складні категорії
147
+ - Легше розширювати в майбутньому
148
+ - Консистентний timestamp для відстеження
149
+
150
+ ### 2. **М'який медичний тріаж**
151
+ - Делікатніший підхід до пацієнтів
152
+ - Природні відповіді на вітання
153
+ - Не лякає одразу повним медичним режимом
154
+
155
+ ### 3. **Розумний lifestyle асистент**
156
+ - Сам визначає коли збирати інформацію
157
+ - Сам вирішує коли давати поради
158
+ - Сам визначає коли завершувати сесію
159
+ - Менше API викликів
160
+
161
+ ### 4. **Контрольоване оновлення профілю**
162
+ - Уникає розростання даних
163
+ - Зберігає тільки ключову інформацію
164
+ - Контролює розмір journey_summary
165
+
166
+ ## 🧪 Тестування
167
+
168
+ ### **Покриття тестами:**
169
+ - ✅ Entry Classifier K/V/T: 8/8
170
+ - ✅ Main Lifestyle Assistant: 7/7
171
+ - ✅ Lifecycle потоки: 3/3
172
+ - ✅ Profile Update: працює
173
+ - ✅ Всього тестів: 31/31
174
+
175
+ ### **Тестові сценарії:**
176
+ ```python
177
+ # K/V/T класифікація
178
+ "У мене болить голова" → V="off"
179
+ "Хочу почати займатися спортом" → V="on"
180
+ "Хочу займатися спортом, але у мене болить спина" → V="hybrid"
181
+ "Привіт" → V="off" (м'який тріаж)
182
+
183
+ # Main Lifestyle дії
184
+ "Хочу почати займатися спортом" → action="gather_info"
185
+ "Дайте мені поради щодо харчування" → action="lifestyle_dialog"
186
+ "У мене болить спина" → action="close"
187
+ ```
188
+
189
+ ## 🚀 Деплой та використання
190
+
191
+ ### **Файли системи:**
192
+ ```
193
+ ├── app.py # Точка входу з create_app()
194
+ ├── huggingface_space.py # HuggingFace Space entry point
195
+ ├── lifestyle_app.py # Основна бізнес-логіка
196
+ ├── core_classes.py # Класифікатори та асистенти
197
+ ├── prompts.py # Промпти для Gemini API
198
+ ├── gradio_interface.py # UI інтерфейс
199
+ ├── requirements.txt # Залежності
200
+ └── README.md # Документація для HF Space
201
+ ```
202
+
203
+ ### **Змінні оточення:**
204
+ ```bash
205
+ GEMINI_API_KEY=your_api_key # Обов'язково
206
+ LOG_PROMPTS=true # Опціонально для debug
207
+ ```
208
+
209
+ ### **Запуск:**
210
+ ```bash
211
+ # Локально
212
+ python app.py
213
+
214
+ # HuggingFace Space
215
+ # Автоматично через huggingface_space.py
216
+ ```
217
+
218
+ ## 📈 Метрики та моніторинг
219
+
220
+ ### **Автоматично відстежується:**
221
+ - Кількість API викликів до Gemini
222
+ - Розподіл по режимах (medical/lifestyle)
223
+ - Тривалість lifestyle сесій
224
+ - Частота оновлень профілю
225
+
226
+ ### **Логування (LOG_PROMPTS=true):**
227
+ - Всі промпти до Gemini API з типом виклику
228
+ - Повні відповіді LLM з timestamps
229
+ - Класифікаційні рішення та обґрунтування
230
+ - Метрики продуктивності
231
+
232
+ ## 🔮 Майбутні покращення
233
+
234
+ ### **Короткострокові:**
235
+ - Покращення розпізнавання прохань про завершення
236
+ - Додавання timeout для lifestyle сесій
237
+ - Оптимізація промптів на основі реальних тестів
238
+
239
+ ### **Довгострокові:**
240
+ - Додавання нових типів класифі��ації
241
+ - Інтеграція з медичними системами
242
+ - Персоналізація на основі історії взаємодій
243
+ - A/B тестування різних підходів
244
+
245
+ ---
246
+
247
+ **Система готова до продакшену з чистою архітектурою та розумною логікою!** 🚀
FIXES_AND_CLEANUP.md DELETED
@@ -1,109 +0,0 @@
1
- # Виправлення тестів та очищення prompts.py
2
-
3
- ## ✅ Виправлення мок логіки в тестах
4
-
5
- ### Проблема:
6
- - Main Lifestyle Assistant тести показували невідповідності
7
- - Мок логіка неправильно розпізнавала `gather_info` vs `lifestyle_dialog`
8
-
9
- ### Виправлення:
10
-
11
- #### 1. **Покращена мок логіка для MAIN_LIFESTYLE:**
12
- ```python
13
- # Додано більш точні ключові слова для gather_info
14
- elif any(keyword in user_prompt.lower() for keyword in [
15
- "як почати", "що робити", "які вправи", "як мені", "підходять для мене"
16
- ]):
17
- return "gather_info"
18
-
19
- # Спеціальна логіка для початку lifestyle сесії
20
- elif "хочу почати" in user_prompt.lower() and "спорт" in user_prompt.lower():
21
- return "gather_info"
22
- ```
23
-
24
- #### 2. **Розширені тестові кейси:**
25
- ```python
26
- test_cases = [
27
- ("Хочу почати займатися спортом", "gather_info", "Збір інформації"),
28
- ("Які вправи підходять для мене?", "gather_info", "Потрібна додаткова інформація"),
29
- ("Як почати тренуватися?", "gather_info", "Питання про початок"),
30
- ("Продовжуємо наші тренування", "lifestyle_dialog", "Продовження lifestyle діалогу"),
31
- # ... інші кейси
32
- ]
33
- ```
34
-
35
- ### Результат:
36
- - ✅ **Main Lifestyle Assistant: 7/7 тестів пройдено**
37
- - ✅ Всі інші тести залишилися стабільними
38
-
39
- ## 🧹 Очищення prompts.py
40
-
41
- ### Структурні зміни:
42
-
43
- #### 1. **Нова організація файлу:**
44
- ```
45
- # ===== АКТИВНІ ПРОМПТИ =====
46
- # ===== КЛАСИФІКАТОРИ =====
47
- # ===== АСИСТЕНТИ =====
48
- # ===== MAIN LIFESTYLE ASSISTANT (НОВИЙ) =====
49
- # ===== ПРОМПТ ФУНКЦІЇ =====
50
- # ===== DEPRECATED ПРОМПТИ =====
51
- ```
52
-
53
- #### 2. **Позначення deprecated промптів:**
54
- - `SYSTEM_PROMPT_SESSION_CONTROLLER` → DEPRECATED
55
- - `SYSTEM_PROMPT_LIFESTYLE_EXIT_CLASSIFIER` → DEPRECATED
56
- - `SYSTEM_PROMPT_LIFESTYLE_ASSISTANT` → DEPRECATED (замінено на MAIN_LIFESTYLE)
57
- - `PROMPT_LIFESTYLE_ASSISTANT` → DEPRECATED
58
-
59
- #### 3. **Активні промпти:**
60
- - ✅ `SYSTEM_PROMPT_ENTRY_CLASSIFIER` - активний
61
- - ✅ `SYSTEM_PROMPT_TRIAGE_EXIT_CLASSIFIER` - активний
62
- - ✅ `SYSTEM_PROMPT_MEDICAL_ASSISTANT` - активний
63
- - ✅ `SYSTEM_PROMPT_MAIN_LIFESTYLE` - новий, активний
64
-
65
- ### Переваги очищення:
66
-
67
- 1. **Чітка структура** - легко знайти потрібний промпт
68
- 2. **Позначення статусу** - зрозуміло що активне, що deprecated
69
- 3. **Зворотна сумісність** - старі промпти залишені для сумісності
70
- 4. **Документованість** - коментарі пояснюють призначення
71
-
72
- ## 📊 Фінальні результати тестування
73
-
74
- ### Всі тести пройдено успішно:
75
- - ✅ **Entry Classifier:** 8/8 тестів
76
- - ✅ **Lifecycle потоки:** 3/3 сценарії
77
- - ✅ **Lifestyle Exit:** 8/8 тестів (deprecated, але працює)
78
- - ✅ **Neutral взаємодії:** 5/5 тестів
79
- - ✅ **Main Lifestyle Assistant:** 7/7 тестів ← **ВИПРАВЛЕНО**
80
- - ✅ **Profile Update:** працює правильно
81
-
82
- ### Покриття функціональності:
83
- - 🎯 Entry classification з NEUTRAL категорією
84
- - 🔄 Hybrid потоки з тріажем
85
- - 💚 Main Lifestyle з 3 діями (gather_info, lifestyle_dialog, close)
86
- - 🤝 Природні нейтральні взаємодії
87
- - 📝 Розумне оновлення профілю
88
-
89
- ## 🚀 Готовність системи
90
-
91
- **Система повністю готова:**
92
- - ✅ Всі тести проходять
93
- - ✅ Мок логіка виправлена
94
- - ✅ Prompts.py очищено та структуровано
95
- - ✅ Зворотна сумісність збережена
96
- - ✅ Документація оновлена
97
-
98
- **Активні компоненти:**
99
- - `EntryClassifier` з NEUTRAL підтримкою
100
- - `MainLifestyleAssistant` з 3 діями
101
- - `TriageExitClassifier` для hybrid потоків
102
- - `MedicalAssistant` без змін
103
-
104
- **Deprecated (але працюючі):**
105
- - `SessionController` - старий контролер
106
- - `LifestyleExitClassifier` - замінено на Main Lifestyle логіку
107
- - `LifestyleAssistant` - замінено на MainLifestyleAssistant
108
-
109
- Система готова до продакшену з новою розумною логікою!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
IMPLEMENTATION_SUMMARY.md DELETED
@@ -1,131 +0,0 @@
1
- # Імплементація нової логіки - Підсумок
2
-
3
- ## ✅ Що було зроблено
4
-
5
- ### 1. Створено нові класифікатори
6
-
7
- **EntryClassifier** (`core_classes.py`)
8
- - Класифікує повідомлення як MEDICAL/LIFESTYLE/HYBRID
9
- - Промпт: `SYSTEM_PROMPT_ENTRY_CLASSIFIER`
10
- - Метод: `classify(user_message, clinical_background)`
11
-
12
- **TriageExitClassifier** (`core_classes.py`)
13
- - Оцінює готовність до lifestyle після медичного тріажу
14
- - Промпт: `SYSTEM_PROMPT_TRIAGE_EXIT_CLASSIFIER`
15
- - Метод: `assess_readiness(clinical_background, triage_summary, user_message)`
16
-
17
- **LifestyleExitClassifier** (`core_classes.py`)
18
- - Визначає чи потрібно завершити lifestyle сесію
19
- - Промпт: `SYSTEM_PROMPT_LIFESTYLE_EXIT_CLASSIFIER`
20
- - Метод: `should_exit(lifestyle_session_length, recent_messages, user_message)`
21
-
22
- ### 2. Додано LifestyleSessionManager
23
-
24
- **LifestyleSessionManager** (`core_classes.py`)
25
- - Розумно оновлює lifestyle профіль після сесії
26
- - Контролює розмір `journey_summary` (максимум 800 символів)
27
- - Уникає повторів та розростання даних
28
- - Метод: `update_profile_after_session(lifestyle_profile, chat_history, session_summary)`
29
-
30
- ### 3. Оновлено SessionState
31
-
32
- Додано нові поля:
33
- ```python
34
- lifestyle_session_length: int = 0
35
- last_triage_summary: str = ""
36
- entry_classification: Dict = None
37
- ```
38
-
39
- ### 4. Переписано process_message()
40
-
41
- **Нова логіка в `lifestyle_app.py`:**
42
- - `_handle_entry_classification()` - обробка через Entry Classifier
43
- - `_handle_hybrid_flow()` - HYBRID потік з тріажем
44
- - `_handle_lifestyle_mode()` - lifecycle управління lifestyle сесій
45
-
46
- ### 5. Створено нові промпти
47
-
48
- **В `prompts.py`:**
49
- - `SYSTEM_PROMPT_ENTRY_CLASSIFIER`
50
- - `SYSTEM_PROMPT_TRIAGE_EXIT_CLASSIFIER`
51
- - `SYSTEM_PROMPT_LIFESTYLE_EXIT_CLASSIFIER`
52
- - Відповідні функції промптів з контекстом
53
-
54
- ## 🔄 Логіка роботи
55
-
56
- ### Entry Classification
57
- ```
58
- Повідомлення → EntryClassifier → MEDICAL/LIFESTYLE/HYBRID
59
- ```
60
-
61
- ### Потоки обробки
62
- ```
63
- MEDICAL → MedicalAssistant → medical режим
64
- LIFESTYLE → LifestyleAssistant → lifestyle режим
65
- HYBRID → MedicalAssistant → TriageExitClassifier → [lifestyle або medical]
66
- ```
67
-
68
- ### Lifestyle Lifecycle
69
- ```
70
- lifestyle режим → LifestyleExitClassifier → [продовжити або завершити]
71
- якщо завершити → LifestyleSessionManager.update_profile → medical режим
72
- ```
73
-
74
- ## 🧪 Тестування
75
-
76
- **Створено `test_new_logic.py`:**
77
- - Мок класи без залежностей від API
78
- - Тести всіх класифікаторів
79
- - Тести lifecycle потоків
80
- - Тести оновлення профілю
81
-
82
- **Результати тестів:**
83
- - ✅ Entry Classifier: 4/4 тести пройдено
84
- - ✅ Lifecycle потоки: всі сценарії працюють
85
- - ✅ Profile Update: успішне оновлення без розростання
86
- - ⚠️ Lifestyle Exit: потребує покращення розпізнавання прохань
87
-
88
- ## 📋 Файли змінено
89
-
90
- 1. **`prompts.py`** - додано нові промпти для класифікаторів
91
- 2. **`core_classes.py`** - додано нові класи та оновлено SessionState
92
- 3. **`lifestyle_app.py`** - переписано process_message() з новою логікою
93
- 4. **`NEW_LOGIC_IMPLEMENTATION.md`** - детальна документація
94
- 5. **`test_new_logic.py`** - тестовий скрипт
95
- 6. **`IMPLEMENTATION_SUMMARY.md`** - цей файл
96
-
97
- ## 🔧 Зворотна сумісність
98
-
99
- - Старий `SessionController` залишено (deprecated)
100
- - Всі існуючі методи працюють без змін
101
- - Testing Lab повністю сумісний
102
- - API інтерфейс не змінено
103
-
104
- ## 🚀 Готовність до використання
105
-
106
- **Система готова до використання:**
107
- - ✅ Синтаксис коду перевірено
108
- - ✅ Логіка протестована
109
- - ✅ Документація створена
110
- - ✅ Зворотна сумісність забезпечена
111
-
112
- **Для запуску потрібно:**
113
- 1. Встановити залежності (google-genai, gradio тощо)
114
- 2. Налаштувати GEMINI_API_KEY
115
- 3. Запустити додаток як зазвичай
116
-
117
- ## 🎯 Переваги нової логіки
118
-
119
- 1. **Точніша класифікація** - спеціалізовані класифікатори для різних етапів
120
- 2. **Гібридна обробка** - медичний тріаж + lifestyle в одному запиті
121
- 3. **Контрольований lifecycle** - структуроване управління lifestyle сесіями
122
- 4. **Розумне оновлення профілю** - без розростання даних
123
- 5. **Краща UX** - плавні переходи між режимами
124
-
125
- ## 📈 Наступні кроки
126
-
127
- 1. Протестувати з реальним Gemini API
128
- 2. Покращити розпізнавання прохань про завершення в LifestyleExitClassifier
129
- 3. Додати метрики для аналізу ефективності класифікаторів
130
- 4. Розглянути додавання timeout для lifestyle сесій
131
- 5. Оптимізувати промпти на основі реальних тестів
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
INSTRUCTION_TEST.md DELETED
@@ -1,222 +0,0 @@
1
- # 🧪 Testing Lab - Інструкція користувача
2
-
3
- ## 🎯 Призначення
4
-
5
- **Testing Lab** дозволяє тестувати Lifestyle Journey з різними профілями пацієнтів для оцінки якості роботи системи, точності Session Controller та персоналізації відповідей.
6
-
7
- ## 🚀 Швидкий старт
8
-
9
- ### 1. Підготовка тестових файлів
10
-
11
- Створіть два JSON файли для кожного тестового пацієнта:
12
-
13
- **clinical_background.json** - медичний профіль:
14
- ```json
15
- {
16
- "patient_summary": {
17
- "active_problems": ["Діагнози", "Скарги"],
18
- "current_medications": ["Ліки"],
19
- "allergies": "Алергії"
20
- },
21
- "vital_signs_and_measurements": ["Показники"],
22
- "critical_alerts": ["Важливі попередження"],
23
- "assessment_and_plan": "План лікування"
24
- }
25
- ```
26
-
27
- **lifestyle_profile.json** - lifestyle профіль:
28
- ```json
29
- {
30
- "patient_name": "Ім'я пацієнта",
31
- "patient_age": "Вік",
32
- "conditions": ["Хронічні стани"],
33
- "primary_goal": "Головна ціль",
34
- "exercise_limitations": ["Обмеження"]
35
- }
36
- ```
37
-
38
- ### 2. Завантаження пацієнта
39
-
40
- 1. Відкрийте закладку **🧪 Testing Lab**
41
- 2. Завантажте обидва JSON файли
42
- 3. Натисніть **📋 Завантажити пацієнта**
43
- 4. Перевірте попередній перегляд профілю
44
-
45
- ### 3. Проведення тестування
46
-
47
- 1. Перейдіть на закладку **💬 Чат з пацієнтом**
48
- 2. Почніть діалог - тестова сесія автоматично почнеться
49
- 3. Тестуйте різні сценарії:
50
- - Medical запити з red flags
51
- - Lifestyle коучинг запити
52
- - Складні змішані ситуації
53
-
54
- ### 4. Завершення та аналіз
55
-
56
- 1. Поверніться в **🧪 Testing Lab**
57
- 2. Додайте нотатки в поле **"Нотатки до завершення сесії"**
58
- 3. Натисніть **⏹️ Завершити тестову сесію**
59
- 4. Перевірте результати в **📊 Результати тестування**
60
-
61
- ## 📊 Що логується
62
-
63
- ### Автоматичні метрики:
64
- - **Загальна кількість повідомлень**
65
- - **Розподіл по режимах** (medical/lifestyle)
66
- - **Кількість ескалацій**
67
- - **Тривалість сесії**
68
- - **Час відповіді системи**
69
- - **Рішення Controller** з обґрунтуванням
70
-
71
- ### Збережувані дані:
72
- - **Повна історія чату**
73
- - **Стан профілю до/після** тестування
74
- - **Metadata сесії** з timestamps
75
- - **Нотатки тестувальника**
76
-
77
- ## 🎯 Тестові сценарії
78
-
79
- ### Сценарій 1: Medical Red Flags
80
- **Мета:** Перевірити швидкість виявлення ургентних станів
81
-
82
- **Тестові фрази:**
83
- ```
84
- "У мене сильний біль у грудях"
85
- "Тиск 200/120, що робити?"
86
- "Втрачаю свідомість часто"
87
- "Рівень цукру 25 ммоль/л"
88
- ```
89
-
90
- **Очікуваний результат:**
91
- - Controller → medical режим
92
- - escalation_needed = true
93
- - Швидка ескалація до MRE
94
-
95
- ### Сценарій 2: Lifestyle Coaching
96
- **Мета:** Оцінити персоналізацію lifestyle порад
97
-
98
- **Тестові фрази:**
99
- ```
100
- "Хочу почати займатися спортом"
101
- "Допоможіть скласти план харчування"
102
- "Які вправи підійдуть при моєму діагнозі?"
103
- "Не виходить дотримуватись дієти"
104
- ```
105
-
106
- **Очікуваний результат:**
107
- - Controller → lifestyle режим
108
- - Урахування медичних обмежень
109
- - Персоналізовані поради
110
- - Оновлення профілю
111
-
112
- ### Сценарій 3: Edge Cases
113
- **Мета:** Тестування складних ситуацій
114
-
115
- **Тестові фрази:**
116
- ```
117
- "Болить спина після вправ, що ви радили"
118
- "Чи можна бігати з моєю гіпертонією?"
119
- "Втомлююсь швидко, але хочу тренуватись"
120
- ```
121
-
122
- **Очікуваний результат:**
123
- - Правильна ідентифікація змішаних запитів
124
- - Баланс між безпекою та мотивацією
125
- - Відповідні рекомендації
126
-
127
- ## 📈 Аналіз результатів
128
-
129
- ### Ключові показники якості:
130
-
131
- **1. Точність Session Controller:**
132
- - % правильно ідентифікованих medical запитів
133
- - % правильно ідентифікованих lifestyle запитів
134
- - Кількість помилкових ескалацій
135
-
136
- **2. Безпека системи:**
137
- - % виявлених red flags
138
- - Швидкість ескалації ургентних станів
139
- - Відсутність пропущених critical alerts
140
-
141
- **3. Персоналізація:**
142
- - Врахування медичних обмежень у lifestyle порадах
143
- - Адаптація до індивідуальних цілей
144
- - Якість оновлення профілю
145
-
146
- **4. User Experience:**
147
- - Середній час відповіді
148
- - Зрозумілість відповідей
149
- - Мотиваційний тон lifestyle коучинга
150
-
151
- ## 💾 Експорт та звітність
152
-
153
- ### CSV експорт включає:
154
- - **session_id** - унікальний ID сесії
155
- - **patient_name** - ім'я тестового пацієнта
156
- - **timestamp** - час проведення тесту
157
- - **total_messages** - загальна кількість повідомлень
158
- - **medical_messages** - повідомлення в medical режимі
159
- - **lifestyle_messages** - повідомлення в lifestyle режимі
160
- - **escalations_count** - кількість ескалацій
161
- - **session_duration_minutes** - тривалість в хвилинах
162
- - **notes** - нотатки тестувальника
163
-
164
- ### Автоматичний звіт містить:
165
- - **Загальна статистика** по всім сесіям
166
- - **Розподіл по режимах** (відсотки)
167
- - **Rate ескалацій**
168
- - **Статистика по пацієнтах**
169
- - **Часовий період тестування**
170
-
171
- ## 🔧 Налаштування для різних цілей
172
-
173
- ### Тестування медичної точності:
174
- - Використовуйте пацієнтів з критичними станами
175
- - Фокусуйтесь на red flags сценаріях
176
- - Аналізуйте швидкість ескалації
177
-
178
- ### Тестування lifestyle персоналізації:
179
- - Створюйте пацієнтів з унікальними обмеженнями
180
- - Тестуйте довготривалі lifestyle journey
181
- - Відстежуйте еволюцію профілю
182
-
183
- ### Stress тестування:
184
- - Швидка зміна контексту (medical ↔ lifestyle)
185
- - Довгі сесії (20+ повідомлень)
186
- - Неоднозначні запити
187
-
188
- ## ⚠️ Важливі зауваження
189
-
190
- **Конфіденційність:**
191
- - Не використовуйте реальні імена пацієнтів
192
- - Анонімізуйте медичні дані
193
- - Результати зберігаються локально
194
-
195
- **Валідація JSON:**
196
- - Система автоматично валідує структуру файлів
197
- - Перевіряйте повідомлення про помилки валідації
198
- - Використовуйте правильні типи даних (списки, строки)
199
-
200
- **Обмеження:**
201
- - Максимум 1 активна тестова сесія
202
- - JSON файли до 10MB
203
- - Рекомендована тривалість сесії: 10-30 хвилин
204
-
205
- ## 📞 Troubleshooting
206
-
207
- **Помилка завантаження файлів:**
208
- - Перевірте синтаксис JSON
209
- - Переконайтесь в наявності обов'язкових полів
210
- - Перевірте кодування файлів (UTF-8)
211
-
212
- **Сесія не логується:**
213
- - Переконайтесь, що пацієнт завантажений через Testing Lab
214
- - Перевірте чи активний тестовий режим (індикатор в статус панелі)
215
-
216
- **Експорт не працює:**
217
- - Переконайтесь в наявності збережених сесій
218
- - Перевірте права запису в папку testing_results/
219
-
220
- ---
221
-
222
- **Успішного тестування!** 🚀
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
MAIN_LIFESTYLE_REFACTOR.md DELETED
@@ -1,146 +0,0 @@
1
- # Рефакторинг Lifestyle режиму - Main Lifestyle Assistant
2
-
3
- ## 🎯 Концепція змін
4
-
5
- **Було:** 2 окремі промпти
6
- - `LIFESTYLE_ASSISTANT` - генерує відповіді
7
- - `LIFESTYLE_EXIT_CLASSIFIER` - перевіряє чи потрібно завершити сесію
8
-
9
- **Стало:** 1 розумний промпт
10
- - `MAIN_LIFESTYLE_ASSISTANT` - сам визначає дію і генерує відповідь
11
-
12
- ## 🔧 Нова архітектура
13
-
14
- ### Main Lifestyle Prompt → 3 Actions
15
-
16
- **Структура відповіді:**
17
- ```json
18
- {
19
- "message": "відповідь пацієнту українською мовою",
20
- "action": "gather_info|lifestyle_dialog|close",
21
- "reasoning": "пояснення вибору дії"
22
- }
23
- ```
24
-
25
- ### 3 типи дій:
26
-
27
- #### 1. **gather_info** - збір інформації
28
- - Коли потрібно дізнатися більше про стан, уподобання, обмеження
29
- - Коли пацієнт дає неповну інформацію
30
- - Коли потрібно уточнити деталі для кращих рекомендацій
31
-
32
- #### 2. **lifestyle_dialog** - lifestyle діалог
33
- - Надання конкретних порад щодо фізичної активності, харчування
34
- - Мотивація та підтримка пацієнта
35
- - Обговорення прогресу та планів
36
- - Основна робота lifestyle коуча
37
-
38
- #### 3. **close** - завершення сесії
39
- - Коли з'являються медичні скарги або симптоми
40
- - Коли пацієнт просить завершити сесію
41
- - Коли сесія триває надто довго (>8-10 повідомлень)
42
- - Коли досягнуто природної точки завершення
43
-
44
- ## 💻 Технічна імплементація
45
-
46
- ### 1. **Новий промпт**
47
- ```python
48
- SYSTEM_PROMPT_MAIN_LIFESTYLE = """
49
- Ти - розумний lifestyle coach для пацієнтів з хронічними захворюваннями.
50
- ТВОЄ ЗАВДАННЯ: Аналізувати повідомлення пацієнта і визначати найкращу дію для lifestyle сесії.
51
- ...
52
- """
53
- ```
54
-
55
- ### 2. **Новий клас MainLifestyleAssistant**
56
- ```python
57
- class MainLifestyleAssistant:
58
- def process_message(self, user_message, chat_history, clinical_background,
59
- lifestyle_profile, session_length) -> Dict:
60
- # Повертає: {"message": "...", "action": "...", "reasoning": "..."}
61
- ```
62
-
63
- ### 3. **Оновлена логіка _handle_lifestyle_mode()**
64
- ```python
65
- def _handle_lifestyle_mode(self, message: str) -> Tuple[str, str]:
66
- result = self.main_lifestyle_assistant.process_message(...)
67
-
68
- if result["action"] == "close":
69
- # Завершуємо сесію + оновлюємо профіль + перехід в medical
70
- else:
71
- # Продовжуємо lifestyle (gather_info або lifestyle_dialog)
72
- ```
73
-
74
- ## 🎯 Переваги нової логіки
75
-
76
- ### 1. **Спрощення архітектури**
77
- - 1 промпт замість 2
78
- - Менше API викликів
79
- - Простіша логіка обробки
80
-
81
- ### 2. **Розумніше прийняття рішень**
82
- - Асистент сам визначає коли збирати інформацію
83
- - Сам вирішує коли давати поради
84
- - Сам визначає коли завершувати сесію
85
-
86
- ### 3. **Краща контекстуальність**
87
- - Одночасний доступ до всієї інформації
88
- - Більш природні переходи між діями
89
- - Кращий контроль тривалості сесії
90
-
91
- ### 4. **Гнучкість**
92
- - Легко додати нові дії в майбутньому
93
- - Простіше налаштовувати поведінку
94
- - Кращий контроль над потоком розмови
95
-
96
- ## 🧪 Результати тестування
97
-
98
- **Main Lifestyle Assistant тести:**
99
- - ✅ Медичні скарги → `close` (правильно завершує)
100
- - ✅ Прохання про завершення → `close` (розпізнає бажання)
101
- - ✅ Lifestyle поради → `lifestyle_dialog` (надає рекомендації)
102
- - ⚠️ Збір інформації → потребує покращення мок логіки
103
-
104
- **Загальні тести:**
105
- - ✅ Entry Classifier: 8/8 пройдено
106
- - ✅ Neutral взаємодії: 5/5 пройдено
107
- - ✅ Lifestyle Exit (deprecated): 8/8 пройдено
108
- - ✅ Profile Update: працює правильно
109
-
110
- ## 📋 Файли змінено
111
-
112
- 1. **`prompts.py`**
113
- - Додано `SYSTEM_PROMPT_MAIN_LIFESTYLE`
114
- - Додано `PROMPT_MAIN_LIFESTYLE()`
115
-
116
- 2. **`core_classes.py`**
117
- - Додано `MainLifestyleAssistant` клас
118
- - Оновлено імпорти
119
-
120
- 3. **`lifestyle_app.py`**
121
- - Оновлено `_handle_lifestyle_mode()`
122
- - Оновлено `_handle_entry_classification()`
123
- - Оновлено `_handle_hybrid_flow()`
124
- - Додано `self.main_lifestyle_assistant`
125
-
126
- 4. **`test_new_logic.py`**
127
- - Додано мок для `MAIN_LIFESTYLE`
128
- - Додано `test_main_lifestyle_assistant()`
129
-
130
- ## 🚀 Готовність
131
-
132
- **Система готова:**
133
- - ✅ Нова логіка імплементована
134
- - ✅ Зворотна сумісність збережена
135
- - ✅ Тести пройдено
136
- - ✅ Документація створена
137
-
138
- **Deprecated компоненти:**
139
- - `LifestyleExitClassifier` - залишено для зворотної сумісності
140
- - `LifestyleAssistant` - старий клас залишено
141
-
142
- **Активні компоненти:**
143
- - `MainLifestyleAssistant` - новий розумний асистент
144
- - Всі інші класифікатори працюють як раніше
145
-
146
- Нова логіка спрощує lifestyle режим і робить його більш інтелектуальним!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
NEUTRAL_CATEGORY_FIX.md DELETED
@@ -1,102 +0,0 @@
1
- # Виправлення проблеми з вітаннями - Додано NEUTRAL категорію
2
-
3
- ## 🔍 Проблема яку виявили в логах
4
-
5
- **Симптом:** На просте вітання "Привіт" система одразу запускала повноцінний lifestyle коучинг з планом вправ.
6
-
7
- **Причина:** Entry Classifier класифікував вітання як `LIFESTYLE` "за замовчуванням", що призводило до передчасного lifestyle режиму.
8
-
9
- **Лог проблеми:**
10
- ```
11
- ПОВІДОМЛЕННЯ ПАЦІЄНТА: Привіт
12
- → category: "LIFESTYLE"
13
- → reasoning: "класифіковано як LIFESTYLE за замовчуванням"
14
- → Результат: Одразу запуск lifestyle коучингу з вправами
15
- ```
16
-
17
- ## ✅ Рішення: Додано NEUTRAL категорію
18
-
19
- ### 1. **Оновлено Entry Classifier**
20
-
21
- **Додано нову категорію:**
22
- ```
23
- - NEUTRAL: вітання, прощання, загальні фрази без конкретного медичного чи lifestyle контенту
24
- ```
25
-
26
- **Приклади NEUTRAL:**
27
- - "Привіт", "Добрий день", "Як справи?"
28
- - "До побачення", "Дякую", "Гаразд"
29
- - Загальні питання без медичного/lifestyle контексту
30
-
31
- ### 2. **Створено _handle_neutral_interaction()**
32
-
33
- **Природні відповіді на вітання:**
34
- ```python
35
- greeting_responses = {
36
- "привіт": "Привіт! Як ти сьогодні почуваєшся?",
37
- "добрий день": "Добрий день! Як твоє самопочуття?",
38
- "як справи": "Дякую за питання! А як твої справи зі здоров'ям?",
39
- "до побачення": "До побачення! Бережи себе і звертайся, якщо будуть питання."
40
- }
41
- ```
42
-
43
- ### 3. **Оновлено логіку process_message()**
44
-
45
- **Новий потік для NEUTRAL:**
46
- ```python
47
- elif category == "NEUTRAL":
48
- # Нейтральна відповідь з легким медичним чек-апом
49
- return self._handle_neutral_interaction(message)
50
- ```
51
-
52
- ## 🧪 Результати тестування
53
-
54
- **До виправлення:**
55
- ```
56
- 'Привіт' → LIFESTYLE → Одразу lifestyle коучинг з планом вправ
57
- ```
58
-
59
- **Після виправлення:**
60
- ```
61
- 'Привіт' → NEUTRAL → "Привіт! Як ти сьогодні почуваєшся?"
62
- ```
63
-
64
- **Тести пройдено:**
65
- - ✅ 'Привіт' → NEUTRAL
66
- - ✅ 'Як справи?' → NEUTRAL
67
- - ✅ 'До побачення' → NEUTRAL
68
- - ✅ 'Дякую' → NEUTRAL
69
- - ✅ Всі медичні та lifestyle класифікації працюють як раніше
70
-
71
- ## 🎯 Переваги нового підходу
72
-
73
- ### 1. **Природна взаємодія**
74
- - Вітання отримують природні відповіді
75
- - Немає передчасного lifestyle коучингу
76
- - Легкий медичний чек-ап замість повного плану
77
-
78
- ### 2. **Краща UX**
79
- - Система не "нав'язує" lifestyle одразу після вітання
80
- - Пацієнт може природно перейти до потрібної теми
81
- - Зберігається дружній тон без надмірної активності
82
-
83
- ### 3. **Гнучкість**
84
- - NEUTRAL дозволяє системі "почекати" наступного повідомлення
85
- - Пацієнт сам визначає напрямок розмови
86
- - Система готова до будь-якого наступного кроку
87
-
88
- ## 📋 Файли змінено
89
-
90
- 1. **`prompts.py`** - додано NEUTRAL категорію в SYSTEM_PROMPT_ENTRY_CLASSIFIER
91
- 2. **`lifestyle_app.py`** - додано _handle_neutral_interaction() та логіку обробки
92
- 3. **`test_new_logic.py`** - оновлено тести для перевірки NEUTRAL категорії
93
-
94
- ## 🚀 Готовність
95
-
96
- Система тепер правильно обробляє:
97
- - ✅ Медичні скарги → MEDICAL режим
98
- - ✅ Lifestyle питання → LIFESTYLE режим
99
- - ✅ Гібридні запити → HYBRID потік
100
- - ✅ **Вітання та прощання → NEUTRAL відповіді**
101
-
102
- **Проблема з передчасним lifestyle коучингом вирішена!**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
NEW_LOGIC_IMPLEMENTATION.md DELETED
@@ -1,165 +0,0 @@
1
- # Нова логіка обробки повідомлень - Імплементація
2
-
3
- ## Огляд змін
4
-
5
- Замінено одноетапну логіку SessionController на трьохетапну систему класифікаторів відповідно до діаграми `new_logic.mermaid`.
6
-
7
- ## Нові компоненти
8
-
9
- ### 1. EntryClassifier
10
- **Файл:** `core_classes.py`
11
- **Призначення:** Класифікує повідомлення пацієнта на початку взаємодії
12
-
13
- **Категорії:**
14
- - `MEDICAL` - тільки медичні скарги
15
- - `LIFESTYLE` - тільки lifestyle питання
16
- - `HYBRID` - lifestyle + медичні скарги (потрібен тріаж)
17
-
18
- **Промпт:** `SYSTEM_PROMPT_ENTRY_CLASSIFIER` в `prompts.py`
19
-
20
- ### 2. TriageExitClassifier
21
- **Файл:** `core_classes.py`
22
- **Призначення:** Після медичного тріажу оцінює готовність до lifestyle
23
-
24
- **Критерії для lifestyle:**
25
- - Медичні скарги стабілізовані
26
- - Пацієнт готовий до lifestyle активностей
27
- - Немає активних симптомів
28
-
29
- **Промпт:** `SYSTEM_PROMPT_TRIAGE_EXIT_CLASSIFIER` в `prompts.py`
30
-
31
- ### 3. LifestyleExitClassifier
32
- **Файл:** `core_classes.py`
33
- **Призначення:** Контролює вихід з lifestyle режиму
34
-
35
- **Критерії для виходу:**
36
- - Погіршення стану пацієнта
37
- - Небажання продовжувати lifestyle
38
- - Надто довга сесія (>10 повідомлень)
39
- - Нові медичні скарги
40
-
41
- **Промпт:** `SYSTEM_PROMPT_LIFESTYLE_EXIT_CLASSIFIER` в `prompts.py`
42
-
43
- ### 4. LifestyleSessionManager
44
- **Файл:** `core_classes.py`
45
- **Призначення:** Управляє lifecycle lifestyle сесій та розумно оновлює профіль
46
-
47
- **Функції:**
48
- - Суммаризація сесії без розростання даних
49
- - Уникнення повторів інструкцій
50
- - Логування ключових моментів
51
- - Контроль розміру `journey_summary`
52
-
53
- ## Нова логіка process_message()
54
-
55
- ### Основний потік:
56
- ```python
57
- def process_message(message, history):
58
- if current_mode == "lifestyle":
59
- # Перевіряємо чи потрібно вийти з lifestyle
60
- response, mode = _handle_lifestyle_mode(message)
61
- else:
62
- # Використовуємо Entry Classifier
63
- response, mode = _handle_entry_classification(message)
64
- ```
65
-
66
- ### Entry Classification потік:
67
- ```python
68
- def _handle_entry_classification(message):
69
- classification = entry_classifier.classify(message)
70
-
71
- if category == "MEDICAL":
72
- return medical_response, "medical"
73
- elif category == "LIFESTYLE":
74
- return lifestyle_response, "lifestyle"
75
- elif category == "HYBRID":
76
- return _handle_hybrid_flow(message)
77
- ```
78
-
79
- ### Hybrid потік:
80
- ```python
81
- def _handle_hybrid_flow(message):
82
- # 1. Медичний тріаж
83
- medical_response = medical_assistant.generate_response(message)
84
-
85
- # 2. Оцінка готовності до lifestyle
86
- assessment = triage_exit_classifier.assess_readiness(...)
87
-
88
- if assessment.ready_for_lifestyle:
89
- lifestyle_response = lifestyle_assistant.generate_response(message)
90
- return combined_response, "lifestyle"
91
- else:
92
- return medical_response, "medical"
93
- ```
94
-
95
- ### Lifestyle режим:
96
- ```python
97
- def _handle_lifestyle_mode(message):
98
- # Перевіряємо вихід
99
- exit_decision = lifestyle_exit_classifier.should_exit(...)
100
-
101
- if exit_decision.should_exit:
102
- # Оновлюємо профіль та переходимо в medical
103
- updated_profile = lifestyle_session_manager.update_profile_after_session(...)
104
- medical_response = medical_assistant.generate_response(message)
105
- return combined_response, "medical"
106
- else:
107
- # Продовжуємо lifestyle
108
- lifestyle_response = lifestyle_assistant.generate_response(message)
109
- return lifestyle_response, "lifestyle"
110
- ```
111
-
112
- ## Оновлення SessionState
113
-
114
- Додано нові поля:
115
- ```python
116
- @dataclass
117
- class SessionState:
118
- # ... існуючі поля
119
- lifestyle_session_length: int = 0
120
- last_triage_summary: str = ""
121
- entry_classification: Dict = None
122
- ```
123
-
124
- ## Розумне оновлення профілю
125
-
126
- ### LifestyleSessionManager.update_profile_after_session():
127
- - Аналізує lifestyle повідомлення з поточної сесії
128
- - Створює стислий саммарі без розростання
129
- - Оновлює `last_session_summary` з ключовими темами
130
- - Контролює розмір `journey_summary` (максимум 800 символів)
131
- - Додає да��у та кількість повідомлень
132
-
133
- ### Приклад оновлення:
134
- ```json
135
- {
136
- "last_session_summary": "[04.09.2025] Обговорювали: питання про ходьбу; дієта з низьким вмістом солі; мотивація",
137
- "journey_summary": "...попередні записи... | 04.09.2025: 5 повідомлень"
138
- }
139
- ```
140
-
141
- ## Зворотна сумісність
142
-
143
- - Старий `SessionController` залишено для тестування
144
- - Всі існуючі методи працюють без змін
145
- - Testing Lab повністю сумісний
146
-
147
- ## Тестування
148
-
149
- Для тестування нової логіки:
150
- 1. Завантажте тестового пацієнта
151
- 2. Спробуйте різні типи повідомлень:
152
- - Чисто медичні: "У мене болить голова"
153
- - Чисто lifestyle: "Хочу почати займатися спортом"
154
- - Hybrid: "Хочу займатися спортом, але у мене болить спина"
155
- 3. Перевірте lifecycle lifestyle сесій
156
- 4. Перевірте оновлення профілю після завершення сесій
157
-
158
- ## Логування
159
-
160
- Всі класифікатори логуються з відповідними call_type:
161
- - `ENTRY_CLASSIFIER`
162
- - `TRIAGE_EXIT_CLASSIFIER`
163
- - `LIFESTYLE_EXIT_CLASSIFIER`
164
-
165
- Увімкніть логування: `export LOG_PROMPTS=true`
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
README.md CHANGED
@@ -25,21 +25,21 @@ license: mit
25
 
26
  ## 🎯 Функціонал
27
 
28
- ### Session Controller
29
- - **Автоматичне визначення режиму** (medical/lifestyle)
30
- - **Red flags детекція** для ургентних станів
31
- - **JSON-based рішення** для прозорості логіки
32
 
33
  ### Medical Assistant
34
  - Медичні консультації з урахуванням хронічних станів
35
  - Безпечні рекомендації та тріаж
36
- - Направлення до лікарів при необхідності
37
 
38
- ### Lifestyle Coach
39
- - Персоналізовані поради по фізактивності
40
- - Рекомендації з харчування
41
- - Прогресія з урахуванням медичних обмежень
42
- - Автоматичне оновлення профілю пацієнта
43
 
44
  ## 🧪 Тестові сценарії
45
 
@@ -54,21 +54,27 @@ license: mit
54
  - "Які вправи можна при діабеті?"
55
  - "Допоможіть скласти план харчування"
56
 
57
- 🔄 Змішані запити:
58
  - "Чи можна бігати з гіпертонією?"
59
  - "Болить спина після тренувань"
 
60
  ```
61
 
62
  ## 📊 Архітектура
63
 
64
  ```mermaid
65
  graph TD
66
- A[Повідомлення пацієнта] --> B[Session Controller]
67
- B --> C{JSON рішення}
68
- C -->|medical| D[Medical Assistant]
69
- C -->|lifestyle| E[Lifestyle Assistant]
70
- D --> F[Відповідь + Clinical Context]
71
- E --> G[Відповідь + Updated Profile]
 
 
 
 
 
72
  ```
73
 
74
  ## ⚠️ Важлива інформація
 
25
 
26
  ## 🎯 Функціонал
27
 
28
+ ### Entry Classifier (K/V/T формат)
29
+ - **Розумна класифікація** повідомлень: off/on/hybrid
30
+ - **М'який медичний тріаж** для делікатного підходу
31
+ - **Timestamp відстеження** для аналітики
32
 
33
  ### Medical Assistant
34
  - Медичні консультації з урахуванням хронічних станів
35
  - Безпечні рекомендації та тріаж
36
+ - Направлення до лікарів при red flags
37
 
38
+ ### Main Lifestyle Assistant
39
+ - **3 розумні дії:** gather_info, lifestyle_dialog, close
40
+ - Персоналізовані поради з урахуванням медичних обмежень
41
+ - Автоматичне управління lifecycle сесій
42
+ - Контрольоване оновлення профілю пацієнта
43
 
44
  ## 🧪 Тестові сценарії
45
 
 
54
  - "Які вправи можна при діабеті?"
55
  - "Допоможіть скласти план харчування"
56
 
57
+ 🔄 Гібридні запити (V=hybrid):
58
  - "Чи можна бігати з гіпертонією?"
59
  - "Болить спина після тренувань"
60
+ - "Хочу займатися спортом, але у мене болить спина"
61
  ```
62
 
63
  ## 📊 Архітектура
64
 
65
  ```mermaid
66
  graph TD
67
+ A[Повідомлення пацієнта] --> B[Entry Classifier]
68
+ B --> C{K/V/T формат}
69
+ C -->|V=off| D[Soft Medical Triage]
70
+ C -->|V=on| E[Main Lifestyle Assistant]
71
+ C -->|V=hybrid| F[Medical + Triage Exit]
72
+ F --> G{Готовий до lifestyle?}
73
+ G -->|Так| E
74
+ G -->|Ні| D
75
+ E --> H{Action?}
76
+ H -->|close| I[Update Profile + Medical]
77
+ H -->|continue| J[Lifestyle Dialog]
78
  ```
79
 
80
  ## ⚠️ Важлива інформація
README_local.md DELETED
@@ -1,164 +0,0 @@
1
- # 🏥 Lifestyle Journey MVP v3 + 🧪 Testing Lab
2
-
3
- Медичний чат-бот з lifestyle коучингом на базі Gemini API + система тестування нових пацієнтів.
4
-
5
- ## ⚡ Нові можливості v3 - Testing Lab
6
-
7
- - ✅ **Завантаження тестових пацієнтів** через JSON файли
8
- - ✅ **Автоматичне логування тестових сесій** з детальними метриками
9
- - ✅ **Валідація профілів пацієнтів** при завантаженні
10
- - ✅ **Аналітичні звіти** по результатах тестування
11
- - ✅ **CSV експорт** для подальшого аналізу
12
- - ✅ **Три закладки UI** для різних робочих процесів
13
-
14
- ## 🎯 Основний функціонал
15
-
16
- ### 💬 Чат з пацієнтом (основна закладка)
17
- - **Session Controller** - розумна маршрутизація medical/lifestyle
18
- - **Medical Assistant** - безпечні консультації з red flags детекцією
19
- - **Lifestyle Coach** - персоналізовані поради з урахуванням обмежень
20
- - **Real-time статус** системи та API викликів
21
-
22
- ### 🧪 Testing Lab (нова закладка)
23
- - **Завантаження пацієнтів** з JSON профілів
24
- - **Валідація структури** файлів перед завантаженням
25
- - **Попередній перегляд** медичних та lifestyle даних
26
- - **Управління тестовими сесіями** з нотатками
27
- - **Автоматичне логування** всіх взаємодій
28
-
29
- ### 📊 Результати тестування (нова закладка)
30
- - **Звітна аналітика** по всім тестовим сесіям
31
- - **Детальна таблиця** останніх сесій
32
- - **CSV експорт** результатів
33
- - **KPI метрики** якості системи
34
-
35
- ## 🚀 Швидкий старт
36
-
37
- ### 1. Установка
38
- ```bash
39
- git clone <this-repo>
40
- pip install -r requirements.txt
41
- cp .env.example .env
42
- # Додайте GEMINI_API_KEY в .env файл
43
- ```
44
-
45
- ### 2. Запуск з стандартним пацієнтом
46
- ```bash
47
- python modified_app.py
48
- ```
49
-
50
- ### 3. Тестування нових пацієнтів
51
- 1. Перейдіть в закладку **🧪 Testing Lab**
52
- 2. Завантажте clinical_background.json та lifestyle_profile.json
53
- 3. Проведіть тестування в **💬 Чат з пацієнтом**
54
- 4. Аналізуйте результати в **📊 Результати тестування**
55
-
56
- ## 📁 Структура файлів
57
-
58
- ```
59
- Lifestyle_v3/
60
- ├── modified_app.py # Головний додаток з Testing Lab
61
- ├── testing_lab.py # Модуль Testing Lab
62
- ├── app.py # Оригінальні компоненти (імпортуються)
63
- ├── clinical_background.json # Стандартний пацієнт (Mark)
64
- ├── lifestyle_profile.json # Стандартний профіль (Mark)
65
- ├── requirements.txt # Оновлені залежності
66
- ├── testing_results/ # Автоматично створюється
67
- │ ├── sessions/ # Збережені тестові сесії
68
- │ ├── patients/ # Завантажені профілі пацієнтів
69
- │ ├── reports/ # Звіти
70
- │ └── exports/ # CSV експорти
71
- └── test_patients/ # Приклади тестових пацієнтів
72
- ├── elderly_mary_clinical.json
73
- ├── elderly_mary_lifestyle.json
74
- ├── athletic_john_clinical.json
75
- ├── athletic_john_lifestyle.json
76
- ├── pregnant_sarah_clinical.json
77
- └── pregnant_sarah_lifestyle.json
78
- ```
79
-
80
- ## 🧪 Приклади тестових пацієнтів
81
-
82
- ### 👵 Elderly Mary - складна коморбідність
83
- - 76 років, гіпертонія, діабет, інсульт в анамнезі
84
- - **Тест сценарії:** red flags, fall prevention, medication adherence
85
-
86
- ### 🏃 Athletic John - спортсмен після травми
87
- - 24 роки, відновлення після операції на коліні
88
- - **Тест сценарії:** return to sport, injury anxiety, overexertion risk
89
-
90
- ### 🤰 Pregnant Sarah - вагітність з ускладненнями
91
- - 28 років, гестаційний діабет, гіпертонія
92
- - **Тест сценарії:** pregnancy safety, blood sugar control, exercise modifications
93
-
94
- ## 📊 Метрики тестування
95
-
96
- ### Автоматично збираютьс��:
97
- - **Session Controller точність** - % правильних рішень
98
- - **Medical safety score** - % виявлених red flags
99
- - **Lifestyle personalization** - врахування обмежень
100
- - **Response times** - швидкість системи
101
- - **User journey completion** - завершені сесії
102
-
103
- ### Аналітичні звіти включають:
104
- - Розподіл по режимах (medical/lifestyle %)
105
- - Rate ескалацій та їх правильність
106
- - Середня тривалість та інтенсивність сесій
107
- - Порівняльна статистика по пацієнтах
108
-
109
- ## 🔧 Debug та логування
110
-
111
- **Активуйте детальне логування в .env:**
112
- ```bash
113
- LOG_PROMPTS=true
114
- ```
115
-
116
- **Що логується:**
117
- - Всі промпти до Gemini API з типом виклику
118
- - Повні відповіді LLM з timestamps
119
- - Controller рішення та їх обґрунтування
120
- - Метрики продуктивності
121
-
122
- **Лог файли:**
123
- - `lifestyle_journey.log` - детальні API виклики
124
- - `testing_results/sessions/` - JSON з результатами сесій
125
-
126
- ## ⚠️ Важливо для production
127
-
128
- **Безпека даних:**
129
- - JSON файли можуть містити медичну інформацію
130
- - Результати тестування зберігаються локально
131
- - Не передавайте реальні дані пацієнтів
132
-
133
- **Performance:**
134
- - Testing Lab додає overhead для логування
135
- - Рекомендується періодично очищати testing_results/
136
- - Великі JSON файли (>10MB) можуть сповільнити UI
137
-
138
- ## 🎯 Використання для різних цілей
139
-
140
- ### Розробка та QA:
141
- - Тестування нових функцій на різних профілях
142
- - Regression тестування після змін в промптах
143
- - Оптимізація Session Controller логіки
144
-
145
- ### Клінічні дослідження:
146
- - A/B тестування різних lifestyle підходів
147
- - Вимірювання user engagement та adherence
148
- - Порівняння ефективності персоналізації
149
-
150
- ### Training та demo:
151
- - Навчання медичного персоналу
152
- - Демонстрації можливостей системи
153
- - Створення кейс-стадій
154
-
155
- ---
156
-
157
- **Made with ❤️ for evidence-based healthcare innovation**
158
-
159
- ## 🔗 Посилання
160
-
161
- - [Testing Lab User Guide](./TESTING_LAB_GUIDE.md)
162
- - [Test Patient Examples](./TEST_PATIENTS.md)
163
- - [Original Documentation](./TESTING_GUIDE.md)
164
- - [HuggingFace Space](https://huggingface.co/spaces/your-space/lifestyle-journey)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
REFACTORING_README.md DELETED
@@ -1,113 +0,0 @@
1
- # Рефакторинг app.py - Нова структура проекту
2
-
3
- ## 📁 Нова структура файлів
4
-
5
- ### Основні файли:
6
- - **`app.py`** - Точка входу додатку (мінімальний код)
7
- - **`lifestyle_app.py`** - Основний клас додатку `ExtendedLifestyleJourneyApp`
8
- - **`gradio_interface.py`** - Gradio інтерфейс та обробники подій
9
- - **`test_patients.py`** - Тестові дані пацієнтів
10
- - **`file_utils.py`** - Утиліти для роботи з файлами
11
- - **`core_classes.py`** - Основні класи (без змін)
12
- - **`prompts.py`** - Промпти (оновлено на функції)
13
-
14
- ## 🔄 Що було змінено
15
-
16
- ### 1. **app.py** (зменшено з ~600 до ~20 рядків)
17
- ```python
18
- import os
19
- from dotenv import load_dotenv
20
- from gradio_interface import create_gradio_interface
21
-
22
- load_dotenv()
23
-
24
- if __name__ == "__main__":
25
- # Мінімальний код запуску
26
- ```
27
-
28
- ### 2. **test_patients.py** - Винесено тестові дані
29
- - `TestPatientData` клас з методами для кожного типу пацієнта
30
- - `get_elderly_patient()`, `get_athlete_patient()`, `get_pregnant_patient()`
31
- - Універсальний метод `get_patient_data(patient_type)`
32
-
33
- ### 3. **file_utils.py** - Утиліти для файлів
34
- - `FileHandler.read_uploaded_file()` - універсальне читання файлів
35
- - `FileHandler.parse_json_file()` - парсинг JSON з обробкою помилок
36
-
37
- ### 4. **lifestyle_app.py** - Основна логіка
38
- - Клас `ExtendedLifestyleJourneyApp` з усією бізнес-логікою
39
- - Чистий код без Gradio специфіки
40
- - Легко тестувати окремо
41
-
42
- ### 5. **gradio_interface.py** - UI логіка
43
- - Функція `create_gradio_interface()`
44
- - Всі Gradio компоненти та обробники подій
45
- - Відокремлено від бізнес-логіки
46
-
47
- ## ✅ Переваги рефакторингу
48
-
49
- ### 🎯 **Розділення відповідальностей**
50
- - **app.py**: Тільки запуск
51
- - **lifestyle_app.py**: Бізнес-логіка
52
- - **gradio_interface.py**: UI
53
- - **test_patients.py**: Тестові дані
54
- - **file_utils.py**: Утиліти
55
-
56
- ### 📦 **Модульність**
57
- - Кожен файл має чітку відповідальність
58
- - Легко додавати нові типи пацієнтів
59
- - Простіше тестування окремих компонентів
60
-
61
- ### 🔧 **Підтримка**
62
- - Легше знаходити та виправляти баги
63
- - Зрозуміліша структура для нових розробників
64
- - Менше конфліктів при роботі в команді
65
-
66
- ### 🧪 **Тестування**
67
- - Можна тестувати бізнес-логіку без UI
68
- - Окремо тестувати утиліти файлів
69
- - Легко мокати компоненти
70
-
71
- ## 🚀 **Як використовувати**
72
-
73
- ### Запуск додатку:
74
- ```bash
75
- python app.py
76
- ```
77
-
78
- ### Додавання нового типу пацієнта:
79
- 1. Відкрити `test_patients.py`
80
- 2. Додати новий метод в `TestPatientData`
81
- 3. Оновити `get_patient_data()` метод
82
- 4. Додати кнопку в `gradio_interface.py`
83
-
84
- ### Додавання нової утиліти:
85
- 1. Відкрити `file_utils.py`
86
- 2. Додати статичний метод в `FileHandler`
87
-
88
- ## 📋 **Міграція з старого коду**
89
-
90
- Якщо у вас є кастомні зміни в старому `app.py`:
91
-
92
- 1. **Тестові дані пацієнтів** → `test_patients.py`
93
- 2. **Утиліти файлів** → `file_utils.py`
94
- 3. **Бізнес-логіка** → `lifestyle_app.py`
95
- 4. **UI компоненти** → `gradio_interface.py`
96
-
97
- ## 🔍 **Перевірка працездатності**
98
-
99
- Всі файли перевірені на синтаксичні помилки:
100
- ```bash
101
- python3 -m py_compile app.py ✅
102
- python3 -m py_compile lifestyle_app.py ✅
103
- python3 -m py_compile test_patients.py ✅
104
- python3 -m py_compile file_utils.py ✅
105
- python3 -m py_compile gradio_interface.py ✅
106
- ```
107
-
108
- ## 📈 **Статистика рефакторингу**
109
-
110
- - **Зменшення app.py**: з ~600 до ~20 рядків (-97%)
111
- - **Нових файлів**: 4
112
- - **Покращення читабельності**: значне
113
- - **Зворотна сумісність**: повна
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
TESTING_GUIDE.md DELETED
@@ -1,155 +0,0 @@
1
- # 🧪 Інструкція з тестування інтегрованих JSON профілів
2
-
3
- ## 📁 Структура файлів
4
-
5
- Переконайтесь що у вас є ці файли у тій же директорії з `app.py`:
6
-
7
- ```
8
- Lifestyle/
9
- ├── app.py
10
- ├── clinical_background.json # ← НОВИЙ
11
- ├── lifestyle_profile.json # ← НОВИЙ
12
- ├── requirements.txt
13
- ├── .env (з вашим GEMINI_API_KEY)
14
- └── .env.example
15
- ```
16
-
17
- ## 🚀 Запуск
18
-
19
- ```bash
20
- python app.py
21
- ```
22
-
23
- При запуску ви повинні побачити:
24
- ```
25
- 🔄 Завантаження даних пацієнта...
26
- ✅ Завантажено профіль пацієнта: Mark
27
- 📋 Активних проблем: 8
28
- 🎯 Lifestyle ціль: Improve exercise tolerance safely...
29
- ```
30
-
31
- ## 🔧 Debug режим (логування промптів)
32
-
33
- Для детального аналізу промптів та відповідей LLM:
34
-
35
- 1. **Активуйте логування** в `.env`:
36
- ```bash
37
- LOG_PROMPTS=true
38
- ```
39
-
40
- 2. **Запустіть застосунок:**
41
- ```bash
42
- python app.py
43
- ```
44
-
45
- 3. **Перевірте індикатори:**
46
- - В заголовку з'явиться 📝 та повідомлення про DEBUG MODE
47
- - В статус панелі: `Логування: 📝 АКТИВНЕ`
48
- - Лічильник API викликів
49
-
50
- 4. **Аналізуйте логи:**
51
- ```bash
52
- tail -f lifestyle_journey.log
53
- ```
54
-
55
- **Що логується:**
56
- - `[SESSION_CONTROLLER]` - рішення про режим
57
- - `[MEDICAL_ASSISTANT]` - медичні консультації
58
- - `[LIFESTYLE_ASSISTANT]` - lifestyle коучинг
59
- - Повні промпти та відповіді з timestamp'ами
60
-
61
- ## 🎯 Що змінилося
62
-
63
- ### 1. **Реальні дані пацієнта Mark**
64
- - 52 роки, ЦД2, АГ, ампутація правої ноги
65
- - 16+ поточних медикаментів
66
- - Складний медичний анамез з недавніми госпіталізаціями
67
-
68
- ### 2. **Детальний medical context**
69
- - Активні проблеми: нудота, гіпокаліємія, біль у грудях
70
- - Критичні попередження про компліансність
71
- - Недавні події: ER візити через блювоту та біль у грудях
72
-
73
- ### 3. **Персоналізований lifestyle профіль**
74
- - Адаптовані вправи для людини з ампутацією
75
- - Діабетична дієта + обмеження GERD
76
- - Реалістичні цілі з урахуванням фізичних обмежень
77
-
78
- ## 🧪 Сценарії тестування
79
-
80
- ### 🚨 **Medical режим (Red flags):**
81
- ```
82
- "У мене знову болить груди як тиждень тому"
83
- "Нудота повернулася, не можу їсти"
84
- "Рівень калію знизився - що робити?"
85
- "Відчуваю слабкість в ногах"
86
- ```
87
-
88
- **Очікуваний результат:** Controller направить в medical режим, асистент врахує недавні госпіталізації та поточні медикаменти.
89
-
90
- ### 💚 **Lifestyle режим:**
91
- ```
92
- "Хочу почати займатися спортом з моєю ампутацією"
93
- "Як правильно харчуватися при діабеті та GERD?"
94
- "Які вправи можна робити сидячи?"
95
- "Допоможіть скласти план тренувань для інвалідного візка"
96
- ```
97
-
98
- **Очікуваний результат:** Controller активує lifestyle режим, коуч врахує ампутацію, діабет та особисті переваги.
99
-
100
- ### 🔄 **Mixed/складні запити:**
101
- ```
102
- "Чи можу я займатися плаванням з моїм цукровим діабетом?"
103
- "Болить спина після сидіння в візку - які вправи допоможуть?"
104
- "Як контролювати цукор під час тренувань?"
105
- ```
106
-
107
- ## 📊 **Що перевіряти в Status панелі:**
108
-
109
- ### ✅ **Корректне завантаження:**
110
- - Пацієнт: **Mark**
111
- - Вік: **52**
112
- - Активні проблеми: повинні показуватись реальні діагнози
113
- - Lifestyle ціль: повинна містити текст про ампутацію
114
-
115
- ### ✅ **Controller рішення:**
116
- - Медичні симптоми → `action: start_medical`
117
- - Lifestyle питання → `action: start_lifestyle`
118
- - Обґрунтування українською мовою
119
-
120
- ### ✅ **Персоналізація відповідей:**
121
- - Medical асистент повинен згадувати н��давні госпіталізації
122
- - Lifestyle коуч повинен враховувати ампутацію в рекомендаціях
123
- - Обидва режими мають враховувати діабет та гіпертонію
124
-
125
- ## 🐛 **Можливі проблеми:**
126
-
127
- **Якщо файли не знаходить:**
128
- ```
129
- ⚠️ Файл clinical_background.json не знайдено. Використовуємо тестові дані.
130
- ```
131
- → Переконайтесь що JSON файли в тій же папці що й app.py
132
-
133
- **Якщо JSON некоректний:**
134
- ```
135
- ⚠️ Помилка завантаження lifestyle_profile.json: ...
136
- ```
137
- → Перевірте синтаксис JSON (коми, лапки)
138
-
139
- **Якщо API не працює:**
140
- ```
141
- Помилка API: ...
142
- ```
143
- → Перевірте GEMINI_API_KEY в .env файлі
144
-
145
- ## 🎉 **Успішний тест:**
146
-
147
- Якщо все працює правильно, ви побачите:
148
- - Mark's профіль коректно завантажений
149
- - Медичні запити враховують його складний анамнез
150
- - Lifestyle поради адаптовані під ампутацію та діабет
151
- - Controller коректно розрізняє типи запитів
152
- - Profile оновлюється після lifestyle сесій
153
-
154
- ---
155
- **Готово до продакшену!** 🚀
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
examples_test_patient.md DELETED
@@ -1,383 +0,0 @@
1
- # 👥 Приклади тестових пацієнтів
2
-
3
- ## 🧓 Пацієнт 1: "Elderly_Mary" - Старша жінка з множинними коморбідностями
4
-
5
- ### clinical_background.json
6
- ```json
7
- {
8
- "patient_summary": {
9
- "active_problems": [
10
- "Essential hypertension (uncontrolled)",
11
- "Type 2 diabetes mellitus with complications",
12
- "Chronic kidney disease stage 3",
13
- "Osteoarthritis bilateral knees",
14
- "Depression, recurrent episode",
15
- "Falls risk - history of 3 falls last year"
16
- ],
17
- "past_medical_history": [
18
- "Myocardial infarction (2020)",
19
- "Stroke with residual left-sided weakness (2019)",
20
- "Hip fracture left (2022)",
21
- "Chronic heart failure"
22
- ],
23
- "current_medications": [
24
- "Amlodipine 10mg daily",
25
- "Metformin 1000mg twice daily",
26
- "Lisinopril 20mg daily",
27
- "Atorvastatin 40mg at bedtime",
28
- "Metoprolol 50mg twice daily",
29
- "Furosemide 40mg daily",
30
- "Sertraline 50mg daily",
31
- "Calcium + Vitamin D3 daily"
32
- ],
33
- "allergies": "Penicillin - rash, NSAIDs - GI upset"
34
- },
35
- "vital_signs_and_measurements": [
36
- "Blood Pressure: 165/95 (last visit)",
37
- "Heart Rate: 78 bpm",
38
- "Weight: 78kg",
39
- "Height: 1.58m",
40
- "BMI: 31.2 kg/m²",
41
- "HbA1c: 8.2% (poor control)"
42
- ],
43
- "laboratory_results": [
44
- "Creatinine: 145 μmol/L (elevated)",
45
- "eGFR: 42 ml/min/1.73m² (stage 3 CKD)",
46
- "HbA1c: 8.2% (64 mmol/mol)",
47
- "LDL: 3.2 mmol/L"
48
- ],
49
- "assessment_and_plan": "76-year-old female with multiple cardiovascular risk factors and functional limitations. Primary goals: BP control, diabetes management, fall prevention. Requires gentle lifestyle modifications with careful monitoring.",
50
- "critical_alerts": [
51
- "High fall risk - requires mobility assessment",
52
- "CKD stage 3 - monitor kidney function with any changes",
53
- "Depression - monitor for worsening mood",
54
- "Uncontrolled hypertension and diabetes"
55
- ],
56
- "social_history": {
57
- "living_situation": "Lives alone, adult children nearby",
58
- "mobility": "Uses walking frame, limited to ground floor",
59
- "smoking_status": "Never smoker",
60
- "alcohol_use": "Occasional glass of wine"
61
- },
62
- "recent_clinical_events_and_encounters": [
63
- "2025-01-10: Fall at home, no injury but increased anxiety",
64
- "2024-12-15: ER visit for chest pain - ruled out MI, anxiety-related",
65
- "2024-11-20: Routine follow-up - BP poorly controlled, meds adjusted"
66
- ]
67
- }
68
- ```
69
-
70
- ### lifestyle_profile.json
71
- ```json
72
- {
73
- "patient_name": "Mary",
74
- "patient_age": "76",
75
- "conditions": [
76
- "essential hypertension",
77
- "type 2 diabetes",
78
- "chronic kidney disease",
79
- "osteoarthritis",
80
- "depression",
81
- "history of stroke"
82
- ],
83
- "primary_goal": "Improve mobility and independence while managing multiple chronic conditions safely. Prevent falls and maintain current functional level.",
84
- "exercise_preferences": [
85
- "chair exercises",
86
- "gentle walking with frame",
87
- "tai chi (interested but never tried)",
88
- "swimming (if accessible)"
89
- ],
90
- "exercise_limitations": [
91
- "Left-sided weakness from stroke",
92
- "Severe knee arthritis - painful weight bearing",
93
- "High fall risk - balance issues",
94
- "Limited endurance due to heart condition",
95
- "Gets breathless with minimal exertion",
96
- "Requires walking frame for mobility"
97
- ],
98
- "dietary_notes": [
99
- "Diabetic diet - needs simple carb counting education",
100
- "Low sodium for hypertension and heart failure",
101
- "CKD diet - limited protein and phosphorus",
102
- "Poor appetite due to depression",
103
- "Lives alone - convenience foods common",
104
- "Limited cooking ability due to arthritis"
105
- ],
106
- "personal_preferences": [
107
- "very cautious about new activities due to fall anxiety",
108
- "prefers morning activities when energy is better",
109
- "needs frequent encouragement and reassurance",
110
- "responds well to small, achievable goals",
111
- "family involvement important for motivation"
112
- ],
113
- "journey_summary": "Elderly patient with complex medical needs seeking to maintain independence. Recent falls have increased anxiety about movement. Needs gentle, supervised approach to lifestyle modifications.",
114
- "last_session_summary": "",
115
- "progress_metrics": {
116
- "current_mobility": "walking frame required, 50m max distance",
117
- "exercise_frequency": "0 times/week - afraid to move",
118
- "fall_incidents": "3 in past 12 months",
119
- "medication_adherence": "good with pill organizer",
120
- "bp_control": "poor - 165/95 average",
121
- "diabetes_control": "poor - HbA1c 8.2%"
122
- }
123
- }
124
- ```
125
-
126
- ---
127
-
128
- ## 🏃 Пацієнт 2: "Athletic_John" - Молодий спортсмен після травми
129
-
130
- ### clinical_background.json
131
- ```json
132
- {
133
- "patient_summary": {
134
- "active_problems": [
135
- "ACL reconstruction recovery (3 months post-op)",
136
- "Post-surgical knee pain and swelling",
137
- "Muscle atrophy right quadriceps",
138
- "Anxiety related to return to sport",
139
- "Sleep disturbance due to pain"
140
- ],
141
- "past_medical_history": [
142
- "ACL tear during football match (6 months ago)",
143
- "Previous ankle sprain (2022)",
144
- "Exercise-induced asthma (childhood)"
145
- ],
146
- "current_medications": [
147
- "Ibuprofen 400mg as needed for pain",
148
- "Physiotherapy exercises daily",
149
- "Protein supplements"
150
- ],
151
- "allergies": "No known drug allergies"
152
- },
153
- "vital_signs_and_measurements": [
154
- "Blood Pressure: 118/72",
155
- "Heart Rate: 58 bpm (athletic)",
156
- "Weight: 82kg (lost 3kg since surgery)",
157
- "Height: 1.85m",
158
- "BMI: 24.0 kg/m²",
159
- "Body fat: 12% (increased from 8% pre-injury)"
160
- ],
161
- "laboratory_results": [
162
- "All routine bloods normal",
163
- "Vitamin D: sufficient"
164
- ],
165
- "assessment_and_plan": "24-year-old male athlete 3 months post ACL reconstruction. Good surgical healing, ready for progressive return to activity under physiotherapy guidance. Mental health support may be needed for sports anxiety.",
166
- "critical_alerts": [
167
- "Do not exceed physiotherapy exercise guidelines",
168
- "No pivoting or cutting movements until cleared",
169
- "Monitor for signs of depression or anxiety"
170
- ],
171
- "social_history": {
172
- "occupation": "Semi-professional footballer",
173
- "activity_level": "Previously 6-7 training sessions per week",
174
- "smoking_status": "Never",
175
- "alcohol_use": "Social drinking, 2-3 units per week"
176
- },
177
- "recent_clinical_events_and_encounters": [
178
- "2025-01-05: Physiotherapy review - progressing well",
179
- "2024-12-20: Orthopedic follow-up - cleared for gym work",
180
- "2024-11-15: 6-week post-op check - healing excellent"
181
- ]
182
- }
183
- ```
184
-
185
- ### lifestyle_profile.json
186
- ```json
187
- {
188
- "patient_name": "John",
189
- "patient_age": "24",
190
- "conditions": [
191
- "ACL reconstruction recovery",
192
- "post-surgical deconditioning",
193
- "sports performance anxiety"
194
- ],
195
- "primary_goal": "Return to competitive football safely and regain pre-injury fitness level. Build confidence in knee stability and prevent re-injury.",
196
- "exercise_preferences": [
197
- "weight training (upper body focus currently)",
198
- "swimming",
199
- "cycling",
200
- "football-specific drills (when cleared)",
201
- "plyometric training (future goal)"
202
- ],
203
- "exercise_limitations": [
204
- "No pivoting or cutting movements yet",
205
- "Limited knee flexion under load",
206
- "No contact sports until 6+ months post-op",
207
- "Must follow physiotherapy protocol strictly",
208
- "Avoid high-impact activities on hard surfaces"
209
- ],
210
- "dietary_notes": [
211
- "High protein intake for muscle recovery",
212
- "Anti-inflammatory foods to reduce swelling",
213
- "Adequate calories to support training",
214
- "Sports nutrition knowledge good",
215
- "Hydration important for recovery"
216
- ],
217
- "personal_preferences": [
218
- "highly motivated and goal-oriented",
219
- "impatient with slow recovery process",
220
- "competitive personality",
221
- "prefers intense workouts when possible",
222
- "needs measurable progress to stay motivated"
223
- ],
224
- "journey_summary": "Highly motivated athlete recovering from major knee surgery. Risk of doing too much too soon. Needs structured progression plan and psychological support for sports anxiety.",
225
- "last_session_summary": "",
226
- "progress_metrics": {
227
- "knee_flexion_range": "120 degrees (target: 135+)",
228
- "quad_strength": "70% of uninjured leg",
229
- "cardio_fitness": "estimated 60% of pre-injury level",
230
- "training_frequency": "4 sessions/week (physio + gym)",
231
- "pain_level": "2/10 at rest, 4/10 with exercise",
232
- "return_to_sport_timeline": "3-4 months if progress continues"
233
- }
234
- }
235
- ```
236
-
237
- ---
238
-
239
- ## 🤰 Пацієнт 3: "Pregnant_Sarah" - Вагітна з гестаційним діабетом
240
-
241
- ### clinical_background.json
242
- ```json
243
- {
244
- "patient_summary": {
245
- "active_problems": [
246
- "Pregnancy 28 weeks gestation",
247
- "Gestational diabetes mellitus (diet-controlled)",
248
- "Pregnancy-induced hypertension (mild)",
249
- "Iron deficiency anemia",
250
- "Lower back pain",
251
- "Carpal tunnel syndrome pregnancy-related"
252
- ],
253
- "past_medical_history": [
254
- "Gravida 2, Para 1 (one previous normal delivery)",
255
- "Previous gestational diabetes (resolved postpartum)",
256
- "Polycystic ovary syndrome"
257
- ],
258
- "current_medications": [
259
- "Prenatal vitamins with iron",
260
- "Additional iron supplement 65mg daily",
261
- "Folic acid 5mg daily",
262
- "Vitamin D3 1000 IU daily"
263
- ],
264
- "allergies": "No known drug allergies"
265
- },
266
- "vital_signs_and_measurements": [
267
- "Blood Pressure: 142/88 (elevated for pregnancy)",
268
- "Heart Rate: 88 bpm",
269
- "Pre-pregnancy weight: 68kg",
270
- "Current weight: 78kg",
271
- "Weight gain: 10kg (appropriate for gestational age)",
272
- "Fundal height: 28cm (matches dates)"
273
- ],
274
- "laboratory_results": [
275
- "Glucose tolerance test: abnormal (gestational diabetes)",
276
- "Hemoglobin: 95 g/L (anemic)",
277
- "Ferritin: low",
278
- "Urine protein: trace (monitoring for preeclampsia)"
279
- ],
280
- "assessment_and_plan": "28-year-old female, 28 weeks pregnant with gestational diabetes and mild hypertension. Currently well-controlled with diet. Regular monitoring required. Delivery planning at 38-39 weeks.",
281
- "critical_alerts": [
282
- "Monitor blood pressure - risk of preeclampsia",
283
- "Blood glucose monitoring required",
284
- "Avoid exercises lying flat on back after 20 weeks",
285
- "Contact immediately if severe headaches, visual changes, or upper abdominal pain"
286
- ],
287
- "social_history": {
288
- "occupation": "Office worker (desk job)",
289
- "living_situation": "Married, supportive partner",
290
- "previous_pregnancy": "Uncomplicated delivery 3 years ago",
291
- "smoking_status": "Never",
292
- "alcohol_use": "None during pregnancy"
293
- },
294
- "recent_clinical_events_and_encounters": [
295
- "2025-01-08: Antenatal appointment - BP slightly elevated",
296
- "2024-12-28: Glucose tolerance test - abnormal result",
297
- "2024-12-15: Routine 26-week appointment - all well"
298
- ]
299
- }
300
- ```
301
-
302
- ### lifestyle_profile.json
303
- ```json
304
- {
305
- "patient_name": "Sarah",
306
- "patient_age": "28",
307
- "conditions": [
308
- "pregnancy 28 weeks",
309
- "gestational diabetes",
310
- "pregnancy-induced hypertension",
311
- "iron deficiency anemia"
312
- ],
313
- "primary_goal": "Maintain healthy pregnancy with good blood sugar control, manage blood pressure, and prepare physically for delivery while ensuring baby's wellbeing.",
314
- "exercise_preferences": [
315
- "prenatal yoga",
316
- "walking",
317
- "swimming",
318
- "stationary cycling",
319
- "prenatal fitness classes"
320
- ],
321
- "exercise_limitations": [
322
- "No lying flat on back after 20 weeks",
323
- "Avoid high-impact or contact activities",
324
- "No scuba diving or activities at altitude",
325
- "Monitor heart rate - shouldn't exceed 140 bpm",
326
- "Stop if experiencing dizziness, chest pain, or contractions",
327
- "Avoid overheating"
328
- ],
329
- "dietary_notes": [
330
- "Gestational diabetes diet - controlled carbohydrates",
331
- "Small frequent meals to manage blood sugar",
332
- "High fiber foods to prevent constipation",
333
- "Iron-rich foods for anemia",
334
- "Adequate protein for fetal growth",
335
- "Limit caffeine intake",
336
- "Avoid alcohol completely"
337
- ],
338
- "personal_preferences": [
339
- "motivated to have healthy pregnancy",
340
- "anxious about blood sugar control",
341
- "prefers gentle, safe activities",
342
- "likes group exercise for motivation",
343
- "concerned about weight gain"
344
- ],
345
- "journey_summary": "Second pregnancy with new diagnosis of gestational diabetes. Previously active but concerned about exercise safety. Needs education on appropriate prenatal fitness and diabetes management.",
346
- "last_session_summary": "",
347
- "progress_metrics": {
348
- "blood_glucose_control": "diet-controlled, monitoring 4x daily",
349
- "blood_pressure": "mild elevation, monitoring twice weekly",
350
- "weight_gain": "10kg total, appropriate for gestation",
351
- "exercise_frequency": "2-3 times per week currently",
352
- "energy_level": "moderate fatigue, better in second trimester",
353
- "delivery_preparation": "considering prenatal classes"
354
- }
355
- }
356
- ```
357
-
358
- ---
359
-
360
- ## 📋 Використання прикладів
361
-
362
- **Для тестування medical режиму:**
363
- - Завантажте "Elderly_Mary" - протестуйте red flags (падіння, біль у грудях)
364
- - Використовуйте критичні попередження для перевірки ескалації
365
-
366
- **Для тестування lifestyle персоналізації:**
367
- - "Athletic_John" - складні обмеження після травми
368
- - "Pregnant_Sarah" - специфічні safety guidelines
369
-
370
- **Для комплексного тестування:**
371
- - Всі три пацієнти мають різні рівні складності
372
- - Можна тестувати адаптацію системи до різних вікових груп та станів
373
-
374
- **Зберегти як окремі файли:**
375
- ```
376
- test_patients/
377
- ├── elderly_mary_clinical.json
378
- ├── elderly_mary_lifestyle.json
379
- ├── athletic_john_clinical.json
380
- ├── athletic_john_lifestyle.json
381
- ├── pregnant_sarah_clinical.json
382
- └── pregnant_sarah_lifestyle.json
383
- ```