-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.py
More file actions
113 lines (82 loc) · 2.66 KB
/
Copy pathserver.py
File metadata and controls
113 lines (82 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import threading
from env import CodeDebugEnv
from tasks import Action
app = FastAPI()
# ---------------- GLOBAL STATE ----------------
env = CodeDebugEnv(difficulty="easy", task="easy_001")
results_store = {
"status": "running",
"stdout": "",
"stderr": "",
"exit_code": None
}
# ---------------- BACKGROUND INFERENCE ----------------
def run_inference():
global results_store
try:
result = env.run_inference()
results_store["status"] = "completed"
results_store["stdout"] = result.stdout
results_store["stderr"] = result.stderr
results_store["exit_code"] = result.returncode
except Exception as e:
results_store["status"] = "error"
results_store["error"] = str(e)
# ---------------- ROOT ----------------
@app.get("/")
def root():
return {
"env": "code-debug-env",
"version": "1.0.0",
"description": "AI Code Debugging OpenEnv",
"status": results_store.get("status", "running"),
"endpoints": ["/", "/health", "/results", "/reset", "/step", "/state"]
}
# ---------------- HEALTH ----------------
@app.get("/health")
def health():
return {"status": "ok"}
# ---------------- RESET ----------------
@app.post("/reset")
async def reset(request: Request):
global env
# Reinitialize environment
env = CodeDebugEnv(difficulty="easy", task="easy_001")
obs = env.reset()
# Return RAW JSON (IMPORTANT)
return JSONResponse(content=obs.model_dump())
# ---------------- STEP ----------------
@app.post("/step")
async def step(action: dict):
try:
# Convert dict → object with attribute (required by env)
class ActionObj:
def __init__(self, fixed_code):
self.fixed_code = fixed_code
action_obj = ActionObj(action.get("fixed_code"))
result = env.step(action_obj)
return JSONResponse(content=result.model_dump())
except Exception as e:
return JSONResponse(
content={"error": str(e)},
status_code=500
)
# ---------------- STATE ----------------
@app.get("/state")
def state():
return JSONResponse(content=env.state().model_dump())
# ---------------- RESULTS ----------------
@app.get("/results")
def results():
return results_store
# ---------------- MAIN ENTRYPOINT (CRITICAL) ----------------
def main():
import uvicorn
# Start background inference thread
thread = threading.Thread(target=run_inference, daemon=True)
thread.start()
uvicorn.run("server:app", host="0.0.0.0", port=7860)
if __name__ == "__main__":
main()