ar9avg commited on
Commit
55f54ec
Β·
1 Parent(s): 44ef33f
Files changed (1) hide show
  1. backend/api/openenv.py +33 -0
backend/api/openenv.py CHANGED
@@ -10,6 +10,9 @@ GET /env/info β†’ env metadata
10
 
11
  from __future__ import annotations
12
 
 
 
 
13
  from fastapi import APIRouter, HTTPException
14
  from pydantic import BaseModel
15
  from typing import Optional
@@ -20,6 +23,11 @@ from env.tasks import get_all_tasks
20
  router = APIRouter()
21
 
22
 
 
 
 
 
 
23
  # ─── Request Models ───────────────────────────────────────────────
24
 
25
  class ResetRequest(BaseModel):
@@ -42,6 +50,12 @@ async def env_reset(req: ResetRequest):
42
  obs = env.reset_with_question(req.task_id, req.question_id)
43
  else:
44
  obs = env.reset(req.task_id)
 
 
 
 
 
 
45
  return obs
46
 
47
 
@@ -55,6 +69,25 @@ async def env_step(req: StepRequest):
55
  custom_sql=req.custom_sql,
56
  )
57
  obs, reward = await env.step(action)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  return {
59
  "observation": obs.model_dump(),
60
  "reward": reward.model_dump(),
 
10
 
11
  from __future__ import annotations
12
 
13
+ import json
14
+ import sys
15
+
16
  from fastapi import APIRouter, HTTPException
17
  from pydantic import BaseModel
18
  from typing import Optional
 
23
  router = APIRouter()
24
 
25
 
26
+ def _log(tag: str, payload: dict) -> None:
27
+ """Emit a single structured log line to stdout: [TAG] <json>"""
28
+ print(f"[{tag}] {json.dumps(payload)}", flush=True)
29
+
30
+
31
  # ─── Request Models ───────────────────────────────────────────────
32
 
33
  class ResetRequest(BaseModel):
 
50
  obs = env.reset_with_question(req.task_id, req.question_id)
51
  else:
52
  obs = env.reset(req.task_id)
53
+ _log("START", {
54
+ "task_id": obs.task_id,
55
+ "task_difficulty": obs.task_difficulty,
56
+ "question": obs.question,
57
+ "max_attempts": obs.max_attempts,
58
+ })
59
  return obs
60
 
61
 
 
69
  custom_sql=req.custom_sql,
70
  )
71
  obs, reward = await env.step(action)
72
+ _log("STEP", {
73
+ "attempt": obs.attempt_number,
74
+ "action": req.repair_action,
75
+ "sql": obs.current_sql or "",
76
+ "error": obs.error_message,
77
+ "error_class": obs.error_class,
78
+ "reward": round(reward.value, 4),
79
+ "success": reward.success,
80
+ "done": reward.done,
81
+ })
82
+ if reward.done:
83
+ ep = env._episode
84
+ _log("END", {
85
+ "success": reward.success,
86
+ "attempts": obs.attempt_number,
87
+ "total_reward": round(
88
+ sum(s.reward for s in ep.steps) if ep and ep.steps else reward.value, 4
89
+ ),
90
+ })
91
  return {
92
  "observation": obs.model_dump(),
93
  "reward": reward.model_dump(),