Spaces:
Sleeping
Sleeping
| import os | |
| from fastapi import FastAPI, Request | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from fastapi.responses import FileResponse, Response | |
| from pydantic import BaseModel | |
| from src.chatbot import handle_query | |
| from pathlib import Path | |
| class ChatRequest(BaseModel): | |
| query: str | |
| class ChatResponse(BaseModel): | |
| answer: str | |
| cards: list = [] | |
| app = FastAPI(title="NoBrokerage Chatbot") | |
| # CORS middleware | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], | |
| allow_credentials=True, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| # Get the directory where app.py is located | |
| BASE_DIR = Path(__file__).resolve().parent | |
| frontend_path = BASE_DIR / "frontend" | |
| async def root(): | |
| """Serve the frontend HTML""" | |
| html_file = frontend_path / "index.html" | |
| if html_file.exists(): | |
| return FileResponse(html_file) | |
| return {"error": "index.html not found", "path": str(html_file)} | |
| async def get_css(): | |
| """Serve CSS file""" | |
| css_file = frontend_path / "style.css" | |
| if css_file.exists(): | |
| return FileResponse(css_file, media_type="text/css") | |
| return {"error": "style.css not found"} | |
| async def get_js(): | |
| """Serve JavaScript file with automatic API URL fix""" | |
| js_file = frontend_path / "script.js" | |
| if js_file.exists(): | |
| # Read the original file | |
| with open(js_file, 'r', encoding='utf-8') as f: | |
| content = f.read() | |
| # Replace localhost URL with empty string for same-origin requests | |
| content = content.replace( | |
| 'const API_BASE_URL = "http://localhost:8000";', | |
| 'const API_BASE_URL = "";' | |
| ) | |
| # Return the modified JavaScript | |
| return Response(content=content, media_type="application/javascript") | |
| return {"error": "script.js not found"} | |
| async def get_logo(): | |
| """Serve logo image""" | |
| logo_file = frontend_path / "logo.png" | |
| if logo_file.exists(): | |
| return FileResponse(logo_file, media_type="image/png") | |
| # Return a placeholder or error | |
| return {"error": "logo.png not found"} | |
| def chat(request: ChatRequest): | |
| """Handle chat requests""" | |
| result = handle_query(request.query) | |
| return ChatResponse(answer=result.get("summary"), cards=result.get("cards", [])) | |
| def health(): | |
| """Health check endpoint""" | |
| return {"status": "ok", "message": "✅ NoBrokerage running"} | |
| # For Hugging Face Spaces | |
| if __name__ == "__main__": | |
| import uvicorn | |
| port = int(os.environ.get("PORT", 7860)) | |
| uvicorn.run(app, host="0.0.0.0", port=port) |