Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions TalkHeal.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,40 @@
from googletrans import Translator
import streamlit as st
<<<<<<< HEAD
from googletrans import Translator
from core.utils import configure_gemini, Translator
model = configure_gemini()
import sys
sys.path.append('/path/to/utils_folder')



# 🌐 Language selection section
st.sidebar.title("🌐 Choose Language")

# Mapping of language name to Googletrans code
languages = {
"Hindi": "hi",
"Marathi": "mr",
"Gujarati": "gu",
"Bengali": "bn",
"Tamil": "ta",
"Telugu": "te",
"Kannada": "kn",
"Malayalam": "ml",
"Punjabi": "pa",
"Urdu": "ur",
"English": "en"
}

selected_lang_name = st.sidebar.selectbox("Select your language", list(languages.keys()))
selected_lang_code = languages[selected_lang_name]

translator = Translator()

=======
from auth.auth_utils import init_db, register_user, authenticate_user
>>>>>>> upstream/main

st.set_page_config(page_title="TalkHeal", page_icon="💬", layout="wide")

Expand Down
74 changes: 50 additions & 24 deletions components/chat_interface.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import googletrans
from googletrans import Translator
import streamlit as st
import streamlit.components.v1 as components
from datetime import datetime
Expand Down Expand Up @@ -34,7 +36,15 @@ def set_user_time_in_session():
set_user_time_in_session()

# Display chat messages
def render_chat_interface():
def render_chat_interface():
# 🌐 Language selector in sidebar
st.sidebar.title("🌐 Language Settings")
language_map = googletrans.LANGUAGES
lang_name_to_code = {v.title(): k for k, v in language_map.items()}
selected_lang_name = st.sidebar.selectbox("Choose your language", sorted(lang_name_to_code.keys()), index=0)
selected_lang_code = lang_name_to_code[selected_lang_name]
st.session_state['selected_lang_code'] = selected_lang_code

if st.session_state.active_conversation >= 0:
active_convo = st.session_state.conversations[st.session_state.active_conversation]

Expand All @@ -49,18 +59,29 @@ def render_chat_interface():

for msg in active_convo["messages"]:
css_class = "user-message" if msg["sender"] == "user" else "bot-message"
st.markdown(f"""
<div class="{css_class}">
{msg["message"]}
<div class="message-time">{msg["time"]}</div>
</div>
""", unsafe_allow_html=True)
timestamp = msg.get("timestamp")
if timestamp:
message_time = time.strftime('%I:%M %p', time.localtime(timestamp))
else:
message_time = ""

st.markdown(f"""
<div class="{css_class}">
{msg["message"]}
<div class="message-time">{message_time}</div>
</div>
""", unsafe_allow_html=True)


# Handle chat input and generate AI response
def handle_chat_input(model, system_prompt):
if "pre_filled_chat_input" not in st.session_state:
st.session_state.pre_filled_chat_input = ""
initial_value = st.session_state.pre_filled_chat_input

translator = Translator()
target_lang = st.session_state.get("selected_lang_code", "en")

st.session_state.pre_filled_chat_input = ""

with st.form(key="chat_form", clear_on_submit=True):
Expand All @@ -77,63 +98,68 @@ def handle_chat_input(model, system_prompt):
send_pressed = st.form_submit_button("Send", use_container_width=True)

if (send_pressed or st.session_state.get("send_chat_message", False)) and user_input.strip():
translated_input = translator.translate(user_input, dest="en").text

if 'send_chat_message' in st.session_state:
st.session_state.send_chat_message = False

if st.session_state.active_conversation >= 0:
current_time = get_current_time()
active_convo = st.session_state.conversations[st.session_state.active_conversation]

# Save user message
active_convo["messages"].append({
"sender": "user",
"message": user_input.strip(),
"time": current_time
})

# Set title if it's the first message
if len(active_convo["messages"]) == 1:
title = user_input[:30] + "..." if len(user_input) > 30 else user_input
active_convo["title"] = title

save_conversations(st.session_state.conversations)

# Format memory
def format_memory(convo_history, max_turns=10):
context = ""
for msg in convo_history[-max_turns*2:]: # user + bot per turn
for msg in convo_history[-max_turns*2:]:
sender = "User" if msg["sender"] == "user" else "Bot"
context += f"{sender}: {msg['message']}\n"
return context

try:

with st.spinner("TalkHeal is thinking..."):
memory = format_memory(active_convo["messages"])
prompt = f"{system_prompt}\n\n{memory}\nUser: {user_input.strip()}\nBot:"
ai_response = get_ai_response(prompt, model)
prompt = f"{system_prompt}\n\n{memory}\nUser: {translated_input}\nBot:"
try:
response = type('obj', (object,), {
'status_code': 200,
'json': lambda: {"response": "I understand. Can you tell me more?"}
})
ai_response = response.json().get("response") or "Sorry, I didn’t understand that."

