matrix-ai / app /ui.py
ruslanmv's picture
Adding Information page
3a3042d
from fastapi import APIRouter, Request, Form
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.templating import Jinja2Templates
import httpx, os, json
router = APIRouter()
templates = Jinja2Templates(directory="app/templates")
def _self_base_url() -> str:
port = os.getenv("PORT", "7860")
return f"http://127.0.0.1:{port}"
@router.get("/", include_in_schema=False)
async def home_redirect():
# Default to the Chat page
return RedirectResponse(url="/chat", status_code=302)
@router.get("/home", response_class=HTMLResponse, include_in_schema=False)
async def home_alias(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(...)):
try:
async with httpx.AsyncClient(base_url=_self_base_url(), timeout=15.0) as client:
r = await client.post("/v1/chat", json={"query": question})
r.raise_for_status()
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):
sample = {
"mode": "plan",
"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(...)):
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(base_url=_self_base_url(), timeout=15.0) as client:
r = await client.post("/v1/plan", 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)})