| # Конфігурація додатку | |
| ## 📋 Огляд | |
| Вся конфігурація додатку зберігається в **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 за замовчуванням | |