File size: 2,867 Bytes
e465928 |
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 |
from fastapi import APIRouter, Request, Form
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
import httpx, os, json
router = APIRouter()
templates = Jinja2Templates(directory="app/templates")
def _self_base_url() -> str:
# When running inside HF Space Docker, use localhost + PORT
port = os.getenv("PORT", "7860")
return f"http://127.0.0.1:{port}"
@router.get("/", response_class=HTMLResponse)
async def home(request: Request):
return templates.TemplateResponse("home.html", {"request": request})
@router.get("/chat", response_class=HTMLResponse)
async def chat_get(request: Request):
return templates.TemplateResponse("chat.html", {"request": request, "answer": None})
@router.post("/chat", response_class=HTMLResponse)
async def chat_post(request: Request, question: str = Form(...)):
# Call your /v1/chat (or return a placeholder)
base_url = _self_base_url()
try:
async with httpx.AsyncClient(timeout=15.0) as client:
r = await client.post("/v1/chat", base_url=base_url, json={"query": question})
data = r.json()
answer = data.get("answer", "(no answer)")
except Exception as e:
answer = f"Error: {e}"
return templates.TemplateResponse("chat.html", {"request": request, "answer": answer, "question": question})
@router.get("/dev", response_class=HTMLResponse)
async def dev_get(request: Request):
# Prefill a realistic plan request used by Matrix-Guardian
sample = {
"context": {
"entity_uid": "matrix-ai",
"health": {"score": 0.64, "status": "degraded", "last_checked": "2025-09-27T00:00:00Z"},
"recent_checks": [
{"check": "http", "result": "fail", "latency_ms": 900, "ts": "2025-09-27T00:00:00Z"}
],
},
"constraints": {"max_steps": 3, "risk": "low"},
}
return templates.TemplateResponse("dev.html", {"request": request, "sample": json.dumps(sample, indent=2)})
@router.post("/dev", response_class=HTMLResponse)
async def dev_post(request: Request, payload: str = Form(...)):
base_url = _self_base_url()
try:
body = json.loads(payload)
except Exception as e:
return templates.TemplateResponse("dev.html", {"request": request, "sample": payload, "error": f"Invalid JSON: {e}"})
try:
async with httpx.AsyncClient(timeout=15.0) as client:
r = await client.post("/v1/plan", base_url=base_url, json=body)
r.raise_for_status()
data = r.json()
pretty = json.dumps(data, indent=2)
return templates.TemplateResponse("dev.html", {"request": request, "sample": payload, "result": pretty})
except Exception as e:
return templates.TemplateResponse("dev.html", {"request": request, "sample": payload, "error": str(e)})
|