Tarun Claude Sonnet 4.6 commited on
Commit ·
de8d74a
1
Parent(s): 6efd27d
Run all 3 tasks in inference.py for task validation check
Browse filesValidator enumerates tasks and needs to see easy/medium/hard each
emit [START]...[END] logs with graded scores. Extracted run_episode()
helper and loop through all three tasks when SUPPORT_ENV_TASK is not
set to a specific single task.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- inference.py +32 -20
inference.py
CHANGED
|
@@ -197,17 +197,10 @@ async def get_action(state: dict, client: AsyncOpenAI, user_prompt: str) -> Supp
|
|
| 197 |
# with a visible error, preventing silent fallback-only episodes.
|
| 198 |
return SupportAction(**data)
|
| 199 |
|
| 200 |
-
async def
|
| 201 |
-
|
| 202 |
-
raise RuntimeError("[FATAL] API_BASE_URL is not set. The LLM proxy URL must be provided via environment variable.")
|
| 203 |
-
if not API_KEY:
|
| 204 |
-
raise RuntimeError("[FATAL] HF_TOKEN (or API_KEY) is not set. A valid API key must be provided via environment variable.")
|
| 205 |
-
|
| 206 |
-
print(f"[INFO] Using API_BASE_URL={API_BASE_URL} MODEL_NAME={MODEL_NAME}", flush=True)
|
| 207 |
-
client = AsyncOpenAI(base_url=API_BASE_URL, api_key=API_KEY)
|
| 208 |
-
|
| 209 |
env = await SupportEnvWrapper.from_docker_image(IMAGE_NAME)
|
| 210 |
-
env.env.task_name =
|
| 211 |
|
| 212 |
history: List[str] = []
|
| 213 |
rewards: List[float] = []
|
|
@@ -215,12 +208,12 @@ async def main() -> None:
|
|
| 215 |
score = 0.0
|
| 216 |
success = False
|
| 217 |
|
| 218 |
-
log_start(task=
|
| 219 |
|
| 220 |
try:
|
| 221 |
result = await env.reset()
|
| 222 |
obs = result.observation
|
| 223 |
-
|
| 224 |
for step in range(1, MAX_STEPS + 1):
|
| 225 |
if result.done:
|
| 226 |
break
|
|
@@ -228,38 +221,57 @@ async def main() -> None:
|
|
| 228 |
user_prompt = build_user_prompt(step, obs, history)
|
| 229 |
state_dict = {
|
| 230 |
"message": obs.message,
|
| 231 |
-
"sentiment": obs.sentiment
|
| 232 |
}
|
| 233 |
action = await get_action(state_dict, client, user_prompt)
|
| 234 |
action_str = json.dumps(action.model_dump())
|
| 235 |
|
| 236 |
-
# environment step
|
| 237 |
result = await env.step(action)
|
| 238 |
obs = result.observation
|
| 239 |
reward = result.reward or 0.0
|
| 240 |
done = result.done
|
| 241 |
-
error = None
|
| 242 |
|
| 243 |
rewards.append(reward)
|
| 244 |
steps_taken = step
|
| 245 |
|
| 246 |
-
log_step(step=step, action=action_str, reward=reward, done=done, error=
|
| 247 |
history.append(f"Step {step}: {action_str} -> reward {reward:+.2f}")
|
| 248 |
|
| 249 |
if done:
|
| 250 |
break
|
| 251 |
|
| 252 |
-
score = sum(rewards) / float(len(rewards)) if rewards else 0.0
|
| 253 |
-
score = min(max(score, 0.
|
| 254 |
success = score >= SUCCESS_SCORE_THRESHOLD
|
| 255 |
|
| 256 |
finally:
|
| 257 |
try:
|
| 258 |
await env.close()
|
| 259 |
-
except Exception as
|
| 260 |
-
print(f"[DEBUG] env.close() error: {
|
| 261 |
log_end(success=success, steps=steps_taken, score=score, rewards=rewards)
|
| 262 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 263 |
if __name__ == "__main__":
|
| 264 |
asyncio.run(main())
|
| 265 |
|
|
|
|
| 197 |
# with a visible error, preventing silent fallback-only episodes.
|
| 198 |
return SupportAction(**data)
|
| 199 |
|
| 200 |
+
async def run_episode(task_name: str, client: AsyncOpenAI) -> None:
|
| 201 |
+
"""Run one full episode for the given task and emit START/STEP/END logs."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 202 |
env = await SupportEnvWrapper.from_docker_image(IMAGE_NAME)
|
| 203 |
+
env.env.task_name = task_name
|
| 204 |
|
| 205 |
history: List[str] = []
|
| 206 |
rewards: List[float] = []
|
|
|
|
| 208 |
score = 0.0
|
| 209 |
success = False
|
| 210 |
|
| 211 |
+
log_start(task=task_name, env=BENCHMARK, model=MODEL_NAME)
|
| 212 |
|
| 213 |
try:
|
| 214 |
result = await env.reset()
|
| 215 |
obs = result.observation
|
| 216 |
+
|
| 217 |
for step in range(1, MAX_STEPS + 1):
|
| 218 |
if result.done:
|
| 219 |
break
|
|
|
|
| 221 |
user_prompt = build_user_prompt(step, obs, history)
|
| 222 |
state_dict = {
|
| 223 |
"message": obs.message,
|
| 224 |
+
"sentiment": obs.sentiment,
|
| 225 |
}
|
| 226 |
action = await get_action(state_dict, client, user_prompt)
|
| 227 |
action_str = json.dumps(action.model_dump())
|
| 228 |
|
|
|
|
| 229 |
result = await env.step(action)
|
| 230 |
obs = result.observation
|
| 231 |
reward = result.reward or 0.0
|
| 232 |
done = result.done
|
|
|
|
| 233 |
|
| 234 |
rewards.append(reward)
|
| 235 |
steps_taken = step
|
| 236 |
|
| 237 |
+
log_step(step=step, action=action_str, reward=reward, done=done, error=None)
|
| 238 |
history.append(f"Step {step}: {action_str} -> reward {reward:+.2f}")
|
| 239 |
|
| 240 |
if done:
|
| 241 |
break
|
| 242 |
|
| 243 |
+
score = sum(rewards) / float(len(rewards)) if rewards else 0.0
|
| 244 |
+
score = min(max(score, 0.002), 0.998)
|
| 245 |
success = score >= SUCCESS_SCORE_THRESHOLD
|
| 246 |
|
| 247 |
finally:
|
| 248 |
try:
|
| 249 |
await env.close()
|
| 250 |
+
except Exception as exc:
|
| 251 |
+
print(f"[DEBUG] env.close() error: {exc}", flush=True)
|
| 252 |
log_end(success=success, steps=steps_taken, score=score, rewards=rewards)
|
| 253 |
|
| 254 |
+
|
| 255 |
+
async def main() -> None:
|
| 256 |
+
if not API_BASE_URL:
|
| 257 |
+
raise RuntimeError("[FATAL] API_BASE_URL is not set. The LLM proxy URL must be provided via environment variable.")
|
| 258 |
+
if not API_KEY:
|
| 259 |
+
raise RuntimeError("[FATAL] HF_TOKEN (or API_KEY) is not set. A valid API key must be provided via environment variable.")
|
| 260 |
+
|
| 261 |
+
print(f"[INFO] Using API_BASE_URL={API_BASE_URL} MODEL_NAME={MODEL_NAME}", flush=True)
|
| 262 |
+
client = AsyncOpenAI(base_url=API_BASE_URL, api_key=API_KEY)
|
| 263 |
+
|
| 264 |
+
# If a specific task is requested run only that one, otherwise run all three
|
| 265 |
+
# so the validator can enumerate tasks and verify each grader.
|
| 266 |
+
if TASK_NAME in ("easy", "medium", "hard"):
|
| 267 |
+
tasks_to_run = [TASK_NAME]
|
| 268 |
+
else:
|
| 269 |
+
tasks_to_run = ["easy", "medium", "hard"]
|
| 270 |
+
|
| 271 |
+
for task in tasks_to_run:
|
| 272 |
+
await run_episode(task, client)
|
| 273 |
+
|
| 274 |
+
|
| 275 |
if __name__ == "__main__":
|
| 276 |
asyncio.run(main())
|
| 277 |
|