Tejasva commited on
Commit
353e8ac
·
1 Parent(s): e38501f

minor fixes

Browse files
Files changed (3) hide show
  1. __pycache__/app.cpython-313.pyc +0 -0
  2. app.py +79 -1
  3. requirements.txt +2 -0
__pycache__/app.cpython-313.pyc ADDED
Binary file (25.2 kB). View file
 
app.py CHANGED
@@ -7,6 +7,9 @@ import json
7
  from typing import Dict, Any, Optional, List
8
  import logging
9
 
 
 
 
10
  # Add current directory to Python path
11
  sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
12
 
@@ -477,5 +480,80 @@ with gr.Blocks(title="CodeGuardian Environment - RL Enhanced") as demo:
477
  outputs=[reset_btn, baseline_btn, episode_btn, perf_btn, plot_btn, action_group, detect_group, risk_group, fix_group]
478
  )
479
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
480
  if __name__ == "__main__":
481
- demo.launch(server_name="0.0.0.0", server_port=7860)
 
 
 
 
7
  from typing import Dict, Any, Optional, List
8
  import logging
9
 
10
+ from fastapi import Body, FastAPI
11
+ from pydantic import BaseModel, ConfigDict
12
+
13
  # Add current directory to Python path
14
  sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
15
 
 
480
  outputs=[reset_btn, baseline_btn, episode_btn, perf_btn, plot_btn, action_group, detect_group, risk_group, fix_group]
481
  )
482
 
483
+ # OpenEnv / TRL-style HTTP API (POST /reset, etc.) for automated Space checks.
484
+ # Gradio alone does not expose these routes and returns 405 Method Not Allowed.
485
+
486
+
487
+ class OpenEnvResetRequest(BaseModel):
488
+ model_config = ConfigDict(extra="allow")
489
+
490
+ seed: Optional[int] = None
491
+ episode_id: Optional[str] = None
492
+
493
+
494
+ class OpenEnvResetResponse(BaseModel):
495
+ model_config = ConfigDict(extra="forbid")
496
+
497
+ observation: Dict[str, Any]
498
+ reward: float = 0
499
+ done: bool = False
500
+
501
+
502
+ class OpenEnvStepRequest(BaseModel):
503
+ model_config = ConfigDict(extra="allow")
504
+
505
+ action: Dict[str, Any]
506
+ timeout_s: Optional[float] = None
507
+ request_id: Optional[str] = None
508
+
509
+
510
+ class OpenEnvStepResponse(BaseModel):
511
+ model_config = ConfigDict(extra="forbid")
512
+
513
+ observation: Dict[str, Any]
514
+ reward: Optional[float] = None
515
+ done: bool = False
516
+
517
+
518
+ app = FastAPI(title="CodeGuardian OpenEnv")
519
+
520
+
521
+ @app.post("/reset", response_model=OpenEnvResetResponse)
522
+ async def openenv_reset(
523
+ _body: OpenEnvResetRequest = Body(default_factory=OpenEnvResetRequest),
524
+ ) -> OpenEnvResetResponse:
525
+ obs = space.env.reset()
526
+ space.current_obs = obs
527
+ return OpenEnvResetResponse(
528
+ observation=obs.model_dump(),
529
+ reward=0,
530
+ done=False,
531
+ )
532
+
533
+
534
+ @app.post("/step", response_model=OpenEnvStepResponse)
535
+ async def openenv_step(request: OpenEnvStepRequest) -> OpenEnvStepResponse:
536
+ action = Action.model_validate(request.action)
537
+ next_obs, reward_obj, done = space.env.step(action)
538
+ space.current_obs = next_obs
539
+ obs_dict = next_obs.model_dump() if next_obs is not None else {}
540
+ return OpenEnvStepResponse(
541
+ observation=obs_dict,
542
+ reward=float(reward_obj.value),
543
+ done=done,
544
+ )
545
+
546
+
547
+ @app.get("/state")
548
+ async def openenv_state() -> Dict[str, Any]:
549
+ return space.env.state()
550
+
551
+
552
+ demo.queue()
553
+ app = gr.mount_gradio_app(app, demo, path="/")
554
+
555
  if __name__ == "__main__":
556
+ import uvicorn
557
+
558
+ PORT = int(os.environ.get("PORT", "7860"))
559
+ uvicorn.run("app:app", host="0.0.0.0", port=PORT)
requirements.txt CHANGED
@@ -4,5 +4,7 @@ gymnasium>=0.28.0
4
  numpy>=1.24.0
5
  python-dotenv>=1.0.0
6
  flask>=3.0.0
 
 
7
  gradio>=4.0.0
8
  plotly
 
4
  numpy>=1.24.0
5
  python-dotenv>=1.0.0
6
  flask>=3.0.0
7
+ fastapi>=0.110.0
8
+ uvicorn[standard]>=0.27.0
9
  gradio>=4.0.0
10
  plotly