awacke1 commited on
Commit
fdd5ded
·
verified ·
1 Parent(s): 4bc0956

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -32
app.py CHANGED
@@ -261,7 +261,6 @@ async def save_chat_entry(username, message, voice, is_markdown=False):
261
  with open(HISTORY_FILE, 'a') as f:
262
  f.write(f"[{timestamp}] {username}: Audio - {audio_file}\n")
263
  st.session_state['mp3_files'][os.path.basename(audio_file)] = (len(st.session_state['chat_history']) + 1, audio_file)
264
- # Clear the text input if it matches the message and this was from speech
265
  if st.session_state.get('speech_processed', False) and st.session_state.get('message_input', '') == message:
266
  st.session_state['message_input'] = ""
267
  st.session_state['speech_processed'] = False
@@ -299,13 +298,17 @@ async def perform_claude_search(query, username, image=None):
299
  "data": img_base64
300
  }
301
  })
302
- response = client.messages.create(
303
- model="claude-3-sonnet-20240229",
304
- max_tokens=1000,
305
- messages=[{"role": "user", "content": message_content}]
306
- )
307
- result = response.content[0].text
308
- st.markdown(f"### Claude's Reply 🧠\n{result}")
 
 
 
 
309
 
310
  voice = FUN_USERNAMES.get(username, "en-US-AriaNeural")
311
  md_file, audio_file = await save_chat_entry(username, f"Claude Search: {query}\nResponse: {result}", voice, True)
@@ -554,10 +557,14 @@ async def save_pasted_image(image, username, prompt=""):
554
  timestamp = format_timestamp_prefix(username)
555
  filename = f"{timestamp}-{clean_text_for_filename(context)}-{img_hash}.png"
556
  filepath = filename
557
- image.save(filepath, "PNG")
558
- st.session_state.image_hashes.add(img_hash)
559
- await save_chat_entry(username, f"Pasted image: {filepath}", FUN_USERNAMES.get(username, "en-US-AriaNeural"))
560
- return filepath
 
 
 
 
561
 
562
  # 📦 Zip Files
563
  def create_zip_of_files(files, prefix="All", query="latest"):
@@ -598,9 +605,10 @@ def paste_image_component():
598
  base64_str = paste_input.split(',')[1]
599
  img_bytes = base64.b64decode(base64_str)
600
  img = Image.open(io.BytesIO(img_bytes))
 
601
  return img
602
  except Exception as e:
603
- st.warning(f"Error decoding pasted image: {e}")
604
  return None
605
  else:
606
  st.warning("Clipboard does not contain a valid image (expected base64 data:image)")
@@ -654,25 +662,30 @@ def main():
654
  message = st.text_input(f"Message as {st.session_state.username}", key="message_input")
655
 
656
  pasted_image = paste_image_component()
657
- if pasted_image is not None and st.session_state['paste_image_base64'] != base64.b64encode(pasted_image.tobytes()).decode('utf-8'):
658
- st.session_state['paste_image_base64'] = base64.b64encode(pasted_image.tobytes()).decode('utf-8')
659
- voice = FUN_USERNAMES.get(st.session_state.username, "en-US-AriaNeural")
660
- st.image(pasted_image, caption="Pasted Image")
661
- image_prompt = st.text_input("Add a prompt for Claude (e.g., 'OCR this image')", key="image_prompt")
662
- filename = asyncio.run(save_pasted_image(pasted_image, st.session_state.username, image_prompt))
663
- if filename:
664
- st.session_state.pasted_image_data = filename
665
- if image_prompt:
666
- md_file_claude, audio_file_claude, claude_result = asyncio.run(
667
- perform_claude_search(image_prompt, st.session_state.username, paved_image)
668
- )
669
- if audio_file_claude:
670
- play_and_download_audio(audio_file_claude)
671
- md_file_arxiv, audio_file_arxiv = asyncio.run(
672
- perform_arxiv_search(image_prompt, st.session_state.username, claude_result)
673
- )
674
- if audio_file_arxiv:
675
- play_and_download_audio(audio_file_arxiv)
 
 
 
 
 
676
  st.session_state.pasted_image_data = None
677
  st.session_state['paste_image_base64'] = ""
678
  st.session_state.timer_start = time.time()
 
