Конфигурация Agent Lab
Система конфигурации поддерживает гибкое управление настройками через JSON файлы и переменные окружения.
Порядок приоритетов
Источники конфигурации применяются в следующем порядке (от высшего к низшему):
- Переменные окружения (ENV) ← Высший приоритет
- Файлы конфигурации (JSON)
- Значения по умолчанию в коде
Структура конфигурации
Основной файл: conf.json
{
"server": {
"env": "local",
"port": 8001,
"debug": true
},
"database": {
"url": "postgresql+asyncpg://user:password@localhost:5432/dbname",
"checkpointer_url": "postgresql://user:password@localhost:5432/dbname"
},
"llm": {
"openrouter": {
"api_key": "sk-or-v1-...",
"enabled": true,
"base_url": "https://openrouter.ai/api/v1",
"site_url": "https://agents-lab.ru",
"site_name": "Agent Lab"
},
"default_model": "anthropic/claude-sonnet-4.5",
"models": {
"anthropic/claude-sonnet-4.5": {
"temperature": 0.2,
"max_tokens": 10000,
"input_cost_per_token": 0.00003,
"output_cost_per_token": 0.00015
}
}
}
}
Дополнительные файлы
conf.local.json- локальные настройки (не коммитится, переопределяетconf.json)- Создается вручную разработчиком
- Есть пример:
conf.local.json.example - Удобен для локальных экспериментов
AGENT_CONFIG_PATH- env переменная с путем к кастомному конфигу
Переопределение через ENV переменные
Формат имени переменной
Для вложенных полей используй двойное подчеркивание __:
Примеры
Локальная разработка
# Изменить порт сервера
export SERVER__PORT=8002
# Использовать другую БД
export DATABASE__URL="postgresql+asyncpg://user:pass@localhost:5433/mydb"
# Настроить OpenRouter
export LLM__OPENROUTER__API_KEY="sk-or-v1-..."
export LLM__DEFAULT_MODEL="anthropic/claude-sonnet-4.5"
# Включить debug режим
export SERVER__DEBUG=true
# Запуск
uv run python run.py
Docker окружение
В docker-compose.yml:
services:
app:
environment:
# Переопределяем хост БД для Docker
- DATABASE__URL=postgresql+asyncpg://user:pass@postgres:5432/dbname
- DATABASE__CHECKPOINTER_URL=postgresql://user:pass@postgres:5432/dbname
# Настройка OpenRouter
- LLM__OPENROUTER__API_KEY=sk-or-v1-...
- LLM__DEFAULT_MODEL=anthropic/claude-sonnet-4.5
Продакшн
# .env файл
DATABASE__URL=postgresql+asyncpg://prod_user:secure_pass@db.example.com:5432/prod_db
LLM__OPENROUTER__API_KEY=sk-or-v1-prod-key-...
LLM__DEFAULT_MODEL=anthropic/claude-sonnet-4.5
SERVER__DEBUG=false
Как это работает внутри
1. Загрузка JSON
Система загружает все JSON файлы и объединяет их:
# app/core/config_utils.py
def load_merged_config():
# Загружает conf.json
# Затем conf.local.json (переопределяет значения)
# Затем файл из AGENT_CONFIG_PATH
...
2. Фильтрация по ENV
Перед передачей в Pydantic удаляются значения, для которых есть ENV переменные:
# app/core/config_utils.py
def remove_env_overridden_values(config):
# Если есть DATABASE__URL в ENV
# Удаляем database.url из JSON
# Чтобы Pydantic прочитал DATABASE__URL
...
3. Применение через Pydantic
Pydantic BaseSettings читает конфигурацию:
# app/core/config.py
class Settings(BaseSettings):
database: DatabaseConfig
class Config:
env_nested_delimiter = "__" # Разделитель для вложенных полей
Результат: ENV переменная всегда побеждает значение из JSON!
Примеры использования
Пример 1: Разработка с локальной БД
conf.json:
{
"database": {
"url": "postgresql+asyncpg://agent_user:agent_password@localhost:5432/agent_platform"
}
}
Запуск: uv run python run.py
Результат: Используется localhost:5432 из JSON
Пример 2: Разработка с тестовой БД
Установка ENV:
Результат: Используется localhost:5433 из ENV (переопределяет JSON)
Пример 3: Docker
conf.json:
{
"database": {
"url": "postgresql+asyncpg://agent_user:agent_password@localhost:5432/agent_platform"
}
}
docker-compose.yml:
app:
environment:
- DATABASE__URL=postgresql+asyncpg://agent_user:agent_password@postgres:5432/agent_platform
Результат:
1. В контейнер копируется conf.json с localhost:5432
2. Устанавливается ENV DATABASE__URL с postgres:5432
3. Система обнаруживает ENV и игнорирует значение из JSON
4. Приложение подключается к postgres:5432 ✅
Пример 4: Переопределение API ключа
conf.json:
{
"llm": {
"openrouter": {
"api_key": "sk-or-v1-dev-key-..."
},
"default_model": "anthropic/claude-sonnet-4.5"
}
}
Продакшн:
export LLM__OPENROUTER__API_KEY="sk-or-v1-prod-key-..."
export LLM__DEFAULT_MODEL="anthropic/claude-opus-4"
Результат: В продакшне используется продакшн ключ и более мощная модель, в разработке - dev ключ и базовая модель
Проверка конфигурации
from app.core.config import settings
# Посмотреть текущие значения
print(f"Database URL: {settings.database.url}")
print(f"Server Port: {settings.server.port}")
print(f"LLM Default Model: {settings.llm.default_model}")
print(f"OpenRouter Enabled: {settings.llm.openrouter.enabled}")
Рекомендации
✅ Хорошие практики
- Храни чувствительные данные (пароли, API ключи) в ENV переменных
- Используй
conf.jsonдля базовых настроек - Используй
conf.local.jsonдля локальных экспериментов (добавь в.gitignore) - В Docker всегда переопределяй хосты через ENV
❌ Плохие практики
- Не коммить
conf.jsonс продакшн паролями - Не дублировать настройки в коде
- Не хардкодить пути к БД в коде
Отладка
Проверить какое значение используется
import os
from app.core.config import settings
# Проверить ENV
print(f"ENV DATABASE__URL: {os.getenv('DATABASE__URL')}")
print(f"ENV LLM__OPENROUTER__API_KEY: {os.getenv('LLM__OPENROUTER__API_KEY')}")
# Проверить итоговое значение
print(f"Settings database.url: {settings.database.url}")
print(f"Settings llm.default_model: {settings.llm.default_model}")
Логи загрузки конфигурации
При старте приложения ищи в логах:
INFO - Конфигурация загружена из /path/to/conf.json
DEBUG - Пропускаем database.url из JSON, используется env переменная DATABASE__URL
Миграция с старой системы
Если у тебя были переменные в другом формате:
Старый формат:
Новый формат:
Обрати внимание:
- Двойное подчеркивание __ вместо одинарного _
- Префикс postgresql+asyncpg для asyncpg драйвера
Секции конфигурации
LLM
Подробная документация: LLM →
Основные параметры:
- llm.openrouter.api_key - API ключ OpenRouter
- llm.openrouter.enabled - включить OpenRouter
- llm.default_model - модель по умолчанию
- llm.models.* - настройки отдельных моделей
Database
database.url- URL для asyncpg (async операции)database.checkpointer_url- URL для psycopg (checkpointer)
Server
server.env- окружение (local, production, staging)server.host- хост сервераserver.port- порт сервера (по умолчанию 8001)server.debug- режим отладки
Auth
auth.enabled- включить авторизациюauth.secret_key- секретный ключ для сессийauth.providers.*- провайдеры OAuth