AG-gamer2 commited on
Commit
311cb46
·
verified ·
1 Parent(s): c8917f7

Upload 3 files

Browse files
Files changed (3) hide show
  1. Dockerfile +18 -0
  2. app.py +52 -0
  3. server_app.py +52 -0
Dockerfile ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.11-slim
2
+
3
+ WORKDIR /code
4
+
5
+ COPY ./requirements.txt /code/requirements.txt
6
+ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
7
+
8
+ COPY . /code/
9
+
10
+ ENV PYTHONPATH=/code
11
+
12
+ # Create server/ folder and copy server_app.py into it as app.py
13
+ RUN mkdir -p /code/server && cp /code/server_app.py /code/server/app.py
14
+
15
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
16
+ CMD python -c "from meta import DataCenterEnv; e=DataCenterEnv(); e.reset(); e.step(0); print('ok')"
17
+
18
+ CMD ["sh", "-c", "python inference.py && uvicorn server.app:app --host 0.0.0.0 --port 7860"]
app.py ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ app.py — OpenEnv-compatible FastAPI server for DataCenterEnv.
3
+ Exposes /reset, /step, /state endpoints as required by the OpenEnv spec.
4
+ """
5
+
6
+ from fastapi import FastAPI, HTTPException
7
+ from pydantic import BaseModel
8
+ from typing import Any, Dict
9
+ import uvicorn
10
+
11
+ from meta import DataCenterEnv, EnvState
12
+
13
+ app = FastAPI(title="DataCenter OpenEnv", version="1.0.0")
14
+
15
+ # Global environment instance
16
+ env = DataCenterEnv(seed=42)
17
+
18
+ class StepRequest(BaseModel):
19
+ action: int
20
+
21
+ @app.post("/reset")
22
+ def reset():
23
+ state = env.reset()
24
+ return {"state": state.model_dump()}
25
+
26
+ @app.post("/step")
27
+ def step(req: StepRequest):
28
+ if req.action not in (0, 1, 2, 3):
29
+ raise HTTPException(status_code=400, detail=f"Invalid action {req.action}. Must be 0-3.")
30
+ state, reward, done, info = env.step(req.action)
31
+ return {"state": state.model_dump(), "reward": reward, "done": done, "info": info}
32
+
33
+ @app.get("/state")
34
+ def state():
35
+ return {"state": env.state().model_dump()}
36
+
37
+ @app.get("/health")
38
+ def health():
39
+ return {"status": "ok"}
40
+
41
+ @app.get("/")
42
+ def root():
43
+ return {
44
+ "name": "DataCenter OpenEnv",
45
+ "version": "1.0.0",
46
+ "endpoints": ["/reset", "/step", "/state", "/health"],
47
+ "action_space": {"type": "Discrete", "n": 4},
48
+ "observation_space": {"type": "Box", "shape": [5]},
49
+ }
50
+
51
+ if __name__ == "__main__":
52
+ uvicorn.run(app, host="0.0.0.0", port=7860)
server_app.py ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ app.py — OpenEnv-compatible FastAPI server for DataCenterEnv.
3
+ Exposes /reset, /step, /state endpoints as required by the OpenEnv spec.
4
+ """
5
+
6
+ from fastapi import FastAPI, HTTPException
7
+ from pydantic import BaseModel
8
+ from typing import Any, Dict
9
+ import uvicorn
10
+
11
+ from meta import DataCenterEnv, EnvState
12
+
13
+ app = FastAPI(title="DataCenter OpenEnv", version="1.0.0")
14
+
15
+ # Global environment instance
16
+ env = DataCenterEnv(seed=42)
17
+
18
+ class StepRequest(BaseModel):
19
+ action: int
20
+
21
+ @app.post("/reset")
22
+ def reset():
23
+ state = env.reset()
24
+ return {"state": state.model_dump()}
25
+
26
+ @app.post("/step")
27
+ def step(req: StepRequest):
28
+ if req.action not in (0, 1, 2, 3):
29
+ raise HTTPException(status_code=400, detail=f"Invalid action {req.action}. Must be 0-3.")
30
+ state, reward, done, info = env.step(req.action)
31
+ return {"state": state.model_dump(), "reward": reward, "done": done, "info": info}
32
+
33
+ @app.get("/state")
34
+ def state():
35
+ return {"state": env.state().model_dump()}
36
+
37
+ @app.get("/health")
38
+ def health():
39
+ return {"status": "ok"}
40
+
41
+ @app.get("/")
42
+ def root():
43
+ return {
44
+ "name": "DataCenter OpenEnv",
45
+ "version": "1.0.0",
46
+ "endpoints": ["/reset", "/step", "/state", "/health"],
47
+ "action_space": {"type": "Discrete", "n": 4},
48
+ "observation_space": {"type": "Box", "shape": [5]},
49
+ }
50
+
51
+ if __name__ == "__main__":
52
+ uvicorn.run(app, host="0.0.0.0", port=7860)