ChatBotPro / app.py
hayabusa
Refactor: Move from Gradio to FastAPI with Custom Vanilla Frontend
2d677a5
Raw
History Blame Contribute Delete
2.88 kB
import os
import sys
from fastapi import FastAPI, HTTPException
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse
from pydantic import BaseModel
import uvicorn
from google import generativeai as genai
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
# Configure Google API
api_key = os.getenv("HF_GOOGLE_API_KEY") or os.getenv("GOOGLE_API_KEY")
if not api_key:
raise ValueError("Google API key not found. Please set HF_GOOGLE_API_KEY in Hugging Face Spaces secrets or GOOGLE_API_KEY in .env file.")
try:
genai.configure(api_key=api_key)
except Exception as e:
print(f"Error configuring Generative AI: {str(e)}")
raise
# Global chat sessions dictionary to maintain sessions between requests
chat_sessions = {}
def get_chat_session(session_id):
"""Get an existing chat session or create a new one."""
if session_id not in chat_sessions:
try:
model = genai.GenerativeModel('gemini-3-flash-preview')
chat_sessions[session_id] = model.start_chat(history=[])
except Exception as e:
raise Exception(f"Failed to create chat session: {str(e)}")
return chat_sessions[session_id]
# FastAPI App Setup
app = FastAPI(title="ChatBot Pro Premium API")
# Add CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
class ChatRequest(BaseModel):
message: str
session_id: str = "default"
class ChatResponse(BaseModel):
response: str
@app.post("/chat", response_model=ChatResponse)
async def chat_endpoint(request: ChatRequest):
if not request.message or not request.message.strip():
raise HTTPException(status_code=400, detail="Message cannot be empty")
try:
chat = get_chat_session(request.session_id)
response = chat.send_message(request.message)
return ChatResponse(response=response.text)
except Exception as e:
print(f"Error in chat endpoint: {str(e)}")
raise HTTPException(status_code=500, detail=str(e))
@app.delete("/chat/{session_id}")
async def clear_chat(session_id: str):
if session_id in chat_sessions:
del chat_sessions[session_id]
return {"status": "success", "message": "Chat history cleared"}
# Mount static files
static_dir = os.path.join(os.path.dirname(__file__), "static")
if not os.path.exists(static_dir):
os.makedirs(static_dir)
app.mount("/static", StaticFiles(directory=static_dir), name="static")
@app.get("/")
async def read_index():
return FileResponse(os.path.join(static_dir, "index.html"))
if __name__ == "__main__":
print("Starting ChatBot Pro Premium on http://127.0.0.1:8000")
uvicorn.run("app:app", host="0.0.0.0", port=8000, reload=True)