umar-sharif821 commited on
Commit
d100658
·
1 Parent(s): f470f29

fix: reset accepts empty body

Browse files
Files changed (1) hide show
  1. api/main.py +27 -37
api/main.py CHANGED
@@ -7,24 +7,16 @@ import sys
7
  import os
8
  sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
9
 
10
- from fastapi import FastAPI, HTTPException
11
  from fastapi.middleware.cors import CORSMiddleware
12
  from pydantic import BaseModel
13
- from typing import Optional, Dict
14
  import uvicorn
15
 
16
  from env.cache import CDNCacheEnv, TASK_CONFIGS
17
  from env.models import Action, StepResult
18
 
19
- app = FastAPI(
20
- title="CDN Cache Optimizer - OpenEnv",
21
- description=(
22
- "RL environment simulating edge CDN cache management. "
23
- "Agent decides which files to evict when cache is full. "
24
- "Implements full OpenEnv spec."
25
- ),
26
- version="1.0.0",
27
- )
28
 
29
  app.add_middleware(
30
  CORSMiddleware,
@@ -33,23 +25,16 @@ app.add_middleware(
33
  allow_headers=["*"],
34
  )
35
 
36
- # Global env instance (stateful per session)
37
  _env: Optional[CDNCacheEnv] = None
38
 
39
 
40
- class ResetRequest(BaseModel):
41
- task_id: str = "task_easy"
42
- seed: int = 42
43
-
44
-
45
- class StepRequest(BaseModel):
46
- evict_file_id: Optional[str] = None
47
-
48
-
49
  @app.get("/health")
50
  def health():
51
  return {"status": "ok", "env": "cdn-cache-optimizer"}
52
 
 
 
 
53
 
54
  @app.get("/tasks")
55
  def list_tasks():
@@ -64,33 +49,40 @@ def list_tasks():
64
  for task_id, cfg in TASK_CONFIGS.items()
65
  }
66
 
67
-
68
  @app.post("/reset")
69
- def reset(req: ResetRequest):
70
  global _env
71
- if req.task_id not in TASK_CONFIGS:
72
- raise HTTPException(
73
- status_code=400,
74
- detail=f"Unknown task_id '{req.task_id}'. Valid: {list(TASK_CONFIGS.keys())}"
75
- )
76
- _env = CDNCacheEnv(task_id=req.task_id, seed=req.seed)
 
 
 
 
 
77
  obs = _env.reset()
78
  return {"observation": obs.dict(), "task": _env.config.dict()}
79
 
80
-
81
  @app.post("/step")
82
- def step(req: StepRequest):
83
  global _env
84
  if _env is None:
85
  raise HTTPException(status_code=400, detail="Call /reset first.")
86
  if _env._done:
87
  raise HTTPException(status_code=400, detail="Episode done. Call /reset.")
88
-
89
- action = Action(evict_file_id=req.evict_file_id)
 
 
 
 
 
90
  result: StepResult = _env.step(action)
91
  return result.dict()
92
 
93
-
94
  @app.get("/state")
95
  def state():
96
  global _env
@@ -98,7 +90,6 @@ def state():
98
  raise HTTPException(status_code=400, detail="Call /reset first.")
99
  return _env.state()
100
 
101
-
102
  @app.get("/")
103
  def root():
104
  return {
@@ -108,6 +99,5 @@ def root():
108
  "tasks": list(TASK_CONFIGS.keys()),
109
  }
110
 
111
-
112
  if __name__ == "__main__":
113
- uvicorn.run("api.main:app", host="0.0.0.0", port=7860, reload=False)
 
7
  import os
8
  sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
9
 
10
+ from fastapi import FastAPI, Request, HTTPException
11
  from fastapi.middleware.cors import CORSMiddleware
12
  from pydantic import BaseModel
13
+ from typing import Optional
14
  import uvicorn
15
 
16
  from env.cache import CDNCacheEnv, TASK_CONFIGS
17
  from env.models import Action, StepResult
18
 
19
+ app = FastAPI(title="CDN Cache Optimizer - OpenEnv", version="1.0.0")
 
 
 
 
 
 
 
 
20
 
21
  app.add_middleware(
22
  CORSMiddleware,
 
25
  allow_headers=["*"],
26
  )
27
 
 
28
  _env: Optional[CDNCacheEnv] = None
29
 
30
 
 
 
 
 
 
 
 
 
 
31
  @app.get("/health")
32
  def health():
33
  return {"status": "ok", "env": "cdn-cache-optimizer"}
34
 
35
+ @app.post("/health")
36
+ def health_post():
37
+ return {"status": "ok", "env": "cdn-cache-optimizer"}
38
 
39
  @app.get("/tasks")
40
  def list_tasks():
 
49
  for task_id, cfg in TASK_CONFIGS.items()
50
  }
51
 
 
52
  @app.post("/reset")
53
+ async def reset(request: Request):
54
  global _env
55
+ task_id = "task_easy"
56
+ seed = 42
57
+ try:
58
+ body = await request.json()
59
+ task_id = body.get("task_id", "task_easy")
60
+ seed = body.get("seed", 42)
61
+ except Exception:
62
+ pass
63
+ if task_id not in TASK_CONFIGS:
64
+ raise HTTPException(status_code=400, detail=f"Unknown task_id '{task_id}'.")
65
+ _env = CDNCacheEnv(task_id=task_id, seed=seed)
66
  obs = _env.reset()
67
  return {"observation": obs.dict(), "task": _env.config.dict()}
68
 
 
69
  @app.post("/step")
70
+ async def step(request: Request):
71
  global _env
72
  if _env is None:
73
  raise HTTPException(status_code=400, detail="Call /reset first.")
74
  if _env._done:
75
  raise HTTPException(status_code=400, detail="Episode done. Call /reset.")
76
+ evict_file_id = None
77
+ try:
78
+ body = await request.json()
79
+ evict_file_id = body.get("evict_file_id", None)
80
+ except Exception:
81
+ pass
82
+ action = Action(evict_file_id=evict_file_id)
83
  result: StepResult = _env.step(action)
84
  return result.dict()
85
 
 
86
  @app.get("/state")
87
  def state():
88
  global _env
 
90
  raise HTTPException(status_code=400, detail="Call /reset first.")
91
  return _env.state()
92
 
 
93
  @app.get("/")
94
  def root():
95
  return {
 
99
  "tasks": list(TASK_CONFIGS.keys()),
100
  }
101
 
 
102
  if __name__ == "__main__":
103
+ uvicorn.run("api.main:app", host="0.0.0.0", port=7860, reload=False)