Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -15,16 +15,25 @@ from fastapi import FastAPI, Form, File, UploadFile
|
|
| 15 |
from fastapi.middleware.cors import CORSMiddleware
|
| 16 |
from fastapi.responses import JSONResponse
|
| 17 |
from fastapi.staticfiles import StaticFiles
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
|
| 19 |
# Configure logging to show detailed messages
|
| 20 |
logging.basicConfig(level=logging.DEBUG)
|
| 21 |
logger = logging.getLogger(__name__)
|
| 22 |
|
| 23 |
-
# Salesforce credentials (
|
| 24 |
-
SALESFORCE_USERNAME = os.getenv("SALESFORCE_USERNAME"
|
| 25 |
-
SALESFORCE_PASSWORD = os.getenv("SALESFORCE_PASSWORD"
|
| 26 |
-
SALESFORCE_SECURITY_TOKEN = os.getenv("SALESFORCE_SECURITY_TOKEN"
|
| 27 |
-
SALESFORCE_DOMAIN = os.getenv("SALESFORCE_DOMAIN", "login") #
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
|
| 29 |
logger.debug(f"Using Salesforce credentials - Username: {SALESFORCE_USERNAME}, Security Token: {SALESFORCE_SECURITY_TOKEN[:5]}...")
|
| 30 |
|
|
@@ -337,8 +346,26 @@ app.add_middleware(
|
|
| 337 |
allow_methods=["*"],
|
| 338 |
allow_headers=["*"],
|
| 339 |
)
|
|
|
|
|
|
|
| 340 |
app.mount("/static", StaticFiles(directory=tempfile.gettempdir()), name="static")
|
| 341 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 342 |
# FastAPI endpoint for Salesforce controller (defined before mounting Gradio)
|
| 343 |
@app.post("/api/gradio_interface")
|
| 344 |
async def api_gradio_interface(
|
|
@@ -440,8 +467,8 @@ async def api_gradio_interface(
|
|
| 440 |
shutil.rmtree(temp_dir)
|
| 441 |
logger.debug(f"Cleaned up temporary directory: {temp_dir}")
|
| 442 |
|
| 443 |
-
# Create Gradio interface
|
| 444 |
-
demo = gr.Blocks(theme="default")
|
| 445 |
with demo:
|
| 446 |
gr.Markdown("## AI Civil Work Planner")
|
| 447 |
gr.Markdown("Generate a project timeline (Gantt chart) and risk tags based on BOQ data and site parameters.")
|
|
@@ -465,7 +492,7 @@ with demo:
|
|
| 465 |
outputs=[output_image, risk_tags],
|
| 466 |
)
|
| 467 |
|
| 468 |
-
# Mount Gradio app
|
| 469 |
gradio_app = gr.mount_gradio_app(app, demo, path="/")
|
| 470 |
|
| 471 |
if __name__ == "__main__":
|
|
|
|
| 15 |
from fastapi.middleware.cors import CORSMiddleware
|
| 16 |
from fastapi.responses import JSONResponse
|
| 17 |
from fastapi.staticfiles import StaticFiles
|
| 18 |
+
from dotenv import load_dotenv # Added for environment variable loading
|
| 19 |
+
|
| 20 |
+
# Load environment variables from .env file
|
| 21 |
+
load_dotenv()
|
| 22 |
|
| 23 |
# Configure logging to show detailed messages
|
| 24 |
logging.basicConfig(level=logging.DEBUG)
|
| 25 |
logger = logging.getLogger(__name__)
|
| 26 |
|
| 27 |
+
# Salesforce credentials (loaded from environment variables)
|
| 28 |
+
SALESFORCE_USERNAME = os.getenv("SALESFORCE_USERNAME")
|
| 29 |
+
SALESFORCE_PASSWORD = os.getenv("SALESFORCE_PASSWORD")
|
| 30 |
+
SALESFORCE_SECURITY_TOKEN = os.getenv("SALESFORCE_SECURITY_TOKEN")
|
| 31 |
+
SALESFORCE_DOMAIN = os.getenv("SALESFORCE_DOMAIN", "login") # Default to 'login' if not set
|
| 32 |
+
|
| 33 |
+
# Validate that credentials are set
|
| 34 |
+
if not all([SALESFORCE_USERNAME, SALESFORCE_PASSWORD, SALESFORCE_SECURITY_TOKEN]):
|
| 35 |
+
logger.error("Salesforce credentials not set in environment variables. Please set SALESFORCE_USERNAME, SALESFORCE_PASSWORD, and SALESFORCE_SECURITY_TOKEN.")
|
| 36 |
+
raise ValueError("Missing Salesforce credentials in environment variables.")
|
| 37 |
|
| 38 |
logger.debug(f"Using Salesforce credentials - Username: {SALESFORCE_USERNAME}, Security Token: {SALESFORCE_SECURITY_TOKEN[:5]}...")
|
| 39 |
|
|
|
|
| 346 |
allow_methods=["*"],
|
| 347 |
allow_headers=["*"],
|
| 348 |
)
|
| 349 |
+
|
| 350 |
+
# Mount directory for temporary files (e.g., Gantt chart PNGs)
|
| 351 |
app.mount("/static", StaticFiles(directory=tempfile.gettempdir()), name="static")
|
| 352 |
|
| 353 |
+
# Mount Gradio's static assets to fix UI rendering issue
|
| 354 |
+
gradio_static_path = os.path.join(gr.__path__[0], "templates", "frontend", "dist")
|
| 355 |
+
if os.path.exists(gradio_static_path):
|
| 356 |
+
app.mount("/_app", StaticFiles(directory=gradio_static_path), name="gradio_static")
|
| 357 |
+
logger.info(f"Mounted Gradio static assets at {gradio_static_path}")
|
| 358 |
+
else:
|
| 359 |
+
logger.error(f"Gradio static assets directory not found at {gradio_static_path}")
|
| 360 |
+
raise FileNotFoundError(f"Gradio static assets not found at {gradio_static_path}")
|
| 361 |
+
|
| 362 |
+
# Health check endpoint to verify static asset availability
|
| 363 |
+
@app.get("/health")
|
| 364 |
+
async def health_check():
|
| 365 |
+
if os.path.exists(gradio_static_path):
|
| 366 |
+
return {"status": "healthy", "gradio_static": "available"}
|
| 367 |
+
return {"status": "unhealthy", "gradio_static": "missing"}
|
| 368 |
+
|
| 369 |
# FastAPI endpoint for Salesforce controller (defined before mounting Gradio)
|
| 370 |
@app.post("/api/gradio_interface")
|
| 371 |
async def api_gradio_interface(
|
|
|
|
| 467 |
shutil.rmtree(temp_dir)
|
| 468 |
logger.debug(f"Cleaned up temporary directory: {temp_dir}")
|
| 469 |
|
| 470 |
+
# Create Gradio interface with explicit base_path
|
| 471 |
+
demo = gr.Blocks(theme="default", base_path="/")
|
| 472 |
with demo:
|
| 473 |
gr.Markdown("## AI Civil Work Planner")
|
| 474 |
gr.Markdown("Generate a project timeline (Gantt chart) and risk tags based on BOQ data and site parameters.")
|
|
|
|
| 492 |
outputs=[output_image, risk_tags],
|
| 493 |
)
|
| 494 |
|
| 495 |
+
# Mount Gradio app
|
| 496 |
gradio_app = gr.mount_gradio_app(app, demo, path="/")
|
| 497 |
|
| 498 |
if __name__ == "__main__":
|