"""Manage the configuration of various retrievers. This module provides functionality to create and manage retrievers for different vector store backends, specifically Elasticsearch, Pinecone, and MongoDB. The retrievers support filtering results by user_id to ensure data isolation between users. """ import os from contextlib import contextmanager from typing import Generator from langchain_core.embeddings import Embeddings from langchain_core.runnables import RunnableConfig from langchain_core.vectorstores import VectorStoreRetriever from langgraph_mcp.configuration import Configuration ## Encoder constructors def make_text_encoder(model: str) -> Embeddings: """Connect to the configured text encoder.""" provider, model = model.split("/", maxsplit=1) match provider: case "openai": from langchain_openai import OpenAIEmbeddings return OpenAIEmbeddings(model=model) case _: raise ValueError(f"Unsupported embedding provider: {provider}") ## Retriever constructors @contextmanager def make_milvus_retriever( configuration: Configuration, embedding_model: Embeddings ) -> Generator[VectorStoreRetriever, None, None]: """Configure this agent to use milvus lite file based uri to store the vector index.""" from langchain_milvus.vectorstores import Milvus uri = os.environ["MILVUS_DB"] vstore = Milvus ( embedding_function=embedding_model, connection_args={"uri": uri}, index_params=None if uri.startswith("http") else {"index_type": "FLAT", "metric_type": "L2", "params": {}} ) yield vstore.as_retriever() @contextmanager def make_retriever( config: RunnableConfig, ) -> Generator[VectorStoreRetriever, None, None]: """Create a retriever for the agent, based on the current configuration.""" configuration = Configuration.from_runnable_config(config) embedding_model = make_text_encoder(configuration.embedding_model) match configuration.retriever_provider: case "milvus": with make_milvus_retriever(configuration, embedding_model) as retriever: yield retriever case _: raise ValueError( "Unrecognized retriever_provider in configuration. " f"Expected one of: {', '.join(Configuration.__annotations__['retriever_provider'].__args__)}\n" f"Got: {configuration.retriever_provider}" )