Spaces:
Sleeping
Sleeping
Upload folder using huggingface_hub
Browse files- inference.py +20 -8
- server/task_bank.py +11 -4
inference.py
CHANGED
|
@@ -27,12 +27,18 @@ ENV_BASE_URL = os.getenv("ENV_BASE_URL", "http://localhost:8000")
|
|
| 27 |
BENCHMARK = os.getenv("BENCHMARK", "coding_env")
|
| 28 |
MAX_STEPS = int(os.getenv("MAX_STEPS", "1"))
|
| 29 |
SUCCESS_SCORE_THRESHOLD = float(os.getenv("SUCCESS_SCORE_THRESHOLD", "0.60"))
|
|
|
|
|
|
|
| 30 |
|
| 31 |
|
| 32 |
def _bool_text(value: bool) -> str:
|
| 33 |
return "true" if value else "false"
|
| 34 |
|
| 35 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
def log_start(task: str, env: str, model: str) -> None:
|
| 37 |
print(f"[START] task={task} env={env} model={model}", flush=True)
|
| 38 |
|
|
@@ -129,7 +135,7 @@ line_number (integer), confidence (0.0-1.0 float)
|
|
| 129 |
def run_task(task_id: str, client: OpenAI | None) -> float:
|
| 130 |
episode_id = f"baseline-{task_id}"
|
| 131 |
rewards: List[float] = []
|
| 132 |
-
score =
|
| 133 |
success = False
|
| 134 |
last_error: str | None = None
|
| 135 |
steps_taken = 0
|
|
@@ -163,7 +169,7 @@ def run_task(task_id: str, client: OpenAI | None) -> float:
|
|
| 163 |
"episode_id": episode_id,
|
| 164 |
},
|
| 165 |
)
|
| 166 |
-
reward = float(step_data.get("reward",
|
| 167 |
done = bool(step_data.get("done", not bool(step_data)))
|
| 168 |
obs_after = step_data.get("observation", {}) if isinstance(step_data, dict) else {}
|
| 169 |
raw_error = obs_after.get("last_action_error")
|
|
@@ -179,17 +185,23 @@ def run_task(task_id: str, client: OpenAI | None) -> float:
|
|
| 179 |
grader_data = _safe_json(
|
| 180 |
"GET", f"{ENV_BASE_URL}/grader?task_id={task_id}&episode_id={episode_id}"
|
| 181 |
)
|
| 182 |
-
grader_score = float(grader_data.get("score",
|
| 183 |
-
step_score = rewards[-1] if rewards else
|
| 184 |
-
score = max(grader_score, step_score)
|
| 185 |
success = score >= SUCCESS_SCORE_THRESHOLD
|
| 186 |
except Exception as exc:
|
| 187 |
last_error = str(exc)
|
| 188 |
if steps_taken == 0:
|
| 189 |
-
log_step(
|
| 190 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 191 |
steps_taken = 1
|
| 192 |
-
score =
|
| 193 |
success = False
|
| 194 |
finally:
|
| 195 |
log_end(success, max(1, steps_taken), score, rewards or [0.0])
|
|
|
|
| 27 |
BENCHMARK = os.getenv("BENCHMARK", "coding_env")
|
| 28 |
MAX_STEPS = int(os.getenv("MAX_STEPS", "1"))
|
| 29 |
SUCCESS_SCORE_THRESHOLD = float(os.getenv("SUCCESS_SCORE_THRESHOLD", "0.60"))
|
| 30 |
+
MIN_STRICT_SCORE = 0.01
|
| 31 |
+
MAX_STRICT_SCORE = 0.99
|
| 32 |
|
| 33 |
|
| 34 |
def _bool_text(value: bool) -> str:
|
| 35 |
return "true" if value else "false"
|
| 36 |
|
| 37 |
|
| 38 |
+
def _strict_score(value: float) -> float:
|
| 39 |
+
return max(MIN_STRICT_SCORE, min(MAX_STRICT_SCORE, round(float(value), 4)))
|
| 40 |
+
|
| 41 |
+
|
| 42 |
def log_start(task: str, env: str, model: str) -> None:
|
| 43 |
print(f"[START] task={task} env={env} model={model}", flush=True)
|
| 44 |
|
|
|
|
| 135 |
def run_task(task_id: str, client: OpenAI | None) -> float:
|
| 136 |
episode_id = f"baseline-{task_id}"
|
| 137 |
rewards: List[float] = []
|
| 138 |
+
score = MIN_STRICT_SCORE
|
| 139 |
success = False
|
| 140 |
last_error: str | None = None
|
| 141 |
steps_taken = 0
|
|
|
|
| 169 |
"episode_id": episode_id,
|
| 170 |
},
|
| 171 |
)
|
| 172 |
+
reward = _strict_score(float(step_data.get("reward", MIN_STRICT_SCORE) or MIN_STRICT_SCORE))
|
| 173 |
done = bool(step_data.get("done", not bool(step_data)))
|
| 174 |
obs_after = step_data.get("observation", {}) if isinstance(step_data, dict) else {}
|
| 175 |
raw_error = obs_after.get("last_action_error")
|
|
|
|
| 185 |
grader_data = _safe_json(
|
| 186 |
"GET", f"{ENV_BASE_URL}/grader?task_id={task_id}&episode_id={episode_id}"
|
| 187 |
)
|
| 188 |
+
grader_score = _strict_score(float(grader_data.get("score", MIN_STRICT_SCORE) or MIN_STRICT_SCORE))
|
| 189 |
+
step_score = _strict_score(rewards[-1] if rewards else MIN_STRICT_SCORE)
|
| 190 |
+
score = _strict_score(max(grader_score, step_score))
|
| 191 |
success = score >= SUCCESS_SCORE_THRESHOLD
|
| 192 |
except Exception as exc:
|
| 193 |
last_error = str(exc)
|
| 194 |
if steps_taken == 0:
|
| 195 |
+
log_step(
|
| 196 |
+
1,
|
| 197 |
+
"bug_type=none;line=-1;confidence=0.00",
|
| 198 |
+
MIN_STRICT_SCORE,
|
| 199 |
+
True,
|
| 200 |
+
last_error,
|
| 201 |
+
)
|
| 202 |
+
rewards.append(MIN_STRICT_SCORE)
|
| 203 |
steps_taken = 1
|
| 204 |
+
score = MIN_STRICT_SCORE
|
| 205 |
success = False
|
| 206 |
finally:
|
| 207 |
log_end(success, max(1, steps_taken), score, rewards or [0.0])
|
server/task_bank.py
CHANGED
|
@@ -88,6 +88,8 @@ TASKS: Dict[str, CodeReviewTask] = {
|
|
| 88 |
|
| 89 |
EPISODE_SCORES: Dict[tuple[str, str], float] = {}
|
| 90 |
SCORE_FILE = os.getenv("CODING_ENV_SCORE_FILE", "/tmp/coding_env_episode_scores.json")
|
|
|
|
|
|
|
| 91 |
|
| 92 |
|
| 93 |
def list_tasks() -> List[Dict[str, str]]:
|
|
@@ -146,13 +148,13 @@ def grade_action(action: CodeAction, task: CodeReviewTask) -> tuple[float, str]:
|
|
| 146 |
else:
|
| 147 |
parts.append("review lacks key evidence (+0.00)")
|
| 148 |
|
| 149 |
-
score =
|
| 150 |
return score, "; ".join(parts)
|
| 151 |
|
| 152 |
|
| 153 |
def record_episode_score(task_id: str, episode_id: str, score: float) -> None:
|
| 154 |
"""Persist normalized score for grader endpoint."""
|
| 155 |
-
normalized =
|
| 156 |
EPISODE_SCORES[(task_id, episode_id)] = normalized
|
| 157 |
_persist_score(task_id, episode_id, normalized)
|
| 158 |
|
|
@@ -194,6 +196,11 @@ def _load_persisted_score(task_id: str, episode_id: str) -> float:
|
|
| 194 |
loaded = json.load(f)
|
| 195 |
key = f"{task_id}::{episode_id}"
|
| 196 |
value = loaded.get(key, 0.0) if isinstance(loaded, dict) else 0.0
|
| 197 |
-
return
|
| 198 |
except Exception:
|
| 199 |
-
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 88 |
|
| 89 |
EPISODE_SCORES: Dict[tuple[str, str], float] = {}
|
| 90 |
SCORE_FILE = os.getenv("CODING_ENV_SCORE_FILE", "/tmp/coding_env_episode_scores.json")
|
| 91 |
+
MIN_STRICT_SCORE = 0.01
|
| 92 |
+
MAX_STRICT_SCORE = 0.99
|
| 93 |
|
| 94 |
|
| 95 |
def list_tasks() -> List[Dict[str, str]]:
|
|
|
|
| 148 |
else:
|
| 149 |
parts.append("review lacks key evidence (+0.00)")
|
| 150 |
|
| 151 |
+
score = _to_strict_open_score(score)
|
| 152 |
return score, "; ".join(parts)
|
| 153 |
|
| 154 |
|
| 155 |
def record_episode_score(task_id: str, episode_id: str, score: float) -> None:
|
| 156 |
"""Persist normalized score for grader endpoint."""
|
| 157 |
+
normalized = _to_strict_open_score(score)
|
| 158 |
EPISODE_SCORES[(task_id, episode_id)] = normalized
|
| 159 |
_persist_score(task_id, episode_id, normalized)
|
| 160 |
|
|
|
|
| 196 |
loaded = json.load(f)
|
| 197 |
key = f"{task_id}::{episode_id}"
|
| 198 |
value = loaded.get(key, 0.0) if isinstance(loaded, dict) else 0.0
|
| 199 |
+
return _to_strict_open_score(value)
|
| 200 |
except Exception:
|
| 201 |
+
return MIN_STRICT_SCORE
|
| 202 |
+
|
| 203 |
+
|
| 204 |
+
def _to_strict_open_score(value: float) -> float:
|
| 205 |
+
"""Clamp to strict open interval (0, 1) as required by validator."""
|
| 206 |
+
return max(MIN_STRICT_SCORE, min(MAX_STRICT_SCORE, round(float(value), 4)))
|