{# Конфиг 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). Роутинг — декларативно через governance.routing_rules (требует включённого config_store). tududi ходит на drop-in эндпоинт /openai и шлёт ЗАХАРДКОЖЕННОЕ имя модели gpt-4o-mini «голым». Правило ловит его по cel и подменяет на реальную модель deepseek/deepseek-v4-pro. Фолбэка нет — единственный провайдер. Чтобы сменить бэкенд-модель, правим ТОЛЬКО этот файл, конфиг tududi не трогаем. Эти 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": [ { "id": "tududi-gpt4omini-to-deepseek-pro", "name": "Tududi gpt-4o-mini -> DeepSeek v4 Pro", "enabled": true, "cel_expression": "model == 'gpt-4o-mini'", "targets": [ { "provider": "deepseek", "model": "deepseek-v4-pro", "weight": 1 } ], "scope": "global", "priority": 0 } ] } }