File size: 9,178 Bytes
ad1818d
 
 
b00cf2f
f97405c
ad1818d
f340460
 
 
 
ad1818d
 
9acdb45
ad1818d
 
 
f372ab5
ad1818d
 
9acdb45
ad1818d
 
c7f81eb
ad1818d
 
 
c7f81eb
 
 
2ded96a
a3f9924
ad1818d
9acdb45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2ded96a
 
9acdb45
2ded96a
 
9acdb45
2ded96a
 
 
 
9acdb45
 
 
ad1818d
9acdb45
 
 
 
 
 
 
b7c83d7
9acdb45
 
b7c83d7
9acdb45
 
b7c83d7
 
9acdb45
b7c83d7
 
9acdb45
 
 
b7c83d7
9acdb45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ad1818d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
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.")