Spaces:
Sleeping
Sleeping
import os | |
import streamlit as st | |
import pandas as pd | |
import mysql.connector | |
from huggingface_hub import InferenceClient | |
st.set_page_config(layout="wide", page_title="π§ SmartHeal AI Dashboard (LLaMA 3.1)") | |
st.title("π©Ί SmartHeal: AI-Generated Dashboard (LLaMA 3.1 Instruct)") | |
HF_TOKEN = os.environ.get("HF_TOKEN") or st.secrets["HF_TOKEN"] | |
client = InferenceClient( | |
model="meta-llama/Llama-3.1-8B-Instruct", | |
token=HF_TOKEN | |
) | |
# ------------------- Fetch all tables, schema, samples ------------------- | |
def get_schema_and_samples(): | |
try: | |
conn = mysql.connector.connect( | |
host="sg-nme-web545.main-hosting.eu", | |
user="u124249738_SmartHealApp", | |
password="I^4y1b12y", | |
database="u124249738_SmartHealAppDB", | |
port=3306, | |
connection_timeout=10 | |
) | |
cursor = conn.cursor() | |
cursor.execute("SHOW TABLES") | |
tables = [t[0] for t in cursor.fetchall()] | |
full_prompt = "" | |
for table in tables: | |
full_prompt += f"\n### Table: {table}\n" | |
cursor.execute(f"DESCRIBE {table}") | |
for row in cursor.fetchall(): | |
full_prompt += f"- {row[0]} ({row[1]})\n" | |
cursor.execute(f"SELECT * FROM {table} LIMIT 5") | |
rows = cursor.fetchall() | |
columns = [desc[0] for desc in cursor.description] | |
df = pd.DataFrame(rows, columns=columns) | |
full_prompt += f"\nSample rows:\n{df.to_markdown(index=False)}\n" | |
conn.close() | |
return full_prompt | |
except Exception as e: | |
return f"β Error: {e}" | |
# ------------------- Ask LLaMA to generate HTML dashboard ------------------- | |
def generate_html(schema): | |
prompt = f""" | |
You are a world-class dashboard developer and wound care analytics expert. | |
Below is the database schema and 5 rows per table from a real wound care system: | |
{schema} | |
Please build a clean, mobile-responsive HTML dashboard using Bootstrap 5 and Chart.js or Plotly.js. | |
Requirements: | |
1. Top KPIs (tiles): Total Patients, Total Wounds, Avg. Wound Area, % Reduction in Area | |
2. A modern line chart of wound area (area_cm2) over time grouped by wound_id | |
3. A pie chart showing wound types (from `wounds` table) | |
4. A searchable table with: patient_id, wound_id, area, created_at | |
5. Layout must have a soft background, card-like sections, hover effects, bold typography | |
6. Add a sticky header and use light neumorphic style or silhouette aesthetics | |
7. Use clean font (like 'Poppins' or 'Lato'), subtle shadows, rounded corners | |
8. Return only pure HTML+CSS+JS. No markdown, no ``` blocks. | |
Respond with only valid HTML. | |
""" | |
response = client.chat.completions.create( | |
model="meta-llama/Llama-3.1-8B-Instruct", | |
messages=[{"role": "user", "content": prompt}] | |
) | |
return response.choices[0].message.content | |
# ------------------- Streamlit flow ------------------- | |
schema_summary = get_schema_and_samples() | |
if schema_summary.startswith("β"): | |
st.error(schema_summary) | |
st.stop() | |
with st.expander("π View Database Schema + Samples"): | |
st.text(schema_summary) | |
if st.button("π Generate HTML Dashboard with LLaMA"): | |
with st.spinner("Generating rich HTML dashboard from LLaMA 3.1..."): | |
try: | |
html_code = generate_html(schema_summary) | |
st.success("β AI dashboard ready!") | |
st.components.v1.html(html_code, height=1200, scrolling=True) | |
except Exception as e: | |
st.error(f"β LLaMA failed: {e}") |