261
  with open(HISTORY_FILE, 'a') as f:
262
  f.write(f"[{timestamp}] {username}: Audio - {audio_file}\n")
263
  st.session_state['mp3_files'][os.path.basename(audio_file)] = (len(st.session_state['chat_history']) + 1, audio_file)
 
264
  if st.session_state.get('speech_processed', False) and st.session_state.get('message_input', '') == message:
265
  st.session_state['message_input'] = ""
266
  st.session_state['speech_processed'] = False
 
298
  "data": img_base64
299
  }
300
  })
301
+ try:
302
+ response = client.messages.create(
303
+ model="claude-3-sonnet-20240229",
304
+ max_tokens=1000,
305
+ messages=[{"role": "user", "content": message_content}]
306
+ )
307
+ result = response.content[0].text
308
+ st.markdown(f"### Claude's Reply 🧠\n{result}")
309
+ except Exception as e:
310
+ st.error(f"Claude processing failed: {e}")
311
+ return None, None, None
312
 
313
  voice = FUN_USERNAMES.get(username, "en-US-AriaNeural")
314
  md_file, audio_file = await save_chat_entry(username, f"Claude Search: {query}\nResponse: {result}", voice, True)
 
557
  timestamp = format_timestamp_prefix(username)
558
  filename = f"{timestamp}-{clean_text_for_filename(context)}-{img_hash}.png"
559
  filepath = filename
560
+ try:
561
+ image.save(filepath, "PNG")
562
+ st.session_state.image_hashes.add(img_hash)
563
+ await save_chat_entry(username, f"Pasted image saved: {filepath}", FUN_USERNAMES.get(username, "en-US-AriaNeural"))
564
+ return filepath
565
+ except Exception as e:
566
+ st.error(f"Failed to save image: {e}")
567
+ return None
568
 
569
  # 📦 Zip Files
570
  def create_zip_of_files(files, prefix="All", query="latest"):
 
605
  base64_str = paste_input.split(',')[1]
606
  img_bytes = base64.b64decode(base64_str)
607
  img = Image.open(io.BytesIO(img_bytes))
608
+ st.image(img, caption="Image Pasted Successfully", use_column_width=True) # Immediate feedback
609
  return img
610
  except Exception as e:
611
+ st.error(f"Error decoding pasted image: {e}")
612
  return None
613
  else:
614
  st.warning("Clipboard does not contain a valid image (expected base64 data:image)")
 
662
  message = st.text_input(f"Message as {st.session_state.username}", key="message_input")
663
 
664
  pasted_image = paste_image_component()
665
+ if pasted_image is not None:
666
+ if st.session_state['paste_image_base64'] != base64.b64encode(pasted_image.tobytes()).decode('utf-8'):
667
+ st.session_state['paste_image_base64'] = base64.b64encode(pasted_image.tobytes()).decode('utf-8')
668
+ voice = FUN_USERNAMES.get(st.session_state.username, "en-US-AriaNeural")
669
+ image_prompt = st.text_input("Add a prompt for Claude (e.g., 'OCR this image')", key="image_prompt", value="")
670
+ with st.spinner("Saving image..."):
671
+ filename = asyncio.run(save_pasted_image(pasted_image, st.session_state.username, image_prompt))
672
+ if filename:
673
+ st.session_state.pasted_image_data = filename
674
+ st.success(f"Image saved as: {filename}")
675
+ if image_prompt:
676
+ with st.spinner("Processing with Claude..."):
677
+ md_file_claude, audio_file_claude, claude_result = asyncio.run(
678
+ perform_claude_search(image_prompt, st.session_state.username, pasted_image)
679
+ )
680
+ if audio_file_claude:
681
+ play_and_download_audio(audio_file_claude)
682
+ if claude_result:
683
+ with st.spinner("Searching ArXiv..."):
684
+ md_file_arxiv, audio_file_arxiv = asyncio.run(
685
+ perform_arxiv_search(image_prompt, st.session_state.username, claude_result)
686
+ )
687
+ if audio_file_arxiv:
688
+ play_and_download_audio(audio_file_arxiv)
689
  st.session_state.pasted_image_data = None
690
  st.session_state['paste_image_base64'] = ""
691
  st.session_state.timer_start = time.time()