import streamlit as st import base64 import openai # Function to encode the image to base64 def encode_image(image_file): return base64.b64encode(image_file.getvalue()).decode("utf-8") # Streamlit page setup st.set_page_config(page_title="MTSS Image Accessibility Alt Text Generator", 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.title('MTSS VisionText™ | Accessibility') st.subheader(':green[_Image Alt Text Generator_]') # Retrieve the OpenAI API Key from secrets openai.api_key = st.secrets["openai_api_key"] # File uploader allows user to add their own image uploaded_file = st.file_uploader("Upload an image", type=["jpg", "png", "jpeg"]) if uploaded_file: # Display the uploaded image with st.expander("Image", expanded = True): st.image(uploaded_file, caption=uploaded_file.name, use_column_width=True) # 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( "Add any additional details or context about the image here:", disabled=not show_details ) # Button to trigger the analysis analyze_button = st.button("Analyse the Image", type="secondary") # Check if an image has been uploaded, if the API key is available, and if the button has been pressed if uploaded_file is not None and analyze_button: with st.spinner("Analyzing the image ..."): # Encode the image base64_image = encode_image(uploaded_file) # Optimized prompt for additional clarity and detail prompt_text = ( "You are a highly knowledgeable accessibility expert. " "Your task is to examine the following image in detail. " "Provide a comprehensive, factual, and accurate explanation of what the image depicts. " "Highlight key elements and their significance, and present your analysis in clear, well-structured markdown format. " "Create a detailed image caption in explaining in 150 words or less." ) 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": f"data:image/jpeg;base64,{base64_image}", }, ], } ] # Make the request to the OpenAI API try: # Without Stream # response = openai.chat.completions.create( # model="gpt-4-vision-preview", messages=messages, max_tokens=500, 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=150, 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 the app # st.write(response.choices[0].message.content) except Exception as e: st.error(f"An error occurred: {e}") else: # Warnings for user action required if not uploaded_file and analyze_button: st.warning("Please upload an image.")