Update app.py
Browse files
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 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
|
|
|
|
|
|
|
|
|
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 |
-
|
558 |
-
|
559 |
-
|
560 |
-
|
|
|
|
|
|
|
|
|
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.
|
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
|
658 |
-
st.session_state['paste_image_base64']
|
659 |
-
|
660 |
-
|
661 |
-
|
662 |
-
|
663 |
-
|
664 |
-
|
665 |
-
|
666 |
-
|
667 |
-
|
668 |
-
|
669 |
-
|
670 |
-
|
671 |
-
|
672 |
-
|
673 |
-
|
674 |
-
|
675 |
-
|
|
|
|
|
|
|
|
|
|
|
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()
|