| |
|
| | |
| | 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)}") |
| |
|
| |
|