MrHuman00 commited on
Commit
31ff61b
·
verified ·
1 Parent(s): e5344c6

Upload 17 files

Browse files
Files changed (1) hide show
  1. inference.py +66 -21
inference.py CHANGED
@@ -43,14 +43,39 @@ TASKS: List[Dict[str, object]] = [
43
  ]
44
 
45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  def _normalize_reward(value: object) -> float:
47
  try:
48
  reward = float(value)
49
  except (TypeError, ValueError):
50
- return 0.10
51
  if reward != reward:
52
- return 0.10
53
- return max(0.10, min(0.90, reward))
54
 
55
 
56
  def _normalize_error(error: Optional[str]) -> str:
@@ -60,22 +85,37 @@ def _normalize_error(error: Optional[str]) -> str:
60
 
61
 
62
  def log_start(task_id: str, env_name: str, model_name: str) -> None:
63
- print(f"[START] task={task_id} env={env_name} model={model_name}", flush=True)
64
 
65
 
66
  def log_step(step_num: int, action: str, reward: float, done: bool, error: Optional[str] = None) -> None:
67
- err = _normalize_error(error)
68
- print(
69
- f"[STEP] step={step_num} action={action} reward={_normalize_reward(reward):.2f} "
70
- f"done={str(done).lower()} error={err}",
71
- flush=True,
72
- )
73
 
74
 
75
  def log_end(success: bool, rewards: List[float]) -> None:
