feat: implement version 2 AI Red-Teaming framework with updated reports, server logic, and environment configuration

هذا الالتزام موجود في:
ZiadMahmoud2003
2026-08-28 02:07:18 +03:00
الأصل 63fe13f387
التزام 9b9457f279
12 ملفات معدلة مع 178 إضافات و176 حذوفات

عرض الملف

@@ -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,