File size: 3,946 Bytes
8ffbf51
c73a6b4
 
 
6e2e0c5
03e23d5
7c56b7b
2e0de3d
da44c3d
c73a6b4
c32572d
 
 
 
 
c73a6b4
 
 
 
 
 
3b73913
c73a6b4
a93e14b
 
120448f
a93e14b
 
 
8ffbf51
120448f
c73a6b4
 
 
a93e14b
e17b907
c73a6b4
7c56b7b
99dbe33
 
 
 
 
 
 
 
 
 
6e2e0c5
c73a6b4
 
a93e14b
c32572d
c73a6b4
 
03e23d5
8ffbf51
c73a6b4
6e2e0c5
fc4d401
2e0de3d
6e2e0c5
fc4d401
9304e0e
60a9d6a
fc4d401
 
d6030a5
fc4d401
 
 
99dbe33
d6030a5
 
 
 
 
 
ecfb0cd
60a9d6a
2e0de3d
99dbe33
 
c73a6b4
fc4d401
 
 
 
c73a6b4
8b45070
2e0de3d
 
 
8b45070
 
 
 
 
 
0510f64
 
 
 
2e0de3d
 
 
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
import streamlit as st
import requests
import os
import base64
from PIL import Image
from io import BytesIO  # Correctly import BytesIO from the io module

# Set page title and layout
st.set_page_config(page_title="Image Caption Generator", layout="wide") 

# API key from environment variable
API_KEY = os.environ.get("NEBIUS_API_KEY")

if not API_KEY:
    st.error("API key not found. Please set the `NEBIUS_API_KEY` environment variable.")

# Function to call Nebius API
def generate_caption(image_base64, api_key):
    api_url = "https://api.studio.nebius.ai/v1/chat/completions"
    headers = {"Authorization": f"Bearer {api_key}"}
    payload = {
        "model": "Qwen/Qwen2-VL-7B-Instruct",
        "messages": [
            {
                "role": "system",
                "content": """You are an image to text prompt converter for AI image generation""",
            },
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": "Describe This Image In Detail under 100 words in this format: [image content/subject, description of action, state, and mood], [art form, style], [artist/photographer reference if needed], [additional settings such as camera and lens settings, lighting, colors, effects, texture, background, rendering]."},
                    {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{image_base64}"}},
                ],
            },
        ],
        "temperature": 0.6,
    }

    try:
        response = requests.post(api_url, json=payload, headers=headers)
        if response.status_code == 200:
            return response.json()
        else:
            st.error(f"API Error: {response.status_code}, {response.text}")
            return {"error": response.text}
    except Exception as e:
        st.error(f"An exception occurred: {e}")
        return {"error": str(e)}

# File uploader for image
uploaded_image = st.file_uploader("Upload an image", type=["png", "jpg", "jpeg"])

if uploaded_image and API_KEY:
    # Convert the image to base64
    image = Image.open(uploaded_image)
    buffered = BytesIO()  # Use BytesIO from the io module
    image.save(buffered, format="PNG")
    image_base64 = base64.b64encode(buffered.getvalue()).decode()

    # Show the uploaded image
    st.image(image, caption="Uploaded Image", use_container_width=True)

    # Add a button to trigger caption generation
    if st.button("Generate Prompt", use_container_width=True):
        st.write("Generating Prompt...")
        result = generate_caption(image_base64, API_KEY)

        # Extract and display the generated caption
        if "error" in result:
            st.error(f"Error: {result['error']}")
        else:
            try:
                # Extract the caption from the response
                caption = (
                    result.get("choices", [{}])[0]
                    .get("message", {})
                    .get("content", "No caption generated.")
                )
                
                st.text_area("Prompt Generated", caption, height=200, key="caption_output")

            except Exception as e:
                st.error(f"Error processing the response: {e}")
else:
    if not API_KEY:
        st.warning("Please set the `NEBIUS_API_KEY` environment variable.")
    else:
        st.info("Please upload an image.")

# Remove the sidebar and center the content
st.markdown(
    """
    <style>
        .css-1d391kg {text-align: center;}
        .css-1v3fvcr {justify-content: center; display: flex;}
        .css-1y4ccs5 {margin: 0 auto;}
        .css-1aumxhk {display: flex; justify-content: center;}
        .css-1k6kn8p {justify-content: center; align-items: center; display: flex;}
        .css-ffhzg6 {text-align: center;}
        textarea {
            color: white !important;
            background-color: #262626 !important;
        }
    </style>
    """, unsafe_allow_html=True
)