feat(scenarios): 支持场景配置加载与首页展示

This commit is contained in:
2026-05-30 00:08:00 +08:00
parent 6291940734
commit 35b80929b0
13 changed files with 256 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
from pathlib import Path
import yaml
from django.conf import settings
REQUIRED_FIELDS = [
("id",),
("name",),
("description",),
("agent", "role"),
("agent", "goal"),
("agent", "instructions"),
("rag", "enabled"),
("tools",),
("output", "type"),
("audit", "enabled"),
]
class ScenarioNotFound(KeyError):
pass
class ScenarioValidationError(ValueError):
pass
def _get_nested(config: dict, path: tuple[str, ...]):
value = config
for key in path:
if not isinstance(value, dict) or key not in value:
raise ScenarioValidationError("缺失必填字段: " + ".".join(path))
value = value[key]
return value
def validate_scenario(config: dict) -> dict:
for field_path in REQUIRED_FIELDS:
_get_nested(config, field_path)
return config
def _scenario_files() -> list[Path]:
config_dir = Path(settings.SCENARIO_CONFIG_DIR)
if not config_dir.exists():
return []
return sorted([*config_dir.glob("*.yaml"), *config_dir.glob("*.yml")])
def list_scenarios() -> list[dict]:
scenarios = []
for path in _scenario_files():
with path.open("r", encoding="utf-8") as file:
config = yaml.safe_load(file) or {}
scenarios.append(validate_scenario(config))
return scenarios
def get_scenario(scenario_id: str) -> dict:
for scenario in list_scenarios():
if scenario["id"] == scenario_id:
return scenario
raise ScenarioNotFound(f"场景不存在: {scenario_id}")