Spaces:
Sleeping
Sleeping
fix
Browse files- 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(),
|