IAMTFRMZA commited on
Commit
af56ec6
·
verified ·
1 Parent(s): 5a0ce18

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +53 -32
app.py CHANGED
@@ -166,16 +166,25 @@ with tab1:
166
 
167
 
168
  # ------------------ Tab 2: Visual Reference Search ------------------
169
- with tab2:
170
- st.title("🔍 Visual Reference Search")
171
- user_query = st.text_input("Enter keyword to search images (e.g. ovary, thyroid, mitosis)")
172
 
 
 
173
  if "image_thread_id" not in st.session_state:
174
  st.session_state.image_thread_id = None
175
  if "image_response" not in st.session_state:
176
  st.session_state.image_response = None
 
 
 
 
 
 
 
 
 
 
 
177
 
178
- if st.button("Ask Assistant") and user_query:
179
  try:
180
  if st.session_state.image_thread_id is None:
181
  thread = client.beta.threads.create()
@@ -184,7 +193,7 @@ with tab2:
184
  client.beta.threads.messages.create(
185
  thread_id=st.session_state.image_thread_id,
186
  role="user",
187
- content=user_query
188
  )
189
 
190
  run = client.beta.threads.runs.create(
@@ -192,7 +201,7 @@ with tab2:
192
  assistant_id=ASSISTANT_ID
193
  )
194
 
195
- with st.spinner("🔬 Searching for visual references..."):
196
  while True:
197
  run_status = client.beta.threads.runs.retrieve(
198
  thread_id=st.session_state.image_thread_id,
@@ -204,36 +213,48 @@ with tab2:
204
 
205
  if run_status.status == "completed":
206
  messages = client.beta.threads.messages.list(thread_id=st.session_state.image_thread_id)
207
- for m in reversed(messages.data):
208
- if m.role == "assistant":
209
- st.session_state.image_response = m.content[0].text.value
 
 
 
 
 
 
 
 
 
210
  break
211
- else:
212
- st.error("❌ Assistant failed to return an image match.")
213
  except Exception as e:
214
- st.error(f"Error: {e}")
215
 
216
- # Display assistant response and render images
217
- if st.session_state.image_response:
218
- st.markdown("### 🧠 Assistant Response")
219
- st.markdown(st.session_state.image_response, unsafe_allow_html=True)
220
 
221
- # More robust regex to extract URLs even with encoded characters and line breaks
222
- url_matches = re.findall(
223
- r'https://raw\.githubusercontent\.com/[^\s)>\]]+\.png',
224
- st.session_state.image_response.replace("\n", " ")
225
- )
226
 
227
- if url_matches:
 
228
  st.markdown("### 🖼️ Image Preview(s)")
229
- for url in url_matches:
230
- try:
231
- response = requests.get(url, timeout=5)
232
- response.raise_for_status()
233
- img = Image.open(BytesIO(response.content))
234
- st.image(img, caption=url.split("/")[-1], use_container_width=True)
235
- except Exception as e:
236
- st.warning(f"⚠️ Could not load image: {url}")
237
- st.error(f"🛑 Error: {str(e)}")
 
238
  else:
239
- st.info("ℹ️ No valid image URLs found in the assistant's response.")
 
 
 
 
 
 
 
166
 
167
 
168
  # ------------------ Tab 2: Visual Reference Search ------------------
 
 
 
169
 
170
+ with tab2:
171
+ ASSISTANT_ID = "asst_9v09zgizdcuuhNdcFQpRo9RO" # Your pathology assistant
172
  if "image_thread_id" not in st.session_state:
173
  st.session_state.image_thread_id = None
174
  if "image_response" not in st.session_state:
175
  st.session_state.image_response = None
176
+ if "image_results" not in st.session_state:
177
+ st.session_state.image_results = []
178
+ if "image_lightbox" not in st.session_state:
179
+ st.session_state.image_lightbox = None
180
+
181
+ # User input for assistant
182
+ image_input = st.chat_input("Ask for histology visual references (e.g. ovary histology, mitosis)")
183
+ if image_input:
184
+ st.session_state.image_response = None
185
+ st.session_state.image_results = []
186
+ st.session_state.image_lightbox = None
187
 
 
188
  try:
189
  if st.session_state.image_thread_id is None:
190
  thread = client.beta.threads.create()
 
193
  client.beta.threads.messages.create(
194
  thread_id=st.session_state.image_thread_id,
195
  role="user",
196
+ content=image_input
197
  )
198
 
199
  run = client.beta.threads.runs.create(
 
201
  assistant_id=ASSISTANT_ID
202
  )
203
 
204
+ with st.spinner("🔬 Searching for histology references..."):
205
  while True:
206
  run_status = client.beta.threads.runs.retrieve(
207
  thread_id=st.session_state.image_thread_id,
 
213
 
214
  if run_status.status == "completed":
215
  messages = client.beta.threads.messages.list(thread_id=st.session_state.image_thread_id)
216
+ for msg in reversed(messages.data):
217
+ if msg.role == "assistant":
218
+ response_text = msg.content[0].text.value
219
+ st.session_state.image_response = response_text
220
+
221
+ # Try to extract structured data (JSON-like block) if present
222
+ try:
223
+ st.session_state.image_results = json.loads(response_text.strip("`json "))
224
+ except:
225
+ # Fallback to manually extract all GitHub image URLs
226
+ urls = re.findall(r'https://raw\.githubusercontent\.com/[^\s)>\]]+\.png', response_text.replace("\n", " "))
227
+ st.session_state.image_results = [{"image": url} for url in urls]
228
  break
 
 
229
  except Exception as e:
230
+ st.error(f"❌ Visual Assistant Error: {e}")
231
 
232
+ # Display split UI (image results right, response text left)
233
+ text_col, image_col = st.columns([2, 1])
 
 
234
 
235
+ with text_col:
236
+ if st.session_state.image_response:
237
+ st.markdown("### 🧠 Assistant Response")
238
+ st.markdown(st.session_state.image_response, unsafe_allow_html=True)
 
239
 
240
+ with image_col:
241
+ if st.session_state.image_results:
242
  st.markdown("### 🖼️ Image Preview(s)")
243
+ for i, item in enumerate(st.session_state.image_results):
244
+ image_url = item.get("image") or item.get("Image URL") or item.get("ImageURL")
245
+ if image_url:
246
+ try:
247
+ st.image(image_url, caption=image_url.split("/")[-1], use_container_width=True)
248
+ if st.button("🖼️ View Full Image", key=f"img_{i}"):
249
+ st.session_state.image_lightbox = image_url
250
+ except Exception as e:
251
+ st.warning(f"⚠️ Could not load: {image_url}")
252
+ st.error(f"{e}")
253
  else:
254
+ st.info("ℹ️ No image references found yet.")
255
+
256
+ if st.session_state.image_lightbox:
257
+ st.image(st.session_state.image_lightbox, caption="🔍 Full Image View", use_container_width=True)
258
+ if st.button("❌ Close Preview"):
259
+ st.session_state.image_lightbox = None
260
+ st.rerun()