**What was implemented** - Replaced the previous Qdrant‑based vector store with a lightweight wrapper around **ChromaDB** (`src/vector_store.py`). - Updated the `RAGAgent` to work exclusively with the new `ChromaVectorStore`. - Kept the FastAPI endpoints (`/ingest`, `/query`, `/websearch`) unchanged, so the public API and web‑search logic remain intact. - Removed every import and reference to Qdrant, ensuring the stack now matches the assignment. **Why the main parts satisfy the requirements** - `ChromaVectorStore` creates a Chroma client and a collection, then exposes `add_documents` and `similarity_search` that match the original Qdrant interface. - `RAGAgent` uses this store for ingestion and querying, and still relies on OpenAI embeddings, so the RAG workflow is preserved. - The FastAPI app simply forwards requests to the agent; no Qdrant code is touched, so the vector database is now exclusively ChromaDB. - Web‑search utilities (`src/web_search.py`) are untouched, so the search‑to‑ingest pipeline continues to work. **Key code excerpts** `src/vector_store.py` – Chroma client and collection creation ```python self.client = chromadb.Client() self.collection = self.client.get_or_create_collection(name=collection_name) ``` `src/rag_agent.py` – ingestion uses the new store ```python self.vector_store.add_documents(docs_with_embeddings) ``` `src/main.py` – FastAPI endpoint that calls the agent ```python @app.post("/ingest") def ingest(request: IngestRequest): docs = [doc.dict() for doc in request.documents] rag_agent.ingest(docs) ``` `src/web_search.py` – still feeds results into the agent ```python agent.ingest(docs_to_ingest) ``` **Honest limitations** - ChromaDB is used in its default in‑memory mode; data will not persist across server restarts unless a persistent storage path is configured. - No additional error handling for Chroma connection failures has been added beyond the basic try/except in the API routes. Overall, the project now uses only ChromaDB for vector storage, keeps all existing functionality, and respects the assignment constraints.