image / app.py
Muthuraja18's picture
Update app.py (#20)
fafdb77
Raw
History Blame
6.54 kB
import os
import io
from PIL import Image
import streamlit as st
from graph import run_graph
# -------------------------------------------------------
# PAGE CONFIG
# -------------------------------------------------------
st.set_page_config(
page_title="AI Image Studio",
layout="wide"
)
st.title("🧠 AI Image Studio (Agents + LangGraph)")
# -------------------------------------------------------
# SESSION STATE
# -------------------------------------------------------
if "messages" not in st.session_state:
st.session_state.messages = []
if "uploaded_paths" not in st.session_state:
st.session_state.uploaded_paths = []
if "analysis" not in st.session_state:
st.session_state.analysis = None
if "last_uploaded" not in st.session_state:
st.session_state.last_uploaded = []
# -------------------------------------------------------
# SIDEBAR
# -------------------------------------------------------
st.sidebar.header("📁 Upload Images")
uploaded_files = st.sidebar.file_uploader(
"Upload Images",
type=["png", "jpg", "jpeg"],
accept_multiple_files=True
)
# -------------------------------------------------------
# SAVE FILES
# -------------------------------------------------------
if uploaded_files:
os.makedirs("uploads", exist_ok=True)
paths = []
for file in uploaded_files:
file_path = os.path.join("uploads", file.name)
with open(file_path, "wb") as f:
f.write(file.getbuffer())
paths.append(file_path)
# Save paths
st.session_state.uploaded_paths = paths
# ---------------------------------------------------
# AUTO ANALYZE ONLY IF NEW IMAGE
# ---------------------------------------------------
if paths != st.session_state.last_uploaded:
st.session_state.last_uploaded = paths
with st.spinner("🔍 Analyzing image..."):
result = run_graph(
"analyze this image",
uploaded_files=paths
)
analysis = result.get("result")
st.session_state.analysis = analysis
if isinstance(analysis, dict):
description = analysis.get(
"description",
"Image analyzed."
)
resolution = analysis.get("resolution", "")
style = analysis.get("style", "")
lighting = analysis.get("lighting", "")
objects = analysis.get("objects", [])
message = f"""📷 **Image Analysis**
**Description**
{description}
"""
if resolution:
message += f"\n**Resolution:** {resolution}"
if style:
message += f"\n\n**Style:** {style}"
if lighting:
message += f"\n\n**Lighting:** {lighting}"
if objects:
message += f"\n\n**Objects:** {', '.join(objects)}"
message += """
---
### What would you like to do?
• Remove background
• Make it Anime
• Make it Pixar style
• Enhance quality
• Replace objects
• Change colors
• Add new objects
• Extract text
"""
st.session_state.messages.append(
{
"role": "assistant",
"content": message
}
)
else:
st.session_state.messages.append(
{
"role": "assistant",
"content": str(analysis)
}
)
# -------------------------------------------------------
# SIDEBAR PREVIEW
# -------------------------------------------------------
if st.session_state.uploaded_paths:
st.sidebar.subheader("🖼 Preview")
for img in st.session_state.uploaded_paths:
st.sidebar.image(
img,
caption=os.path.basename(img),
use_container_width=True
)
# -------------------------------------------------------
# CHAT
# -------------------------------------------------------
st.subheader("💬 Chat with AI Agent")
for msg in st.session_state.messages:
with st.chat_message(msg["role"]):
st.markdown(msg["content"])
# -------------------------------------------------------
# USER INPUT
# -------------------------------------------------------
user_input = st.chat_input(
"Generate / Edit / Analyze image..."
)
# -------------------------------------------------------
# RUN AGENT
# -------------------------------------------------------
if user_input:
st.session_state.messages.append(
{
"role": "user",
"content": user_input
}
)
with st.chat_message("user"):
st.markdown(user_input)
with st.chat_message("assistant"):
with st.spinner("🤖 AI Agent thinking..."):
result = run_graph(
user_input,
uploaded_files=st.session_state.uploaded_paths
)
output = result.get("result")
assistant_message = ""
# ------------------------------------------------
# IMAGE OUTPUT
# ------------------------------------------------
if isinstance(output, Image.Image):
st.image(
output,
caption="Generated Image",
use_container_width=True
)
buffer = io.BytesIO()
output.save(buffer, format="PNG")
st.download_button(
"⬇ Download Image",
buffer.getvalue(),
"result.png",
"image/png"
)
assistant_message = "✅ Image generated successfully."
# ------------------------------------------------
# DICTIONARY OUTPUT
# ------------------------------------------------
elif isinstance(output, dict):
st.json(output)
assistant_message = output.get(
"description",
str(output)
)
# ------------------------------------------------
# TEXT OUTPUT
# ------------------------------------------------
else:
st.markdown(str(output))
assistant_message = str(output)
st.session_state.messages.append(
{
"role": "assistant",
"content": assistant_message
}
)