PromptCanvas / app.py
ProfessorLeVesseur's picture
Update app.py
9acdb45 verified
import streamlit as st
# import base64
import openai
from io import BytesIO
import requests
# import os
# from pathlib import Path
# from dotenv import load_dotenv
# load_dotenv()
# Streamlit page setup
st.set_page_config(page_title="PromptCanvas™", layout="centered", initial_sidebar_state="collapsed")
#Add the image with a specified width
image_width = 300 # Set the desired width in pixels
st.image('MTSS.ai_Logo.png', width=image_width)
st.header('PromptCanvas™ | Images')
st.subheader('Image Builder + Alt Text')
# Retrieve the OpenAI API Key from secrets
openai.api_key = st.secrets["openai_api_key"]
# Set the OpenAI API key
# Retrieve OpenAI API key from environment variables
# openai_api_key = os.getenv('OPENAI_API_KEY')
# if not openai_api_key:
# raise ValueError("OPENAI_API_KEY not set in environment variables")
# Set the OpenAI API key
# openai.api_key = openai_api_key
# def generate_images(prompt): #def generate_images(image_description, num_images):
# response = openai.images.generate(
# model="dall-e-3",
# prompt = prompt,
# size="1024x1024",
# quality="standard",
# n = 1,
# )
# image_url = response.data[0].url
# return image_url
# # Use a unique key for the text area to avoid conflicts with other session_state usages
# image_description_prompt = st.text_area("Enter a description for the image you want to generate", key="image_description")
# if st.button("Generate Images"):
# with st.spinner("Analyzing the image ..."):
# # Generate the image and store its URL in session_state
# st.session_state['generated_image_url'] = generate_images(image_description_prompt)
# # Check if the 'generated_image_url' key exists in session_state and display the image and download button
# if 'generated_image_url' in st.session_state and st.session_state['generated_image_url']:
# st.image(st.session_state['generated_image_url'], caption="Generated Image")
# # Fetch the image from the URL to enable downloading
# response = requests.get(st.session_state['generated_image_url'])
# if response.status_code == 200:
# img_bytes = BytesIO(response.content)
# st.download_button(
# label="Download Image",
# data=img_bytes,
# file_name="generated_image.png",
# mime="image/png",
# type="primary"
# )
# st.success('Powered by MTSS GPT. AI can make mistakes. Consider checking important information.')
def generate_images(prompt):
response = openai.images.generate(
model="dall-e-3",
prompt=prompt,
size="1024x1024",
quality="standard",
n=1,
)
image_url = response.data[0].url
return image_url
# Input for image description
# prompt = st.text_input("Enter a description for the image you want to generate")
prompt = st.text_area("Enter a description for the image you want to generate")
# Generate Image button
if st.button("Generate Image"):
generated_image_url = generate_images(prompt)
if generated_image_url:
# st.image(generated_image_url, caption="Generated Image")
# Store the generated image URL in the session state
st.session_state['generated_image_url'] = generated_image_url
# Display the generated image if it's in the session state
if 'generated_image_url' in st.session_state:
st.image(st.session_state['generated_image_url'], caption="Generated Image")
# Fetch the image to download
response = requests.get(st.session_state['generated_image_url'])
if response.status_code == 200:
# Create a download button and provide the image content as a byte stream
st.download_button(
label="Download Image",
data=response.content,
file_name="generated_image.jpg",
mime="image/jpeg"
)
# Show the following options only if an image has been generated
if 'generated_image_url' in st.session_state:
# Toggle for showing additional details input
show_details = st.toggle("Add details about the image.", value=False)
if show_details:
# Text input for additional details about the image, shown only if toggle is True
additional_details = st.text_area(
"The details could include specific information that is important to include in the alt text or reflect why the image is being used:",
disabled=not show_details
)
# Toggle for modifying the prompt for complex images
complex_image = st.toggle("Is this a complex image? ", value=False)
if complex_image:
# Text input for additional details about the image, shown only if toggle is True
complex_image_details = st.caption(
"By clicking this toggle, it will inform MTSS.ai to create a description that exceeds the 125 character limit. "
"Add the description in a placeholder behind the image and 'Description in the content placeholder' in the alt text box. "
)
# Analyze Image button
# Button to trigger the analysis
analyze_button = st.button("Analyze the Image", type="secondary")
# Optimized prompt for complex images
complex_image_prompt_text = (
"As an expert in image accessibility and alternative text, thoroughly describe the image provided. "
"Provide a brief description using not more than 500 characters that convey the essential information conveyed by the image in eight or fewer clear and concise sentences. "
"Skip phrases like 'image of' or 'picture of.' "
"Your description should form a clear, well-structured, and factual paragraph that avoids bullet points, focusing on creating a seamless narrative."
)
# Check if an image has been uploaded, if the API key is available, and if the button has been pressed
if analyze_button:
with st.spinner("Analyzing the image ..."):
# Determine which prompt to use based on the complexity of the image
if complex_image:
prompt_text = complex_image_prompt_text
else:
prompt_text = (
"As an expert in image accessibility and alternative text, succinctly describe the image provided in less than 125 characters. "
"Provide a brief description using not more than 125 characters that convey the essential information conveyed by the image in three or fewer clear and concise sentences for use as alt text. "
"Skip phrases like 'image of' or 'picture of.' "
"Your description should form a clear, well-structured, and factual paragraph that avoids bullet points and newlines, focusing on creating a seamless narrative that serves as effective alternative text for accessibility purposes."
)
if show_details and additional_details:
prompt_text += (
f"\n\nAdditional Context Provided by the User:\n{additional_details}"
)
# Create the payload for the completion request
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": prompt_text},
{
"type": "image_url",
"image_url": st.session_state['generated_image_url'],
},
],
}
]
# Make the request to the OpenAI API
try:
# Without Stream
# response = openai.chat.completions.create(
# model="gpt-4-vision-preview", messages=messages, max_tokens=250, stream=False
# )
# Stream the response
full_response = ""
message_placeholder = st.empty()
for completion in openai.chat.completions.create(
model="gpt-4-vision-preview", messages=messages,
max_tokens=1200, stream=True
):
# Check if there is content to display
if completion.choices[0].delta.content is not None:
full_response += completion.choices[0].delta.content
message_placeholder.markdown(full_response + "▌")
# Final update to placeholder after the stream ends
message_placeholder.markdown(full_response)
# # Display the response in a text area
# st.text_area('Response:', value=full_response, height=250, key="response_text_area")
st.success('Powered by MTSS GPT. AI can make mistakes. Consider checking important information.')
except Exception as e:
st.error(f"An error occurred: {e}")
# else:
# # Warnings for user action required
# if not st.session_state['generated_image_url'] and analyze_button:
# st.warning("Please upload an image.")