Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import requests | |
| import pandas as pd | |
| import base64 | |
| from io import BytesIO | |
| import json | |
| import time | |
| import traceback | |
| # π§ CONFIGURE: Replace with your EC2 public IP | |
| API_URL = "http://3.14.153.135:5000/ask" | |
| HEALTH_URL = "http://3.14.153.135:5000/health" | |
| SIMPLE_TEST_URL = "http://3.14.153.135:5000/simple-test" | |
| DEBUG_URL = "http://3.14.153.135:5000/debug" | |
| def test_connection(): | |
| try: | |
| print("=== TESTING CONNECTION ===") | |
| response = requests.get(HEALTH_URL, timeout=30) | |
| print(f"Connection test status: {response.status_code}") | |
| print(f"Connection test response: {response.text}") | |
| if response.status_code == 200: | |
| return f"β Connection successful! Status: {response.status_code}\nResponse: {response.text}" | |
| else: | |
| return f"β οΈ Connection returned status: {response.status_code}\nResponse: {response.text}" | |
| except Exception as e: | |
| error_msg = f"Connection error: {str(e)}" | |
| print(f"Connection error: {error_msg}") | |
| print(f"Traceback: {traceback.format_exc()}") | |
| return f"β {error_msg}" | |
| def test_simple_endpoint(): | |
| try: | |
| print("=== TESTING SIMPLE ENDPOINT ===") | |
| response = requests.post( | |
| SIMPLE_TEST_URL, | |
| json={"question": "test question"}, | |
| timeout=30 | |
| ) | |
| print(f"Simple test status: {response.status_code}") | |
| print(f"Simple test response: {response.text}") | |
| if response.status_code == 200: | |
| result = response.json() | |
| return f"β Simple test successful! SQL: {result.get('sql', 'N/A')}", None | |
| else: | |
| return f"β Simple test failed: {response.status_code} - {response.text}", None | |
| except Exception as e: | |
| error_msg = f"Simple test error: {str(e)}" | |
| print(f"Simple test error: {error_msg}") | |
| print(f"Traceback: {traceback.format_exc()}") | |
| return f"β {error_msg}", None | |
| def test_debug_endpoint(): | |
| try: | |
| print("=== TESTING DEBUG ENDPOINT ===") | |
| response = requests.post( | |
| DEBUG_URL, | |
| json={"test": "data"}, | |
| timeout=30 | |
| ) | |
| print(f"Debug test status: {response.status_code}") | |
| print(f"Debug test response: {response.text}") | |
| return f"Debug response: {response.text}", None | |
| except Exception as e: | |
| error_msg = f"Debug test error: {str(e)}" | |
| print(f"Debug test error: {error_msg}") | |
| print(f"Traceback: {traceback.format_exc()}") | |
| return f"β {error_msg}", None | |
| def query_database(question): | |
| if not question.strip(): | |
| return "", None, None, "β οΈ Please enter a question.", "", "" | |
| try: | |
| start_time = time.time() | |
| print("\n" + "="*50) | |
| print("=== NEW QUERY REQUEST ===") | |
| print(f"Time: {time.strftime('%Y-%m-%d %H:%M:%S')}") | |
| print(f"Question: {question}") | |
| print("="*50) | |
| # Prepare the request | |
| headers = { | |
| 'Content-Type': 'application/json', | |
| 'User-Agent': 'HuggingFace-Space/1.0' | |
| } | |
| payload = {"question": question} | |
| print(f"Request URL: {API_URL}") | |
| print(f"Request headers: {headers}") | |
| print(f"Request payload: {payload}") | |
| # Make the request | |
| print("Sending request...") | |
| response = requests.post( | |
| API_URL, | |
| json=payload, | |
| headers=headers, | |
| timeout=300 | |
| ) | |
| elapsed_time = time.time() - start_time | |
| print(f"\n=== RESPONSE RECEIVED ===") | |
| print(f"Response time: {elapsed_time:.2f} seconds") | |
| print(f"Response status: {response.status_code}") | |
| print(f"Response headers: {dict(response.headers)}") | |
| print(f"Response text length: {len(response.text)} characters") | |
| print(f"Response text: {response.text}") | |
| # Check if response is empty | |
| if not response.text: | |
| error_msg = "Empty response from server" | |
| print(f"ERROR: {error_msg}") | |
| return "", None, None, f"β {error_msg}", f"Request time: {elapsed_time:.2f}s", "Empty response" | |
| # Try to parse JSON response | |
| try: | |
| result = response.json() | |
| print(f"Parsed JSON successfully: {type(result)}") | |
| except json.JSONDecodeError as e: | |
| error_msg = f"Invalid JSON response: {str(e)}" | |
| print(f"ERROR: {error_msg}") | |
| print(f"Response text (first 500 chars): {response.text[:500]}") | |
| return "", None, None, f"β {error_msg}", f"Request time: {elapsed_time:.2f}s", "JSON parse error" | |
| # Check HTTP status | |
| if response.status_code != 200: | |
| error_msg = result.get("error", f"HTTP {response.status_code}") | |
| print(f"ERROR: HTTP status {response.status_code}: {error_msg}") | |
| return "", None, None, f"β Server error: {error_msg}", f"Request time: {elapsed_time:.2f}s", "HTTP error" | |
| # Check for application error | |
| if "error" in result: | |
| error_msg = result['error'] | |
| print(f"ERROR: Application error: {error_msg}") | |
| return "", None, None, f"β {error_msg}", f"Request time: {elapsed_time:.2f}s", "Application error" | |
| # Extract data | |
| sql = result.get("sql", "N/A") | |
| rows = result.get("result", []) | |
| chart_data = result.get("chart") | |
| print(f"\n=== EXTRACTED DATA ===") | |
| print(f"SQL: {sql[:100] if sql else 'None'}...") | |
| print(f"Rows count: {len(rows)}") | |
| print(f"Chart data received: {'Yes' if chart_data else 'No'}") | |
| print(f"Chart data length: {len(chart_data) if chart_data else 0}") | |
| # Create DataFrame | |
| df = pd.DataFrame(rows) if rows else pd.DataFrame() | |
| print(f"DataFrame shape: {df.shape}") | |
| # Process chart | |
| chart_image = None | |
| if chart_data: | |
| try: | |
| image_bytes = base64.b64decode(chart_data) | |
| chart_image = BytesIO(image_bytes) | |
| print("Chart decoded successfully") | |
| except Exception as e: | |
| print(f"Error decoding chart: {e}") | |
| # Prepare details | |
| details = f"Request time: {elapsed_time:.2f}s\n" | |
| details += f"Status code: {response.status_code}\n" | |
| details += f"Rows returned: {len(rows)}\n" | |
| details += f"Chart generated: {'Yes' if chart_data else 'No'}\n" | |
| details += f"Response size: {len(response.text)} bytes" | |
| print(f"=== REQUEST COMPLETED SUCCESSFULLY ===") | |
| return sql, df, chart_image, "β Query completed successfully!", details, "Success" | |
| except requests.exceptions.ConnectionError as e: | |
| error_msg = f"Connection failed: {str(e)}" | |
| print(f"CONNECTION ERROR: {error_msg}") | |
| print(f"Traceback: {traceback.format_exc()}") | |
| return "", None, None, f"β {error_msg}", "Connection error", "Connection error" | |
| except requests.exceptions.Timeout: | |
| error_msg = "Request timed out after 300 seconds" | |
| print(f"TIMEOUT ERROR: {error_msg}") | |
| return "", None, None, f"β±οΈ {error_msg}", "Timeout error", "Timeout error" | |
| except requests.exceptions.RequestException as e: | |
| error_msg = f"Request exception: {str(e)}" | |
| print(f"REQUEST ERROR: {error_msg}") | |
| print(f"Traceback: {traceback.format_exc()}") | |
| return "", None, None, f"β {error_msg}", "Request error", "Request error" | |
| except Exception as e: | |
| error_msg = f"Unexpected error: {str(e)}" | |
| print(f"UNEXPECTED ERROR: {error_msg}") | |
| print(f"Traceback: {traceback.format_exc()}") | |
| return "", None, None, f"π¨ {error_msg}", f"Error: {str(e)}", "Unexpected error" | |
| # π¨ Theme: Enterprise Dark Blue | |
| theme = gr.themes.Default( | |
| primary_hue="blue", | |
| secondary_hue="gray", | |
| neutral_hue="slate", | |
| font=["Inter", "sans-serif"] | |
| ).set( | |
| body_background_fill="*neutral_950", | |
| background_fill_secondary="*neutral_900" | |
| ) | |
| # π UI Layout | |
| with gr.Blocks(theme=theme, title="Enterprise SQL Assistant") as demo: | |
| gr.HTML(""" | |
| <div style="text-align: center; padding: 20px;"> | |
| <h1 style="color: #3B82F6; margin-bottom: 5px;">π Enterprise SQL Assistant</h1> | |
| <p style="color: #9CA3AF; font-size: 1.1em; margin-top: 0;"> | |
| Ask questions about your data. Get SQL, results, and insights. | |
| </p> | |
| </div> | |
| """) | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| gr.Markdown("### π Ask a Question") | |
| question_input = gr.Textbox( | |
| placeholder="E.g., How many members are there?", | |
| label="Natural Language Query", | |
| lines=3 | |
| ) | |
| submit_btn = gr.Button("π Generate SQL & Results", variant="primary") | |
| gr.Markdown("### π§ Connection Tests") | |
| with gr.Accordion("Connection Tests", open=True): | |
| test_btn = gr.Button("Test Connection to EC2") | |
| connection_status = gr.Textbox(label="Connection Status", interactive=False) | |
| simple_test_btn = gr.Button("Test Simple Endpoint") | |
| simple_test_status = gr.Textbox(label="Simple Test Status", interactive=False) | |
| debug_test_btn = gr.Button("Test Debug Endpoint") | |
| debug_test_status = gr.Textbox(label="Debug Test Status", interactive=False) | |
| gr.Markdown("### π‘ Example Queries") | |
| gr.Markdown(""" | |
| Try these example queries: | |
| - How many members are there? | |
| - What is the total transaction amount? | |
| - Show members with their account balances | |
| - Which member has the highest balance? | |
| - Show transaction trends over time | |
| - Count of members by status | |
| - Show me the first 10 rows | |
| - What is the average age of members? | |
| """) | |
| with gr.Column(scale=2): | |
| gr.Markdown("### π Results") | |
| status = gr.Textbox(label="Status", interactive=False) | |
| with gr.Tabs(): | |
| with gr.Tab("SQL Query"): | |
| sql_output = gr.Code(label="", language="sql") | |
| with gr.Tab("Data Results"): | |
| results_output = gr.Dataframe( | |
| label="Query Results", | |
| interactive=False, | |
| wrap=True | |
| ) | |
| with gr.Tab("Visual Insights"): | |
| chart_output = gr.Image( | |
| label="Chart", | |
| type="pil", | |
| height=400, | |
| elem_classes="chart-container" | |
| ) | |
| gr.Markdown("### π Request Details") | |
| request_details = gr.Textbox(label="Request Details", interactive=False, lines=6) | |
| gr.Markdown("### π Error Details") | |
| error_details = gr.Textbox(label="Error Details", interactive=False, lines=4) | |
| # Events | |
| test_btn.click( | |
| fn=test_connection, | |
| outputs=[connection_status] | |
| ) | |
| simple_test_btn.click( | |
| fn=test_simple_endpoint, | |
| outputs=[simple_test_status] | |
| ) | |
| debug_test_btn.click( | |
| fn=test_debug_endpoint, | |
| outputs=[debug_test_status] | |
| ) | |
| submit_btn.click( | |
| fn=query_database, | |
| inputs=question_input, | |
| outputs=[sql_output, results_output, chart_output, status, request_details, error_details] | |
| ) | |
| # Launch | |
| if __name__ == "__main__": | |
| demo.launch() | |