Multi-agent discussion framework: - Custom/AutoGen/CrewAI backends - Multi-provider API (role→model binding) - Tools system (files, web, commands) - Markdown scenarios with YAML frontmatter - Workspace init (meeting-room init) - Session save (--save)
61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
"""Scenario loader — supports .md (frontmatter + markdown) and .yaml."""
|
|
|
|
import os
|
|
import re
|
|
import yaml
|
|
|
|
|
|
def load_scenario(path: str) -> dict:
|
|
with open(path, encoding="utf-8") as f:
|
|
content = f.read()
|
|
|
|
if path.endswith((".md", ".markdown")):
|
|
return _parse_markdown(content)
|
|
elif path.endswith((".yaml", ".yml")):
|
|
return yaml.safe_load(content)
|
|
else:
|
|
try:
|
|
return _parse_markdown(content)
|
|
except Exception:
|
|
return yaml.safe_load(content)
|
|
|
|
|
|
def _parse_markdown(content: str) -> dict:
|
|
match = re.match(r"^---\s*\n(.*?)\n---\s*\n(.*)", content, re.DOTALL)
|
|
if not match:
|
|
raise ValueError("No YAML frontmatter found. Expected --- at the top.")
|
|
|
|
meta = yaml.safe_load(match.group(1))
|
|
body = match.group(2).strip()
|
|
meta["problem"] = body
|
|
if "name" not in meta:
|
|
meta["name"] = "Без названия"
|
|
return meta
|
|
|
|
|
|
def list_scenarios(scenarios_dir: str) -> list[dict]:
|
|
results = []
|
|
if not os.path.isdir(scenarios_dir):
|
|
return results
|
|
|
|
for fname in sorted(os.listdir(scenarios_dir)):
|
|
if not fname.endswith((".md", ".markdown", ".yaml", ".yml")):
|
|
continue
|
|
path = os.path.join(scenarios_dir, fname)
|
|
try:
|
|
data = load_scenario(path)
|
|
results.append({
|
|
"file": fname,
|
|
"path": path,
|
|
"name": data.get("name", "Без названия"),
|
|
"participants": data.get("participants", []),
|
|
})
|
|
except Exception as e:
|
|
results.append({
|
|
"file": fname,
|
|
"path": path,
|
|
"name": f"[Ошибка: {e}]",
|
|
"participants": [],
|
|
})
|
|
return results
|