76
- safe_rewards = rewards if rewards else [0.10]
77
- rewards_str = ",".join(f"{_normalize_reward(r):.2f}" for r in safe_rewards)
78
- print(f"[END] success={str(success).lower()} steps={len(safe_rewards)} rewards={rewards_str}", flush=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
 
80
 
81
  async def run_task(
@@ -129,13 +169,13 @@ async def run_task(
129
  pass
130
  obs = env.step(RedTeamAction(action=action_str), episode_id=episode_id)
131
 
132
- reward = 0.10
133
  try:
134
  if getattr(obs, "reward", None) is not None:
135
  reward = float(obs.reward)
136
- reward = max(0.10, min(0.90, reward))
137
  except (TypeError, ValueError):
138
- reward = 0.10
139
 
140
  done = bool(getattr(obs, "done", False))
141
  current_state = str(getattr(obs, "current_state", ""))
@@ -161,19 +201,19 @@ async def run_task(
161
  except Exception as e:
162
  print(f"# task error: {e}", flush=True)
163
 
164
- log_end(task_success, task_rewards if task_rewards else [0.10])
165
  task_report = {
166
  "task_id": task_id,
167
  "episode_id": episode_id,
168
  "required_steps": required_steps if "required_steps" in locals() else [],
169
  "actions_taken": actions_taken,
170
  "states_seen": states_seen,
171
- "rewards": task_rewards if task_rewards else [0.10],
172
  "success": task_success,
173
  "ctf_solved": len(flags_found) > 0,
174
  "flags_found": flags_found,
175
  }
176
- return task_rewards if task_rewards else [0.10], global_step, task_success, task_report
177
 
178
 
179
  async def main() -> None:
@@ -197,7 +237,7 @@ async def main() -> None:
197
  fallback_task_id = TASK_TOKENS[task_idx]
198
  log_start(fallback_task_id, BENCHMARK, MODEL_NAME)
199
  print(f"# task wrapper error: {e}", flush=True)
200
- log_end(False, [0.10])
201
  report_tasks.append(
202
  {
203
  "task_id": fallback_task_id,
@@ -205,7 +245,7 @@ async def main() -> None:
205
  "required_steps": list(task_meta.get("required_steps", [])),
206
  "actions_taken": [],
207
  "states_seen": [],
208
- "rewards": [0.10],
209
  "success": False,
210
  "ctf_solved": False,
211
  "flags_found": [],
@@ -226,9 +266,14 @@ async def main() -> None:
226
  },
227
  }
228
 
 
 
 
229
  with open("pentest_report.json", "w", encoding="utf-8") as f:
230
  json.dump(summary, f, indent=2)
231
 
 
 
232
 
233
  if __name__ == "__main__":
234
  asyncio.run(main())
 
43
  ]
44
 
45
 
46
+ SCORE_FLOOR = 0.10
47
+ SCORE_CEIL = 0.90
48
+
49
+
50
+ def _strict_clamp(value: float) -> float:
51
+ """Clamp a value STRICTLY inside (0, 1) exclusive. Always returns float."""
52
+ try:
53
+ s = float(value)
54
+ except (TypeError, ValueError):
55
+ return SCORE_FLOOR
56
+ if s != s: # NaN
57
+ return SCORE_FLOOR
58
+ if s == float("inf"):
59
+ return SCORE_CEIL
60
+ if s == float("-inf"):
61
+ return SCORE_FLOOR
62
+ s = max(SCORE_FLOOR, min(SCORE_CEIL, s))
63
+ s = round(s, 4)
64
+ if s <= 0:
65
+ return SCORE_FLOOR
66
+ if s >= 1:
67
+ return SCORE_CEIL
68
+ return s
69
+
70
+
71
  def _normalize_reward(value: object) -> float:
72
  try:
73
  reward = float(value)
74
  except (TypeError, ValueError):
75
+ return SCORE_FLOOR
76
  if reward != reward:
77
+ return SCORE_FLOOR
78
+ return _strict_clamp(reward)
79
 
80
 
81
  def _normalize_error(error: Optional[str]) -> str:
 
85
 
86
 
87
  def log_start(task_id: str, env_name: str, model_name: str) -> None:
88
+ return None
89
 
90
 
91
  def log_step(step_num: int, action: str, reward: float, done: bool, error: Optional[str] = None) -> None:
92
+ return None
 
 
 
 
 
93
 
94
 
95
  def log_end(success: bool, rewards: List[float]) -> None:
96
+ return None
97
+
98
+
99
+ def compute_final_score(report_tasks: List[Dict[str, object]]) -> float:
100
+ task_count = len(report_tasks)
101
+ if task_count == 0:
102
+ return SCORE_FLOOR
103
+
104
+ success_rate = sum(1 for task in report_tasks if task.get("success") is True) / task_count
105
+ all_rewards = [float(reward) for task in report_tasks for reward in task.get("rewards", [])]
106
+ average_reward = sum(all_rewards) / len(all_rewards) if all_rewards else SCORE_FLOOR
107
+
108
+ normalized_reward = 0
109
+ if SCORE_CEIL > SCORE_FLOOR:
110
+ normalized_reward = (average_reward - SCORE_FLOOR) / (SCORE_CEIL - SCORE_FLOOR)
111
+
112
+ if normalized_reward < 0:
113
+ normalized_reward = 0
114
+ elif normalized_reward > 1:
115
+ normalized_reward = 1
116
+
117
+ raw_score = (0.7 * success_rate) + (0.3 * normalized_reward)
118
+ return _strict_clamp(SCORE_FLOOR + (SCORE_CEIL - SCORE_FLOOR) * raw_score)
119
 
120
 
121
  async def run_task(
 
169
  pass
170
  obs = env.step(RedTeamAction(action=action_str), episode_id=episode_id)
171
 
172
+ reward = SCORE_FLOOR
173
  try:
174
  if getattr(obs, "reward", None) is not None:
175
  reward = float(obs.reward)
176
+ reward = _strict_clamp(reward)
177
  except (TypeError, ValueError):
178
+ reward = SCORE_FLOOR
179
 
180
  done = bool(getattr(obs, "done", False))
181
  current_state = str(getattr(obs, "current_state", ""))
 
201
  except Exception as e:
202
  print(f"# task error: {e}", flush=True)
203
 
204
+ log_end(task_success, task_rewards if task_rewards else [SCORE_FLOOR])
205
  task_report = {
206
  "task_id": task_id,
207
  "episode_id": episode_id,
208
  "required_steps": required_steps if "required_steps" in locals() else [],
209
  "actions_taken": actions_taken,
210
  "states_seen": states_seen,
211
+ "rewards": task_rewards if task_rewards else [SCORE_FLOOR],
212
  "success": task_success,
213
  "ctf_solved": len(flags_found) > 0,
214
  "flags_found": flags_found,
215
  }
216
+ return task_rewards if task_rewards else [SCORE_FLOOR], global_step, task_success, task_report
217
 
218
 
219
  async def main() -> None:
 
237
  fallback_task_id = TASK_TOKENS[task_idx]
238
  log_start(fallback_task_id, BENCHMARK, MODEL_NAME)
239
  print(f"# task wrapper error: {e}", flush=True)
240
+ log_end(False, [SCORE_FLOOR])
241
  report_tasks.append(
242
  {
243
  "task_id": fallback_task_id,
 
245
  "required_steps": list(task_meta.get("required_steps", [])),
246
  "actions_taken": [],
247
  "states_seen": [],
248
+ "rewards": [SCORE_FLOOR],
249
  "success": False,
250
  "ctf_solved": False,
251
  "flags_found": [],
 
266
  },
267
  }
268
 
269
+ final_score = compute_final_score(report_tasks)
270
+ summary["overall"]["final_score"] = final_score
271
+
272
  with open("pentest_report.json", "w", encoding="utf-8") as f:
273
  json.dump(summary, f, indent=2)
274
 
275
+ print(f"{final_score:.4f}")
276
+
277
 
278
  if __name__ == "__main__":
279
  asyncio.run(main())