feat: implement version 2 AI Red-Teaming framework with updated reports, server logic, and environment configuration
هذا الالتزام موجود في:
@@ -80,21 +80,18 @@ def parse_v1_markdown():
|
||||
|
||||
|
||||
|
||||
def get_domain1_stats(evaluated: list) -> dict:
|
||||
def get_domain1_stats(v2_evaluated: list, v1_evaluated: list) -> dict:
|
||||
"""Extract stats from Domain 1 (AI Red-Teaming) evaluated results, combining V1 + V2."""
|
||||
if not evaluated:
|
||||
return {"available": False}
|
||||
|
||||
v2_total = len(evaluated)
|
||||
v2_succeeded = sum(1 for r in evaluated if r.get("attack_success"))
|
||||
v2_defended = sum(1 for r in evaluated if not r.get("attack_success") and r.get("evaluation") != "SKIPPED")
|
||||
v2_skipped = sum(1 for r in evaluated if r.get("evaluation") == "SKIPPED")
|
||||
|
||||
# V1 Hardcoded stats (46 tests) from reports/redteam_report.md
|
||||
v1_total = 46
|
||||
v1_succeeded = 1
|
||||
v1_defended = 45
|
||||
v1_skipped = 0
|
||||
v2_total = len(v2_evaluated)
|
||||
v2_succeeded = sum(1 for r in v2_evaluated if r.get("attack_success"))
|
||||
v2_defended = sum(1 for r in v2_evaluated if r.get("evaluation") in ["DEFENDED", "LIKELY_DEFENDED"])
|
||||
v2_skipped = sum(1 for r in v2_evaluated if r.get("evaluation") == "SKIPPED")
|
||||
|
||||
v1_total = len(v1_evaluated)
|
||||
v1_succeeded = sum(1 for r in v1_evaluated if r.get("attack_success"))
|
||||
v1_defended = sum(1 for r in v1_evaluated if "DEFENDED" in r.get("evaluation", ""))
|
||||
v1_skipped = sum(1 for r in v1_evaluated if r.get("evaluation") == "SKIPPED")
|
||||
|
||||
total = v1_total + v2_total
|
||||
succeeded = v1_succeeded + v2_succeeded
|
||||
@@ -104,9 +101,10 @@ def get_domain1_stats(evaluated: list) -> dict:
|
||||
asr = round(succeeded / max(total, 1) * 100, 1)
|
||||
|
||||
return {
|
||||
"available": True,
|
||||
"available": True if total > 0 else False,
|
||||
"total": total,
|
||||
"v2_results": evaluated,
|
||||
"v2_results": v2_evaluated,
|
||||
"results": v1_evaluated,
|
||||
"succeeded": succeeded,
|
||||
"defended": defended,
|
||||
"skipped": skipped,
|
||||
@@ -149,9 +147,10 @@ def generate_dashboard():
|
||||
|
||||
# Load all data
|
||||
d1_evaluated = load_json(DOMAIN_1_EVALUATED) or []
|
||||
v1_tests = parse_v1_markdown()
|
||||
d2_results = load_json(DOMAIN_2_RESULTS) or []
|
||||
|
||||
d1 = get_domain1_stats(d1_evaluated)
|
||||
d1 = get_domain1_stats(d1_evaluated, v1_tests)
|
||||
d2 = get_domain2_stats(d2_results)
|
||||
|
||||
# Calculate totals
|
||||
@@ -482,11 +481,6 @@ def generate_dashboard():
|
||||
# Let's clean them up to be safe (remove 'available' which is fine, but just standard json.dumps)
|
||||
|
||||
# Ensure we don't have Path objects inside by just taking what we loaded
|
||||
# Inject the V1 parsed tests so the HTML dashboard can render the 46 tests!
|
||||
v1_tests = parse_v1_markdown()
|
||||
if "results" not in d1:
|
||||
d1["results"] = []
|
||||
d1["results"].extend(v1_tests)
|
||||
|
||||
inject_data = {
|
||||
"d1": d1,
|
||||
|
||||
المرجع في مشكلة جديدة
حظر مستخدم