Spaces:
Sleeping
Sleeping
| from __future__ import annotations | |
| import argparse | |
| import json | |
| import os | |
| from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer | |
| from pathlib import Path | |
| from urllib.parse import urlparse | |
| from llm import llm_status | |
| from report import build_report | |
| PROJECT_ROOT = Path(__file__).resolve().parents[1] | |
| WEB_ROOT = PROJECT_ROOT / "web" | |
| class TideHandler(SimpleHTTPRequestHandler): | |
| def __init__(self, *args, **kwargs): | |
| super().__init__(*args, directory=str(WEB_ROOT), **kwargs) | |
| def do_GET(self) -> None: | |
| route = urlparse(self.path).path | |
| if route == "/healthz": | |
| self._json_response( | |
| { | |
| "status": "ok", | |
| "service": "tide-api", | |
| "llm": llm_status(PROJECT_ROOT / ".env"), | |
| } | |
| ) | |
| return | |
| super().do_GET() | |
| def do_POST(self) -> None: | |
| route = urlparse(self.path).path | |
| if route != "/api/report": | |
| self.send_error(404, "Unknown route") | |
| return | |
| try: | |
| length = int(self.headers.get("content-length", "0")) | |
| payload = self.rfile.read(length) | |
| form_data = json.loads(payload.decode("utf-8")) | |
| report = build_report(form_data, PROJECT_ROOT) | |
| except Exception as exc: # Keep local MVP errors visible to the browser. | |
| self._json_response({"ok": False, "error": str(exc)}, status=500) | |
| return | |
| self._json_response(report) | |
| def log_message(self, format: str, *args) -> None: | |
| print(f"{self.address_string()} - {format % args}") | |
| def _json_response(self, payload: dict, status: int = 200) -> None: | |
| body = json.dumps(payload, indent=2).encode("utf-8") | |
| self.send_response(status) | |
| self.send_header("content-type", "application/json; charset=utf-8") | |
| self.send_header("cache-control", "no-store") | |
| self.send_header("x-content-type-options", "nosniff") | |
| self.send_header("content-length", str(len(body))) | |
| self.end_headers() | |
| self.wfile.write(body) | |
| def main() -> None: | |
| parser = argparse.ArgumentParser(description="Run the TIDE form MVP server.") | |
| parser.add_argument("--host", default=os.getenv("TIDE_HOST", "127.0.0.1")) | |
| parser.add_argument("--port", type=int, default=int(os.getenv("PORT", "8000"))) | |
| args = parser.parse_args() | |
| server = ThreadingHTTPServer((args.host, args.port), TideHandler) | |
| print(f"TIDE form MVP running at http://{args.host}:{args.port}") | |
| server.serve_forever() | |
| if __name__ == "__main__": | |
| main() | |