| import os |
| import pandas as pd |
| import streamlit as st |
| from llama_index.experimental.query_engine import PandasQueryEngine |
| from prompts import new_prompt, instruction_str, context |
| from note_engine import note_engine |
| from llama_index.core.tools import QueryEngineTool, ToolMetadata |
| from llama_index.core.agent import ReActAgent |
| from llama_index.llms.openai import OpenAI |
| from data_summary import data_summary_tool |
| from pdf import bangladesh_engine |
| from dotenv import load_dotenv |
|
|
| |
| load_dotenv() |
|
|
| |
| conversation_file = os.path.join("data", "conversation.txt") |
| summary_file = os.path.join("data", "data_summary.txt") |
| population_path = os.path.join("data", "Population.csv") |
| population_df = pd.read_csv(population_path) |
|
|
| |
| st.title("๐ Population and Bangladesh Data Assistant") |
|
|
| |
| api_key = st.sidebar.text_input("Enter your OpenAI API Key", type="password") |
| if api_key: |
| os.environ["OPENAI_API_KEY"] = api_key |
|
|
| |
| population_query_engine = PandasQueryEngine( |
| df=population_df, verbose=True, instruction_str=instruction_str |
| ) |
|
|
| population_query_engine.update_prompts({"pandas_prompt": new_prompt}) |
|
|
| tools = [ |
| QueryEngineTool( |
| query_engine=population_query_engine, |
| metadata=ToolMetadata( |
| name="population_data", |
| description="Provides information about world population and demographics", |
| ), |
| ), |
| QueryEngineTool( |
| query_engine=bangladesh_engine, |
| metadata=ToolMetadata( |
| name="bangladesh_data", |
| description="Provides detailed information about Bangladesh", |
| ), |
| ), |
| ] |
|
|
| llm = OpenAI(model="gpt-3.5-turbo") |
| agent = ReActAgent.from_tools(tools, llm=llm, verbose=True, context=context) |
|
|
| |
| st.sidebar.header("Options") |
| option = st.sidebar.selectbox("Choose an action:", [ |
| "Ask a Question", |
| "View Previous Conversations", |
| "View Data Summary", |
| "Save a Note" |
| ]) |
|
|
| |
| conversation_active = st.session_state.get('conversation_active', False) |
|
|
| if option == "Ask a Question": |
| if not conversation_active: |
| st.session_state.conversation_active = True |
| st.session_state.conversation_history = [] |
| |
| prompt = st.text_area("Enter your query:", key="user_input") |
| |
| if st.button("Submit"): |
| if prompt: |
| result = agent.query(prompt) |
| response_text = result.response |
| st.write("Response:", response_text) |
|
|
| |
| timestamp = pd.Timestamp.now().strftime("%Y-%m-%d %H:%M:%S") |
| st.session_state.conversation_history.append((timestamp, prompt, response_text)) |
| else: |
| st.error("Please enter a query.") |
| |
| if st.button("Save this Conversation"): |
| |
| with open(conversation_file, "a") as file: |
| for timestamp, user_prompt, bot_response in st.session_state.conversation_history: |
| file.write(f"Timestamp: {timestamp}\n") |
| file.write(f"Prompt: {user_prompt}\n") |
| file.write(f"Response: {bot_response}\n") |
| file.write("=" * 40 + "\n") |
| st.success("Conversation saved.") |
|
|
| if st.button("End Conversation"): |
| st.session_state.conversation_active = False |
| st.success("Conversation ended.") |
|
|
| |
| elif option == "View Previous Conversations": |
| if os.path.exists(conversation_file): |
| try: |
| with open(conversation_file, "r", encoding="utf-8", errors="replace") as file: |
| content = file.read() |
| st.text_area("Previous Conversations", content, height=300) |
| except Exception as e: |
| st.error(f"An error occurred while reading the file: {e}") |
| else: |
| st.warning("No previous conversations found.") |
|
|
|
|
| |
| elif option == "View Data Summary": |
| if os.path.exists(summary_file): |
| try: |
| with open(summary_file, "r", encoding="utf-8", errors="replace") as file: |
| content = file.read() |
| st.text_area("Data Summary", content, height=300) |
| except Exception as e: |
| st.error(f"An error occurred while reading the file: {e}") |
| else: |
| st.warning("No data summary found.") |
|
|
|
|
| |
| elif option == "Save a Note": |
| note = st.text_input("Enter a note to save:") |
| if st.button("Save Note"): |
| if note: |
| |
| timestamp = pd.Timestamp.now().strftime("%Y-%m-%d %H:%M:%S") |
| with open(conversation_file, "a") as file: |
| file.write(f"Timestamp: {timestamp} (Note)\n") |
| file.write(f"Note: {note}\n") |
| file.write("=" * 40 + "\n") |
| st.success("Note saved.") |
| else: |
| st.error("Please enter a note.") |
|
|
| |
| st.sidebar.subheader("Instructions") |
| st.sidebar.write( |
| "1. Enter your OpenAI API Key in the sidebar.\n" |
| "2. Use the sidebar to choose an action: ask a question, view previous conversations, view the data summary, or save a note.\n" |
| "3. If you ask a question and click save, the conversation will be saved. If you ask multiple questions and then press save, it will save the whole conversation.\n" |
| "4. The End Conversation button will simply end the conversation without saving anything.\n" |
| ) |
|
|