File size: 4,569 Bytes
73bb3e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import streamlit as st
import json
import time
from dotenv import load_dotenv

load_dotenv()

from crew_ai.chatbot import run_user_profile_retrieval, run_recommendations, run_crisis_check, run_condition_classification
from crew_ai.config import get_config

config = get_config()

def full_chat_flow(contextual_query: str, user_query: str, user_id: str = "anon_user"):

    with st.chat_message("user"):
        st.write(st.session_state.chat_history[-1]["content"])

    with st.chat_message("assistant"):
        st.write("πŸ“„ Processing your query...")

    # Retrieve user profile
    if st.session_state.user_profile is None:
        st.session_state.user_profile = run_user_profile_retrieval(user_query, user_id)

    crisis_result = run_crisis_check(contextual_query)
    is_crisis = crisis_result.get("is_crisis", False)
    explanation = crisis_result.get("explanation", "")

    # Store crisis detection in session state
    st.session_state.crisis_detected = is_crisis
    st.session_state.crisis_explanation = explanation

    if is_crisis:
        with st.chat_message("assistant"):
            st.error(f"🚨 Crisis detected: {explanation}")
            st.info("We're prioritizing your safety. Connecting you with the best support now...")
        rec = run_recommendations(
                contextual_query, 
                json.dumps(st.session_state.user_profile), 
                condition="Crisis", 
                answers="{}", 
                interpretation="N/A", 
                is_crisis="true"
            )
        
        # task_outputs = rec.tasks_output
        # retrieved_docs_crisis = task_outputs[0]

        with st.chat_message("assistant"):
            st.write("πŸ†˜ Crisis Support Recommendation:")
            def stream_answer():
                for word in rec["recommendation"].split(" "):
                    yield word + " "
                    time.sleep(0.1)
            st.write_stream(stream_answer)

        return rec
        
        # return {
        #     "recommendation": rec["recommendation"],
        #     "condition": "crisis",
        #     "is_crisis": True,
        #     "crisis_explanation": explanation,
        #     "score_interpretation": "Not applicable",
        #     # "retrieved_docs": retrieved_docs_crisis
        # }

    with st.chat_message("assistant"):
        st.write("βœ… No immediate crisis detected.")
        st.write("πŸ” Let's understand your mental health condition...")

    condition_result = run_condition_classification(contextual_query, json.dumps(st.session_state.user_profile))
    condition = condition_result.get("condition", "general").split(" ")[0].lower()
    condition_explanation = condition_result.get("rationale", "")
    questionnaire_name = config["CONDITION_TO_QUESTIONNAIRE"].get(condition)

    # Store condition detection in session state
    st.session_state.detected_condition = condition
    st.session_state.condition_explanation = condition_explanation

    with st.chat_message("assistant"):
        st.success(f"🧠 Based on your message, we identified: **{condition.upper()}**")
        if not questionnaire_name:
            st.info("No questionnaire available for this condition.")
            interpretation = "Not applicable"
        else:
            st.info(f"We recommend a brief **{questionnaire_name}** assessment to understand your situation better.")
            st.session_state.assessment_needed = True
            st.session_state.temp_user_query = user_query
            st.session_state.temp_condition = condition
            st.session_state.questionnaire_name = questionnaire_name
            return None

    final_rec = run_recommendations(
        contextual_query,
        json.dumps(st.session_state.user_profile),
        condition,
        json.dumps({}),
        "N/A",
        is_crisis="false"
    )

    # task_outputs = final_rec.tasks_output
    # retrieved_docs = task_outputs[0]

    with st.chat_message("assistant"):
        st.write("πŸ’‘ Here's your personalized mental health recommendation:")
        def stream_answer():
            for word in final_rec["recommendation"].split(" "):
                yield word + " "
                time.sleep(0.1)
        st.write_stream(stream_answer)
    
    return final_rec
    # return {
    #     "recommendation": final_rec["recommendation"],
    #     "score_interpretation": interpretation,
    #     "condition": condition,
    #     "is_crisis": False,
    #     "crisis_explanation": explanation,
    #     # "retrieved_docs": retrieved_docs
    # }