RAHMAN00700 commited on
Commit
743982a
·
unverified ·
1 Parent(s): 04bd8d0

Create app1.py

Browse files
Files changed (1) hide show
  1. app1.py +141 -0
app1.py ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import base64
3
+ from PIL import Image
4
+ import os
5
+ from dotenv import load_dotenv
6
+ import requests
7
+
8
+ # Load environment variables
9
+ load_dotenv()
10
+ api_key = os.getenv("IBM_API_KEY")
11
+
12
+ def convert_image_to_base64(uploaded_file):
13
+ """Convert uploaded image to Base64 format."""
14
+ bytes_data = uploaded_file.getvalue()
15
+ base64_image = base64.b64encode(bytes_data).decode()
16
+ return base64_image
17
+
18
+ def get_auth_token(api_key):
19
+ """Retrieve authentication token using IBM API key."""
20
+ auth_url = "https://iam.cloud.ibm.com/identity/token"
21
+
22
+ headers = {
23
+ "Content-Type": "application/x-www-form-urlencoded",
24
+ "Accept": "application/json"
25
+ }
26
+
27
+ data = {
28
+ "grant_type": "urn:ibm:params:oauth:grant-type:apikey",
29
+ "apikey": api_key
30
+ }
31
+
32
+ response = requests.post(auth_url, headers=headers, data=data, verify=False)
33
+
34
+ if response.status_code == 200:
35
+ return response.json().get("access_token")
36
+ else:
37
+ raise Exception("Failed to get authentication token")
38
+
39
+ def main():
40
+ st.title("Chat with Images")
41
+
42
+ # Initialize chat history and uploaded file state
43
+ if "messages" not in st.session_state:
44
+ st.session_state.messages = []
45
+ if "uploaded_file" not in st.session_state:
46
+ st.session_state.uploaded_file = None
47
+
48
+ # Clear uploaded image button
49
+ if st.session_state.uploaded_file:
50
+ if st.button("Clear Uploaded Image"):
51
+ st.session_state.uploaded_file = None
52
+ st.session_state.messages = []
53
+
54
+ # User input: Upload an image
55
+ uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])
56
+ if uploaded_file is not None:
57
+ st.session_state.uploaded_file = uploaded_file
58
+ image = Image.open(uploaded_file)
59
+ with st.chat_message("user"):
60
+ st.image(image, caption='Uploaded Image', use_container_width=True)
61
+ base64_image = convert_image_to_base64(uploaded_file)
62
+ st.session_state.messages.append({"role": "user", "content": [{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{base64_image}"}}]})
63
+
64
+ # Display chat messages
65
+ for msg in st.session_state.messages[1:]:
66
+ if msg['role'] == "user":
67
+ with st.chat_message("user"):
68
+ if msg['content'][0]['type'] == "text":
69
+ st.write(msg['content'][0]['text'])
70
+ else:
71
+ st.chat_message("assistant").write(msg["content"])
72
+
73
+ # User input: Chat message
74
+ user_input = st.chat_input("Type your message here...")
75
+
76
+ if user_input:
77
+ message = {"role": "user", "content": [{"type": "text", "text": user_input}]}
78
+ st.session_state.messages.append(message)
79
+ st.chat_message(message['role']).write(user_input)
80
+
81
+ # Prepare and send API request
82
+ url = "https://us-south.ml.cloud.ibm.com/ml/v1/text/chat?version=2023-05-29"
83
+
84
+ model_messages = []
85
+ latest_image_url = None
86
+ for msg in st.session_state.messages:
87
+ if msg["role"] == "user" and isinstance(msg["content"], list):
88
+ content = []
89
+ for item in msg["content"]:
90
+ if item["type"] == "text":
91
+ content.append(item)
92
+ elif item["type"] == "image_url":
93
+ latest_image_url = item
94
+ if latest_image_url:
95
+ content.append(latest_image_url)
96
+ model_messages.append({"role": msg["role"], "content": content})
97
+ else:
98
+ model_messages.append({"role": msg["role"], "content": [{"type": "text", "text": msg["content"]}] if isinstance(msg["content"], str) else msg["content"]})
99
+
100
+ body = {
101
+ "messages": [model_messages[-1]],
102
+ "project_id": "833c9053-ef07-455e-819f-6557dea2f8bc",
103
+ "model_id": "meta-llama/llama-3-2-90b-vision-instruct",
104
+ "decoding_method": "greedy",
105
+ "repetition_penalty": 1,
106
+ "max_tokens": 900
107
+ }
108
+
109
+ try:
110
+ YOUR_ACCESS_TOKEN = get_auth_token(api_key)
111
+
112
+ headers = {
113
+ "Accept": "application/json",
114
+ "Content-Type": "application/json",
115
+ "Authorization": f"Bearer {YOUR_ACCESS_TOKEN}"
116
+ }
117
+
118
+ response = requests.post(
119
+ url,
120
+ headers=headers,
121
+ json=body
122
+ )
123
+
124
+ if response.status_code == 200:
125
+ res_content = response.json()['choices'][0]['message']['content']
126
+ if isinstance(res_content, list):
127
+ res_content = " ".join([item.get("text", "") for item in res_content])
128
+ st.session_state.messages.append({"role": "assistant", "content": res_content})
129
+ with st.chat_message("assistant"):
130
+ st.write(res_content)
131
+ else:
132
+ error_message = "Sorry, I couldn't process your request. Please try again later."
133
+ st.session_state.messages.append({"role": "assistant", "content": error_message})
134
+ with st.chat_message("assistant"):
135
+ st.write(error_message)
136
+
137
+ except Exception as e:
138
+ st.error(f"An error occurred: {e}")
139
+
140
+ if __name__ == "__main__":
141
+ main()