File size: 2,807 Bytes
6e7ce30
3e0331f
6e7ce30
 
44df6b6
3e0331f
 
 
6e7ce30
 
 
 
 
3e0331f
 
6e7ce30
 
44df6b6
6e7ce30
 
 
 
 
3e0331f
 
 
 
 
 
 
 
 
 
 
 
6e7ce30
 
 
 
 
44df6b6
6e7ce30
44df6b6
 
6e7ce30
 
 
 
 
3e0331f
6e7ce30
 
 
 
 
 
3e0331f
6e7ce30
 
 
3e0331f
6e7ce30
 
 
3e0331f
6e7ce30
3e0331f
6e7ce30
 
3e0331f
 
 
 
 
6e7ce30
 
 
 
 
 
 
3e0331f
6e7ce30
 
 
 
 
 
3e0331f
 
 
44df6b6
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
import uuid
import os
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Dict, Optional

# Import your environment logic
# Ensure these files exist in a folder named 'environment' with an __init__.py file
from environment.env import CodeReviewEnv
from environment.models import Action, Observation, Reward

app = FastAPI(title="CodeReviewEnv")

# In-memory store for environments categorized by session IDs
sessions: Dict[str, CodeReviewEnv] = {}

class ResetRequest(BaseModel):
    task_id: str = "easy"

class StepRequest(BaseModel):
    session_id: str
    action: Action

# --- IMPORTANT FOR HUGGING FACE ---
# This root route tells Hugging Face your app is alive. 
# Without this, the Space may stay on "Starting..."
@app.get("/")
async def root():
    return {
        "status": "online", 
        "environment": "CodeReviewEnv", 
        "tag": "openenv",
        "docs": "/docs"
    }

@app.get("/health")
async def health():
    return {"status": "ok"}

@app.post("/reset")
async def reset_endpoint(req: Optional[ResetRequest] = None):
    try:
        if req is None:
            req = ResetRequest()
        # Create a new session with a unique ID
        session_id = str(uuid.uuid4())
        env = CodeReviewEnv(req.task_id)
        obs = env.reset()
        sessions[session_id] = env
                
        # Return observation alongside the session ID
        return {
            "session_id": session_id,
            "observation": obs.dict()
        }
    except Exception as e:
        raise HTTPException(status_code=400, detail=f"Reset failed: {str(e)}")

@app.post("/step")
async def step_endpoint(req: StepRequest):
    # Check if session exists
    if req.session_id not in sessions:
        raise HTTPException(status_code=400, detail="Invalid session ID or expired environment.")
    
    # Corrected Indentation: This must be outside the 'if' block
    env = sessions[req.session_id]
    
    try:
        obs, reward, done, info = env.step(req.action)
        
        # Optional: Remove session if 'done' to save memory
        if done:
            del sessions[req.session_id]
            
        return {
            "observation": obs.dict(),
            "reward": reward.dict(),
            "done": done,
            "info": info
        }
    except Exception as e:
        raise HTTPException(status_code=400, detail=f"Step execution failed: {str(e)}")

@app.get("/state")
async def state_endpoint(session_id: str):
    if session_id not in sessions:
        raise HTTPException(status_code=400, detail="Invalid session ID.")
    return sessions[session_id].state()

# Note: In Hugging Face Spaces with Docker, 
# you do NOT need 'if __name__ == "__main__": uvicorn.run(...)' 
# because it is handled by your Dockerfile CMD.