Spaces:
Paused
Paused
Update app.py via AI Editor
Browse files
app.py
CHANGED
@@ -184,7 +184,7 @@ def chat_message_card(msg, is_user):
|
|
184 |
dbc.CardBody([
|
185 |
html.Div([
|
186 |
html.Span(avatar, style={"fontSize": "2rem"}),
|
187 |
-
html.Span(msg, style={"whiteSpace": "pre-wrap", "marginLeft": "0.75rem"})
|
188 |
], style={"display": "flex", "alignItems": "center", "justifyContent": align})
|
189 |
]),
|
190 |
className=f"mb-2 ms-3 me-3",
|
@@ -231,11 +231,13 @@ def left_navbar_static():
|
|
231 |
], style={"padding": "1rem", "backgroundColor": "#f8f9fa", "height": "100vh", "overflowY": "auto"})
|
232 |
|
233 |
def chat_box_card():
|
|
|
234 |
return dbc.Card(
|
235 |
dbc.CardBody([
|
236 |
html.Div(id="chat-window", style={
|
237 |
"height": "60vh",
|
238 |
"overflowY": "auto",
|
|
|
239 |
"display": "flex",
|
240 |
"flexDirection": "column",
|
241 |
"justifyContent": "flex-end",
|
@@ -244,7 +246,8 @@ def chat_box_card():
|
|
244 |
"borderRadius": "0.5rem"
|
245 |
})
|
246 |
]),
|
247 |
-
className="mt-3"
|
|
|
248 |
)
|
249 |
|
250 |
def user_input_card():
|
@@ -291,7 +294,6 @@ app.layout = html.Div([
|
|
291 |
], style={"display": "flex"}),
|
292 |
dcc.Store(id="clear-input", data=False),
|
293 |
dcc.Store(id="scroll-bottom", data=0),
|
294 |
-
# clientside callback for textarea enter/shift-enter
|
295 |
dcc.Store(id="enter-pressed", data=False)
|
296 |
])
|
297 |
|
@@ -426,8 +428,10 @@ def main_callback(session_id, send_clicks, file_contents, new_chat_clicks, strea
|
|
426 |
)
|
427 |
|
428 |
file_was_uploaded_and_sent = False
|
|
|
429 |
if trigger == "file-upload" and file_contents and file_names:
|
430 |
uploads = []
|
|
|
431 |
if not isinstance(file_contents, list):
|
432 |
file_contents = [file_contents]
|
433 |
file_names = [file_names]
|
@@ -446,7 +450,31 @@ def main_callback(session_id, send_clicks, file_contents, new_chat_clicks, strea
|
|
446 |
if text.strip():
|
447 |
embed_user_doc(session_id, fname, text)
|
448 |
logger.info(f"Session {session_id}: Uploaded doc '{n}' embedded for user vector store")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
449 |
state["uploads"].extend(uploads)
|
|
|
|
|
|
|
450 |
save_session_state(session_id)
|
451 |
logger.info(f"Session {session_id}: Uploaded files {[u['name'] for u in uploads]}")
|
452 |
|
|
|
184 |
dbc.CardBody([
|
185 |
html.Div([
|
186 |
html.Span(avatar, style={"fontSize": "2rem"}),
|
187 |
+
html.Span(msg, style={"whiteSpace": "pre-wrap", "marginLeft": "0.75rem", "overflowWrap": "break-word", "wordBreak": "break-word"})
|
188 |
], style={"display": "flex", "alignItems": "center", "justifyContent": align})
|
189 |
]),
|
190 |
className=f"mb-2 ms-3 me-3",
|
|
|
231 |
], style={"padding": "1rem", "backgroundColor": "#f8f9fa", "height": "100vh", "overflowY": "auto"})
|
232 |
|
233 |
def chat_box_card():
|
234 |
+
# Explicit scrollbars and height
|
235 |
return dbc.Card(
|
236 |
dbc.CardBody([
|
237 |
html.Div(id="chat-window", style={
|
238 |
"height": "60vh",
|
239 |
"overflowY": "auto",
|
240 |
+
"overflowX": "auto",
|
241 |
"display": "flex",
|
242 |
"flexDirection": "column",
|
243 |
"justifyContent": "flex-end",
|
|
|
246 |
"borderRadius": "0.5rem"
|
247 |
})
|
248 |
]),
|
249 |
+
className="mt-3",
|
250 |
+
style={"height": "62vh", "overflowY": "auto", "overflowX": "auto"}
|
251 |
)
|
252 |
|
253 |
def user_input_card():
|
|
|
294 |
], style={"display": "flex"}),
|
295 |
dcc.Store(id="clear-input", data=False),
|
296 |
dcc.Store(id="scroll-bottom", data=0),
|
|
|
297 |
dcc.Store(id="enter-pressed", data=False)
|
298 |
])
|
299 |
|
|
|
428 |
)
|
429 |
|
430 |
file_was_uploaded_and_sent = False
|
431 |
+
file_upload_message = None
|
432 |
if trigger == "file-upload" and file_contents and file_names:
|
433 |
uploads = []
|
434 |
+
file_upload_messages = []
|
435 |
if not isinstance(file_contents, list):
|
436 |
file_contents = [file_contents]
|
437 |
file_names = [file_names]
|
|
|
450 |
if text.strip():
|
451 |
embed_user_doc(session_id, fname, text)
|
452 |
logger.info(f"Session {session_id}: Uploaded doc '{n}' embedded for user vector store")
|
453 |
+
# Add extracted text to chat
|
454 |
+
preview = text[:1000]
|
455 |
+
file_upload_messages.append({
|
456 |
+
"role": "user",
|
457 |
+
"content": f"[Document uploaded: {n}]\n{preview if preview.strip() else '[No text extracted]'}"
|
458 |
+
})
|
459 |
+
else:
|
460 |
+
file_upload_messages.append({
|
461 |
+
"role": "user",
|
462 |
+
"content": f"[Document uploaded: {n}]\n[No text extracted]"
|
463 |
+
})
|
464 |
+
elif is_img:
|
465 |
+
file_upload_messages.append({
|
466 |
+
"role": "user",
|
467 |
+
"content": f"[Image uploaded: {n}]"
|
468 |
+
})
|
469 |
+
else:
|
470 |
+
file_upload_messages.append({
|
471 |
+
"role": "user",
|
472 |
+
"content": f"[File uploaded: {n}]"
|
473 |
+
})
|
474 |
state["uploads"].extend(uploads)
|
475 |
+
# Only show the latest file upload message(s)
|
476 |
+
for msg in file_upload_messages:
|
477 |
+
state["messages"].append(msg)
|
478 |
save_session_state(session_id)
|
479 |
logger.info(f"Session {session_id}: Uploaded files {[u['name'] for u in uploads]}")
|
480 |
|