amiguel commited on
Commit
0373f3c
Β·
verified Β·
1 Parent(s): a941d96

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +41 -43
app.py CHANGED
@@ -25,9 +25,6 @@ with st.sidebar:
25
  hf_token = st.text_input("Hugging Face Token", type="password",
26
  help="Get your token from https://huggingface.co/settings/tokens")
27
 
28
- if not hf_token:
29
- st.warning("πŸ”‘ Token required for private model access!", icon="⚠️")
30
-
31
  st.header("Upload Documents πŸ“‚")
32
  uploaded_file = st.file_uploader(
33
  "Choose a PDF or XLSX file",
@@ -42,27 +39,28 @@ if "messages" not in st.session_state:
42
  # Process uploaded files
43
  @st.cache_data
44
  def process_file(uploaded_file):
45
- file_content = ""
 
 
46
  try:
47
  if uploaded_file.type == "application/pdf":
48
  pdf_reader = PyPDF2.PdfReader(uploaded_file)
49
- file_content = "\n".join([page.extract_text() for page in pdf_reader.pages])
50
  elif uploaded_file.type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":
51
  df = pd.read_excel(uploaded_file)
52
- file_content = df.to_markdown()
53
  except Exception as e:
54
  st.error(f"πŸ“„ Error processing file: {str(e)}")
55
- return file_content
56
 
57
  # Load model and tokenizer with authentication
58
  @st.cache_resource
59
  def load_model(hf_token):
60
  try:
61
- # Login to Hugging Face Hub
62
  if hf_token:
63
  login(token=hf_token)
64
  else:
65
- st.error("πŸ” Authentication required! Please provide a Hugging Face token.")
66
  return None, None
67
 
68
  tokenizer = AutoTokenizer.from_pretrained(
@@ -82,17 +80,18 @@ def load_model(hf_token):
82
 
83
  # Generate responses with streaming
84
  def generate_response(prompt, file_context):
85
- # Prepare prompt template
86
- full_prompt = f"""You are an expert inspection engineer. Analyze this context:
87
  {file_context}
88
 
89
  Question: {prompt}
90
  Answer:"""
91
 
92
- # Create streamer
93
- streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
 
 
 
94
 
95
- # Tokenize input
96
  inputs = tokenizer(
97
  full_prompt,
98
  return_tensors="pt",
@@ -100,7 +99,6 @@ def generate_response(prompt, file_context):
100
  truncation=True
101
  ).to(model.device)
102
 
103
- # Start generation thread
104
  generation_kwargs = dict(
105
  inputs,
106
  streamer=streamer,
@@ -109,63 +107,63 @@ def generate_response(prompt, file_context):
109
  top_p=0.9,
110
  repetition_penalty=1.1,
111
  do_sample=True,
112
- use_cache=True # Enable caching for faster generation
113
  )
114
- thread = Thread(target=model.generate, kwargs=generation_kwargs)
115
- thread.start()
116
 
 
117
  return streamer
118
 
119
- # Display chat messages with proper avatar handling
120
  for message in st.session_state.messages:
121
  try:
122
- # Set appropriate avatar based on role
123
  avatar = "πŸ‘€" if message["role"] == "user" else "πŸ€–"
124
-
125
  with st.chat_message(message["role"], avatar=avatar):
126
  st.markdown(message["content"])
127
- except Exception as e:
128
- st.error(f"Error displaying message: {str(e)}")
129
- # Fallback to default avatar
130
  with st.chat_message(message["role"]):
131
  st.markdown(message["content"])
132
 
133
- # Chat input section
134
  if prompt := st.chat_input("Ask your inspection question..."):
135
  if not hf_token:
136
- st.error("πŸ”‘ Authentication required! Please enter your Hugging Face token in the sidebar.")
137
  st.stop()
138
-
139
  # Load model if not loaded
140
  if "model" not in st.session_state:
141
  st.session_state.model, st.session_state.tokenizer = load_model(hf_token)
142
  model = st.session_state.model
143
  tokenizer = st.session_state.tokenizer
144
 
145
- # Add user message with proper avatar handling
146
- try:
147
- with st.chat_message("user", avatar="πŸ‘€"):
148
- st.markdown(prompt)
149
- except:
150
- # Fallback if avatar fails
151
- with st.chat_message("user"):
152
- st.markdown(prompt)
153
-
154
  st.session_state.messages.append({"role": "user", "content": prompt})
155
 
156
  # Process file
157
- file_context = process_file(uploaded_file) if uploaded_file else ""
158
 
159
- # Generate and stream response with avatar handling
160
  if model and tokenizer:
161
  try:
162
  with st.chat_message("assistant", avatar="πŸ€–"):
163
  streamer = generate_response(prompt, file_context)
164
- response = st.write_stream(streamer)
165
- # Remove <think> tokens if present
166
- response = response.replace("<think>", "").replace("</think>", "").strip()
167
- st.session_state.messages.append({"role": "assistant", "content": response})
 
 
 
 
 
 
 
 
 
 
 
168
  except Exception as e:
169
  st.error(f"⚑ Generation error: {str(e)}")
170
  else:
171
- st.error("πŸ€– Model not loaded - check your token and connection!")
 
25
  hf_token = st.text_input("Hugging Face Token", type="password",
26
  help="Get your token from https://huggingface.co/settings/tokens")
27
 
 
 
 
28
  st.header("Upload Documents πŸ“‚")
29
  uploaded_file = st.file_uploader(
30
  "Choose a PDF or XLSX file",
 
39
  # Process uploaded files
40
  @st.cache_data
41
  def process_file(uploaded_file):
42
+ if uploaded_file is None:
43
+ return ""
44
+
45
  try:
46
  if uploaded_file.type == "application/pdf":
47
  pdf_reader = PyPDF2.PdfReader(uploaded_file)
48
+ return "\n".join([page.extract_text() for page in pdf_reader.pages])
49
  elif uploaded_file.type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":
50
  df = pd.read_excel(uploaded_file)
51
+ return df.to_markdown()
52
  except Exception as e:
53
  st.error(f"πŸ“„ Error processing file: {str(e)}")
54
+ return ""
55
 
56
  # Load model and tokenizer with authentication
57
  @st.cache_resource
58
  def load_model(hf_token):
59
  try:
 
60
  if hf_token:
61
  login(token=hf_token)
62
  else:
63
+ st.error("πŸ” Authentication required!")
64
  return None, None
65
 
66
  tokenizer = AutoTokenizer.from_pretrained(
 
80
 
81
  # Generate responses with streaming
82
  def generate_response(prompt, file_context):
83
+ full_prompt = f"""Analyze this context:
 
84
  {file_context}
85
 
86
  Question: {prompt}
87
  Answer:"""
88
 
89
+ streamer = TextIteratorStreamer(
90
+ tokenizer,
91
+ skip_prompt=True,
92
+ skip_special_tokens=True
93
+ )
94
 
 
95
  inputs = tokenizer(
96
  full_prompt,
97
  return_tensors="pt",
 
99
  truncation=True
100
  ).to(model.device)
101
 
 
102
  generation_kwargs = dict(
103
  inputs,
104
  streamer=streamer,
 
107
  top_p=0.9,
108
  repetition_penalty=1.1,
109
  do_sample=True,
110
+ use_cache=True
111
  )
 
 
112
 
113
+ Thread(target=model.generate, kwargs=generation_kwargs).start()
114
  return streamer
115
 
116
+ # Display chat messages
117
  for message in st.session_state.messages:
118
  try:
 
119
  avatar = "πŸ‘€" if message["role"] == "user" else "πŸ€–"
 
120
  with st.chat_message(message["role"], avatar=avatar):
121
  st.markdown(message["content"])
122
+ except:
 
 
123
  with st.chat_message(message["role"]):
124
  st.markdown(message["content"])
125
 
126
+ # Chat input handling
127
  if prompt := st.chat_input("Ask your inspection question..."):
128
  if not hf_token:
129
+ st.error("πŸ”‘ Authentication required!")
130
  st.stop()
131
+
132
  # Load model if not loaded
133
  if "model" not in st.session_state:
134
  st.session_state.model, st.session_state.tokenizer = load_model(hf_token)
135
  model = st.session_state.model
136
  tokenizer = st.session_state.tokenizer
137
 
138
+ # Add user message
139
+ with st.chat_message("user", avatar="πŸ‘€"):
140
+ st.markdown(prompt)
 
 
 
 
 
 
141
  st.session_state.messages.append({"role": "user", "content": prompt})
142
 
143
  # Process file
144
+ file_context = process_file(uploaded_file)
145
 
146
+ # Generate response
147
  if model and tokenizer:
148
  try:
149
  with st.chat_message("assistant", avatar="πŸ€–"):
150
  streamer = generate_response(prompt, file_context)
151
+ response_container = st.empty()
152
+ full_response = ""
153
+
154
+ for chunk in streamer:
155
+ # Remove <think> tags and clean text
156
+ cleaned_chunk = chunk.replace("<think>", "").replace("</think>", "").strip()
157
+ full_response += cleaned_chunk + " "
158
+
159
+ # Update display with typing cursor
160
+ response_container.markdown(full_response + "β–Œ", unsafe_allow_html=True)
161
+
162
+ # Display final response
163
+ response_container.markdown(full_response)
164
+ st.session_state.messages.append({"role": "assistant", "content": full_response})
165
+
166
  except Exception as e:
167
  st.error(f"⚑ Generation error: {str(e)}")
168
  else:
169
+ st.error("πŸ€– Model not loaded!")