apiagrilens / streamlit_interface.py
Sidoineko's picture
Add Streamlit UI to call FastAPI (streamlit_interface.py)
d731ef7
import io
import os
import requests
import streamlit as st
from PIL import Image
API_BASE = os.environ.get("API_BASE") or st.secrets.get("API_BASE") or "https://sido1991-apiagrilens.hf.space"
st.set_page_config(page_title="AgriLens AI", page_icon="🌱", layout="centered")
st.title("🌱 AgriLens AI - Plant Disease Diagnosis")
with st.sidebar:
st.markdown("### API")
api_url = st.text_input("API base URL", API_BASE, help="Your FastAPI base")
col1, col2 = st.columns(2)
with col1:
if st.button("Health check"):
try:
r = requests.get(f"{api_url}/health", timeout=60)
st.write(r.status_code, r.json())
except Exception as e:
st.error(str(e))
with col2:
if st.button("Load model"):
try:
r = requests.get(f"{api_url}/load", timeout=300)
st.write(r.status_code, r.json())
except Exception as e:
st.error(str(e))
uploaded = st.file_uploader("Upload a leaf photo", type=["jpg","jpeg","png"])
culture = st.text_input("Culture (optional)")
notes = st.text_area("Notes (optional)")
if st.button("Analyze") and uploaded:
img = Image.open(uploaded).convert("RGB")
buf = io.BytesIO()
img.save(buf, format="JPEG", quality=90)
buf.seek(0)
files = {"image": ("image.jpg", buf.getvalue(), "image/jpeg")}
data = {}
if culture: data["culture"] = culture
if notes: data["notes"] = notes
with st.spinner("Analyzing..."):
r = requests.post(f"{api_url}/diagnose", files=files, data=data, timeout=180)
if r.ok:
out = r.json()
st.image(img, caption="Input")
st.subheader("Diagnosis")
st.write(out.get("diagnosis", "No text"))
else:
st.error(f"Error {r.status_code}: {r.text}")