File size: 2,515 Bytes
4def1b3
 
 
 
 
 
 
 
91dc4f7
 
4def1b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import streamlit as st
from src.tools.accent_tool import AccentAnalyzerTool
from src.app.main_agent import create_agent
from langchain_core.messages import HumanMessage, AIMessage
import re

st.set_page_config(page_title="Accent Analyzer Agent", page_icon="💬", layout="centered")

st.warning("⚠️ High latency due to CPU usage. Once migrated to GPU, response time will improve significantly.")

st.title("English Accent Analyzer (Conversational)")
st.subheader("Ask me to analyze a video URL, e.g.: \n\n `Analyze this video: https://your-link.com/video.mp4`")

@st.cache_resource
def load_tool_and_agent():
    tool = AccentAnalyzerTool()
    analysis_agent, follow_up_agent = create_agent(tool)
    return tool, analysis_agent, follow_up_agent

accent_tool_obj, analysis_agent, follow_up_agent = load_tool_and_agent()

if "chat_history" not in st.session_state:
    st.session_state.chat_history = []

if hasattr(accent_tool_obj, "last_transcript") and accent_tool_obj.last_transcript:
    prompt_label = "Ask more about the video..."
    input_key = "followup"
else:
    prompt_label = "Paste your prompt here..."
    input_key = "initial"

user_input = st.chat_input(prompt_label, key=input_key)

# Variable to defer assistant response
deferred_response = None
deferred_spinner_msg = ""

if user_input:
    st.session_state.chat_history.append(HumanMessage(content=user_input))

    if re.search(r'https?://\S+', user_input):
        accent_tool_obj.last_transcript = ""
        deferred_spinner_msg = "Analyzing new video..."
        def run_agent():
            return analysis_agent.invoke(st.session_state.chat_history)[-1].content
    else:
        deferred_spinner_msg = "Responding based on transcript..."
        def run_agent():
            return follow_up_agent.invoke(st.session_state.chat_history).content

    # Run response generation inside spinner after chat is rendered
    def process_response():
        with st.spinner(deferred_spinner_msg):
            try:
                result = run_agent()
            except Exception as e:
                result = f"Error: {str(e)}"
            st.session_state.chat_history.append(AIMessage(content=result))
            st.rerun() 

# Display full chat history (before running spinner)
for msg in st.session_state.chat_history:
    with st.chat_message("user" if isinstance(msg, HumanMessage) else "assistant"):
        st.markdown(msg.content)

# Only process response at the bottom, after chat is shown
if user_input:
    process_response()