LP_2-test / docs /CONFIGURATION.md
DocUA's picture
Clean deployment without large index files
461adca
|
raw
history blame
9.21 kB
# Конфігурація додатку
## 📋 Огляд
Вся конфігурація додатку зберігається в **config/environments/default.yaml** як єдине джерело істини.
Pydantic моделі в **config/settings.py** використовуються **тільки для валідації** типів та значень, без дефолтних значень.
## 🎯 Принципи
### ✅ Правильний підхід
```
YAML файл → Єдине джерело істини (всі значення)
Pydantic → Валідація типів (БЕЗ дефолтів)
Python код → Використання через get_settings()
```
### ❌ Неправильний підхід (дубляж)
```python
# ❌ НЕ робити так!
class AppConfig(BaseModel):
name: str = "Legal Position" # ← Дубляж з YAML
```
## 📁 Структура конфігурації
### config/environments/default.yaml
```yaml
# Єдине джерело істини для всіх налаштувань
app:
name: "Legal Position AI Analyzer"
version: "1.0.0"
debug: false
environment: "production"
models:
default_provider: "gemini" # ← Провайдер за замовчуванням
providers:
- openai
- anthropic
- gemini
- deepseek
```
### config/settings.py
```python
# Тільки типи та валідація, БЕЗ дефолтів
class AppConfig(BaseModel):
name: str # ← Тільки тип
version: str # ← Тільки тип
debug: bool
environment: str
```
### config/models.py
```python
# Динамічна генерація enums з YAML
GenerationModelName = Enum(
'GenerationModelName',
_registry.get_generation_models(), # ← З YAML
type=str
)
```
## 🔧 Використання
### Отримання налаштувань
```python
from config import get_settings
settings = get_settings()
# Доступ до значень
app_name = settings.app.name
default_provider = settings.models.default_provider
timeout = settings.session.timeout_minutes
```
### Отримання моделей
```python
from config import GenerationModelName, ModelProvider
# Enum згенерований з YAML
model = GenerationModelName.GEMINI_3_FLASH
# Провайдер
provider = ModelProvider.GEMINI
```
### Зміна дефолтного провайдера
**Крок 1:** Змінити в YAML
```yaml
# config/environments/default.yaml
models:
default_provider: "gemini" # ← Змінити тут
```
**Крок 2:** Оновити UI (якщо потрібно)
```python
# interface.py
generation_provider_dropdown = gr.Dropdown(
value=ModelProvider.GEMINI.value # ← Синхронізувати
)
```
## 📊 Поточні налаштування
### Провайдери
| Параметр | Значення | Файл |
|----------|----------|------|
| Default Provider (Generation) | gemini | YAML |
| Default Provider (Analysis) | gemini | YAML |
| Default Model (Generation) | gemini-3-flash-preview | YAML |
| Default Model (Analysis) | gemini-3-flash-preview | YAML |
### Сесії
| Параметр | Значення | Опис |
|----------|----------|------|
| timeout_minutes | 30 | Таймаут сесії |
| cleanup_interval_minutes | 5 | Інтервал очистки |
| max_sessions | 1000 | Максимум сесій |
| storage_type | memory | Тип зберігання |
### LlamaIndex
| Параметр | Значення | Опис |
|----------|----------|------|
| context_window | 20000 | Розмір контексту |
| chunk_size | 2048 | Розмір чанка |
| similarity_top_k | 20 | К-сть результатів |
| embed_model | text-embedding-3-small | Модель ембедінгу |
### Gradio
| Параметр | Значення | Опис |
|----------|----------|------|
| server_name | 0.0.0.0 | Адреса сервера |
| server_port | 7860 | Порт |
| share | true | Публічний доступ |
## 🔄 Ієрархія конфігурації
```
1. Environment Variables (.env)
2. YAML Configuration (default.yaml)
3. Pydantic Validation (settings.py)
4. Runtime Settings (get_settings())
```
### Environment Variables
```bash
# .env
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
GEMINI_API_KEY=AI...
DEEPSEEK_API_KEY=sk-...
```
### YAML приоритет
Якщо потрібно перевизначити для різних середовищ:
```
config/environments/
├── default.yaml # ← Базові налаштування
├── development.yaml # ← Для розробки (опціонально)
└── production.yaml # ← Для production (опціонально)
```
## 🎨 Додавання нової моделі
### Крок 1: Додати в YAML
```yaml
# config/environments/default.yaml
models:
generation:
gemini:
- name: "gemini-3-flash-preview"
display_name: "Gemini 3 Flash"
default: true
- name: "gemini-4-ultra" # ← Нова модель
display_name: "Gemini 4 Ultra"
```
### Крок 2: Перезапустити додаток
Enum автоматично згенерується з нової конфігурації.
```python
# Автоматично доступно
from config import GenerationModelName
GenerationModelName.GEMINI_4_ULTRA # ✅ Працює!
```
## 🔒 Валідація
### Автоматична валідація при завантаженні
```python
# config/loader.py
settings = loader.load_config(validate_api_keys=True)
# Перевіряє:
# ✅ Типи даних (int, str, bool, etc.)
# ✅ Обов'язкові поля
# ✅ Діапазони значень
# ✅ Формати (email, URL, etc.)
# ✅ API ключі (якщо validate_api_keys=True)
```
### Кастомна валідація
```python
# config/settings.py
@validator('storage_type')
def validate_storage_type(cls, v):
allowed = ["memory", "redis"]
if v not in allowed:
raise ValueError(f"storage_type must be one of {allowed}")
return v
```
## 📝 Найкращі практики
### ✅ DO
1. **Всі дефолти в YAML**
```yaml
session:
timeout_minutes: 30 # ✅
```
2. **Pydantic тільки для типів**
```python
class SessionConfig(BaseModel):
timeout_minutes: int # ✅ Тільки тип
```
3. **Використання через get_settings()**
```python
settings = get_settings()
timeout = settings.session.timeout_minutes # ✅
```
### ❌ DON'T
1. **Не дублювати значення**
```python
# ❌ Неправильно
timeout_minutes: int = 30 # Дубляж з YAML
```
2. **Не хардкодити в коді**
```python
# ❌ Неправильно
TIMEOUT = 30 # Має бути в YAML
```
3. **Не ігнорувати валідацію**
```python
# ❌ Неправильно
arbitrary_types_allowed = True # Без необхідності
```
## 🐛 Troubleshooting
### Проблема: Зміни в YAML не застосовуються
**Рішення:** Перезапустити додаток
```bash
# Зупинити
Ctrl+C
# Запустити знову
python main.py
```
### Проблема: Помилка валідації
```
pydantic.error_wrappers.ValidationError:
timeout_minutes
field required (type=value_error.missing)
```
**Рішення:** Перевірити наявність поля в YAML
```yaml
# config/environments/default.yaml
session:
timeout_minutes: 30 # ← Додати, якщо відсутнє
```
### Проблема: Модель не знайдена
```
AttributeError: 'GenerationModelName' has no attribute 'GEMINI_3_FLASH'
```
**Рішення:** Перевірити назву в YAML та перезапустити
```yaml
models:
generation:
gemini:
- name: "gemini-3-flash-preview" # ← Точна назва
```
## 🔍 Перевірка конфігурації
### Команда для перевірки
```python
from config import get_settings
settings = get_settings()
print(f"App: {settings.app.name}")
print(f"Default provider: {settings.models.default_provider}")
print(f"Session timeout: {settings.session.timeout_minutes}m")
```
### Очікуваний вихід
```
App: Legal Position AI Analyzer
Default provider: gemini
Session timeout: 30m
```
## 📚 Додаткова інформація
- **Повна конфігурація:** [config/environments/default.yaml](../config/environments/default.yaml)
- **Pydantic моделі:** [config/settings.py](../config/settings.py)
- **Генерація enums:** [config/models.py](../config/models.py)
- **Завантажувач:** [config/loader.py](../config/loader.py)
---
**Останнє оновлення:** 2025-12-28
**Статус:** ✅ Без дубляжів, Gemini за замовчуванням