{# Конфиг Bifrost — ИСТОЧНИК ПРАВДЫ. Рендерится в config_dir/config.json (app-dir Bifrost смонтирован на /app/data), Bifrost читает его при старте. source_of_truth=config.json: на каждом старте секции этого файла авторитетно перезаписывают состояние в config.db (git выигрывает у правок через UI). Раскладка каталогов (по требованию «конфиги/данные раздельно»): - config_dir -> /app/data : сам config.json (app-dir Bifrost по умолчанию); - data_dir -> /app/store : config.db + logs.db (пути заданы явно ниже). Несекретные настройки (base URL провайдера, имя модели) заданы здесь прямо строками — они больше нигде не переиспользуются. Секреты (ключ DeepSeek, encryption_key) рендерятся строками из vars/secrets.yml, поэтому готовый config.json — секретный файл (плейбук пишет его на 0600). DeepSeek с v1.6.3 — НАТИВНЫЙ провайдер Bifrost (dedicated request handling, thinking-mode gating, корректные reasoning-поля для v4-моделей — issue #3139): не нужны ни custom_provider_config, ни base_url (дефолт api.deepseek.com). Роутинг правилами больше не нужен: клиенты шлют имя модели с префиксом провайдера (tududi — deepseek/deepseek-v4-pro на drop-in эндпоинт /openai), Bifrost резолвит провайдера сам. Раньше здесь жило правило, подменявшее захардкоженное у tududi gpt-4o-mini; с tududi 1.3.1 модель задаётся переменной. routing_rules оставлен ПУСТЫМ МАССИВОМ, а не удалён: при source_of_truth=config.json авторитетно перезаписываются только присутствующие секции, а отсутствующие оставляют строки в config.db нетронутыми — удали ключ, и старое правило продолжило бы жить в БД (config.go, isGovernanceSectionPresent). Эти Jinja-комментарии в готовый config.json не попадают (на выходе чистый JSON). #} { "$schema": "https://www.getbifrost.ai/schema", "encryption_key": {{ bifrost_encryption_key | to_json }}, "source_of_truth": "config.json", "client": { "enable_logging": true }, "providers": { "deepseek": { "keys": [ { "name": "deepseek-primary", "value": {{ bifrost_deepseek_api_key | to_json }}, "models": ["*"], "weight": 1.0 } ], "network_config": { "max_retries": 2 } } }, "config_store": { "enabled": true, "type": "sqlite", "config": { "path": "/app/store/config.db" } }, "logs_store": { "enabled": true, "type": "sqlite", "config": { "path": "/app/store/logs.db" } }, "governance": { "routing_rules": [] } }