|
|
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(): |
|
|
|
|
|
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)}) |
|
|
|