|
|
| |
| import streamlit as st |
| from typing import Dict, List |
| import requests |
| import json |
|
|
| |
| API_BASE_URL = "https://chris4k-mdb.hf.space" |
|
|
| def fetch_documents(): |
| response = requests.get(API_BASE_URL) |
| try: |
| response_json = response.json() |
| return response_json.get("documents", []) |
| except requests.exceptions.JSONDecodeError: |
| print("Invalid JSON response:", response.text) |
| return [] |
|
|
|
|
|
|
| def index_content(doc_type: str, source: str, config: Dict): |
| """Index content through the backend API.""" |
| payload = {"doc_type": doc_type, "source": source, "config": config} |
| response = requests.post(f"{API_BASE_URL}/index", json=payload) |
| return response.json() |
|
|
| def delete_document(doc_id: str): |
| """Delete a document by its ID.""" |
| response = requests.delete(f"{API_BASE_URL}/delete?doc_id={doc_id}") |
| return response.json() |
|
|
| def search_documents(query: str, top_k: int = 5): |
| """Search documents through the backend API.""" |
| payload = {"query": query, "top_k": top_k} |
| response = requests.post(f"{API_BASE_URL}/search", json=payload) |
| return response.json() |
|
|
| |
| st.title("ChromaDB Document Manager ๐") |
|
|
| |
| st.sidebar.header("Navigation") |
| page = st.sidebar.radio("Go to", ["Home", "Add Document", "Search"]) |
|
|
| |
| if page == "Home": |
| st.header("Indexed Documents") |
| documents = fetch_documents() |
|
|
| if not documents: |
| st.info("No documents indexed yet.") |
| else: |
| for doc in documents: |
| with st.expander(f"Document ID: {doc['doc_id']}"): |
| st.write("**Metadata:**") |
| st.json(doc) |
|
|
| |
| if st.button(f"Delete {doc['doc_id']}"): |
| result = delete_document(doc['doc_id']) |
| st.success(f"Deleted: {result['doc_id']}") |
|
|
| |
| elif page == "Add Document": |
| st.header("Add a New Document") |
| doc_type = st.selectbox("Document Type", ["pdf", "webpage", "manual"]) |
| source = st.text_input("Source (URL for webpage, file path for PDF, or manual text)") |
| config = st.text_area( |
| "Configuration (JSON)", |
| value=json.dumps({"chunk_size": 1000, "chunk_overlap": 200}, indent=4) |
| ) |
|
|
| if st.button("Index Document"): |
| try: |
| config_dict = json.loads(config) |
| result = index_content(doc_type, source, config_dict) |
| st.success(f"Document indexed: {result['doc_id']}") |
| except Exception as e: |
| st.error(f"Error: {str(e)}") |
|
|
| |
| elif page == "Search": |
| st.header("Search Documents") |
| query = st.text_input("Enter your search query") |
| top_k = st.number_input("Number of Results", min_value=1, max_value=10, value=5) |
|
|
| if st.button("Search"): |
| try: |
| results = search_documents(query, top_k) |
| st.write("**Results:**") |
| for idx, res in enumerate(results["results"]): |
| st.markdown(f"**Result {idx + 1}:**") |
| st.write(res) |
| except Exception as e: |
| st.error(f"Error: {str(e)}") |
|
|
|
|