Spaces:
Running
Running
Added KB updater and multiple generations per input
Browse files
app.py
CHANGED
|
@@ -27,7 +27,7 @@ def get_openai_client():
|
|
| 27 |
return None
|
| 28 |
|
| 29 |
|
| 30 |
-
@st.cache_resource
|
| 31 |
def get_document_converter():
|
| 32 |
"""Cache the DocumentConverter to prevent reloading on each interaction"""
|
| 33 |
return None # Return None initially
|
|
@@ -1410,6 +1410,10 @@ if "user_inputs" not in st.session_state:
|
|
| 1410 |
st.session_state.user_inputs = {}
|
| 1411 |
if "generated_output" not in st.session_state:
|
| 1412 |
st.session_state.generated_output = ""
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1413 |
|
| 1414 |
# Sidebar setup
|
| 1415 |
with st.sidebar:
|
|
@@ -1535,7 +1539,7 @@ with tab1:
|
|
| 1535 |
)
|
| 1536 |
|
| 1537 |
# Rest of your existing code for document processing...
|
| 1538 |
-
if uploaded_files:
|
| 1539 |
# Track filenames for UI feedback
|
| 1540 |
st.session_state.uploaded_filenames = [file.name for file in uploaded_files]
|
| 1541 |
|
|
@@ -1707,6 +1711,114 @@ with tab2:
|
|
| 1707 |
)
|
| 1708 |
st.session_state.template_spec["prompt"] = prompt_template
|
| 1709 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1710 |
# Knowledge Base Analysis Section
|
| 1711 |
if st.session_state.knowledge_base:
|
| 1712 |
with st.expander("Knowledge Base Analysis", expanded=False):
|
|
|
|
| 27 |
return None
|
| 28 |
|
| 29 |
|
| 30 |
+
# @st.cache_resource
|
| 31 |
def get_document_converter():
|
| 32 |
"""Cache the DocumentConverter to prevent reloading on each interaction"""
|
| 33 |
return None # Return None initially
|
|
|
|
| 1410 |
st.session_state.user_inputs = {}
|
| 1411 |
if "generated_output" not in st.session_state:
|
| 1412 |
st.session_state.generated_output = ""
|
| 1413 |
+
if "uploaded_filenames" not in st.session_state:
|
| 1414 |
+
st.session_state.uploaded_filenames = []
|
| 1415 |
+
if "kb_cleared" not in st.session_state:
|
| 1416 |
+
st.session_state.kb_cleared = False
|
| 1417 |
|
| 1418 |
# Sidebar setup
|
| 1419 |
with st.sidebar:
|
|
|
|
| 1539 |
)
|
| 1540 |
|
| 1541 |
# Rest of your existing code for document processing...
|
| 1542 |
+
if uploaded_files and not st.session_state.kb_cleared:
|
| 1543 |
# Track filenames for UI feedback
|
| 1544 |
st.session_state.uploaded_filenames = [file.name for file in uploaded_files]
|
| 1545 |
|
|
|
|
| 1711 |
)
|
| 1712 |
st.session_state.template_spec["prompt"] = prompt_template
|
| 1713 |
|
| 1714 |
+
# Knowledge Base Management Section
|
| 1715 |
+
with st.expander("Knowledge Base Management", expanded=False):
|
| 1716 |
+
st.info("Upload and manage documents to use as knowledge base")
|
| 1717 |
+
|
| 1718 |
+
# Upload interface
|
| 1719 |
+
uploaded_files = st.file_uploader(
|
| 1720 |
+
"Upload documents",
|
| 1721 |
+
accept_multiple_files=True,
|
| 1722 |
+
type=["pdf", "txt", "docx", "html"],
|
| 1723 |
+
)
|
| 1724 |
+
|
| 1725 |
+
# Handle document processing
|
| 1726 |
+
if uploaded_files:
|
| 1727 |
+
# Choose how to handle new uploads
|
| 1728 |
+
handle_method = st.radio(
|
| 1729 |
+
"How to handle new documents?",
|
| 1730 |
+
["Replace existing", "Append to existing"],
|
| 1731 |
+
horizontal=True,
|
| 1732 |
+
)
|
| 1733 |
+
|
| 1734 |
+
if st.button("Process Documents"):
|
| 1735 |
+
parse_documents.clear()
|
| 1736 |
+
analyze_knowledge_base.clear()
|
| 1737 |
+
st.session_state.kb_cleared = True
|
| 1738 |
+
with st.spinner("Processing documents..."):
|
| 1739 |
+
|
| 1740 |
+
if handle_method == "Replace existing":
|
| 1741 |
+
new_content = parse_documents(uploaded_files)
|
| 1742 |
+
st.session_state.knowledge_base = new_content
|
| 1743 |
+
st.session_state.uploaded_filenames = [
|
| 1744 |
+
file.name for file in uploaded_files
|
| 1745 |
+
]
|
| 1746 |
+
else: # Append
|
| 1747 |
+
# Find new files by comparing filenames
|
| 1748 |
+
new_files = []
|
| 1749 |
+
duplicate_files = []
|
| 1750 |
+
|
| 1751 |
+
for file in uploaded_files:
|
| 1752 |
+
if file.name in st.session_state.uploaded_filenames:
|
| 1753 |
+
duplicate_files.append(file.name)
|
| 1754 |
+
else:
|
| 1755 |
+
new_files.append(file)
|
| 1756 |
+
st.session_state.uploaded_filenames.append(
|
| 1757 |
+
file.name
|
| 1758 |
+
)
|
| 1759 |
+
|
| 1760 |
+
# Process only new files
|
| 1761 |
+
if new_files:
|
| 1762 |
+
new_content = parse_documents(new_files)
|
| 1763 |
+
st.session_state.knowledge_base += (
|
| 1764 |
+
"\n\n" + new_content
|
| 1765 |
+
)
|
| 1766 |
+
|
| 1767 |
+
# Provide feedback about duplicates
|
| 1768 |
+
if duplicate_files:
|
| 1769 |
+
st.info(
|
| 1770 |
+
f"Skipped {len(duplicate_files)} duplicate files: {', '.join(duplicate_files)}"
|
| 1771 |
+
)
|
| 1772 |
+
|
| 1773 |
+
# Reset any analysis that depends on knowledge base
|
| 1774 |
+
if "suggested_variables" in st.session_state:
|
| 1775 |
+
st.session_state.suggested_variables = []
|
| 1776 |
+
st.session_state.show_suggested_vars = False
|
| 1777 |
+
|
| 1778 |
+
st.success(f"Processed {len(uploaded_files)} documents")
|
| 1779 |
+
st.rerun()
|
| 1780 |
+
|
| 1781 |
+
# Display knowledge base information
|
| 1782 |
+
if st.session_state.knowledge_base:
|
| 1783 |
+
st.write(
|
| 1784 |
+
f"Knowledge base size: {len(st.session_state.knowledge_base)} characters"
|
| 1785 |
+
)
|
| 1786 |
+
|
| 1787 |
+
# Clear knowledge base button
|
| 1788 |
+
# Display uploaded filenames
|
| 1789 |
+
if st.session_state.uploaded_filenames:
|
| 1790 |
+
st.write("Uploaded files:")
|
| 1791 |
+
for filename in st.session_state.uploaded_filenames:
|
| 1792 |
+
st.write(f"- {filename}")
|
| 1793 |
+
|
| 1794 |
+
if st.button("Clear Knowledge Base"):
|
| 1795 |
+
analyze_knowledge_base.clear()
|
| 1796 |
+
st.session_state.knowledge_base = ""
|
| 1797 |
+
st.session_state.kb_cleared = True
|
| 1798 |
+
st.session_state.uploaded_filenames = []
|
| 1799 |
+
if "suggested_variables" in st.session_state:
|
| 1800 |
+
st.session_state.suggested_variables = []
|
| 1801 |
+
st.session_state.show_suggested_vars = False
|
| 1802 |
+
st.success("Knowledge base cleared")
|
| 1803 |
+
st.rerun()
|
| 1804 |
+
|
| 1805 |
+
# Option to edit knowledge base directly
|
| 1806 |
+
edit_kb = st.checkbox("Edit knowledge base directly")
|
| 1807 |
+
if edit_kb:
|
| 1808 |
+
new_content = st.text_area(
|
| 1809 |
+
"Edit knowledge base content",
|
| 1810 |
+
value=st.session_state.knowledge_base,
|
| 1811 |
+
height=300,
|
| 1812 |
+
)
|
| 1813 |
+
if st.button("Update Knowledge Base"):
|
| 1814 |
+
analyze_knowledge_base.clear()
|
| 1815 |
+
st.session_state.knowledge_base = new_content
|
| 1816 |
+
if "suggested_variables" in st.session_state:
|
| 1817 |
+
st.session_state.suggested_variables = []
|
| 1818 |
+
st.session_state.show_suggested_vars = False
|
| 1819 |
+
st.success("Knowledge base updated")
|
| 1820 |
+
st.rerun()
|
| 1821 |
+
|
| 1822 |
# Knowledge Base Analysis Section
|
| 1823 |
if st.session_state.knowledge_base:
|
| 1824 |
with st.expander("Knowledge Base Analysis", expanded=False):
|