Spaces:
No application file
No application file
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()) | |