File size: 5,023 Bytes
601f5a4
 
 
 
 
 
461adca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
601f5a4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<!--
NOTE: This file is a legacy implementation summary. The canonical documentation entrypoint is docs/README.md.
If you reached this file, please consult docs/README.md or docs/PROMPT_EDITING.md for the up-to-date, user-facing and developer-facing docs.
This file is kept for historical reference and has been marked legacy. Short summaries or pointers are preferred instead of duplicating long docs.
-->

# 🎉 Підсумок реалізації: Редагування промптів з ізоляцією сесій

**Дата:** 2025-12-28
**Версія:** 2.0
**Статус:** ✅ Production Ready

---

## 📋 Що було реалізовано

### 1. Розширення системи управління сесіями

#### Файл: [src/session/state.py](src/session/state.py)

**Додано нове поле:**
```python
custom_prompts: Dict[str, str] = field(default_factory=dict)
```

**Нові методи:**
- `get_prompt(prompt_type, default_prompt)` - отримання промпту з fallback
- `set_prompt(prompt_type, prompt_value)` - збереження промпту
- `reset_prompts()` - скидання всіх промптів до стандартних

**Оновлено:**
- `to_dict()` - додано серіалізацію custom_prompts
- `from_dict()` - додано десеріалізацію з підтримкою старих версій
- `clear_data()` - очищення включає кастомні промпти

### 2. UI для редагування промптів

#### Файл: [interface.py](interface.py)

**Додано нові функції:**

```python
async def save_custom_prompts(session_id, system_prompt, lp_prompt, analysis_prompt)
    - Валідація довжини (max 50,000 символів)
    - Збереження в сесію
    - Повідомлення про успіх/помилку

async def reset_prompts_to_default(session_id)
    - Скидання до стандартних значень
    - Оновлення UI

async def load_session_prompts(session_id)
    - Завантаження при старті додатку
    - Fallback до стандартних значень
```

**Нова вкладка "⚙️ Налаштування":**
- 📋 Редактор системного промпту (5 рядків)
- ⚖️ Редактор промпту генерації (15 рядків)
- 🔍 Редактор промпту аналізу (15 рядків)
- 💾 Кнопка "Зберегти промпти"
- 🔄 Кнопка "Скинути до стандартних"
- Статус-повідомлення

**Інтеграція з сесіями:**
```python
# Генерація унікального session ID для кожного користувача
session_id_state = gr.State(value=generate_session_id)

# Завантаження промптів при старті
app.load(fn=load_session_prompts, inputs=[session_id_state], ...)
```

### 3. Підтримка кастомних промптів у генерації

#### Файл: [main.py](main.py)

**Оновлено сигнатуру:**
```python
def generate_legal_position(
    # ... існуючі параметри ...
    custom_system_prompt: Optional[str] = None,  # 🆕
    custom_lp_prompt: Optional[str] = None       # 🆕
) -> Dict:
```

**Логіка використання:**
```python
# Використання кастомних або стандартних промптів
system_prompt = custom_system_prompt or SYSTEM_PROMPT
lp_prompt = custom_lp_prompt or LEGAL_POSITION_PROMPT

# Форматування контенту з кастомним промптом
content = lp_prompt.format(
    court_decision_text=court_decision_text,
    comment=comment_input if comment_input else "Коментар відсутній"
)
```

**Оновлено всі провайдери:**
- ✅ OpenAI (GPT-4o, GPT-4.1)
- ✅ Anthropic (Claude 4.5 Sonnet)
- ✅ Google (Gemini 3.0/3.5 Flash)
- ✅ DeepSeek (DeepSeek Chat)

### 4. Оновлення обробників в interface.py

**Змінено `process_input()`:**
```python
async def process_input(..., session_id: str) -> Tuple[str, Dict, str]:
    # Завантаження сесії
    manager = get_session_manager()
    session = await manager.get_session(session_id)

    # Витягування кастомних промптів
    custom_system = session.get_prompt('system', SYSTEM_PROMPT)
    custom_lp = session.get_prompt('legal_position', LEGAL_POSITION_PROMPT)

    # Генерація з кастомними промптами
    legal_position_json = generate_legal_position(
        ..., custom_system, custom_lp
    )

    # Збереження результату в сесію
    session.legal_position_json = legal_position_json
    await manager.update_session(session)

    return output, legal_position_json, session_id
```

---

(remaining content preserved)