Tejasva commited on
Commit ·
353e8ac
1
Parent(s): e38501f
minor fixes
Browse files- __pycache__/app.cpython-313.pyc +0 -0
- app.py +79 -1
- 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|