File size: 5,595 Bytes
7efd637
b6ef90b
c33dbd2
ca8dc25
5ee7ec4
bd796ec
ca8dc25
c33dbd2
c27316e
e98c6cb
c73a06f
c27316e
 
 
04fcd0b
 
c27316e
 
04fcd0b
d107cdf
b66c571
c73a06f
 
 
 
 
b66c571
 
c73a06f
 
 
c27316e
efae69e
 
 
c73a06f
5fc2eb2
efae69e
c27316e
26df791
 
8362128
c73a06f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8362128
26df791
c73a06f
 
 
 
 
 
 
 
deffb23
00c5acf
c73a06f
 
 
 
 
8362128
c73a06f
 
00c5acf
c73a06f
 
 
9dc7fb7
efae69e
bd796ec
293451d
bd796ec
 
efae69e
bd796ec
 
 
26df791
bd796ec
c73a06f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
efae69e
20b1f08
c73a06f
 
 
 
 
 
5fc2eb2
82ee039
c73a06f
 
034341f
20b1f08
c73a06f
 
 
 
efae69e
 
 
c2ebbce
c73a06f
efae69e
c73a06f
efae69e
 
 
82c99b8
efae69e
 
 
 
 
c73a06f
efae69e
c73a06f
034341f
66305c9
034341f
 
8362128
c73a06f
 
 
8362128
c73a06f
7efd637
c33dbd2
8362128
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
import gradio as gr
from PIL import Image
import os
from together import Together
import base64
import io

# Initialize Together client
client = None


def initialize_client(api_key=None):
    global client
    if api_key:
        os.environ["TOGETHER_API_KEY"] = api_key
    if "TOGETHER_API_KEY" in os.environ:
        client = Together()
    else:
        raise ValueError("Please provide a Together API Key")


def encode_image(image_path):
    with Image.open(image_path) as img:
        buffered = io.BytesIO()
        img.save(buffered, format="PNG")
        return base64.b64encode(buffered.getvalue()).decode("utf-8")


def bot_streaming(
    message, history, together_api_key, max_new_tokens=250, temperature=0.7
):
    if client is None:
        try:
            initialize_client(together_api_key)
        except Exception as e:
            history.append((message, f"Error initializing client: {str(e)}"))
            yield history
            return

    prompt = "You are a helpful AI assistant. Analyze the image provided (if any) and respond to the user's query or comment."
    messages = [{"role": "system", "content": prompt}]

    # Add history to messages
    for user_msg, assistant_msg in history:
        if isinstance(user_msg, str):  # Text message
            messages.append(
                {"role": "user", "content": [{"type": "text", "text": user_msg}]}
            )
        elif isinstance(user_msg, dict):  # Image message
            image_base64 = encode_image(user_msg["image_path"])
            messages.append(
                {
                    "role": "user",
                    "content": [
                        {"type": "text", "text": user_msg.get("text", "")},
                        {
                            "type": "image_url",
                            "image_url": {
                                "url": f"data:image/png;base64,{image_base64}"
                            },
                        },
                    ],
                }
            )
        messages.append(
            {"role": "assistant", "content": [{"type": "text", "text": assistant_msg}]}
        )

    # Prepare the current message
    user_message_content = []
    if isinstance(message, dict):
        if message.get("text"):
            user_message_content.append({"type": "text", "text": message["text"]})
        if message.get("files") and len(message["files"]) > 0:
            image_path = message["files"][0]
            image_base64 = encode_image(image_path)
            user_message_content.append(
                {
                    "type": "image_url",
                    "image_url": {"url": f"data:image/png;base64,{image_base64}"},
                }
            )
    elif isinstance(message, str):
        user_message_content.append({"type": "text", "text": message})

    current_message = {"role": "user", "content": user_message_content}
    messages.append(current_message)

    # Add the user's message to the history
    user_display_message = message["text"] if isinstance(message, dict) else message
    history = history + [(user_display_message, "")]

    try:
        stream = client.chat.completions.create(
            model="meta-llama/Llama-Vision-Free",
            messages=messages,
            max_tokens=max_new_tokens,
            temperature=temperature,
            stream=True,
        )

        response = ""
        for chunk in stream:
            if (
                chunk.choices
                and chunk.choices[0].delta
                and chunk.choices[0].delta.content is not None
            ):
                response += chunk.choices[0].delta.content
                # Update the assistant's response in the history
                history[-1] = (user_display_message, response)
                yield history

        if not response:
            history[-1] = (
                user_display_message,
                "No response generated. Please try again.",
            )
            yield history

    except Exception as e:
        error_message = (
            "The image is too large. Please try with a smaller image or compress the existing one."
            if "Request Entity Too Large" in str(e)
            else f"An error occurred: {str(e)}"
        )
        history[-1] = (user_display_message, error_message)
        yield history


# The rest of your Gradio interface code remains the same
with gr.Blocks() as demo:
    gr.Markdown("# Meta Llama-3.2-11B-Vision-Instruct (FREE)")
    gr.Markdown(
        "Try the new Llama 3.2 11B Vision API by Meta for free through Together AI. Upload an image, and start chatting about it. Just paste in your Together AI API key and get started!"
    )

    with gr.Row():
        together_api_key = gr.Textbox(
            label="Together API Key",
            placeholder="Enter your TOGETHER_API_KEY here",
            type="password",
        )

    with gr.Row():
        max_new_tokens = gr.Slider(
            minimum=10,
            maximum=10000,
            value=250,
            step=10,
            label="Maximum number of new tokens",
        )
        temperature = gr.Number(
            value=0.7, minimum=0, maximum=1, step=0.1, label="Temperature"
        )

    chatbot = gr.Chatbot()
    msg = gr.MultimodalTextbox(label="")
    clear = gr.Button("Clear")

    msg.submit(
        bot_streaming,
        [msg, chatbot, together_api_key, max_new_tokens, temperature],
        chatbot,
    )
    clear.click(lambda: None, None, chatbot, queue=False)

if __name__ == "__main__":
    demo.launch(debug=True)