# Хардкод vs Конфігурація

## 🔴 ХАРДКОД (Hardcode) - Що це?

**Хардкод** = значення, які "зашиті" прямо в коді і не можуть змінюватись без редагування коду.

### Приклад хардкоду:
```python
# ❌ ХАРДКОД - значення прямо в коді
local_model = "qwen3-8b"  # Якщо треба змінити модель, треба редагувати код!
```

### Проблеми хардкоду:
1. **Треба редагувати код** для зміни значення
2. **Не можна змінити без перезапуску** сервісу
3. **Важко тестувати** різні конфігурації
4. **Не гнучко** - однаковий код для всіх середовищ (dev/prod)

---

## ✅ КОНФІГУРАЦІЯ (Config) - Що це?

**Конфігурація** = значення, які зберігаються окремо від коду (в файлах, змінних середовища, БД) і можуть змінюватись без редагування коду.

### Приклад конфігурації:
```yaml
# ✅ КОНФІГ - значення в окремому файлі router-config.yml
llm_profiles:
  qwen3_science_8b:
    provider: ollama
    model: qwen3:8b
    max_tokens: 2048
```

```python
# ✅ КОД читає з конфігу
llm_profile = router_config.get("llm_profiles", {}).get("qwen3_science_8b")
model = llm_profile.get("model")  # Беремо з конфігу, не хардкодимо!
```

### Переваги конфігурації:
1. **Зміна без редагування коду** - просто змінити YAML файл
2. **Різні конфіги для різних середовищ** (dev/prod/staging)
3. **Легко тестувати** - можна створити test-config.yml
4. **Гнучко** - один код, багато конфігурацій

---

## 📊 ПОРІВНЯННЯ

| Аспект | Хардкод | Конфігурація |
|--------|---------|--------------|
| **Де зберігається?** | В коді | В окремих файлах |
| **Як змінити?** | Редагувати код | Редагувати конфіг |
| **Потрібен рестарт?** | Так (перекомпіляція) | Так (перезапуск) |
| **Гнучкість** | Низька | Висока |
| **Тестування** | Важко | Легко |

---

## 🔧 ЩО МИ ВИПРАВИЛИ?

### БУЛО (хардкод):
```python
# ❌ Хардкод - модель завжди "qwen3-8b"
local_model = "qwen3-8b"
```

### СТАЛО (з конфігу):
```python
# ✅ Читаємо з конфігу
if llm_profile.get("provider") == "ollama":
    ollama_model = llm_profile.get("model", "qwen3:8b")
    local_model = ollama_model.replace(":", "-")  # qwen3:8b → qwen3-8b
```

### Результат:
- ✅ Модель береться з `router-config.yml`
- ✅ Якщо змінити конфіг → зміниться поведінка
- ✅ Не треба редагувати код для зміни моделі
- ✅ Різні агенти можуть мати різні локальні моделі

---

## 💡 КОЛИ ВИКОРИСТОВУВАТИ?

### Хардкод - тільки для:
- Константи (π = 3.14, версія API)
- Значення, які ніколи не зміняться
- Технічні деталі (timeout = 5.0 сек)

### Конфігурація - для:
- Моделі LLM
- API ключі
- URL сервісів
- Параметри (temperature, max_tokens)
- Налаштування агентів

---

## 📝 ПРИКЛАД З НАШОГО ПРОЄКТУ

### router-config.yml (конфігурація):
```yaml
agents:
  helion:
    default_llm: qwen3_science_8b  # ← Можна змінити тут

llm_profiles:
  qwen3_science_8b:
    provider: ollama
    model: qwen3:8b  # ← Можна змінити модель тут
```

### main.py (код):
```python
# Читаємо з конфігу
default_llm = agent_config.get("default_llm", "qwen3-8b")
llm_profile = llm_profiles.get(default_llm, {})
model = llm_profile.get("model")  # ← Беремо з конфігу!
```

**Тепер можна змінити модель просто редагуванням YAML файлу!** 🎉
