Spaces:
Runtime error
Runtime error
File size: 3,264 Bytes
290ff9e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | """Build data/ergo-knowledge-base.json from the raw datasource dumps.
Run: uv run python scripts/build_knowledge_base.py
"""
from __future__ import annotations
import json
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
PARAMS_FILE = ROOT / "docs" / "datasources" / "common-assessment-parameters.json"
ISSUES_FILE = ROOT / "docs" / "datasources" / "issue-based-outcomes.json"
OUT_FILE = ROOT / "data" / "ergo-knowledge-base.json"
def _none_if_empty(value):
if value is None:
return None
if isinstance(value, str) and value.strip() == "":
return None
return value
def main() -> None:
raw_params = json.loads(PARAMS_FILE.read_text())
raw_issues = json.loads(ISSUES_FILE.read_text())
issues_by_outcome = {row["outcome"]: row for row in raw_issues}
parameters = []
for p in raw_params:
options = []
for o in p["options"]:
key = o["option"]
risk_title = _none_if_empty(o.get("riskTitle"))
overall_risk = _none_if_empty(o.get("overallRisk"))
is_good_habit = risk_title is None and overall_risk is None
issue = issues_by_outcome.get(key)
if issue is None:
raise SystemExit(
f"Missing issue-based-outcomes entry for option key: {key}"
)
posture_score = issue["postureScore"]
# Parameter file is the authoritative visual rubric — if it says
# good habit, force risk_level to null. Otherwise take the issue
# file's risk_level.
if is_good_habit:
risk_level = None
else:
risk_level = _none_if_empty(issue.get("riskLevel"))
if risk_level is None:
raise SystemExit(
f"{key}: risky in parameter file but issue riskLevel is null"
)
options.append(
{
"key": key,
"label": o["optionText"],
"reference_image": o["optionImage"],
"is_good_habit": is_good_habit,
"risk_level": risk_level,
"posture_score": posture_score,
"risk_title": risk_title,
"overall_risk": overall_risk,
}
)
selection_mode = "multi" if p.get("has_multi_select") else "single"
parameters.append(
{
"id": p["id"],
"group": p["group"],
"order": p["order"],
"selection_mode": selection_mode,
"parameter_text": p["parameterText"],
"question_text": p["question_text"],
"options": options,
}
)
payload = {"version": "1.0", "parameters": parameters}
OUT_FILE.parent.mkdir(parents=True, exist_ok=True)
OUT_FILE.write_text(json.dumps(payload, indent=2) + "\n")
print(f"Wrote {OUT_FILE} ({len(parameters)} parameters, "
f"{sum(len(p['options']) for p in parameters)} options)")
if __name__ == "__main__":
main()
|