import gradio as gr import sys from utils.retriever import get_context, get_vectorstore from typing import Optional # Initialize vector store at startup print("Initializing vector store connection...", flush=True) try: vectorstore = get_vectorstore() print("Vector store connection initialized successfully", flush=True) except Exception as e: print(f"Failed to initialize vector store: {e}", flush=True) raise # --------------------------------------------------------------------- # MCP - returns raw dictionary format # --------------------------------------------------------------------- def retrieve( query:str, collection_name:Optional[str] = None, filter_metadata:Optional[dict] = None, ) -> list: """ Retrieve semantically similar documents from the vector database for MCP clients. Args: query (str): The search query text reports_filter (str): Comma-separated list of specific report filenames (optional) sources_filter (str): Filter by document source type (optional) subtype_filter (str): Filter by document subtype (optional) year_filter (str): Comma-separated list of years to filter by (optional) Returns: list: List of dictionaries containing document content, metadata, and scores """ # Call retriever function and return raw results results = get_context( vectorstore=vectorstore, query=query, collection_name=collection_name, filter_metadata = filter_metadata ) return results # Create the Gradio interface with Blocks to support both UI and MCP with gr.Blocks() as ui: gr.Markdown("# ChatFed Retrieval/Reranker Module") gr.Markdown("Retrieves semantically similar documents from vector database and reranks. Intended for use in RAG pipelines as an MCP server with other ChatFed modules.") with gr.Row(): with gr.Column(): query_input = gr.Textbox( label="Query", lines=2, placeholder="Enter your search query here", info="The query to search for in the vector database" ) collection_name = gr.Textbox( label="Collection Name (optional)", lines=1, placeholder="EUDR, Humboldt", info="Name of the collection" ) filter_metadata = gr.JSON(label="Filter Metadata (optional)") submit_btn = gr.Button("Submit", variant="primary") # Output needs to be in json format to be added as tool in HuggingChat with gr.Column(): output = gr.Text( label="Retrieved Context", lines=10, show_copy_button=True ) # UI event handler submit_btn.click( fn=retrieve, inputs=[query_input, collection_name, filter_metadata], outputs=output, api_name="retrieve" ) # Launch with MCP server enabled if __name__ == "__main__": ui.launch( server_name="0.0.0.0", server_port=7860, #mcp_server=True, show_error=True )