Ninjasharp commited on
Commit
f25fe53
·
verified ·
1 Parent(s): 472e2f5

Upload 2 files

Browse files
Files changed (2) hide show
  1. ochatv.py +139 -0
  2. requirements.txt +6 -0
ochatv.py ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import ollama
2
+ import streamlit as st
3
+ import httpx
4
+ import io
5
+ import pandas as pd
6
+ from PyPDF2 import PdfReader
7
+ from PIL import Image
8
+
9
+ st.set_page_config(layout="wide")
10
+ st.title("LLM Chatbot")
11
+
12
+ # Initialize history
13
+ if "messages" not in st.session_state:
14
+ st.session_state["messages"] = []
15
+
16
+ # Initialize models and system prompt
17
+ if "model" not in st.session_state:
18
+ st.session_state["model"] = ""
19
+ if "system_prompt" not in st.session_state:
20
+ st.session_state["system_prompt"] = "analyze file and summarize in bullet points"
21
+ if "new_message" not in st.session_state:
22
+ st.session_state["new_message"] = False
23
+ if "user_query" not in st.session_state:
24
+ st.session_state["user_query"] = ""
25
+ if "uploaded_file_content" not in st.session_state:
26
+ st.session_state["uploaded_file_content"] = ""
27
+ if "uploaded_files" not in st.session_state:
28
+ st.session_state["uploaded_files"] = []
29
+
30
+ st.sidebar.write("local vision, rag")
31
+ # Sidebar menu
32
+ with st.sidebar:
33
+ try:
34
+ models = [model["name"] for model in ollama.list()["models"]]
35
+ st.session_state["model"] = st.selectbox("Choose your model", models)
36
+ except httpx.ConnectError:
37
+ st.error("Unable to connect to the local Ollama instance. Please ensure it is running.")
38
+ st.session_state["system_prompt"] = st.text_area("System Prompt", value="analyze file and summarize in bullet points")
39
+
40
+ if st.button("Reset"):
41
+ st.session_state["messages"] = []
42
+ st.session_state["new_message"] = False
43
+ st.session_state["user_query"] = ""
44
+ st.session_state["uploaded_file_content"] = ""
45
+ st.session_state["uploaded_files"] = []
46
+ st.rerun()
47
+
48
+ uploaded_files = st.file_uploader("Upload images (PNG, JPG) or text files (PDF, CSV)", type=["png", "jpg", "pdf", "csv"], accept_multiple_files=True)
49
+ if uploaded_files:
50
+ st.session_state["uploaded_files"] = uploaded_files
51
+
52
+ # Add a radio button to decide if the uploaded file should be part of the query
53
+ include_files_in_query = st.radio("Include uploaded files in query?", ("Yes", "No"))
54
+
55
+ def process_uploaded_files():
56
+ file_contents = []
57
+ image_files = []
58
+ for uploaded_file in st.session_state["uploaded_files"]:
59
+ file_type = uploaded_file.type
60
+ if "image" in file_type:
61
+ image_files.append(uploaded_file)
62
+ file_contents.append(f"Image file: {uploaded_file.name}")
63
+ elif "pdf" in file_type:
64
+ pdf_reader = PdfReader(io.BytesIO(uploaded_file.read()))
65
+ pdf_text = ""
66
+ for page in pdf_reader.pages:
67
+ pdf_text += page.extract_text()
68
+ file_contents.append(f"PDF file: {uploaded_file.name}\nContent:\n{pdf_text}")
69
+ elif "csv" in file_type:
70
+ csv_data = pd.read_csv(uploaded_file)
71
+ csv_text = csv_data.to_string()
72
+ file_contents.append(f"CSV file: {uploaded_file.name}\nContent:\n{csv_text}")
73
+ return "\n".join(file_contents), image_files
74
+
75
+ def model_res_generator(messages):
76
+ try:
77
+ stream = ollama.chat(
78
+ model=st.session_state["model"],
79
+ messages=messages,
80
+ stream=True,
81
+ )
82
+ for chunk in stream:
83
+ yield chunk["message"]["content"]
84
+ except (httpx.ConnectError, ollama.ResponseError) as e:
85
+ st.error(f"An error occurred: {e}")
86
+ return
87
+
88
+ # Display chat messages from history on app rerun
89
+ for message in st.session_state["messages"]:
90
+ with st.chat_message(message["role"]):
91
+ st.markdown(message["content"])
92
+
93
+ # Add some space before the query box
94
+ st.write("")
95
+ st.write("")
96
+
97
+ if st.session_state["new_message"]:
98
+ st.session_state["user_query"] = ""
99
+ st.session_state["new_message"] = False
100
+ st.rerun()
101
+
102
+ if prompt := st.text_input("What is your query?", key="user_query"):
103
+ # Process and include uploaded file content in the query if the user chose to include it
104
+ if include_files_in_query == "Yes":
105
+ st.session_state["uploaded_file_content"], image_files = process_uploaded_files()
106
+ augmented_prompt = prompt + "\n\n" + st.session_state["uploaded_file_content"]
107
+ else:
108
+ augmented_prompt = prompt
109
+
110
+ # Prepare messages with possible images
111
+ messages = [{"role": "user", "content": augmented_prompt}]
112
+ if st.session_state["system_prompt"]:
113
+ messages.insert(0, {"role": "system", "content": st.session_state["system_prompt"]})
114
+ if include_files_in_query == "Yes" and image_files:
115
+ with io.BytesIO() as file_obj:
116
+ file_obj.write(image_files[0].read())
117
+ file_obj.seek(0)
118
+ messages[0]["images"] = [file_obj.read()]
119
+
120
+ # Add latest message to history in format {role, content}
121
+ st.session_state["messages"].append({"role": "user", "content": prompt})
122
+
123
+ with st.chat_message("user"):
124
+ st.markdown(prompt)
125
+
126
+ with st.chat_message("assistant"):
127
+ with st.spinner("Thinking..."):
128
+ # Generate response based on the augmented prompt
129
+ try:
130
+ message = "".join(model_res_generator(messages))
131
+ st.session_state["messages"].append({"role": "assistant", "content": message})
132
+ except Exception as e:
133
+ st.error(f"Failed to generate response: {e}")
134
+
135
+ # Set flag for new message
136
+ st.session_state["new_message"] = True
137
+ st.rerun()
138
+
139
+ st.sidebar.info("built by dw")
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ streamlit
2
+ httpx
3
+ pandas
4
+ PyPDF2
5
+ Pillow
6
+ ollama