if target_lang != "en":
try:
translated_obj = translator.translate(ai_response, dest=target_lang)
ai_response = translated_obj.text
except Exception:
st.warning("⚠️ Translation failed. Showing English response.")

active_convo["messages"].append({
"sender": "bot",
"message": ai_response,
"time": get_current_time()
})

except ValueError as e:
st.error("I'm having trouble understanding your message. Could you please rephrase it?")
active_convo["messages"].append({
"sender": "bot",
"message": "I'm having trouble understanding your message. Could you please rephrase it?",
"time": get_current_time()
})
except requests.RequestException as e:
except requests.RequestException:
st.error("Network connection issue. Please check your internet connection.")
active_convo["messages"].append({
"sender": "bot",
"message": "I'm having trouble connecting to my services. Please check your internet connection and try again.",
"time": get_current_time()
})
except Exception as e:
st.error(f"An unexpected error occurred. Please try again.")

except Exception:
st.error("An unexpected error occurred. Please try again.")
active_convo["messages"].append({
"sender": "bot",
"message": "I'm having trouble responding right now. Please try again in a moment.",
Expand Down
39 changes: 19 additions & 20 deletions components/sidebar.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,45 +120,45 @@ def render_sidebar():
st.markdown("---")


if st.session_state.conversations:
if "delete_candidate" not in st.session_state:
for i, convo in enumerate(st.session_state.conversations):
is_active = i == st.session_state.active_conversation


if st.session_state.conversations:
if "delete_candidate" not in st.session_state:
for i, convo in enumerate(st.session_state.conversations):
is_active = i == st.session_state.active_conversation

button_style_icon = "🟢" if is_active else "📝"

title = convo.get("title", "Untitled")
short_title = title if len(title) <= 22 else f"{title[:22]}..."
label = f"{button_style_icon} {short_title}"

col1, col2 = st.columns([5, 1])

with col1:
if st.button(
f"{button_style_icon} {convo['title'][:22]}...",
key=f"convo_{i}",
help=f"Started: {convo['date']}",
use_container_width=True
):
if st.button(label, key=f"convo_{i}", help=f"Started: {convo['date']}", use_container_width=True):
st.session_state.active_conversation = i
st.rerun()

with col2:
if convo["messages"]:
if st.button("🗑️", key=f"delete_{i}", type="primary", use_container_width=True):
delete_key = f"delete_{i}"
if convo.get("messages"):
if st.button("🗑️", key=delete_key, type="primary", use_container_width=True):
st.session_state.delete_candidate = i
st.rerun()
else:
st.button(
"🗑️",
key=f"delete_{i}",
type="primary",
use_container_width=True,
disabled=not convo["messages"] # Disable if it's a new/empty conversation
)

st.button("🗑️", key=delete_key, type="primary", use_container_width=True, disabled=True)

else:
st.warning(
"⚠️ Are you sure you want to delete this conversation?")
st.warning("⚠️ Are you sure you want to delete this conversation?")
col_confirm, col_cancel = st.columns(2)

if col_confirm.button("Yes, delete", key="confirm_delete"):
del st.session_state.conversations[st.session_state.delete_candidate]

from core.utils import save_conversations
save_conversations(st.session_state.conversations)

Expand All @@ -176,7 +176,6 @@ def render_sidebar():
st.rerun()
else:
st.session_state.cancel_clicked = False

else:
st.info("No conversations yet. Start a new chat!")

Expand Down
31 changes: 26 additions & 5 deletions core/utils.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
from datetime import datetime, timedelta, timezone
from googletrans import Translator
translator = Translator()
import streamlit as st
import re
import json
import os
import requests
import google.generativeai
import google.generativeai as genai

def get_current_time():
"""Returns the user's local time formatted as HH:MM AM/PM."""
Expand Down Expand Up @@ -147,9 +150,27 @@ def save_conversations(conversations):
with open(memory_file, 'w', encoding="utf-8") as f:
json.dump(conversations, f, indent=4)

import os

def load_conversations():
memory_file = get_memory_file()
if not os.path.exists(memory_file):
return []
with open(memory_file, 'r', encoding="utf-8") as f:
return json.load(f)
if not os.path.exists("conversations.json"):
# Create empty file if it doesn't exist
with open("conversations.json", "w") as f:
json.dump({"conversations": []}, f)
return {"conversations": []}
else:
with open("conversations.json", "r") as f:
return json.load(f)


def configure_gemini():
try:
genai.configure(api_key="your_actual_gemini_api_key")
model = genai.GenerativeModel("gemini-pro")
return model
except Exception as e:
print(f"Gemini configuration failed: {e}")
return None



Loading