File size: 2,992 Bytes
66c0d0c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import asyncio
import os

import httpx
import streamlit as st
from dotenv import load_dotenv

APP_TITLE = "DAPA"
APP_ICON = "🛡️"

# Load environment variables
load_dotenv()
BACKEND_URL = os.getenv("BACKEND_URL")
CHAT_API = BACKEND_URL + "/chat"


async def get_response(user_message: str, thread_id: str | None = None) -> dict:
    payload = {"user_message": user_message, "thread_id": thread_id}
    async with httpx.AsyncClient(timeout=10.0) as client:
        try:
            response = await client.post(CHAT_API, json=payload)
            response.raise_for_status()
            return response.json()
        except httpx.HTTPError as e:
            return {"error": f"Error connecting to backend: {str(e)}"}


async def main():
    st.set_page_config(page_title=APP_TITLE, page_icon=APP_ICON)

    if "thread_id" not in st.session_state:
        st.session_state.thread_id = None
    if "messages" not in st.session_state:
        st.session_state.messages = []

    st.title(f"{APP_ICON} DAPA AI Assistant")
    st.write(
        "This bot helps you identify or report phone numbers involved in financial fraud or cyber scams."
        "Please describe your incident below."
    )

    for message in st.session_state.messages:
        responder_type = message["responder"]
        if responder_type == "tool":
            st.chat_message("tool", avatar="🛡️").write(message["content"])
        else:
            st.chat_message(responder_type).write(message["content"])

    # User input
    if user_input := st.chat_input("Type your message here..."):
        st.session_state.messages.append({"responder": "human", "content": user_input})
        st.chat_message("human").write(user_input)

        response = await get_response(user_input, st.session_state.thread_id)

        if "error" in response:
            st.error(response["error"])
        else:
            response_message = response["response_message"]
            responder = response["responder"]
            st.session_state.thread_id = response["thread_id"]

            # Append the response to session state
            st.session_state.messages.append(
                {"responder": responder, "content": response_message}
            )
            if responder == "tool":
                st.chat_message("tool", avatar="🛡️").write(response_message)
            else:
                st.chat_message(responder).write(response_message)

    with st.sidebar:
        st.header(f"{APP_ICON} {APP_TITLE}")
        st.write("DAPA chatbot for secure reporting of scams.")

        # Privacy Section
        with st.expander("🔒 Privacy"):
            st.write(
                "Query and response in this app are anonymously recorded and saved to LangSmith for product evaluation and improvement purposes."
            )

        st.markdown(
            "Made with ❤️ by [Raushan](https://www.linkedin.com/in/raushan-in/) in Trier"
        )


if __name__ == "__main__":
    asyncio.run(main())