Spaces:
Sleeping
Sleeping
Subhakanta
commited on
Commit
·
8630e6c
0
Parent(s):
Deploy chatbot FastAPI app
Browse files- .gitignore +87 -0
- Dockerfile +26 -0
- README.md +167 -0
- backend/api.py +30 -0
- data/ProjectAddress.csv +32 -0
- data/ProjectConfiguration.csv +61 -0
- data/ProjectConfigurationVariant.csv +84 -0
- data/project.csv +32 -0
- database/mongo_upload.py +45 -0
- frontend/index.html +42 -0
- frontend/logo.png +0 -0
- frontend/script.js +386 -0
- frontend/style.css +386 -0
- processed_data/final_merged_data1.csv +0 -0
- processed_data/final_merged_data_1st.csv +15 -0
- processed_data/left.ipynb +0 -0
- processed_data/nobrokrage.ipynb +0 -0
- requirements.txt +104 -0
- src/chatbot.py +329 -0
- src/check_index.py +21 -0
- src/ingest.py +135 -0
- src/query.py +38 -0
.gitignore
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ========================
|
| 2 |
+
# Python
|
| 3 |
+
# ========================
|
| 4 |
+
__pycache__/
|
| 5 |
+
*.py[cod]
|
| 6 |
+
*.pyo
|
| 7 |
+
*.pyd
|
| 8 |
+
*.pyc
|
| 9 |
+
*.pdb
|
| 10 |
+
*.egg-info/
|
| 11 |
+
*.egg
|
| 12 |
+
*.dist-info/
|
| 13 |
+
*.log
|
| 14 |
+
|
| 15 |
+
# ========================
|
| 16 |
+
# Virtual Environments
|
| 17 |
+
# ========================
|
| 18 |
+
venv/
|
| 19 |
+
env/
|
| 20 |
+
.venv/
|
| 21 |
+
subha/
|
| 22 |
+
|
| 23 |
+
# ========================
|
| 24 |
+
# IDE / Editor
|
| 25 |
+
# ========================
|
| 26 |
+
.vscode/
|
| 27 |
+
*.code-workspace
|
| 28 |
+
.idea/
|
| 29 |
+
*.sublime-project
|
| 30 |
+
*.sublime-workspace
|
| 31 |
+
|
| 32 |
+
# ========================
|
| 33 |
+
# OS Files
|
| 34 |
+
# ========================
|
| 35 |
+
.DS_Store
|
| 36 |
+
Thumbs.db
|
| 37 |
+
|
| 38 |
+
# ========================
|
| 39 |
+
# Docker
|
| 40 |
+
# ========================
|
| 41 |
+
*.dockerignore
|
| 42 |
+
*.tar
|
| 43 |
+
*.img
|
| 44 |
+
docker-compose.override.yml
|
| 45 |
+
|
| 46 |
+
# ========================
|
| 47 |
+
# FAISS / Vectorstore
|
| 48 |
+
# ========================
|
| 49 |
+
# Optional: Ignore vectorstore if too large
|
| 50 |
+
vectorStore/
|
| 51 |
+
|
| 52 |
+
# ========================
|
| 53 |
+
# Env / Secrets
|
| 54 |
+
# ========================
|
| 55 |
+
.env
|
| 56 |
+
.env.local
|
| 57 |
+
.env.*.local
|
| 58 |
+
|
| 59 |
+
# ========================
|
| 60 |
+
# Logs
|
| 61 |
+
# ========================
|
| 62 |
+
logs/
|
| 63 |
+
*.log
|
| 64 |
+
|
| 65 |
+
# ========================
|
| 66 |
+
# Build / Packaging
|
| 67 |
+
# ========================
|
| 68 |
+
build/
|
| 69 |
+
dist/
|
| 70 |
+
*.tar.gz
|
| 71 |
+
*.whl
|
| 72 |
+
|
| 73 |
+
# ========================
|
| 74 |
+
# Database / Cache
|
| 75 |
+
# ========================
|
| 76 |
+
*.sqlite3
|
| 77 |
+
*.db
|
| 78 |
+
*.sqlite
|
| 79 |
+
__pycache__/
|
| 80 |
+
*.cache/
|
| 81 |
+
|
| 82 |
+
# ========================
|
| 83 |
+
# Hugging Face / Space temp files
|
| 84 |
+
# ========================
|
| 85 |
+
*.lock
|
| 86 |
+
*.h5
|
| 87 |
+
*.pt
|
Dockerfile
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Use official Python image
|
| 2 |
+
FROM python:3.11-slim
|
| 3 |
+
|
| 4 |
+
# Set working directory
|
| 5 |
+
WORKDIR /app
|
| 6 |
+
|
| 7 |
+
# Install system dependencies (for building Python deps)
|
| 8 |
+
RUN apt-get update && apt-get install -y build-essential && rm -rf /var/lib/apt/lists/*
|
| 9 |
+
|
| 10 |
+
# Copy and install Python dependencies
|
| 11 |
+
COPY requirements.txt .
|
| 12 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
| 13 |
+
|
| 14 |
+
# Copy project directories
|
| 15 |
+
COPY backend ./backend
|
| 16 |
+
COPY src ./src
|
| 17 |
+
COPY vectorstore ./vectorstore
|
| 18 |
+
COPY frontend ./frontend
|
| 19 |
+
COPY .env .env
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
# Expose the port that Hugging Face Spaces expects
|
| 23 |
+
EXPOSE 7860
|
| 24 |
+
|
| 25 |
+
# Run the FastAPI app
|
| 26 |
+
CMD ["uvicorn", "backend.api:app", "--host", "0.0.0.0", "--port", "7860"]
|
README.md
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# NoBrokerage Chatbot
|
| 2 |
+
|
| 3 |
+
**AI-powered real estate assistant** for NoBrokerage.com that retrieves property data from a FAISS vectorstore, applies structured filters, and generates grounded summaries and property cards using Groq LLM.
|
| 4 |
+
|
| 5 |
+
This project is built using **FastAPI**, **LangChain**, **FAISS**, **HuggingFace embeddings**, **Frontend**, and **Groq LLM**, and is ready for **Docker deployment** and **Hugging Face Spaces**.
|
| 6 |
+
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+
## Table of Contents
|
| 10 |
+
|
| 11 |
+
- [NoBrokerage Chatbot](#nobrokerage-chatbot)
|
| 12 |
+
- [Table of Contents](#table-of-contents)
|
| 13 |
+
- [Project Overview](#project-overview)
|
| 14 |
+
- [Features](#features)
|
| 15 |
+
- [Project Structure](#project-structure)
|
| 16 |
+
- [Example Queries the Chatbot Can Handle](#example-queries-the-chatbot-can-handle)
|
| 17 |
+
- [How to Run Locally](#how-to-run-locally)
|
| 18 |
+
- [1. Clone the Repository](#1-clone-the-repository)
|
| 19 |
+
- [2. Create Virtual Environment](#2-create-virtual-environment)
|
| 20 |
+
- [3. Install Dependencies](#3-install-dependencies)
|
| 21 |
+
- [4. Set Up Environment Variables](#4-set-up-environment-variables)
|
| 22 |
+
- [5. Run the FastAPI Server](#5-run-the-fastapi-server)
|
| 23 |
+
- [Tech Stack](#tech-stack)
|
| 24 |
+
- [Features](#features-1)
|
| 25 |
+
- [Deployment Ready](#deployment-ready)
|
| 26 |
+
- [👨💻 Author](#-author)
|
| 27 |
+
|
| 28 |
+
---
|
| 29 |
+
|
| 30 |
+
## Project Overview
|
| 31 |
+
|
| 32 |
+
NoBrokerage Chatbot allows users to query property listings by specifying filters like **city, BHK, budget, status, locality**, and returns **summary text** and **cards** with property details.
|
| 33 |
+
|
| 34 |
+
- **Semantic search**: FAISS vectorstore with HuggingFace embeddings for similarity search.
|
| 35 |
+
- **Deterministic filters**: Apply structured metadata filters for city, BHK, budget, status, and locality.
|
| 36 |
+
- **LLM summarization**: Groq LLM produces grounded summaries and card outputs strictly from filtered property records.
|
| 37 |
+
- **Deployment-ready**: Can run via CLI, FastAPI, Docker, or Hugging Face Spaces.
|
| 38 |
+
|
| 39 |
+
---
|
| 40 |
+
|
| 41 |
+
## Features
|
| 42 |
+
|
| 43 |
+
- Parse natural language queries for:
|
| 44 |
+
- Budget (₹, Cr, Lakh)
|
| 45 |
+
- BHK
|
| 46 |
+
- City
|
| 47 |
+
- Property status (Ready to move / Under construction)
|
| 48 |
+
- Locality or project
|
| 49 |
+
- FAISS similarity search over property embeddings
|
| 50 |
+
- Deterministic filtering of search results
|
| 51 |
+
- Generate structured JSON output with:
|
| 52 |
+
- `summary` (text summary)
|
| 53 |
+
- `cards` (detailed property info)
|
| 54 |
+
- FastAPI backend with `/chat` endpoint
|
| 55 |
+
- Dockerized for easy deployment
|
| 56 |
+
- Compatible with Hugging Face Spaces
|
| 57 |
+
|
| 58 |
+
---
|
| 59 |
+
|
| 60 |
+
## Project Structure
|
| 61 |
+
|
| 62 |
+
|
| 63 |
+
```bash
|
| 64 |
+
NOBROKERAGE/
|
| 65 |
+
├── backend/
|
| 66 |
+
│ ├── api.py
|
| 67 |
+
│
|
| 68 |
+
├── data/
|
| 69 |
+
├── database/
|
| 70 |
+
├── frontend/
|
| 71 |
+
├── processed_data/
|
| 72 |
+
├── src/
|
| 73 |
+
│ └── chatbot.py
|
| 74 |
+
├── subha/
|
| 75 |
+
├── vectorstore/
|
| 76 |
+
│ └── index.faiss
|
| 77 |
+
├── .env
|
| 78 |
+
├── .gitignore
|
| 79 |
+
├── Dockerfile
|
| 80 |
+
├── README.md
|
| 81 |
+
└── requirements.txt
|
| 82 |
+
|
| 83 |
+
```
|
| 84 |
+
---
|
| 85 |
+
|
| 86 |
+
## Example Queries the Chatbot Can Handle
|
| 87 |
+
|
| 88 |
+
The chatbot can intelligently respond to natural language queries like:
|
| 89 |
+
|
| 90 |
+
- " Find 2BHK apartments in Chembur "
|
| 91 |
+
- " 3BHK flat in Pune under ₹1.2 Cr "
|
| 92 |
+
- " Under-construction 3BHK in Mumbai "
|
| 93 |
+
- " 2bhk flat in pune "
|
| 94 |
+
- " 3bhk in Mumbai "
|
| 95 |
+
|
| 96 |
+
|
| 97 |
+
It uses:
|
| 98 |
+
- **FAISS** to find the most relevant property documents.
|
| 99 |
+
- **LangChain + Groq LLM** (`llama-3.1-8b-instant`) to summarize matching results.
|
| 100 |
+
- **Structured filters** for city, budget, BHK, locality, and status.
|
| 101 |
+
---
|
| 102 |
+
|
| 103 |
+
## How to Run Locally
|
| 104 |
+
|
| 105 |
+
### 1. Clone the Repository
|
| 106 |
+
```bash
|
| 107 |
+
git clone https://github.com/yourusername/nobrokerage.git
|
| 108 |
+
cd nobrokerage
|
| 109 |
+
```
|
| 110 |
+
### 2. Create Virtual Environment
|
| 111 |
+
```bash
|
| 112 |
+
python -m venv venv
|
| 113 |
+
venv\Scripts\activate # on Windows
|
| 114 |
+
# OR
|
| 115 |
+
source venv/bin/activate # on Mac/Linux
|
| 116 |
+
```
|
| 117 |
+
### 3. Install Dependencies
|
| 118 |
+
```bash
|
| 119 |
+
pip install -r requirements.txt
|
| 120 |
+
```
|
| 121 |
+
### 4. Set Up Environment Variables
|
| 122 |
+
```bash
|
| 123 |
+
GROQ_API_KEY=your_groq_api_key_here
|
| 124 |
+
```
|
| 125 |
+
### 5. Run the FastAPI Server
|
| 126 |
+
```bash
|
| 127 |
+
cd backend
|
| 128 |
+
uvicorn api:app --reload
|
| 129 |
+
```
|
| 130 |
+
---
|
| 131 |
+
|
| 132 |
+
## Tech Stack
|
| 133 |
+
|
| 134 |
+
- **FastAPI** — Backend API framework
|
| 135 |
+
- **Frontend** - index.html, style.css, script.js
|
| 136 |
+
- **LangChain** — LLM orchestration
|
| 137 |
+
- **Groq LLM (llama-3.1-8b-instant)** — Summarization & reasoning
|
| 138 |
+
- **FAISS** — Semantic vector search
|
| 139 |
+
- **HuggingFace Sentence Transformer** — Embeddings
|
| 140 |
+
- **Docker** — Containerization
|
| 141 |
+
- **Python 3.11**
|
| 142 |
+
|
| 143 |
+
---
|
| 144 |
+
|
| 145 |
+
## Features
|
| 146 |
+
|
| 147 |
+
✅ Semantic property search using FAISS
|
| 148 |
+
✅ Intelligent summaries and cards generated by Groq LLM
|
| 149 |
+
✅ Handles filters like city, budget, BHK, and project status
|
| 150 |
+
✅ Ready for Hugging Face Spaces or cloud deployment
|
| 151 |
+
✅ Modular architecture (backend + src separation)
|
| 152 |
+
|
| 153 |
+
---
|
| 154 |
+
|
| 155 |
+
## Deployment Ready
|
| 156 |
+
|
| 157 |
+
This backend is designed to work seamlessly with **Docker** and can deploy directly to **Hugging Face Spaces**.
|
| 158 |
+
Make sure `vectorstore/` and `.env` are included in your project before building the Docker image.
|
| 159 |
+
|
| 160 |
+
---
|
| 161 |
+
|
| 162 |
+
## 👨💻 Author
|
| 163 |
+
|
| 164 |
+
**Subhakanta Rath**
|
| 165 |
+
🎓 MSc AI & ML — IIIT Lucknow
|
| 166 |
+
💡 Focused on ML, Data Engineering & Agentic AI Systems
|
| 167 |
+
📍 Lucknow, India
|
backend/api.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi import FastAPI
|
| 2 |
+
from fastapi.middleware.cors import CORSMiddleware
|
| 3 |
+
from pydantic import BaseModel
|
| 4 |
+
from src.chatbot import handle_query # now safe
|
| 5 |
+
|
| 6 |
+
class ChatRequest(BaseModel):
|
| 7 |
+
query: str
|
| 8 |
+
|
| 9 |
+
class ChatResponse(BaseModel):
|
| 10 |
+
answer: str
|
| 11 |
+
cards: list = []
|
| 12 |
+
|
| 13 |
+
app = FastAPI(title="NoBrokerage Chatbot")
|
| 14 |
+
|
| 15 |
+
app.add_middleware(
|
| 16 |
+
CORSMiddleware,
|
| 17 |
+
allow_origins=["*"],
|
| 18 |
+
allow_credentials=True,
|
| 19 |
+
allow_methods=["*"],
|
| 20 |
+
allow_headers=["*"],
|
| 21 |
+
)
|
| 22 |
+
|
| 23 |
+
@app.post("/chat", response_model=ChatResponse)
|
| 24 |
+
def chat(request: ChatRequest):
|
| 25 |
+
result = handle_query(request.query)
|
| 26 |
+
return ChatResponse(answer=result.get("summary"), cards=result.get("cards", []))
|
| 27 |
+
|
| 28 |
+
@app.get("/")
|
| 29 |
+
def root():
|
| 30 |
+
return {"message": "✅ NoBrokerage running"}
|
data/ProjectAddress.csv
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
id , projectId , landmark , fullAddress , pincode
|
| 2 |
+
cmf53kl01000nvcu8ibut7fka, cmf53kkzy000fvcu8tx8jwjmr, Babys school , Mumbai chembur , 411017
|
| 3 |
+
cmf5r6hv30008vxptq5el3h5n, cmf5r6hv00001vxptnfichhfl, Sai nagar , "sr no 13 beside godrej, opposite to mca stadium, sai nagar, mamurdi, pune " , 412101
|
| 4 |
+
cmfawdrnt000kvc18h3j7e93j, cmfawdrno0007vc18l0fm0z2j, Sindhi Society , "Sindhi Society, Near Swami Vivekanand Jr College, Chembur, Mumbai Harbour, Mumbai" , 400071
|
| 5 |
+
cmfaxq2ot002avc18ild77rjg, cmfaxq2oo0020vc1806nmle00, Sindhi Society , "Cts 300, plot no 37, opposite midtown 71, Sindhi Society, Chembur, Mumbai, Maharashtra 400071" , 400069
|
| 6 |
+
cmfaycwya003hvc18yc5gtwtc, cmfaycwy70036vc18ppmb8mwh, Hind high school , "104, Yashvant Seth Jadhav Marg, Gauri Shankar Wadi No. 2, Savitribai Phule Nagar, Pant Nagar, Ghatkopar East, Mumbai, Maharashtra 400075" , 400075
|
| 7 |
+
cmfc6pq1n000cvca0gpdjstzf, cmfc6pq1k0001vca0ikzb258m, JBCN International School Mulund , Prataprao Gujar Rd Neelam Nagar Mulund East Mumbai Maharashtra 400081 , 400081
|
| 8 |
+
cmfc79ip8001lvca0o1ls6fuz, cmfc79ip5001cvca0qht6o44p, JBCN International School Parel , AVENUE 15 Ramesh Barrel Supplying Company K.T.Gupta Wadi S.P.Murai Rd behind Sewri Road Sewri W Maharashtra 400015 , 400015
|
| 9 |
+
cmfc80zv4002lvca04o23il71, cmfc80zv1002dvca0hcgoc6ea, Infiniti Mall , "Swaroop Aditya Avenue, Sheraton Hotel, Marol Pipeline Rd, near Itc Maratha, Kanti Nagar, J B Nagar, Andheri East, Mumbai, Maharashtra 400099", 400099
|
| 10 |
+
cmfc8w1ea003nvca0sz7s13bl, cmfc8w1e8003dvca0yvieggaz, R Mall , "Marigold Miraaya, Purushottam Kheraj Rd, Asha Nagar, Mulund West, Mumbai, Maharashtra 400080" , 400080
|
| 11 |
+
cmfcccifw004vvca0mvtcgxos, cmfcccifs004nvca0b7im3r5a, Lodha Xperia Mall , 64C5+C63 Dombivli East Dombivli Maharashtra 421301 , 421201
|
| 12 |
+
cmfcd6uus005ovca0f1pjzb76, cmfcd6uup005fvca03vhph9j1, R City , "3WG5+CHM, 90 Feet Rd, Garodia Nagar, Ghatkopar East, Mumbai, Maharashtra 400077" , 400077
|
| 13 |
+
cmfcdo9ek006qvca0y01p1j7c, cmfcdo9ei006gvca0wq9t8usr, Criticare Hospital , "Makwana Rd, Gamdevi, Marol, Andheri East, Mumbai, Maharashtra 400059" , 400059
|
| 14 |
+
cmfcg9req000avc20v8brb1zg, cmfcg9ren0001vc209rw25eve, Sarai Sport Acadamy , " Kate Wasti Rd, Kate Wasti, Punawale, Pimpri-Chinchwad, Dattwadi, Maharashtra 411033" , 411033
|
| 15 |
+
cmfdmdqmu000jvc90b6auuc6b, cmfdmdqmq0008vc90svu2sfto, Station Road Saraswat Colony , "CTS NO 391, Station Rd, opp. Zilla Parishad, Mangalwar Peth, Somwar Peth, Pune, Maharashtra 411011" , 411011
|
| 16 |
+
cmfdnk2s1001xvc90bewa3cn0, cmfdnk2rz001rvc90t6aa3f0e, Model Colony , "1102/A/48, Lakaki Rd, Model Colony, Shivajinagar, Pune, Maharashtra 411016" , 411016
|
| 17 |
+
cmfdro2w4002ovc90arhj0v5w, cmfdro2w2002ivc90co2n24lb, Bharat English School & jr. College , "Dinmanee, Squadron Leader Sureshchandra Bhagwat Rd, Model Colony, Shivajinagar, Pune, Maharashtra 411016" , 411016
|
| 18 |
+
cmfdssd1b003fvc90p5sgwr4n, cmfdssd190037vc90paoxv29h, Renuka mata mandir , "Sr.no.36 Zoa, keshav nagar,Neatr renuka mata Temple Mundhwa, pune 411036" , 411036
|
| 19 |
+
cmfdu2099004evc90okn0mpde, cmfdu20970046vc90g587nym1, Shri Kshetra Kalbhairavnath Temple , "Survey no. 18-19, plot no. p7, river road, Thite Nagar, Kharadi, Pune, Maharashtra 411014" , 411014
|
| 20 |
+
cmfdvkxex0059vc90y73532b2, cmfdvkxeu0053vc90gquj3cbz, Sai nagar Rd , "Sai Nagar, Mamurdi, Dehu Road, Maharashtra 412101" , 412101
|
| 21 |
+
cmfdxi4sy005zvc909kpgh2dl, cmfdxi4sv005rvc90ygfhnzc9, Maharashtra Cricket Association Stadium, "MP78+P45, St Tukaram Nagar, Mamurdi, Dehu Road, Maharashtra 412101" , 412101
|
| 22 |
+
cmfdyb2yf0071vc90z0jmbahe, cmfdyb2yc006rvc900owycgrv, Chandraprabha corner , "BRT Link Rd, Ravet, Pimpri-Chinchwad, Maharashtra 412101" , 412099
|
| 23 |
+
cmfdz9fvz008hvc9079u0jrlc, cmfdz9fvx0088vc90pw26eyr8, Police Station , "Santiago sky town, MP9R+2JG, Ravet Rd, Vikas Nagar, Ravet, Pimpri-Chinchwad, Dehu Road, Maharashtra 412101" , 412101
|
| 24 |
+
cmfe01l6j009pvc902gw4nwqa, cmfe01l6h009gvc90y1zazr09, MNGL CNG Station , "The Silver altair Project Sr.No. 8/1,12/5 Near MNGL CNG Station , Aundh Ravet BRTS RD, Ravet" , 412101
|
| 25 |
+
cmff8swbn0007vxp7bhj7cmqv, cmff8swbm0001vxp7pe3neibi, sdfgb , asdfgh , 123456
|
| 26 |
+
cmftjwws90009vx552vtbze6k, cmftjwws60001vx55r0q7797l, LANDMARK , ADDRESS , 123456
|
| 27 |
+
cmfw5ivre0009vxnkmzexw3zd, cmfw5ivra0001vxnkbozvz8bd, sedrftgyhuj , awsedrftgyhujk , 123456
|
| 28 |
+
cmfwd3782000evxgxgjz4wuum, cmfwd377z0008vxgxd9nju858, landmark , address , 828123
|
| 29 |
+
cmfxrvmud000kqq13r64tex8v, cmfxrvmuc0009qq138n0vk91p, Jain mandir , "Building No 10, Subhash Nagar Redevelopment Cluster, Subhash Nagar, Chembur, Mumbai, Maharashtra 400071" , 400071
|
| 30 |
+
cmfxtgtbz000fvxov0zosuc1d, cmfxtgtbw0009vxov4t5onh7d, esrdfghbj , sdfghj , 123456
|
| 31 |
+
cmfxwmse80007qq099axxvni0, cmfxwmse70001qq0908yt6oar, Shri siddhivinayak ganesh temple , "Building No 10, Subhash Nagar Redevelopment Cluster, Subhash Nagar, Chembur, Mumbai, Maharashtra 400071" , 400076
|
| 32 |
+
cmfxxh08u001cqq09fwo5o5i7, cmfxxh08t0013qq09o0rajcrt, Shri siddhivinayak ganesh temple , "Subhash Nagar, Chembur, Mumbai Harbour, Mumbai" , 400076
|
data/ProjectConfiguration.csv
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
id , projectId , propertyCategory, type , customBHK
|
| 2 |
+
cmf53kkzz000ivcu89r5399s4, cmf53kkzy000fvcu8tx8jwjmr, RESIDENTIAL , 1BHK ,
|
| 3 |
+
cmf53kl00000kvcu86ivy65di, cmf53kkzy000fvcu8tx8jwjmr, RESIDENTIAL , 2BHK ,
|
| 4 |
+
cmf5r6hv20004vxpt0l657blu, cmf5r6hv00001vxptnfichhfl, RESIDENTIAL , 2BHK , 2BHK
|
| 5 |
+
cmfawdrnq000avc18qcvaxzi9, cmfawdrno0007vc18l0fm0z2j, RESIDENTIAL , 1BHK , 1BHK
|
| 6 |
+
cmfawdrnr000dvc188hupv4yy, cmfawdrno0007vc18l0fm0z2j, RESIDENTIAL , 3BHK , 3BHK
|
| 7 |
+
cmfawdrnr000gvc18iunqlv98, cmfawdrno0007vc18l0fm0z2j, RESIDENTIAL , 2BHK , 2BHK
|
| 8 |
+
cmfaxq2or0023vc18biodrtiy, cmfaxq2oo0020vc1806nmle00, RESIDENTIAL , 1BHK , 1BHK
|
| 9 |
+
cmfaxq2os0025vc18y99ryrns, cmfaxq2oo0020vc1806nmle00, RESIDENTIAL , 2BHK , 2BHK
|
| 10 |
+
cmfaxq2os0027vc1861948lln, cmfaxq2oo0020vc1806nmle00, RESIDENTIAL , 3BHK , 3BHK
|
| 11 |
+
cmfaycwy80039vc18b1epdodx, cmfaycwy70036vc18ppmb8mwh, RESIDENTIAL , 1BHK , 1BHK
|
| 12 |
+
cmfaycwy9003dvc1853ic14wb, cmfaycwy70036vc18ppmb8mwh, RESIDENTIAL , 2BHK , 2BHK
|
| 13 |
+
cmfc6pq1m0004vca0cdihsx99, cmfc6pq1k0001vca0ikzb258m, RESIDENTIAL , 1BHK , 1BHK
|
| 14 |
+
cmfc6pq1m0006vca04kqz1wsp, cmfc6pq1k0001vca0ikzb258m, RESIDENTIAL , 2BHK , 2BHK
|
| 15 |
+
cmfc6pq1m0009vca0tmv501em, cmfc6pq1k0001vca0ikzb258m, RESIDENTIAL , 3BHK , 3BHK
|
| 16 |
+
cmfc79ip7001fvca0dhfqinl1, cmfc79ip5001cvca0qht6o44p, RESIDENTIAL , 1BHK , 1BHK
|
| 17 |
+
cmfc79ip7001ivca0pjtsq247, cmfc79ip5001cvca0qht6o44p, RESIDENTIAL , 2BHK , 2BHK
|
| 18 |
+
cmfc80zv3002gvca08q08d09k, cmfc80zv1002dvca0hcgoc6ea, COMMERCIAL , Office , Office
|
| 19 |
+
cmfc8w1e9003gvca0vfq51lrw, cmfc8w1e8003dvca0yvieggaz, RESIDENTIAL , 2BHK , 2BHK
|
| 20 |
+
cmfc8w1ea003kvca0antflsgo, cmfc8w1e8003dvca0yvieggaz, RESIDENTIAL , 3BHK , 3BHK
|
| 21 |
+
cmfcccifu004qvca0daqsesxl, cmfcccifs004nvca0b7im3r5a, RESIDENTIAL , 1BHK , 1BHK
|
| 22 |
+
cmfcccifv004svca07g88pbp7, cmfcccifs004nvca0b7im3r5a, RESIDENTIAL , 2BHK , 2BHK
|
| 23 |
+
cmfcd6uur005ivca0zanvi722, cmfcd6uup005fvca03vhph9j1, RESIDENTIAL , 2BHK , 2BHK
|
| 24 |
+
cmfcd6uur005lvca0r1lfayx1, cmfcd6uup005fvca03vhph9j1, RESIDENTIAL , 3BHK , 3BHK
|
| 25 |
+
cmfcdo9ej006jvca0unalmr56, cmfcdo9ei006gvca0wq9t8usr, RESIDENTIAL , 1BHK , 1BHK
|
| 26 |
+
cmfcdo9ek006lvca0wye9m2zq, cmfcdo9ei006gvca0wq9t8usr, RESIDENTIAL , 2BHK , 2BHK
|
| 27 |
+
cmfcdo9ek006nvca0aerkp2r8, cmfcdo9ei006gvca0wq9t8usr, RESIDENTIAL , Office space,
|
| 28 |
+
cmfcg9rep0004vc20nnmldrf5, cmfcg9ren0001vc209rw25eve, RESIDENTIAL , 2BHK , 2BHK
|
| 29 |
+
cmfcg9rep0006vc20zocna1zw, cmfcg9ren0001vc209rw25eve, RESIDENTIAL , 3BHK , 3BHK
|
| 30 |
+
cmfdmdqms000bvc90e1hpq42a, cmfdmdqmq0008vc90svu2sfto, RESIDENTIAL , 1BHK , 1BHK
|
| 31 |
+
cmfdmdqmt000dvc90s9ndd0nq, cmfdmdqmq0008vc90svu2sfto, RESIDENTIAL , 2BHK , 2BHK
|
| 32 |
+
cmfdmdqmt000gvc90h6gcwpga, cmfdmdqmq0008vc90svu2sfto, RESIDENTIAL , 3BHK , 3BHK
|
| 33 |
+
cmfdnk2s1001uvc90qi4xuo6m, cmfdnk2rz001rvc90t6aa3f0e, RESIDENTIAL , 4.5BHK , Custom
|
| 34 |
+
cmfdro2w3002lvc90reujbiw4, cmfdro2w2002ivc90co2n24lb, RESIDENTIAL , 3BHK , 3BHK
|
| 35 |
+
cmfdssd1a003avc90t92jvmti, cmfdssd190037vc90paoxv29h, RESIDENTIAL , 1BHK , 1BHK
|
| 36 |
+
cmfdssd1b003cvc905s09tzlj, cmfdssd190037vc90paoxv29h, RESIDENTIAL , 2BHK , 2BHK
|
| 37 |
+
cmfdu20980049vc901gbx5yzt, cmfdu20970046vc90g587nym1, RESIDENTIAL , 2BHK , 2BHK
|
| 38 |
+
cmfdu2099004bvc90md0gqlsn, cmfdu20970046vc90g587nym1, RESIDENTIAL , 3BHK , 3BHK
|
| 39 |
+
cmfdvkxew0056vc90azi120pa, cmfdvkxeu0053vc90gquj3cbz, RESIDENTIAL , 2BHK , 2BHK
|
| 40 |
+
cmfdxi4sx005uvc90ek5w6w18, cmfdxi4sv005rvc90ygfhnzc9, RESIDENTIAL , 1BHK ,
|
| 41 |
+
cmfdxi4sx005wvc90x44fqzb5, cmfdxi4sv005rvc90ygfhnzc9, RESIDENTIAL , 2BHK ,
|
| 42 |
+
cmfdyb2yd006uvc90uba2ys2y, cmfdyb2yc006rvc900owycgrv, RESIDENTIAL , 2BHK ,
|
| 43 |
+
cmfdyb2ye006xvc90tgudor3v, cmfdyb2yc006rvc900owycgrv, RESIDENTIAL , 3BHK ,
|
| 44 |
+
cmfdz9fvy008bvc90b7nawpiw, cmfdz9fvx0088vc90pw26eyr8, RESIDENTIAL , 2BHK , 2BHK
|
| 45 |
+
cmfdz9fvy008evc90f98iggaw, cmfdz9fvx0088vc90pw26eyr8, RESIDENTIAL , 3BHK , 3BHK
|
| 46 |
+
cmfe01l6i009jvc90qz54yiev, cmfe01l6h009gvc90y1zazr09, RESIDENTIAL , 2BHK , 2BHK
|
| 47 |
+
cmfe01l6j009mvc90aj7pny7p, cmfe01l6h009gvc90y1zazr09, RESIDENTIAL , 3BHK , 3BHK
|
| 48 |
+
cmfozqxd90001vxxuau2xc6lj, cmff8swbm0001vxp7pe3neibi, RESIDENTIAL , 5BHK ,
|
| 49 |
+
cmfozzj19001rvxxuloxiehen, cmff8swbm0001vxp7pe3neibi, RESIDENTIAL , 2BHK ,
|
| 50 |
+
cmftjwws80004vx55yx8nel0u, cmftjwws60001vx55r0q7797l, RESIDENTIAL , 4BHK , 4BHK
|
| 51 |
+
cmftjwws80006vx55x3s20w2u, cmftjwws60001vx55r0q7797l, RESIDENTIAL , 4.5BHK ,
|
| 52 |
+
cmfw5ivrc0004vxnkqlpfdbae, cmfw5ivra0001vxnkbozvz8bd, RESIDENTIAL , House_Villa , House_Villa
|
| 53 |
+
cmfw5ivrd0006vxnk2bia4myh, cmfw5ivra0001vxnkbozvz8bd, RESIDENTIAL , 3BHK , 3BHK
|
| 54 |
+
cmfwd3781000bvxgx5ilktqht, cmfwd377z0008vxgxd9nju858, RESIDENTIAL , 4BHK , 4BHK
|
| 55 |
+
cmfxrvmud000cqq134yeaya3o, cmfxrvmuc0009qq138n0vk91p, RESIDENTIAL , 1BHK , 1BHK
|
| 56 |
+
cmfxrvmud000eqq13dl82i5js, cmfxrvmuc0009qq138n0vk91p, RESIDENTIAL , 2BHK , 2BHK
|
| 57 |
+
cmfxrvmud000hqq136m0p71jv, cmfxrvmuc0009qq138n0vk91p, RESIDENTIAL , 3BHK , 3BHK
|
| 58 |
+
cmfxtgtby000cvxovsdc7rfa6, cmfxtgtbw0009vxov4t5onh7d, RESIDENTIAL , 3BHK , 3BHK
|
| 59 |
+
cmfxwmse70004qq0987ge7h2b, cmfxwmse70001qq0908yt6oar, RESIDENTIAL , 1RK ,
|
| 60 |
+
cmfxxh08t0016qq09wmpw7s17, cmfxxh08t0013qq09o0rajcrt, RESIDENTIAL , 1BHK , 1BHK
|
| 61 |
+
cmfxxh08u0018qq09k3wwm63q, cmfxxh08t0013qq09o0rajcrt, RESIDENTIAL , 2BHK , 2BHK
|
data/ProjectConfigurationVariant.csv
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"id" , "configurationId" , "bathrooms", "privateBathrooms", "publicBathrooms", "balcony", "furnishedType" , "furnishingType" , "lift" , "ageOfProperty", "parkingType", "listingType", "floorPlanImage" , "carpetArea", "price" , "propertyImages" , "maintenanceCharges", "aboutProperty" , "createdAt" , "updatedAt"
|
| 2 |
+
"cmf5r6hv20005vxpt3yfnl2qp", "cmf5r6hv20004vxpt0l657blu", "12" , , , "3" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757011238520-ba6c9c4021ea321f.jpg" , "972" , "120000000", "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757011238541-c8a6e3aced460e18.jpg""]" , "faded " , "about property " , "2025-09-04 18:42:08.748", "2025-09-04 18:42:08.748"
|
| 3 |
+
"cmf5r6hv20006vxptcx3lmm05", "cmf5r6hv20004vxpt0l657blu", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757011238542-2d39a8b06669406b.jpg" , "188.73" , "210000000", "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757011238542-bd3d1a40c2d7fadb.jpg""]" , , "fsdaffdsafsfdddsa" , "2025-09-04 18:42:08.748", "2025-09-04 18:42:08.748"
|
| 4 |
+
"cmfawdrnq000bvc188680qjyx", "cmfawdrnq000avc18qcvaxzi9", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391101-b4e4be9945434d29.jpg" , "426.57" , "13000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391106-7c383f81d9c66290.jpg""]" , , "na" , "2025-09-08 09:06:36.995", "2025-09-08 09:06:36.995"
|
| 5 |
+
"cmfawdrnr000cvc1897rpsu1b", "cmfawdrnq000avc18qcvaxzi9", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391141-e6c14becbdbd76a2.jpg" , "460.8" , "15000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391150-9b806803ceb0c8b6.jpg""]" , , "na" , "2025-09-08 09:06:36.995", "2025-09-08 09:06:36.995"
|
| 6 |
+
"cmfawdrnr000evc18jwvlery4", "cmfawdrnr000dvc188hupv4yy", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391158-41329b8304cff17d.jpg" , "893.08" , "29000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391167-19d3844213de86cb.jpg""]" , , "na" , "2025-09-08 09:06:36.995", "2025-09-08 09:06:36.995"
|
| 7 |
+
"cmfawdrnr000fvc18af74elnu", "cmfawdrnr000dvc188hupv4yy", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391179-7f2bff943c2805a5.jpg" , "918.27" , "29000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391188-7b25319224e8a812.jpg""]" , , "na" , "2025-09-08 09:06:36.995", "2025-09-08 09:06:36.995"
|
| 8 |
+
"cmfawdrns000hvc18t3u6jukg", "cmfawdrnr000gvc18iunqlv98", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391195-0e9c4aa442f80776.jpg" , "804.6" , "26000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391202-e4d28b891dcb832f.jpg""]" , , "na" , "2025-09-08 09:06:36.995", "2025-09-08 09:06:36.995"
|
| 9 |
+
"cmfawdrns000ivc181n6bq8cm", "cmfawdrnr000gvc18iunqlv98", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391210-70f3ad7351a09d4c.jpg" , "1036.67" , "33000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391218-4ca8b878a42de5ae.jpg""]" , , "na" , "2025-09-08 09:06:36.995", "2025-09-08 09:06:36.995"
|
| 10 |
+
"cmfaxq2or0024vc18pjebowp8", "cmfaxq2or0023vc18biodrtiy", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757324645437-975f7a8ecca1de6d.jpg" , "443.37" , "13000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757324645448-dbde48f7805f3bd0.jpg""]" , , "na" , "2025-09-08 09:44:10.775", "2025-09-08 09:44:10.775"
|
| 11 |
+
"cmfaxq2os0026vc18v92cqw3r", "cmfaxq2os0025vc18y99ryrns", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757324645448-970dda42c441c73b.jpg" , "644.11" , "19000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757324645449-b2f826d061804b98.jpg""]" , , "na" , "2025-09-08 09:44:10.775", "2025-09-08 09:44:10.775"
|
| 12 |
+
"cmfaxq2os0028vc18z4otsg17", "cmfaxq2os0027vc1861948lln", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757324645450-abde5eb3211c0467.jpg" , "798.57" , "23000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757324645451-d9b3e0a968cfc871.jpg""]" , , "na" , "2025-09-08 09:44:10.775", "2025-09-08 09:44:10.775"
|
| 13 |
+
"cmfaycwy9003avc18vwkotg8q", "cmfaycwy80039vc18b1epdodx", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712590-57c98e762d3e95c3.jpg" , "379" , "850000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712591-aa79bad30786e10c.jpg""]" , , "na" , "2025-09-08 10:01:56.431", "2025-09-08 10:01:56.431"
|
| 14 |
+
"cmfaycwy9003bvc189xf97r7w", "cmfaycwy80039vc18b1epdodx", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712593-25cd2d9a5765be22.jpg" , "354" , "790000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712594-cd33c56e7db9cd37.jpg""]" , , "na" , "2025-09-08 10:01:56.431", "2025-09-08 10:01:56.431"
|
| 15 |
+
"cmfaycwy9003cvc181yx3c5gf", "cmfaycwy80039vc18b1epdodx", "1" , , , "0" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712597-accd128a6ea12d10.jpg" , "391" , "880000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712598-d2ac8b8887119ad8.jpg""]" , , "na" , "2025-09-08 10:01:56.431", "2025-09-08 10:01:56.431"
|
| 16 |
+
"cmfaycwy9003evc186uhex90a", "cmfaycwy9003dvc1853ic14wb", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712599-4bd849d13fb20425.jpg" , "536" , "12000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712607-8e031215d719e572.jpg""]" , , "na" , "2025-09-08 10:01:56.431", "2025-09-08 10:01:56.431"
|
| 17 |
+
"cmfaycwy9003fvc1859euhuy7", "cmfaycwy9003dvc1853ic14wb", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712608-05900f06f63a6dfa.jpg" , "650" , "14000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712608-e94b60550c5c2690.jpg""]" , , "na" , "2025-09-08 10:01:56.431", "2025-09-08 10:01:56.431"
|
| 18 |
+
"cmfc6pq1m0005vca07z1oktrg", "cmfc6pq1m0004vca0cdihsx99", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210633-ec5431f188d4de3c.jpg" , "457.57" , "12000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210665-ab087e966ba018ff.jpg""]" , , "na" , "2025-09-09 06:43:37.112", "2025-09-09 06:43:37.112"
|
| 19 |
+
"cmfc6pq1m0007vca0wei4jsgs", "cmfc6pq1m0006vca04kqz1wsp", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210671-c54804f690eac296.jpg" , "652.83" , "17000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210672-3f6998fafc9e8521.jpg""]" , , "na" , "2025-09-09 06:43:37.112", "2025-09-09 06:43:37.112"
|
| 20 |
+
"cmfc6pq1m0008vca0hsbdneqc", "cmfc6pq1m0006vca04kqz1wsp", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210675-be2512dbfae0b3f7.jpg" , "728.5" , "19000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210678-f61b2d8c4b4a4a50.jpg""]" , , "na" , "2025-09-09 06:43:37.112", "2025-09-09 06:43:37.112"
|
| 21 |
+
"cmfc6pq1n000avca0g8zz0fur", "cmfc6pq1m0009vca0tmv501em", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210681-7ca76e0e6739c3c1.jpg" , "1240.22" , "33000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210682-37e9e8c4f43b5b32.jpg""]" , , "na" , "2025-09-09 06:43:37.112", "2025-09-09 06:43:37.112"
|
| 22 |
+
"cmfc79ip7001gvca0u52qiras", "cmfc79ip7001fvca0dhfqinl1", "1" , , , "0" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136185-abf1e76a1175f931.jpg" , "416.56" , "9890000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136186-23bdb16c58a9e122.jpg""]" , , "na" , "2025-09-09 06:59:00.713", "2025-09-09 06:59:00.713"
|
| 23 |
+
"cmfc79ip7001hvca0xz5kv4ld", "cmfc79ip7001fvca0dhfqinl1", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136186-d8d90b0f32b32c7f.jpg" , "438.63" , "14000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136187-7ce77cd129550d77.jpg""]" , , "na" , "2025-09-09 06:59:00.713", "2025-09-09 06:59:00.713"
|
| 24 |
+
"cmfc79ip8001jvca0r5k1gc5d", "cmfc79ip7001ivca0pjtsq247", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136187-1ecea6707162bfe7.jpg" , "653.15" , "15000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136188-b404a27ba98528f4.jpg""]" , , "na" , "2025-09-09 06:59:00.713", "2025-09-09 06:59:00.713"
|
| 25 |
+
"cmfc80zv3002hvca0yghwoxui", "cmfc80zv3002gvca08q08d09k", "1" , "1" , "1" , , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757402417345-d65dfb1fd5d0d077.jpg" , "239" , "5975000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757402417346-ede3eaf6864e2efa.jpg""]" , , "na" , "2025-09-09 07:20:22.669", "2025-09-09 07:20:22.669"
|
| 26 |
+
"cmfc80zv4002ivca0pti2hjp8", "cmfc80zv3002gvca08q08d09k", "1" , "1" , "1" , , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757402417346-59bcce3ff8c17194.jpg" , "309" , "7720000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757402417347-f5e0ac2f495d60e1.jpg""]" , , "na" , "2025-09-09 07:20:22.669", "2025-09-09 07:20:22.669"
|
| 27 |
+
"cmfc80zv4002jvca0kkwyzbb6", "cmfc80zv3002gvca08q08d09k", "0" , "0" , "0" , , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757402417348-0cca2389f798785c.jpg" , "634" , "15000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757402417348-9bfc082c0bba270f.jpg""]" , , , "2025-09-09 07:20:22.669", "2025-09-09 07:20:22.669"
|
| 28 |
+
"cmfc8w1ea003hvca0yj9692xd", "cmfc8w1e9003gvca0vfq51lrw", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866053-185c21624393f002.jpg" , "637.76" , "8900000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866054-3b21d5295d1b7bce.jpg""]" , , "na" , "2025-09-09 07:44:30.992", "2025-09-09 07:44:30.992"
|
| 29 |
+
"cmfc8w1ea003ivca01s66pru9", "cmfc8w1e9003gvca0vfq51lrw", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866054-1c8c078c7503aa74.jpg" , "783.83" , "10000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866054-19520d6cb5866f61.jpg""]" , , "na" , "2025-09-09 07:44:30.992", "2025-09-09 07:44:30.992"
|
| 30 |
+
"cmfc8w1ea003jvca011hgz43s", "cmfc8w1e9003gvca0vfq51lrw", "2" , , , "0" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866054-f05bbc2ef47cc262.jpg" , "719.46" , "10000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866054-18d491c4116a4a1d.jpg""]" , , "na" , "2025-09-09 07:44:30.992", "2025-09-09 07:44:30.992"
|
| 31 |
+
"cmfc8w1ea003lvca01p19m6o0", "cmfc8w1ea003kvca0antflsgo", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866054-66f1c36cd5370f62.jpg" , "1090.59" , "15000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866055-12dde6891b923a80.jpg""]" , , "na" , "2025-09-09 07:44:30.992", "2025-09-09 07:44:30.992"
|
| 32 |
+
"cmfcccifv004rvca0a0lvecba", "cmfcccifu004qvca0daqsesxl", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672773-6523197b4bafe2f8.jpg" , "422" , "4190000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672775-37d2dedeb898bfd3.jpg""]" , , "na" , "2025-09-09 09:21:18.424", "2025-09-09 09:21:18.424"
|
| 33 |
+
"cmfcccifv004tvca0yjaewx04", "cmfcccifv004svca07g88pbp7", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672776-9c48211b8fc08a50.jpg" , "580" , "5770000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672776-55a3d0d5d7d3bb44.jpg""]" , , "na" , "2025-09-09 09:21:18.424", "2025-09-09 09:21:18.424"
|
| 34 |
+
"cmfcd6uur005jvca02nt9ohd3", "cmfcd6uur005ivca0zanvi722", "2" , , , "0" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411089519-382dc615d1a8a01c.jpg" , "518.71" , "17000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411089520-1fd3665afc1a746a.jpg""]" , , "na" , "2025-09-09 09:44:54.193", "2025-09-09 09:44:54.193"
|
| 35 |
+
"cmfcd6uur005kvca0xz0ru5kf", "cmfcd6uur005ivca0zanvi722", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411089523-4a25ba0ab26ba4af.jpg" , "712.68" , "24000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411089524-f866cded7e572242.jpg""]" , , "na" , "2025-09-09 09:44:54.193", "2025-09-09 09:44:54.193"
|
| 36 |
+
"cmfcd6uus005mvca0z74nkpkh", "cmfcd6uur005lvca0r1lfayx1", "3" , , , "0" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411089524-85f5063857a9e066.jpg" , "1098.46" , "37000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411089525-9e16be48ea1c5dca.jpg""]" , , "na" , "2025-09-09 09:44:54.193", "2025-09-09 09:44:54.193"
|
| 37 |
+
"cmfcdo9ej006kvca0mi9penvv", "cmfcdo9ej006jvca0unalmr56", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411900104-d2b27e1086902c25.jpg" , "425.39" , "12000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411900105-0cd46f586c660d51.jpg""]" , , "na" , "2025-09-09 09:58:26.202", "2025-09-09 09:58:26.202"
|
| 38 |
+
"cmfcdo9ek006mvca080i6yeza", "cmfcdo9ek006lvca0wye9m2zq", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411900105-92746a06993e21a1.jpg" , "589.43" , "17000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411900106-3270032d1b3b29a6.jpg""]" , , "na" , "2025-09-09 09:58:26.202", "2025-09-09 09:58:26.202"
|
| 39 |
+
"cmfcdo9ek006ovca0wwc1e84f", "cmfcdo9ek006nvca0aerkp2r8", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411900106-2052b7fd49a2faaa.jpg" , "710.63" , "21000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411900108-5b7ad0636af0eef0.jpg""]" , , "na" , "2025-09-09 09:58:26.202", "2025-09-09 09:58:26.202"
|
| 40 |
+
"cmfcg9rep0005vc20150vzeqp", "cmfcg9rep0004vc20nnmldrf5", "0" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757416263429-b34f6e00dad04cee.jpg" , "835" , "67000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757416263441-db4005e8699b54f5.jpg""]" , , "na" , "2025-09-09 11:11:08.543", "2025-09-09 11:11:08.543"
|
| 41 |
+
"cmfcg9rep0007vc20aotbggv3", "cmfcg9rep0006vc20zocna1zw", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757416263442-37973fcf73632905.jpg" , "1064" , "86000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757416263443-efccc3b7b11a9cf6.jpg""]" , , "na" , "2025-09-09 11:11:08.543", "2025-09-09 11:11:08.543"
|
| 42 |
+
"cmfcg9rep0008vc207t5kmleq", "cmfcg9rep0006vc20zocna1zw", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757416263444-42b0f4d7ba7315d4.jpg" , "1185" , "96000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757416263445-61ad0a336e5cd7e8.jpg""]" , , "na" , "2025-09-09 11:11:08.543", "2025-09-09 11:11:08.543"
|
| 43 |
+
"cmfdmdqms000cvc90o7xhka3i", "cmfdmdqms000bvc90e1hpq42a", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757486991474-f7da47510a2039a9.jpeg", "269.1" , "5649000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757486991482-830ba2f79d951b2a.jpg""]" , "NA" , "NA" , "2025-09-10 06:49:58.034", "2025-09-10 06:49:58.034"
|
| 44 |
+
"cmfdmdqmt000evc90cfyoejib", "cmfdmdqmt000dvc90s9ndd0nq", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757486991488-c0b949b98960c0ed.jpg" , "685" , "14300000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757486991494-9ac904a02c4e153c.jpg""]" , "NA" , "NA" , "2025-09-10 06:49:58.034", "2025-09-10 06:49:58.034"
|
| 45 |
+
"cmfdmdqmt000fvc900m43j9nq", "cmfdmdqmt000dvc90s9ndd0nq", "2" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , , "900" , "18900000" , "[]" , "NA" , "NA" , "2025-09-10 06:49:58.034", "2025-09-10 06:49:58.034"
|
| 46 |
+
"cmfdmdqmt000hvc90cqvdwrq7", "cmfdmdqmt000gvc90h6gcwpga", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757486991499-74fa17a4c97985e2.jpg" , "1095" , "22900000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757486991505-2373b8e162de669f.jpg""]" , "NA" , "NA" , "2025-09-10 06:49:58.034", "2025-09-10 06:49:58.034"
|
| 47 |
+
"cmfdnk2s1001vvc90hgqf4i31", "cmfdnk2s1001uvc90qi4xuo6m", "4" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757488967184-719e10b6efff3546.jpg" , "2650" , "55800000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757488967185-54cee65e85919c06.jpg""]" , , "NA" , "2025-09-10 07:22:53.328", "2025-09-10 07:22:53.328"
|
| 48 |
+
"cmfdro2w3002mvc90s7nanw73", "cmfdro2w3002lvc90reujbiw4", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757495874341-877b209a8dd708f2.jpg" , "1065" , "25400000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757495874342-f91c6d45130b2367.jpg""]" , "NA" , "NA" , "2025-09-10 09:17:58.561", "2025-09-10 09:17:58.561"
|
| 49 |
+
"cmfdssd1b003bvc90y4vu1v7i", "cmfdssd1a003avc90t92jvmti", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757497751961-62a4a746ffb7d92a.jpeg", "450" , "7499000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757497751961-e4b9f6b35ff84fc4.jpg""]" , "NA" , "NA" , "2025-09-10 09:49:17.949", "2025-09-10 09:49:17.949"
|
| 50 |
+
"cmfdssd1b003dvc903vfdvvi2", "cmfdssd1b003cvc905s09tzlj", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757497751962-8264b2f46aeac8b4.jpg" , "850" , "14100000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757497751962-181b9fb00f69e030.jpg""]" , "NA" , "NA" , "2025-09-10 09:49:17.949", "2025-09-10 09:49:17.949"
|
| 51 |
+
"cmfdu2098004avc90e18s3onw", "cmfdu20980049vc901gbx5yzt", "2" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757499882365-234e90325d589de6.jpg" , "774" , "13600000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757499882366-5ff9be2083ac3230.jpg""]" , "NA" , "NA" , "2025-09-10 10:24:47.563", "2025-09-10 10:24:47.563"
|
| 52 |
+
"cmfdu2099004cvc90ne8y9pf7", "cmfdu2099004bvc90md0gqlsn", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757499882367-f956a3cf2e42cc2e.jpg" , "1044" , "13900000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757499882368-39d519773fe47182.jpg""]" , "NA" , "NA" , "2025-09-10 10:24:47.563", "2025-09-10 10:24:47.563"
|
| 53 |
+
"cmfdvkxew0057vc90kpqcfjys", "cmfdvkxew0056vc90azi120pa", "2" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757502445782-c4d339912dac6059.jpg" , "912" , "66800000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757502445783-07ddd86f8b94a188.jpg""]" , "NA" , "NA" , "2025-09-10 11:07:29.958", "2025-09-10 11:07:29.958"
|
| 54 |
+
"cmfdz9fvy008cvc90tbqa3czs", "cmfdz9fvy008bvc90b7nawpiw", "2" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757508627511-94d95f7bbb80de8a.jpg" , "767" , "784300000", "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757508627511-f415324344fe391c.jpg""]" , "NA" , "NA" , "2025-09-10 12:50:32.493", "2025-09-10 12:50:32.493"
|
| 55 |
+
"cmfdz9fvy008dvc90825ql292", "cmfdz9fvy008bvc90b7nawpiw", "2" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757508627511-b25862c0a7c41854.jpg" , "786" , "8037000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757508627515-f85803015d61e3d3.jpg""]" , "NA" , "NA" , "2025-09-10 12:50:32.493", "2025-09-10 12:50:32.493"
|
| 56 |
+
"cmfdz9fvy008fvc90mg7x9wwf", "cmfdz9fvy008evc90f98iggaw", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757508627516-8e8d34b349402165.jpg" , "1017" , "13900000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757508627516-8162911bdda309f0.jpg""]" , "NA" , "NA" , "2025-09-10 12:50:32.493", "2025-09-10 12:50:32.493"
|
| 57 |
+
"cmfe01l6i009kvc90s59ib9e3", "cmfe01l6i009jvc90qz54yiev", "1" , , , "4" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757509935799-56e60e5d51f758f8.jpg" , "880" , "8409000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757509935800-7ec66eb73cfad6b5.jpg""]" , "NA" , "NA" , "2025-09-10 13:12:25.721", "2025-09-10 13:12:25.721"
|
| 58 |
+
"cmfe01l6j009lvc90tcyi3t79", "cmfe01l6i009jvc90qz54yiev", "2" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757509935801-62f8a4e2e69af1fb.jpg" , "921" , "8885000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757509935801-4a6e51cf542453de.jpg""]" , "NA" , "NA" , "2025-09-10 13:12:25.721", "2025-09-10 13:12:25.721"
|
| 59 |
+
"cmfe01l6j009nvc904pcq2sfa", "cmfe01l6j009mvc90aj7pny7p", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757509935801-e3046c3165cb6a9a.jpg" , "1048" , "11000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757509935802-e9fd330d696b020e.jpg""]" , "NA" , "NA" , "2025-09-10 13:12:25.721", "2025-09-10 13:12:25.721"
|
| 60 |
+
"cmff8vfoq0013vxp7h3onmg46", "cmf53kkzz000ivcu89r5399s4", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757584023815-67012c27580e3e23.jpg" , "123" , "11111111" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1756971672464-1e5179453b5df91d.jpg""]" , , "jjhhhu" , "2025-09-11 10:07:21.386", "2025-09-11 10:07:21.386"
|
| 61 |
+
"cmff8vjd4001dvxp7tq21djvf", "cmf53kl00000kvcu86ivy65di", "0" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1756971672464-419924a4c5c28823.jpg" , "456" , "22222222" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1756971672464-7c8c73119cb2047b.jpg""]" , , "nbhjg" , "2025-09-11 10:07:26.152", "2025-09-11 10:07:26.152"
|
| 62 |
+
"cmfgp97cv0001vxiu8xn9weu6", "cmfdyb2yd006uvc90uba2ys2y", "2" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757507025374-12d089344fa03c16.jpg" , "719" , "7916000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757507025374-6b9222f0e2694408.jpg""]" , , "NA" , "2025-09-12 10:33:43.807", "2025-09-12 10:33:43.807"
|
| 63 |
+
"cmfgp97ei0003vxiubxjn87zv", "cmfdyb2yd006uvc90uba2ys2y", "8" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757507025375-8c1c881fc556c580.jpg" , "714" , "7624000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757507025375-b7d209814ec2b899.jpg"",""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757573877398-e4d685da0a0dfae1.jpg""]", , "NA" , "2025-09-12 10:33:43.807", "2025-09-12 10:33:43.807"
|
| 64 |
+
"cmfgp9avl000mvxiui2lz3xmj", "cmfdyb2ye006xvc90tgudor3v", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757507025375-6d208dc15b1ffe3b.jpg" , "954" , "9900000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757507025385-aedb0110dffa5f27.jpg""]" , , "NA" , "2025-09-12 10:33:48.369", "2025-09-12 10:33:48.369"
|
| 65 |
+
"cmfgp9avl000nvxiu2x1yqc8h", "cmfdyb2ye006xvc90tgudor3v", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757507025386-cd046b94df0f53d9.jpg" , "973" , "11000000" , "[]" , , "NA" , "2025-09-12 10:33:48.369", "2025-09-12 10:33:48.369"
|
| 66 |
+
"cmfp02pgf0023vxxulf38fhsj", "cmfozqxd90001vxxuau2xc6lj", "8" , , , "8" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758174783708-6bab276d8a2b3207.jpg" , "9.79" , "10088000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758174623697-27c4f71a991e078c.jpg""]" , , "asdfghjk" , "2025-09-18 05:58:45.853", "2025-09-18 05:58:45.853"
|
| 67 |
+
"cmfp02t4b002dvxxu826dader", "cmfozzj19001rvxxuloxiehen", "99" , , , "987" , "SEMI_FURNISHED", "[""KITCHEN_APPLIANCES"",""BASIC_FURNITURE""]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758174963753-1d59b6ee8bc63eff.jpg" , "9" , "980000000", "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758174963765-07ee6ee92139cc03.jpeg""]" , , "asdfghjkl;vbn" , "2025-09-18 05:58:50.603", "2025-09-18 05:58:50.603"
|
| 68 |
+
"cmfp02t6d002fvxxubqj69fmu", "cmfozzj19001rvxxuloxiehen", "10" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758175122464-bb8651e2ee2d0642.png" , "3" , "120000000", "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758175122464-0dead4f474b5ccbc.jpg""]" , , "about property" , "2025-09-18 05:58:50.603", "2025-09-18 05:58:50.603"
|
| 69 |
+
"cmftjwws80005vx55hh50oj5t", "cmftjwws80004vx55yx8nel0u", "1" , , , "2" , "SEMI_FURNISHED", "[""KITCHEN_APPLIANCES"",""WARDROBE""]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758450157387-61f41f3b1aba317d.jpg" , "12" , "20000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758450157413-fd5b7567dbd1a680.png""]" , , "about this property hahah", "2025-09-21 10:25:12.438", "2025-09-21 10:25:12.438"
|
| 70 |
+
"cmftjwws80007vx55btfpj0zh", "cmftjwws80006vx55x3s20w2u", "1" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , , "122" , "10000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758450157414-15c5ef82cad99022.jpg""]" , , "ABOUT PROPERTY " , "2025-09-21 10:25:12.438", "2025-09-21 10:25:12.438"
|
| 71 |
+
"cmfw5ivrc0005vxnktgx2aruy", "cmfw5ivrc0004vxnkqlpfdbae", "5" , , , "4" , "SEMI_FURNISHED", "[""LIGHTS_FANS"",""BASIC_FURNITURE""]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758607532938-1eb357675429379e.jpg" , "8" , "80000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758607532944-b93d0b2a52058cc7.webp""]" , , "asdfghj" , "2025-09-23 06:05:41.83" , "2025-09-23 06:05:41.83"
|
| 72 |
+
"cmfw5ivrd0007vxnk9hpgpk3m", "cmfw5ivrd0006vxnk2bia4myh", "99" , , , "88" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758607532944-ac73972e2cdcdbfb.jpg" , "69" , "960000000", "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758607532944-e10a4f6be6b3cc76.jpg""]" , , "described huh ...?" , "2025-09-23 06:05:41.83" , "2025-09-23 06:05:41.83"
|
| 73 |
+
"cmfwd3781000cvxgxh6ehnao5", "cmfwd3781000bvxgx5ilktqht", "10" , , , "12" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758620243241-c0143b04ebeb03b2.jpg" , "2" , "30000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758620243242-5810bb1b43a5db87.webp""]" , , "about property" , "2025-09-23 09:37:27.119", "2025-09-23 09:37:27.119"
|
| 74 |
+
"cmfxrvmud000dqq13dhmztds7", "cmfxrvmud000cqq134yeaya3o", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551545-37ea5c3b2ad1281f.jpeg", "413.23" , "10900000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551546-edea4e482b14fe41.jpg""]" , , "Na" , "2025-09-24 09:19:14.532", "2025-09-24 09:19:14.532"
|
| 75 |
+
"cmfxrvmud000fqq13a1u44y3m", "cmfxrvmud000eqq13dl82i5js", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551547-58f19a494160e237.jpeg", "705.14" , "18700000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551548-68b2c475624ac9aa.jpg""]" , , "Na" , "2025-09-24 09:19:14.532", "2025-09-24 09:19:14.532"
|
| 76 |
+
"cmfxrvmud000gqq13js3rz2zw", "cmfxrvmud000eqq13dl82i5js", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551549-35d879317c8edbda.jpeg", "646.91" , "17200000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551550-8dd99bd7e0de26db.jpg""]" , , "Na" , "2025-09-24 09:19:14.532", "2025-09-24 09:19:14.532"
|
| 77 |
+
"cmfxrvmud000iqq13q80pzcvk", "cmfxrvmud000hqq136m0p71jv", "3" , , , "3" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551551-788c3a56eab050d8.jpeg", "901.26" , "23900000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551551-635af274c30c9045.jpg""]" , , "NA" , "2025-09-24 09:19:14.532", "2025-09-24 09:19:14.532"
|
| 78 |
+
"cmfxtgtby000dvxovucxxqsad", "cmfxtgtby000cvxovsdc7rfa6", "9" , , , "9" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758708115716-31db7b2bcb6394ec.webp", "7" , "80000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758708115716-b28e6ee1732f2e2b.webp""]" , , "sdfghjn" , "2025-09-24 10:03:42.333", "2025-09-24 10:03:42.333"
|
| 79 |
+
"cmfxwmse70005qq093vr7rk2k", "cmfxwmse70004qq0987ge7h2b", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758713537111-51daa54aa4442c6d.jpg" , "331.85" , "7944000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758713537116-09ebbf05ef9abbaa.jpg""]" , , "1 RK APARTMENTS" , "2025-09-24 11:32:19.903", "2025-09-24 11:32:19.903"
|
| 80 |
+
"cmfxxh08t0017qq09qd68njyj", "cmfxxh08t0016qq09wmpw7s17", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758714944558-7c8147da421f3025.jpg" , "396.97" , "10700000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758714944560-7c164d7b1cc645f7.jpg""]" , , "NA" , "2025-09-24 11:55:49.757", "2025-09-24 11:55:49.757"
|
| 81 |
+
"cmfxxh08u0019qq098khzka3e", "cmfxxh08u0018qq09k3wwm63q", "2" , , , "4" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758714944560-a72d3b85432ed5df.jpg" , "568.98" , "15300000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758714944561-7778f9768558b3c0.jpg""]" , , "NA" , "2025-09-24 11:55:49.757", "2025-09-24 11:55:49.757"
|
| 82 |
+
"cmfxxh08u001aqq09otdgddxp", "cmfxxh08u0018qq09k3wwm63q", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758714944562-d6e4bab26b0d4fef.jpg" , "619.89" , "16700000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758714944562-e50632ef4ec31e1b.jpg""]" , , "NA" , "2025-09-24 11:55:49.757", "2025-09-24 11:55:49.757"
|
| 83 |
+
"cmfz8hny50001wkcc52edymyk", "cmfdxi4sx005uvc90ek5w6w18", "1" , , , "1" , "FURNISHED" , "[""KITCHEN_APPLIANCES"",""LIGHTS_FANS"",""WARDROBE"",""MODULAR_KITCHEN""]", "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757505674362-a03f1a776276e18c.jpg" , "497" , "30400000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757505674367-357debf889702320.jpg""]" , , "NA" , "2025-09-25 09:52:02.418", "2025-09-25 09:52:02.418"
|
| 84 |
+
"cmfz8hs5g000bwkccafirnr9h", "cmfdxi4sx005wvc90x44fqzb5", "0" , , , "0" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757505674380-a846f28fd0ac4508.jpg" , "805" , "49000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757505674385-88d968255a68bec4.jpg""]" , , "NA" , "2025-09-25 09:52:07.876", "2025-09-25 09:52:07.876"
|
data/project.csv
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
id , projectType, projectName , projectCategory, slug , slugId, status , projectAge, reraId , countryId , stateId , cityId , localityId , subLocalityId , projectSummary , possessionDate
|
| 2 |
+
cmf53kkzy000fvcu8tx8jwjmr, RESIDENTIAL, Ashwini , STANDALONE , luxury-ashwini-ashoknagar-chembur-mumbai-675058 , , UNDER_CONSTRUCTION, , "[""P99000056045""]" , cmfw6qdtd0000vx6uelma0klf, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pksk30035vcxs7r2mo3iq, cmfdkuymm0001vc90iiyzkr8d, , 2025-09-28 00:00:00
|
| 3 |
+
cmf5r6hv00001vxptnfichhfl, RESIDENTIAL, Pristine02 , STANDALONE , pristine02-modelcolony-shivajinagar-pune-428955 , , READY_TO_MOVE , 0.0, "[""P52100032109""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pk0cn0033vcxshxbf5hdh, cmfdn705v001pvc90uyle9m34, ,
|
| 4 |
+
cmfawdrno0007vc18l0fm0z2j, RESIDENTIAL, Gurukripa , COMPLEX , gurukripa-ashoknagar-chembur-mumbai-086047 , , UNDER_CONSTRUCTION, , "[""[\""P51800047648\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
|
| 5 |
+
cmfaxq2oo0020vc1806nmle00, RESIDENTIAL, Hari om , STANDALONE , hari-om-ashoknagar-chembur-mumbai-650559 , , UNDER_CONSTRUCTION, , "[""P51800066536""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmfcec5ph007ivca007lzj3b3, ,
|
| 6 |
+
cmfaycwy70036vc18ppmb8mwh, RESIDENTIAL, Om makarand heights , STANDALONE , om-makarand-heights-ashoknagar-chembur-mumbai-716337 , , UNDER_CONSTRUCTION, , "[""P51800052217""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf6oxndf0021vcxsvog0r7bk, cmfcewd9m007svca0b4pla35a, , 2025-09-21 00:00:00
|
| 7 |
+
cmfc6pq1k0001vca0ikzb258m, RESIDENTIAL, Sainath Vrindavan , STANDALONE , luxury-sainath-vrindavan-ashoknagar-chembur-mumbai-216861, , UNDER_CONSTRUCTION, , "[""[\""P51800049646\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
|
| 8 |
+
cmfc79ip5001cvca0qht6o44p, RESIDENTIAL, Avenue 15 , STANDALONE , avenue-15-ashoknagar-chembur-mumbai-140508 , , UNDER_CONSTRUCTION, , "[""[\""P51900032165\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
|
| 9 |
+
cmfc80zv1002dvca0hcgoc6ea, COMMERCIAL , Swaroop Aditya Avenue , STANDALONE , swaroop-aditya-avenue-ashoknagar-chembur-mumbai-422427 , , UNDER_CONSTRUCTION, , "[""[\""P51800017168\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
|
| 10 |
+
cmfc8w1e8003dvca0yvieggaz, RESIDENTIAL, Marigold miraaya , TOWNSHIP , luxury-marigold-miraaya--ashoknagar-chembur-mumbai-870766, , UNDER_CONSTRUCTION, , "[""[\""P51800003669\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
|
| 11 |
+
cmfcccifs004nvca0b7im3r5a, RESIDENTIAL, Balaji Kanha , STANDALONE , balaji-kanha--ashoknagar-chembur-mumbai-678207 , , UNDER_CONSTRUCTION, , "[""[\""P51700048490\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
|
| 12 |
+
cmfcd6uup005fvca03vhph9j1, RESIDENTIAL, Bhoomi antara , STANDALONE , luxury-bhoomi-antara--ashoknagar-chembur-mumbai-093979 , , UNDER_CONSTRUCTION, , "[""[\""P51800045215\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
|
| 13 |
+
cmfcdo9ei006gvca0wq9t8usr, BOTH , Arkade Prime , COMPLEX , luxury-arkade-prime-ashoknagar-chembur-mumbai-906049 , , UNDER_CONSTRUCTION, , "[""[\""P51800047081\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
|
| 14 |
+
cmfcg9ren0001vc209rw25eve, RESIDENTIAL, Glory , STANDALONE , luxury-glory-katewasti-punawale-pune-268353 , , UNDER_CONSTRUCTION, , "[""[\""P52100077028\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmfcfnqp6007zvca0dcgj52pp, cmfcfoprz0081vca0fus0zwq5, ,
|
| 15 |
+
cmfdmdqmq0008vc90svu2sfto, RESIDENTIAL, Antriksh , STANDALONE , luxury-antriksh-somwarpeth-camp-pune-997560 , , UNDER_CONSTRUCTION, , "[""P52100019454"",""P52100047488""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pksk30035vcxs7r2mo3iq, cmfdkuymm0001vc90iiyzkr8d, ,
|
| 16 |
+
cmfdnk2rz001rvc90t6aa3f0e, RESIDENTIAL, 16 Lakaki , STANDALONE , 16-lakaki-modelcolony-shivajinagar-pune-470663 , , UNDER_CONSTRUCTION, , "[""P52100078263""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pk0cn0033vcxshxbf5hdh, cmfdn705v001pvc90uyle9m34, sdfghgvbndfgh ,
|
| 17 |
+
cmfdro2w2002ivc90co2n24lb, RESIDENTIAL, Dinmanee , STANDALONE , luxury-dinmanee--modelcolony-shivajinagar-pune-878430 , , UNDER_CONSTRUCTION, , "[""[\""P52100079399\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pk0cn0033vcxshxbf5hdh, cmfdn705v001pvc90uyle9m34, ,
|
| 18 |
+
cmfdssd190037vc90paoxv29h, RESIDENTIAL, Zoa Building - 2 Wing A , STANDALONE , zoa-building-2-wing-a-keshavnagar-mundhwa-pune-757777 , , UNDER_CONSTRUCTION, , "[""[\""P52100056199\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pwxtd003gvcxszmny2jn7, cmfds8hud0030vc90h37juexd, ,
|
| 19 |
+
cmfdu20970046vc90g587nym1, RESIDENTIAL, Leela by Empyrean Landmarks - Phase 1 & 2, STANDALONE , leela-by-empyrean-landmar-thitenagar-kharadi-pune-887385 , , UNDER_CONSTRUCTION, , "[""[\""P52100078302\"",\""P52100052570\""]""]", cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pxwqh003jvcxs9xzbgo7z, cmfdt1o8c003zvc90uqngk7v6, ,
|
| 20 |
+
cmfdvkxeu0053vc90gquj3cbz, RESIDENTIAL, Midori Towers , TOWNSHIP , midori-towers-modelcolony-shivajinagar-pune-449745 , , UNDER_CONSTRUCTION, , "[""[\""P52100047310\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pk0cn0033vcxshxbf5hdh, cmfdn705v001pvc90uyle9m34, ,
|
| 21 |
+
cmfdxi4sv005rvc90ygfhnzc9, RESIDENTIAL, Kedar Residency , STANDALONE , kedar-residency-modelcolony-shivajinagar-pune-678656 , , READY_TO_MOVE , 0.0, "[""[\""P52100032109\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pk0cn0033vcxshxbf5hdh, cmfdn705v001pvc90uyle9m34, ,
|
| 22 |
+
cmfdyb2yc006rvc900owycgrv, RESIDENTIAL, Sonai Clara , STANDALONE , sonai-clara-brtlinkrd-ravet-pune-029297 , , UNDER_CONSTRUCTION, , "[""[\""P52100080205\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6qgr4u004fvcxswao9nc4r, cmfdxt4wr006pvc90zvflron5, ,
|
| 23 |
+
cmfdz9fvx0088vc90pw26eyr8, RESIDENTIAL, Santiago Skytown , STANDALONE , santiago-skytown-vikasnagar-ravet-pune-632333 , , UNDER_CONSTRUCTION, , "[""[\""P52100077942\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6qgr4u004fvcxswao9nc4r, cmfdyubxb0086vc90glhoi1tr, ,
|
| 24 |
+
cmfe01l6h009gvc90y1zazr09, RESIDENTIAL, The silver altair , STANDALONE , the-silver-altair--pcmc-ravet-pune-945470 , , UNDER_CONSTRUCTION, , "[""[\""P52100035075\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6qgr4u004fvcxswao9nc4r, cmfdzm7gn009evc907tntxrwq, ,
|
| 25 |
+
cmff8swbm0001vxp7pe3neibi, RESIDENTIAL, testing , STANDALONE , testing-modelcolony-shivajinagar-pune-301013 , , READY_TO_MOVE , 11.0, "[""123456789""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pk0cn0033vcxshxbf5hdh, cmfdn705v001pvc90uyle9m34, sdfghjhgfdfghjgfdfghgfgh ,
|
| 26 |
+
cmftjwws60001vx55r0q7797l, RESIDENTIAL, TESTING , TOWNSHIP , testing-somwarpeth-camp-pune-281770 , , READY_TO_MOVE , 2.0, "[""123124"",""345678""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pksk30035vcxs7r2mo3iq, cmfdkuymm0001vc90iiyzkr8d, PROJECT SUMMARY ,
|
| 27 |
+
cmfw5ivra0001vxnkbozvz8bd, RESIDENTIAL, testing igi , TOWNSHIP , testing-igi-somwarpeth-camp-pune-541659 , , READY_TO_MOVE , 8.0, "[""[\""12345678\"",\""2345678\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pksk30035vcxs7r2mo3iq, cmfdkuymm0001vc90iiyzkr8d, aqwsedrftgyhujikozsxdcfvgbhjnkm ,
|
| 28 |
+
cmfwd377z0008vxgxd9nju858, RESIDENTIAL, some project testing , COMPLEX , some-project-testing-somwarpeth-camp-pune-246958 , , UNDER_CONSTRUCTION, , "[""[\""2345678\"",\""5678\""]""]" , cmfw6qdtd0000vx6uelma0klf, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pksk30035vcxs7r2mo3iq, cmfdkuymm0001vc90iiyzkr8d, project summary , 2025-09-24 00:00:00
|
| 29 |
+
cmfxrvmuc0009qq138n0vk91p, RESIDENTIAL, QUEENS PARK , STANDALONE , queens-park-subhashnagar-chembur-mumbai-554402 , , UNDER_CONSTRUCTION, , "[""[\""P51800047377\""]""]" , cmfw6qdtd0000vx6uelma0klf, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmfxo3xxc0007qq13foyboh8s, "Queens Park by Vaibhavlaxmi builder & developer is a well-designed residential development in Chembur, Mumbai. It provides contemporary features, convenient connectivity, and peaceful living, all supported by the developer's long-standing heritage and adherence to excellence. Situated in a well-developed suburb with the best infrastructure and great connectivity, the project meets the needs of the city life while affording peace and ease of living." , 2025-12-31 00:00:00
|
| 30 |
+
cmfxtgtbw0009vxov4t5onh7d, RESIDENTIAL, testring999 , COMPLEX , testring999-somwarpeth-camp-pune-222053 , , UNDER_CONSTRUCTION, , "[""[\""asdfghjkl\""]""]" , cmfw6qdtd0000vx6uelma0klf, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pksk30035vcxs7r2mo3iq, cmfdkuymm0001vc90iiyzkr8d, dsgfhjk , 2025-09-25 00:00:00
|
| 31 |
+
cmfxwmse70001qq0908yt6oar, RESIDENTIAL, Queens Glory , STANDALONE , queens-glory-subhashnagar-chembur-mumbai-539772 , , UNDER_CONSTRUCTION, , "[""[\""P51800076971\""]""]" , cmfw6qdtd0000vx6uelma0klf, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmfxo3xxc0007qq13foyboh8s, "Queens Glory by VaibhavLaxmi Builders and Developers is a well-designed residential development in Chembur, Mumbai. It provides contemporary features, convenient connectivity, and peaceful living, all supported by the developer's long-standing heritage and adherence to excellence. Situated in a well-developed suburb with the best infrastructure and great connectivity, the project meets the needs of the city life while affording peace and ease of living." , 2027-12-31 00:00:00
|
| 32 |
+
cmfxxh08t0013qq09o0rajcrt, RESIDENTIAL, Queens Avenue , TOWNSHIP , queens-avenue-subhashnagar-chembur-mumbai-949624 , , UNDER_CONSTRUCTION, , "[""[\""P51800054458\""]""]" , cmfw6qdtd0000vx6uelma0klf, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmfxo3xxc0007qq13foyboh8s, "Vaibhavlaxmi Queens Avenue offers well-ventilated homes in Chembur East, combining luxury with modern living standards. With easy access to essential amenities, including schools, hospitals, and shopping malls, the project ensures a convenient lifestyle. Developed by Vaibhavlaxmi Developers, a renowned name in Mumbai's real estate sector, the project promises quality construction and timely delivery, making it a top choice for those seeking an ideal urban living experience.", 2027-12-31 00:00:00
|
database/mongo_upload.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
This script reads all CSV files from the data/ folder and inserts them into MongoDB.
|
| 3 |
+
"""
|
| 4 |
+
|
| 5 |
+
import os
|
| 6 |
+
import pandas as pd
|
| 7 |
+
from pymongo import MongoClient
|
| 8 |
+
from dotenv import load_dotenv
|
| 9 |
+
|
| 10 |
+
# Load environment variables
|
| 11 |
+
load_dotenv()
|
| 12 |
+
|
| 13 |
+
# MongoDB config
|
| 14 |
+
MONGO_URI = os.getenv("MONGO_URI")
|
| 15 |
+
MONGO_DB = os.getenv("MONGO_DB")
|
| 16 |
+
|
| 17 |
+
# Initialize connection
|
| 18 |
+
client = MongoClient(MONGO_URI)
|
| 19 |
+
db = client[MONGO_DB]
|
| 20 |
+
|
| 21 |
+
def insert_csv_to_mongo(data_folder="../data"):
|
| 22 |
+
"""Read CSV files from data folder and insert into MongoDB."""
|
| 23 |
+
csv_files = [f for f in os.listdir(data_folder) if f.endswith(".csv")]
|
| 24 |
+
|
| 25 |
+
if not csv_files:
|
| 26 |
+
print("⚠️ No CSV files found in the data folder.")
|
| 27 |
+
return
|
| 28 |
+
|
| 29 |
+
all_docs = []
|
| 30 |
+
for file in csv_files:
|
| 31 |
+
path = os.path.join(data_folder, file)
|
| 32 |
+
print(f"📂 Reading: {path}")
|
| 33 |
+
df = pd.read_csv(path)
|
| 34 |
+
records = df.to_dict(orient="records")
|
| 35 |
+
all_docs.extend(records)
|
| 36 |
+
|
| 37 |
+
if all_docs:
|
| 38 |
+
collection = db["company_data"]
|
| 39 |
+
collection.insert_many(all_docs)
|
| 40 |
+
print(f"✅ Inserted {len(all_docs)} records into MongoDB collection 'company_data'.")
|
| 41 |
+
else:
|
| 42 |
+
print("⚠️ No data found to insert.")
|
| 43 |
+
|
| 44 |
+
if __name__ == "__main__":
|
| 45 |
+
insert_csv_to_mongo()
|
frontend/index.html
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
+
<title>AI Chatbot</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css" />
|
| 8 |
+
</head>
|
| 9 |
+
<body>
|
| 10 |
+
<div class="app-container">
|
| 11 |
+
<!-- Sidebar -->
|
| 12 |
+
<aside class="sidebar" id="sidebar">
|
| 13 |
+
<div class="logo-container">
|
| 14 |
+
<img src="logo.png" alt="Property AI" class="logo">
|
| 15 |
+
</div>
|
| 16 |
+
<button id="new-chat-btn" class="new-chat-btn">+ New Chat</button>
|
| 17 |
+
<div id="chat-history" class="chat-history"></div>
|
| 18 |
+
</aside>
|
| 19 |
+
|
| 20 |
+
<!-- Main Chat -->
|
| 21 |
+
<div class="chat-container">
|
| 22 |
+
<header class="chat-header">
|
| 23 |
+
<button id="menu-toggle" class="menu-toggle">☰</button>
|
| 24 |
+
<h1 id="chat-title">New Chat</h1>
|
| 25 |
+
</header>
|
| 26 |
+
|
| 27 |
+
<div id="chat-box" class="chat-box">
|
| 28 |
+
<div class="message ai">
|
| 29 |
+
<div class="bubble">Hello! 👋 Welcome to Property AI. I'm here to help you find your perfect property. What are you looking for today?</div>
|
| 30 |
+
</div>
|
| 31 |
+
</div>
|
| 32 |
+
|
| 33 |
+
<div class="chat-input-container">
|
| 34 |
+
<textarea id="user-input" placeholder="Type a message..." rows="1"></textarea>
|
| 35 |
+
<button id="send-btn">➤</button>
|
| 36 |
+
</div>
|
| 37 |
+
</div>
|
| 38 |
+
</div>
|
| 39 |
+
|
| 40 |
+
<script src="script.js"></script>
|
| 41 |
+
</body>
|
| 42 |
+
</html>
|
frontend/logo.png
ADDED
|
frontend/script.js
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
let db;
|
| 2 |
+
let currentChatId = null;
|
| 3 |
+
|
| 4 |
+
// ⚙️ Backend API Configuration
|
| 5 |
+
const API_BASE_URL = "http://localhost:8000"; // Change this to your backend URL
|
| 6 |
+
|
| 7 |
+
// ---------- IndexedDB Setup ----------
|
| 8 |
+
const request = indexedDB.open("ChatDB", 1);
|
| 9 |
+
|
| 10 |
+
request.onupgradeneeded = (e) => {
|
| 11 |
+
db = e.target.result;
|
| 12 |
+
const store = db.createObjectStore("chats", { keyPath: "id", autoIncrement: true });
|
| 13 |
+
store.createIndex("title", "title", { unique: false });
|
| 14 |
+
};
|
| 15 |
+
|
| 16 |
+
request.onsuccess = (e) => {
|
| 17 |
+
db = e.target.result;
|
| 18 |
+
loadChatHistory();
|
| 19 |
+
};
|
| 20 |
+
|
| 21 |
+
request.onerror = (e) => {
|
| 22 |
+
console.error("IndexedDB error:", e.target.error);
|
| 23 |
+
};
|
| 24 |
+
|
| 25 |
+
// ---------- UI Elements ----------
|
| 26 |
+
const chatBox = document.getElementById("chat-box");
|
| 27 |
+
const userInput = document.getElementById("user-input");
|
| 28 |
+
const sendBtn = document.getElementById("send-btn");
|
| 29 |
+
const newChatBtn = document.getElementById("new-chat-btn");
|
| 30 |
+
const chatHistory = document.getElementById("chat-history");
|
| 31 |
+
const chatTitle = document.getElementById("chat-title");
|
| 32 |
+
|
| 33 |
+
// ---------- Core Chat Functions ----------
|
| 34 |
+
function addMessage(content, sender, cards = [], save = true) {
|
| 35 |
+
const msg = document.createElement("div");
|
| 36 |
+
msg.classList.add("message", sender);
|
| 37 |
+
|
| 38 |
+
const bubble = document.createElement("div");
|
| 39 |
+
bubble.classList.add("bubble");
|
| 40 |
+
bubble.textContent = content;
|
| 41 |
+
|
| 42 |
+
msg.appendChild(bubble);
|
| 43 |
+
|
| 44 |
+
// Add property cards if they exist
|
| 45 |
+
if (cards && cards.length > 0) {
|
| 46 |
+
const cardsContainer = document.createElement("div");
|
| 47 |
+
cardsContainer.classList.add("property-cards");
|
| 48 |
+
|
| 49 |
+
cards.forEach(card => {
|
| 50 |
+
const cardEl = createPropertyCard(card);
|
| 51 |
+
cardsContainer.appendChild(cardEl);
|
| 52 |
+
});
|
| 53 |
+
|
| 54 |
+
msg.appendChild(cardsContainer);
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
chatBox.appendChild(msg);
|
| 58 |
+
chatBox.scrollTop = chatBox.scrollHeight;
|
| 59 |
+
|
| 60 |
+
if (save && currentChatId) saveMessageToDB(content, sender, cards);
|
| 61 |
+
}
|
| 62 |
+
|
| 63 |
+
function createPropertyCard(card) {
|
| 64 |
+
const cardEl = document.createElement("div");
|
| 65 |
+
cardEl.classList.add("property-card");
|
| 66 |
+
|
| 67 |
+
// Clean up the data
|
| 68 |
+
const title = card.title || card.project_name || 'Property';
|
| 69 |
+
const price = card.price || 'Price on request';
|
| 70 |
+
const location = card.city_locality || 'Location not specified';
|
| 71 |
+
|
| 72 |
+
// Clean BHK - remove underscores and format nicely
|
| 73 |
+
let bhk = card.bhk || '';
|
| 74 |
+
bhk = bhk.replace(/_/g, ' ').trim();
|
| 75 |
+
|
| 76 |
+
// Clean status - format nicely
|
| 77 |
+
let status = card.possession_status || '';
|
| 78 |
+
status = status.replace(/_/g, ' ')
|
| 79 |
+
.toLowerCase()
|
| 80 |
+
.split(' ')
|
| 81 |
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
| 82 |
+
.join(' ');
|
| 83 |
+
|
| 84 |
+
// Filter out placeholder amenities
|
| 85 |
+
let amenities = card.top_amenities || [];
|
| 86 |
+
amenities = amenities.filter(a =>
|
| 87 |
+
a &&
|
| 88 |
+
a.toLowerCase() !== 'about property' &&
|
| 89 |
+
a.toLowerCase() !== 'property' &&
|
| 90 |
+
a.trim().length > 2
|
| 91 |
+
);
|
| 92 |
+
|
| 93 |
+
cardEl.innerHTML = `
|
| 94 |
+
<div class="card-header">
|
| 95 |
+
<h3 class="card-title">${title}</h3>
|
| 96 |
+
<span class="card-price">${price}</span>
|
| 97 |
+
</div>
|
| 98 |
+
<div class="card-body">
|
| 99 |
+
<p class="card-location">📍 ${location}</p>
|
| 100 |
+
${bhk ? `<p class="card-bhk">🏠 ${bhk}</p>` : ''}
|
| 101 |
+
${status ? `<p class="card-status">🔑 ${status}</p>` : ''}
|
| 102 |
+
${amenities.length > 0 ? `
|
| 103 |
+
<div class="card-amenities">
|
| 104 |
+
<strong>✨ Amenities:</strong>
|
| 105 |
+
<ul>
|
| 106 |
+
${amenities.slice(0, 3).map(a => `<li>${a}</li>`).join('')}
|
| 107 |
+
</ul>
|
| 108 |
+
</div>
|
| 109 |
+
` : ''}
|
| 110 |
+
</div>
|
| 111 |
+
<div class="card-footer">
|
| 112 |
+
<a href="${card.cta_url || '#'}" class="card-cta" target="_blank">View Details →</a>
|
| 113 |
+
</div>
|
| 114 |
+
`;
|
| 115 |
+
|
| 116 |
+
return cardEl;
|
| 117 |
+
}
|
| 118 |
+
|
| 119 |
+
function showTypingIndicator() {
|
| 120 |
+
const indicator = document.createElement("div");
|
| 121 |
+
indicator.classList.add("message", "ai", "typing-indicator");
|
| 122 |
+
indicator.id = "typing-indicator";
|
| 123 |
+
indicator.innerHTML = `
|
| 124 |
+
<div class="bubble">
|
| 125 |
+
<span></span><span></span><span></span>
|
| 126 |
+
</div>
|
| 127 |
+
`;
|
| 128 |
+
chatBox.appendChild(indicator);
|
| 129 |
+
chatBox.scrollTop = chatBox.scrollHeight;
|
| 130 |
+
}
|
| 131 |
+
|
| 132 |
+
function removeTypingIndicator() {
|
| 133 |
+
const indicator = document.getElementById("typing-indicator");
|
| 134 |
+
if (indicator) indicator.remove();
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
+
function isGreeting(text) {
|
| 138 |
+
const greetings = [
|
| 139 |
+
'hi', 'hello', 'hey', 'hii', 'hiii', 'hiiii',
|
| 140 |
+
'good morning', 'good afternoon', 'good evening', 'good night',
|
| 141 |
+
'morning', 'evening', 'afternoon',
|
| 142 |
+
'namaste', 'namaskar',
|
| 143 |
+
'greetings', 'howdy', 'sup', 'yo',
|
| 144 |
+
'how are you', 'whats up', "what's up",
|
| 145 |
+
'hola', 'bonjour', 'ciao'
|
| 146 |
+
];
|
| 147 |
+
|
| 148 |
+
const lowerText = text.toLowerCase().trim();
|
| 149 |
+
return greetings.some(greeting =>
|
| 150 |
+
lowerText === greeting ||
|
| 151 |
+
lowerText.startsWith(greeting + ' ') ||
|
| 152 |
+
lowerText.startsWith(greeting + '!')
|
| 153 |
+
);
|
| 154 |
+
}
|
| 155 |
+
|
| 156 |
+
function getGreetingResponse() {
|
| 157 |
+
return "Hello! 👋 Welcome to Property AI. I'm here to help you find your perfect property. What are you looking for today?";
|
| 158 |
+
}
|
| 159 |
+
|
| 160 |
+
async function aiResponse(userMsg) {
|
| 161 |
+
// Check if it's a greeting
|
| 162 |
+
if (isGreeting(userMsg)) {
|
| 163 |
+
showTypingIndicator();
|
| 164 |
+
setTimeout(() => {
|
| 165 |
+
removeTypingIndicator();
|
| 166 |
+
addMessage(getGreetingResponse(), "ai", []);
|
| 167 |
+
}, 700);
|
| 168 |
+
return;
|
| 169 |
+
}
|
| 170 |
+
|
| 171 |
+
showTypingIndicator();
|
| 172 |
+
|
| 173 |
+
try {
|
| 174 |
+
const response = await fetch(`${API_BASE_URL}/chat`, {
|
| 175 |
+
method: "POST",
|
| 176 |
+
headers: {
|
| 177 |
+
"Content-Type": "application/json",
|
| 178 |
+
},
|
| 179 |
+
body: JSON.stringify({ query: userMsg }),
|
| 180 |
+
});
|
| 181 |
+
|
| 182 |
+
if (!response.ok) {
|
| 183 |
+
throw new Error(`HTTP error! status: ${response.status}`);
|
| 184 |
+
}
|
| 185 |
+
|
| 186 |
+
const data = await response.json();
|
| 187 |
+
removeTypingIndicator();
|
| 188 |
+
|
| 189 |
+
// Display AI response WITHOUT cards - only show text summary
|
| 190 |
+
addMessage(data.answer, "ai", []);
|
| 191 |
+
|
| 192 |
+
} catch (error) {
|
| 193 |
+
removeTypingIndicator();
|
| 194 |
+
console.error("Error calling backend:", error);
|
| 195 |
+
addMessage(
|
| 196 |
+
"Sorry, I'm having trouble connecting to the server. Please make sure the backend is running on " + API_BASE_URL,
|
| 197 |
+
"ai"
|
| 198 |
+
);
|
| 199 |
+
}
|
| 200 |
+
}
|
| 201 |
+
|
| 202 |
+
function sendMessage() {
|
| 203 |
+
const text = userInput.value.trim();
|
| 204 |
+
if (!text) return;
|
| 205 |
+
|
| 206 |
+
// Disable send button while processing
|
| 207 |
+
sendBtn.disabled = true;
|
| 208 |
+
userInput.disabled = true;
|
| 209 |
+
|
| 210 |
+
// ✅ Automatically create a chat if none exists
|
| 211 |
+
if (!currentChatId) {
|
| 212 |
+
createNewChatWithMessage(text);
|
| 213 |
+
} else {
|
| 214 |
+
addMessage(text, "user");
|
| 215 |
+
userInput.value = "";
|
| 216 |
+
updateChatTitleIfNeeded(text);
|
| 217 |
+
aiResponse(text).finally(() => {
|
| 218 |
+
sendBtn.disabled = false;
|
| 219 |
+
userInput.disabled = false;
|
| 220 |
+
userInput.focus();
|
| 221 |
+
});
|
| 222 |
+
}
|
| 223 |
+
}
|
| 224 |
+
|
| 225 |
+
// ---------- IndexedDB Helpers ----------
|
| 226 |
+
function saveMessageToDB(content, sender, cards = []) {
|
| 227 |
+
const tx = db.transaction("chats", "readwrite");
|
| 228 |
+
const store = tx.objectStore("chats");
|
| 229 |
+
store.get(currentChatId).onsuccess = (e) => {
|
| 230 |
+
const chat = e.target.result;
|
| 231 |
+
chat.messages.push({ sender, content, cards: cards || [] });
|
| 232 |
+
store.put(chat);
|
| 233 |
+
};
|
| 234 |
+
}
|
| 235 |
+
|
| 236 |
+
function updateChatTitleIfNeeded(firstMsg) {
|
| 237 |
+
const tx = db.transaction("chats", "readwrite");
|
| 238 |
+
const store = tx.objectStore("chats");
|
| 239 |
+
store.get(currentChatId).onsuccess = (e) => {
|
| 240 |
+
const chat = e.target.result;
|
| 241 |
+
if (chat.title === "New Chat" && firstMsg) {
|
| 242 |
+
const shortTitle = firstMsg.length > 25 ? firstMsg.slice(0, 25) + "…" : firstMsg;
|
| 243 |
+
chat.title = shortTitle;
|
| 244 |
+
chatTitle.textContent = shortTitle;
|
| 245 |
+
store.put(chat);
|
| 246 |
+
loadChatHistory();
|
| 247 |
+
}
|
| 248 |
+
};
|
| 249 |
+
}
|
| 250 |
+
|
| 251 |
+
function createNewChat() {
|
| 252 |
+
const tx = db.transaction("chats", "readwrite");
|
| 253 |
+
const store = tx.objectStore("chats");
|
| 254 |
+
const newChat = { title: "New Chat", messages: [] };
|
| 255 |
+
const req = store.add(newChat);
|
| 256 |
+
req.onsuccess = () => {
|
| 257 |
+
currentChatId = req.result;
|
| 258 |
+
chatTitle.textContent = "New Chat";
|
| 259 |
+
chatBox.innerHTML = `
|
| 260 |
+
<div class="message ai">
|
| 261 |
+
<div class="bubble">Hello 👋 I'm your AI assistant. How can I help you find properties today?</div>
|
| 262 |
+
</div>`;
|
| 263 |
+
loadChatHistory();
|
| 264 |
+
};
|
| 265 |
+
}
|
| 266 |
+
|
| 267 |
+
function createNewChatWithMessage(firstMessage) {
|
| 268 |
+
const tx = db.transaction("chats", "readwrite");
|
| 269 |
+
const store = tx.objectStore("chats");
|
| 270 |
+
const shortTitle = firstMessage.length > 25 ? firstMessage.slice(0, 25) + "…" : firstMessage;
|
| 271 |
+
const newChat = {
|
| 272 |
+
title: shortTitle,
|
| 273 |
+
messages: [{ sender: "user", content: firstMessage, cards: [] }]
|
| 274 |
+
};
|
| 275 |
+
const req = store.add(newChat);
|
| 276 |
+
req.onsuccess = () => {
|
| 277 |
+
currentChatId = req.result;
|
| 278 |
+
chatTitle.textContent = shortTitle;
|
| 279 |
+
chatBox.innerHTML = `
|
| 280 |
+
<div class="message ai">
|
| 281 |
+
<div class="bubble">Hello 👋 I'm your AI assistant. How can I help you find properties today?</div>
|
| 282 |
+
</div>`;
|
| 283 |
+
addMessage(firstMessage, "user", [], false);
|
| 284 |
+
userInput.value = "";
|
| 285 |
+
loadChatHistory();
|
| 286 |
+
aiResponse(firstMessage).finally(() => {
|
| 287 |
+
sendBtn.disabled = false;
|
| 288 |
+
userInput.disabled = false;
|
| 289 |
+
userInput.focus();
|
| 290 |
+
});
|
| 291 |
+
};
|
| 292 |
+
}
|
| 293 |
+
|
| 294 |
+
function deleteChat(id) {
|
| 295 |
+
const tx = db.transaction("chats", "readwrite");
|
| 296 |
+
const store = tx.objectStore("chats");
|
| 297 |
+
store.delete(id).onsuccess = () => {
|
| 298 |
+
if (id === currentChatId) {
|
| 299 |
+
// If deleting active chat, reset UI
|
| 300 |
+
currentChatId = null;
|
| 301 |
+
chatTitle.textContent = "New Chat";
|
| 302 |
+
chatBox.innerHTML = `
|
| 303 |
+
<div class="message ai">
|
| 304 |
+
<div class="bubble">Hello 👋 I'm your AI assistant. How can I help you find properties today?</div>
|
| 305 |
+
</div>`;
|
| 306 |
+
}
|
| 307 |
+
loadChatHistory();
|
| 308 |
+
};
|
| 309 |
+
}
|
| 310 |
+
|
| 311 |
+
function loadChatHistory() {
|
| 312 |
+
chatHistory.innerHTML = "";
|
| 313 |
+
const tx = db.transaction("chats", "readonly");
|
| 314 |
+
const store = tx.objectStore("chats");
|
| 315 |
+
|
| 316 |
+
store.openCursor().onsuccess = (e) => {
|
| 317 |
+
const cursor = e.target.result;
|
| 318 |
+
if (cursor) {
|
| 319 |
+
const chat = cursor.value;
|
| 320 |
+
|
| 321 |
+
const item = document.createElement("div");
|
| 322 |
+
item.classList.add("chat-item");
|
| 323 |
+
if (chat.id === currentChatId) item.classList.add("active");
|
| 324 |
+
|
| 325 |
+
const title = document.createElement("div");
|
| 326 |
+
title.classList.add("chat-title");
|
| 327 |
+
title.textContent = chat.title || `Chat ${chat.id}`;
|
| 328 |
+
title.onclick = () => loadChat(chat.id);
|
| 329 |
+
|
| 330 |
+
const delBtn = document.createElement("button");
|
| 331 |
+
delBtn.classList.add("delete-btn");
|
| 332 |
+
delBtn.innerHTML = `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
| 333 |
+
<path d="M2 4h12M5.333 4V2.667a1.333 1.333 0 0 1 1.334-1.334h2.666a1.333 1.333 0 0 1 1.334 1.334V4m2 0v9.333a1.333 1.333 0 0 1-1.334 1.334H4.667a1.333 1.333 0 0 1-1.334-1.334V4h9.334Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
| 334 |
+
</svg>`;
|
| 335 |
+
delBtn.onclick = (event) => {
|
| 336 |
+
event.stopPropagation();
|
| 337 |
+
deleteChat(chat.id);
|
| 338 |
+
};
|
| 339 |
+
|
| 340 |
+
item.appendChild(title);
|
| 341 |
+
item.appendChild(delBtn);
|
| 342 |
+
chatHistory.appendChild(item);
|
| 343 |
+
cursor.continue();
|
| 344 |
+
}
|
| 345 |
+
};
|
| 346 |
+
}
|
| 347 |
+
|
| 348 |
+
function loadChat(id) {
|
| 349 |
+
const tx = db.transaction("chats", "readonly");
|
| 350 |
+
const store = tx.objectStore("chats");
|
| 351 |
+
store.get(id).onsuccess = (e) => {
|
| 352 |
+
const chat = e.target.result;
|
| 353 |
+
currentChatId = id;
|
| 354 |
+
chatTitle.textContent = chat.title;
|
| 355 |
+
chatBox.innerHTML = "";
|
| 356 |
+
chat.messages.forEach((m) => addMessage(m.content, m.sender, m.cards || [], false));
|
| 357 |
+
loadChatHistory();
|
| 358 |
+
};
|
| 359 |
+
}
|
| 360 |
+
|
| 361 |
+
// ---------- Event Listeners ----------
|
| 362 |
+
sendBtn.addEventListener("click", sendMessage);
|
| 363 |
+
userInput.addEventListener("keydown", (e) => {
|
| 364 |
+
if (e.key === "Enter" && !e.shiftKey) {
|
| 365 |
+
e.preventDefault();
|
| 366 |
+
sendMessage();
|
| 367 |
+
}
|
| 368 |
+
});
|
| 369 |
+
newChatBtn.addEventListener("click", createNewChat);
|
| 370 |
+
|
| 371 |
+
// ---------- Mobile Menu Toggle ----------
|
| 372 |
+
const menuToggle = document.getElementById("menu-toggle");
|
| 373 |
+
const sidebar = document.getElementById("sidebar");
|
| 374 |
+
|
| 375 |
+
menuToggle.addEventListener("click", () => {
|
| 376 |
+
sidebar.classList.toggle("open");
|
| 377 |
+
});
|
| 378 |
+
|
| 379 |
+
// Close sidebar when clicking outside on mobile
|
| 380 |
+
document.addEventListener("click", (e) => {
|
| 381 |
+
if (window.innerWidth <= 768) {
|
| 382 |
+
if (!sidebar.contains(e.target) && !menuToggle.contains(e.target)) {
|
| 383 |
+
sidebar.classList.remove("open");
|
| 384 |
+
}
|
| 385 |
+
}
|
| 386 |
+
});
|
frontend/style.css
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* --- Reset and Base --- */
|
| 2 |
+
* {
|
| 3 |
+
box-sizing: border-box;
|
| 4 |
+
margin: 0;
|
| 5 |
+
padding: 0;
|
| 6 |
+
}
|
| 7 |
+
|
| 8 |
+
body {
|
| 9 |
+
font-family: "Inter", system-ui, sans-serif;
|
| 10 |
+
background: radial-gradient(circle at top left, #0a0033, #000);
|
| 11 |
+
color: #e0e8ff;
|
| 12 |
+
height: 100vh;
|
| 13 |
+
overflow: hidden;
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
/* --- App Layout --- */
|
| 17 |
+
.app-container {
|
| 18 |
+
display: flex;
|
| 19 |
+
height: 100vh;
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
/* --- Sidebar --- */
|
| 23 |
+
.sidebar {
|
| 24 |
+
width: 260px;
|
| 25 |
+
background: rgba(9, 1, 32, 0.9);
|
| 26 |
+
border-right: 1px solid rgba(120, 80, 255, 0.3);
|
| 27 |
+
display: flex;
|
| 28 |
+
flex-direction: column;
|
| 29 |
+
padding: 16px;
|
| 30 |
+
box-shadow: 0 0 20px rgba(120, 80, 255, 0.15);
|
| 31 |
+
}
|
| 32 |
+
|
| 33 |
+
.sidebar h2 {
|
| 34 |
+
color: #9f7fff;
|
| 35 |
+
text-align: center;
|
| 36 |
+
margin-bottom: 16px;
|
| 37 |
+
font-weight: 700;
|
| 38 |
+
text-shadow: 0 0 6px rgba(140, 100, 255, 0.6);
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
.logo-container {
|
| 42 |
+
text-align: center;
|
| 43 |
+
margin-bottom: 20px;
|
| 44 |
+
padding: 10px;
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
.logo {
|
| 48 |
+
max-width: 140px;
|
| 49 |
+
width: 100%;
|
| 50 |
+
height: auto;
|
| 51 |
+
display: block;
|
| 52 |
+
margin: 0 auto;
|
| 53 |
+
filter: drop-shadow(0 0 10px rgba(120, 80, 255, 0.5));
|
| 54 |
+
}
|
| 55 |
+
|
| 56 |
+
.new-chat-btn {
|
| 57 |
+
background: linear-gradient(135deg, #6a00ff, #00bfff);
|
| 58 |
+
color: #fff;
|
| 59 |
+
border: none;
|
| 60 |
+
border-radius: 12px;
|
| 61 |
+
padding: 10px 12px;
|
| 62 |
+
font-size: 0.9rem;
|
| 63 |
+
cursor: pointer;
|
| 64 |
+
margin-bottom: 16px;
|
| 65 |
+
transition: 0.2s;
|
| 66 |
+
box-shadow: 0 0 10px rgba(100, 160, 255, 0.4);
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
.new-chat-btn:hover {
|
| 70 |
+
background: linear-gradient(135deg, #7a33ff, #33ccff);
|
| 71 |
+
transform: scale(1.03);
|
| 72 |
+
}
|
| 73 |
+
|
| 74 |
+
.chat-history {
|
| 75 |
+
flex: 1;
|
| 76 |
+
overflow-y: auto;
|
| 77 |
+
border-top: 1px solid rgba(120, 80, 255, 0.2);
|
| 78 |
+
padding-top: 10px;
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
.chat-item {
|
| 82 |
+
padding: 10px 12px;
|
| 83 |
+
border-radius: 10px;
|
| 84 |
+
margin-bottom: 8px;
|
| 85 |
+
background: rgba(120, 80, 255, 0.05);
|
| 86 |
+
cursor: pointer;
|
| 87 |
+
transition: 0.2s;
|
| 88 |
+
display: flex;
|
| 89 |
+
justify-content: space-between;
|
| 90 |
+
align-items: center;
|
| 91 |
+
}
|
| 92 |
+
|
| 93 |
+
.chat-title {
|
| 94 |
+
flex: 1;
|
| 95 |
+
overflow: hidden;
|
| 96 |
+
text-overflow: ellipsis;
|
| 97 |
+
white-space: nowrap;
|
| 98 |
+
padding-right: 8px;
|
| 99 |
+
}
|
| 100 |
+
|
| 101 |
+
.chat-item:hover {
|
| 102 |
+
background: rgba(120, 80, 255, 0.15);
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
.chat-item.active {
|
| 106 |
+
background: rgba(120, 80, 255, 0.3);
|
| 107 |
+
font-weight: 600;
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
/* --- Chat Area --- */
|
| 111 |
+
.chat-container {
|
| 112 |
+
flex: 1;
|
| 113 |
+
display: flex;
|
| 114 |
+
flex-direction: column;
|
| 115 |
+
background: linear-gradient(
|
| 116 |
+
180deg,
|
| 117 |
+
rgba(5, 0, 40, 0.85),
|
| 118 |
+
rgba(0, 0, 30, 0.95)
|
| 119 |
+
);
|
| 120 |
+
border-left: 1px solid rgba(120, 80, 255, 0.2);
|
| 121 |
+
}
|
| 122 |
+
|
| 123 |
+
.chat-header {
|
| 124 |
+
padding: 16px 24px;
|
| 125 |
+
text-align: center;
|
| 126 |
+
color: #c9d8ff;
|
| 127 |
+
font-weight: 700;
|
| 128 |
+
border-bottom: 1px solid rgba(120, 80, 255, 0.2);
|
| 129 |
+
position: relative;
|
| 130 |
+
|
| 131 |
+
/* ✨ Transparent Glass Look */
|
| 132 |
+
background: rgba(10, 0, 40, 0.15);
|
| 133 |
+
backdrop-filter: blur(20px) saturate(180%);
|
| 134 |
+
-webkit-backdrop-filter: blur(20px) saturate(180%);
|
| 135 |
+
|
| 136 |
+
/* 🌈 Glow and Depth */
|
| 137 |
+
text-shadow: 0 0 10px rgba(120, 80, 255, 0.4);
|
| 138 |
+
box-shadow: 0 2px 20px rgba(120, 80, 255, 0.15);
|
| 139 |
+
border-radius: 0 0 16px 16px;
|
| 140 |
+
z-index: 10;
|
| 141 |
+
}
|
| 142 |
+
|
| 143 |
+
/* --- Hamburger Menu Button --- */
|
| 144 |
+
.menu-toggle {
|
| 145 |
+
display: none;
|
| 146 |
+
position: absolute;
|
| 147 |
+
left: 16px;
|
| 148 |
+
top: 50%;
|
| 149 |
+
transform: translateY(-50%);
|
| 150 |
+
background: rgba(120, 80, 255, 0.2);
|
| 151 |
+
border: 1px solid rgba(120, 80, 255, 0.4);
|
| 152 |
+
color: #9f7fff;
|
| 153 |
+
font-size: 1.5rem;
|
| 154 |
+
width: 40px;
|
| 155 |
+
height: 40px;
|
| 156 |
+
border-radius: 8px;
|
| 157 |
+
cursor: pointer;
|
| 158 |
+
transition: 0.2s;
|
| 159 |
+
z-index: 1000;
|
| 160 |
+
}
|
| 161 |
+
|
| 162 |
+
.menu-toggle:hover {
|
| 163 |
+
background: rgba(120, 80, 255, 0.3);
|
| 164 |
+
transform: translateY(-50%) scale(1.05);
|
| 165 |
+
}
|
| 166 |
+
|
| 167 |
+
/* --- Chat Box --- */
|
| 168 |
+
.chat-box {
|
| 169 |
+
flex: 1;
|
| 170 |
+
padding: 24px;
|
| 171 |
+
overflow-y: auto;
|
| 172 |
+
display: flex;
|
| 173 |
+
flex-direction: column;
|
| 174 |
+
gap: 14px;
|
| 175 |
+
scroll-behavior: smooth;
|
| 176 |
+
}
|
| 177 |
+
|
| 178 |
+
/* --- Message Bubbles --- */
|
| 179 |
+
.message {
|
| 180 |
+
display: flex;
|
| 181 |
+
align-items: flex-start;
|
| 182 |
+
}
|
| 183 |
+
|
| 184 |
+
.message.user {
|
| 185 |
+
justify-content: flex-end;
|
| 186 |
+
}
|
| 187 |
+
|
| 188 |
+
.bubble {
|
| 189 |
+
max-width: 70%;
|
| 190 |
+
padding: 12px 16px;
|
| 191 |
+
border-radius: 14px;
|
| 192 |
+
font-size: 0.95rem;
|
| 193 |
+
line-height: 1.4;
|
| 194 |
+
animation: fadeIn 0.2s ease-in-out;
|
| 195 |
+
}
|
| 196 |
+
|
| 197 |
+
.message.ai .bubble {
|
| 198 |
+
background: rgba(10, 10, 40, 0.9);
|
| 199 |
+
color: #7fb3ff;
|
| 200 |
+
border: 1px solid rgba(100, 160, 255, 0.4);
|
| 201 |
+
border-top-left-radius: 4px;
|
| 202 |
+
box-shadow: 0 0 10px rgba(100, 160, 255, 0.15);
|
| 203 |
+
}
|
| 204 |
+
|
| 205 |
+
.message.user .bubble {
|
| 206 |
+
background: linear-gradient(135deg, #6a00ff, #00bfff);
|
| 207 |
+
color: #fff;
|
| 208 |
+
border-top-right-radius: 4px;
|
| 209 |
+
box-shadow: 0 0 10px rgba(100, 160, 255, 0.3);
|
| 210 |
+
}
|
| 211 |
+
|
| 212 |
+
/* --- Input --- */
|
| 213 |
+
.chat-input-container {
|
| 214 |
+
display: flex;
|
| 215 |
+
align-items: center;
|
| 216 |
+
padding: 12px 16px;
|
| 217 |
+
border-top: 1px solid rgba(120, 80, 255, 0.2);
|
| 218 |
+
background: rgba(10, 0, 40, 0.9);
|
| 219 |
+
}
|
| 220 |
+
|
| 221 |
+
.chat-input-container textarea {
|
| 222 |
+
flex: 1;
|
| 223 |
+
resize: none;
|
| 224 |
+
border: none;
|
| 225 |
+
outline: none;
|
| 226 |
+
font-size: 1rem;
|
| 227 |
+
padding: 10px;
|
| 228 |
+
background: #0a0a2a;
|
| 229 |
+
color: #fff;
|
| 230 |
+
border-radius: 12px;
|
| 231 |
+
margin-right: 8px;
|
| 232 |
+
border: 1px solid rgba(100, 160, 255, 0.3);
|
| 233 |
+
}
|
| 234 |
+
|
| 235 |
+
.chat-input-container button {
|
| 236 |
+
background: linear-gradient(135deg, #6a00ff, #00bfff);
|
| 237 |
+
color: #fff;
|
| 238 |
+
border: none;
|
| 239 |
+
border-radius: 50%;
|
| 240 |
+
width: 44px;
|
| 241 |
+
height: 44px;
|
| 242 |
+
font-size: 1.1rem;
|
| 243 |
+
cursor: pointer;
|
| 244 |
+
transition: 0.2s;
|
| 245 |
+
box-shadow: 0 0 10px rgba(100, 160, 255, 0.3);
|
| 246 |
+
}
|
| 247 |
+
|
| 248 |
+
.chat-input-container button:hover {
|
| 249 |
+
transform: scale(1.1);
|
| 250 |
+
background: linear-gradient(135deg, #7a33ff, #33ccff);
|
| 251 |
+
}
|
| 252 |
+
|
| 253 |
+
/* --- Delete Icon --- */
|
| 254 |
+
.delete-btn {
|
| 255 |
+
background: none;
|
| 256 |
+
border: none;
|
| 257 |
+
color: #79aaff;
|
| 258 |
+
cursor: pointer;
|
| 259 |
+
opacity: 0.5;
|
| 260 |
+
transition: all 0.2s;
|
| 261 |
+
padding: 6px;
|
| 262 |
+
flex-shrink: 0;
|
| 263 |
+
display: flex;
|
| 264 |
+
align-items: center;
|
| 265 |
+
justify-content: center;
|
| 266 |
+
border-radius: 6px;
|
| 267 |
+
}
|
| 268 |
+
|
| 269 |
+
.delete-btn:hover {
|
| 270 |
+
opacity: 1;
|
| 271 |
+
color: #ff6b6b;
|
| 272 |
+
background: rgba(255, 107, 107, 0.1);
|
| 273 |
+
transform: scale(1.1);
|
| 274 |
+
}
|
| 275 |
+
|
| 276 |
+
.delete-btn svg {
|
| 277 |
+
width: 16px;
|
| 278 |
+
height: 16px;
|
| 279 |
+
}
|
| 280 |
+
|
| 281 |
+
.delete-btn:hover {
|
| 282 |
+
opacity: 1;
|
| 283 |
+
color: #33ccff;
|
| 284 |
+
}
|
| 285 |
+
|
| 286 |
+
/* --- Animated Moving Dots Background --- */
|
| 287 |
+
@keyframes moveDots {
|
| 288 |
+
0% {
|
| 289 |
+
background-position: 0 0, 50px 50px;
|
| 290 |
+
}
|
| 291 |
+
100% {
|
| 292 |
+
background-position: 100px 100px, 150px 150px;
|
| 293 |
+
}
|
| 294 |
+
}
|
| 295 |
+
|
| 296 |
+
.chat-container::before,
|
| 297 |
+
.chat-header::before {
|
| 298 |
+
content: "";
|
| 299 |
+
position: absolute;
|
| 300 |
+
pointer-events: none;
|
| 301 |
+
top: 0;
|
| 302 |
+
left: 0;
|
| 303 |
+
width: 100%;
|
| 304 |
+
height: 100%;
|
| 305 |
+
background-image:
|
| 306 |
+
radial-gradient(rgba(120, 80, 255, 0.3) 2px, transparent 1px),
|
| 307 |
+
radial-gradient(rgba(100, 160, 255, 0.15) 2px, transparent 1px);
|
| 308 |
+
background-size: 50px 50px, 80px 80px;
|
| 309 |
+
animation: moveDots 20s linear infinite;
|
| 310 |
+
z-index: 0;
|
| 311 |
+
opacity: 0.3;
|
| 312 |
+
}
|
| 313 |
+
|
| 314 |
+
/* Ensure content appears above the animated background */
|
| 315 |
+
.chat-container,
|
| 316 |
+
.chat-header {
|
| 317 |
+
position: relative;
|
| 318 |
+
z-index: 1;
|
| 319 |
+
overflow: hidden;
|
| 320 |
+
}
|
| 321 |
+
|
| 322 |
+
/* --- Responsive Design --- */
|
| 323 |
+
@media (max-width: 768px) {
|
| 324 |
+
.sidebar {
|
| 325 |
+
position: fixed;
|
| 326 |
+
left: -260px;
|
| 327 |
+
top: 0;
|
| 328 |
+
height: 100vh;
|
| 329 |
+
z-index: 999;
|
| 330 |
+
transition: left 0.3s ease;
|
| 331 |
+
}
|
| 332 |
+
|
| 333 |
+
.sidebar.open {
|
| 334 |
+
left: 0;
|
| 335 |
+
box-shadow: 2px 0 15px rgba(0, 0, 0, 0.5);
|
| 336 |
+
}
|
| 337 |
+
|
| 338 |
+
.menu-toggle {
|
| 339 |
+
display: block;
|
| 340 |
+
}
|
| 341 |
+
|
| 342 |
+
.chat-header h1 {
|
| 343 |
+
font-size: 1.1rem;
|
| 344 |
+
margin-left: 30px;
|
| 345 |
+
}
|
| 346 |
+
|
| 347 |
+
.bubble {
|
| 348 |
+
max-width: 85%;
|
| 349 |
+
}
|
| 350 |
+
|
| 351 |
+
.chat-box {
|
| 352 |
+
padding: 16px;
|
| 353 |
+
}
|
| 354 |
+
|
| 355 |
+
.chat-input-container {
|
| 356 |
+
padding: 10px;
|
| 357 |
+
}
|
| 358 |
+
|
| 359 |
+
.chat-input-container textarea {
|
| 360 |
+
font-size: 0.9rem;
|
| 361 |
+
padding: 8px;
|
| 362 |
+
}
|
| 363 |
+
|
| 364 |
+
.chat-input-container button {
|
| 365 |
+
width: 38px;
|
| 366 |
+
height: 38px;
|
| 367 |
+
font-size: 1rem;
|
| 368 |
+
}
|
| 369 |
+
}
|
| 370 |
+
|
| 371 |
+
@media (max-width: 480px) {
|
| 372 |
+
.bubble {
|
| 373 |
+
max-width: 90%;
|
| 374 |
+
font-size: 0.9rem;
|
| 375 |
+
padding: 10px 14px;
|
| 376 |
+
}
|
| 377 |
+
|
| 378 |
+
.chat-header h1 {
|
| 379 |
+
font-size: 1rem;
|
| 380 |
+
}
|
| 381 |
+
|
| 382 |
+
.new-chat-btn {
|
| 383 |
+
font-size: 0.85rem;
|
| 384 |
+
padding: 8px 10px;
|
| 385 |
+
}
|
| 386 |
+
}
|
processed_data/final_merged_data1.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
processed_data/final_merged_data_1st.csv
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
projectType, projectName , projectCategory, slug , status , projectAge, projectSummary , possessionDate , propertyCategory, type, customBHK, bathrooms , privateBathrooms, publicBathrooms, balcony , furnishedType , furnishingType , lift , ageOfProperty, parkingType, listingType , floorPlanImage , carpetArea , price , propertyImages , maintenanceCharges, aboutProperty , createdAt , updatedAt , Address info
|
| 2 |
+
RESIDENTIAL, Ashwini , STANDALONE , luxury-ashwini-ashoknagar-chembur-mumbai-675058 , UNDER_CONSTRUCTION, , , 2025-09-28 00:00:00, RESIDENTIAL , 1BHK, , " ""1"" ", , , " ""1"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757584023815-67012c27580e3e23.jpg"" ", " ""123"" ", " ""11111111"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1756971672464-1e5179453b5df91d.jpg""""]"" ", , " ""jjhhhu"" ", " ""2025-09-11 10:07:21.386""", " ""2025-09-11 10:07:21.386""", " Babys school , Mumbai chembur , 411017"
|
| 3 |
+
RESIDENTIAL, Ashwini , STANDALONE , luxury-ashwini-ashoknagar-chembur-mumbai-675058 , UNDER_CONSTRUCTION, , , 2025-09-28 00:00:00, RESIDENTIAL , 2BHK, , " ""0"" ", , , " ""2"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1756971672464-419924a4c5c28823.jpg"" ", " ""456"" ", " ""22222222"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1756971672464-7c8c73119cb2047b.jpg""""]"" ", , " ""nbhjg"" ", " ""2025-09-11 10:07:26.152""", " ""2025-09-11 10:07:26.152""", " Babys school , Mumbai chembur , 411017"
|
| 4 |
+
RESIDENTIAL, Sainath Vrindavan, STANDALONE , luxury-sainath-vrindavan-ashoknagar-chembur-mumbai-216861, UNDER_CONSTRUCTION, , , , RESIDENTIAL , 1BHK, 1BHK , " ""1"" ", , , " ""1"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210633-ec5431f188d4de3c.jpg"" ", " ""457.57"" ", " ""12000000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210665-ab087e966ba018ff.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 06:43:37.112""", " ""2025-09-09 06:43:37.112""", " JBCN International School Mulund , Prataprao Gujar Rd Neelam Nagar Mulund East Mumbai Maharashtra 400081 , 400081"
|
| 5 |
+
RESIDENTIAL, Sainath Vrindavan, STANDALONE , luxury-sainath-vrindavan-ashoknagar-chembur-mumbai-216861, UNDER_CONSTRUCTION, , , , RESIDENTIAL , 2BHK, 2BHK , " ""2"" ", , , " ""2"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210671-c54804f690eac296.jpg"" ", " ""652.83"" ", " ""17000000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210672-3f6998fafc9e8521.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 06:43:37.112""", " ""2025-09-09 06:43:37.112""", " JBCN International School Mulund , Prataprao Gujar Rd Neelam Nagar Mulund East Mumbai Maharashtra 400081 , 400081"
|
| 6 |
+
RESIDENTIAL, Sainath Vrindavan, STANDALONE , luxury-sainath-vrindavan-ashoknagar-chembur-mumbai-216861, UNDER_CONSTRUCTION, , , , RESIDENTIAL , 2BHK, 2BHK , " ""2"" ", , , " ""2"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210675-be2512dbfae0b3f7.jpg"" ", " ""728.5"" ", " ""19000000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210678-f61b2d8c4b4a4a50.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 06:43:37.112""", " ""2025-09-09 06:43:37.112""", " JBCN International School Mulund , Prataprao Gujar Rd Neelam Nagar Mulund East Mumbai Maharashtra 400081 , 400081"
|
| 7 |
+
RESIDENTIAL, Sainath Vrindavan, STANDALONE , luxury-sainath-vrindavan-ashoknagar-chembur-mumbai-216861, UNDER_CONSTRUCTION, , , , RESIDENTIAL , 3BHK, 3BHK , " ""3"" ", , , " ""2"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210681-7ca76e0e6739c3c1.jpg"" ", " ""1240.22"" ", " ""33000000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210682-37e9e8c4f43b5b32.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 06:43:37.112""", " ""2025-09-09 06:43:37.112""", " JBCN International School Mulund , Prataprao Gujar Rd Neelam Nagar Mulund East Mumbai Maharashtra 400081 , 400081"
|
| 8 |
+
RESIDENTIAL, Avenue 15 , STANDALONE , avenue-15-ashoknagar-chembur-mumbai-140508 , UNDER_CONSTRUCTION, , , , RESIDENTIAL , 1BHK, 1BHK , " ""1"" ", , , " ""0"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136185-abf1e76a1175f931.jpg"" ", " ""416.56"" ", " ""9890000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136186-23bdb16c58a9e122.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 06:59:00.713""", " ""2025-09-09 06:59:00.713""", " JBCN International School Parel , AVENUE 15 Ramesh Barrel Supplying Company K.T.Gupta Wadi S.P.Murai Rd behind Sewri Road Sewri W Maharashtra 400015 , 400015"
|
| 9 |
+
RESIDENTIAL, Avenue 15 , STANDALONE , avenue-15-ashoknagar-chembur-mumbai-140508 , UNDER_CONSTRUCTION, , , , RESIDENTIAL , 1BHK, 1BHK , " ""1"" ", , , " ""1"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136186-d8d90b0f32b32c7f.jpg"" ", " ""438.63"" ", " ""14000000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136187-7ce77cd129550d77.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 06:59:00.713""", " ""2025-09-09 06:59:00.713""", " JBCN International School Parel , AVENUE 15 Ramesh Barrel Supplying Company K.T.Gupta Wadi S.P.Murai Rd behind Sewri Road Sewri W Maharashtra 400015 , 400015"
|
| 10 |
+
RESIDENTIAL, Avenue 15 , STANDALONE , avenue-15-ashoknagar-chembur-mumbai-140508 , UNDER_CONSTRUCTION, , , , RESIDENTIAL , 2BHK, 2BHK , " ""2"" ", , , " ""2"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136187-1ecea6707162bfe7.jpg"" ", " ""653.15"" ", " ""15000000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136188-b404a27ba98528f4.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 06:59:00.713""", " ""2025-09-09 06:59:00.713""", " JBCN International School Parel , AVENUE 15 Ramesh Barrel Supplying Company K.T.Gupta Wadi S.P.Murai Rd behind Sewri Road Sewri W Maharashtra 400015 , 400015"
|
| 11 |
+
RESIDENTIAL, Balaji Kanha , STANDALONE , balaji-kanha--ashoknagar-chembur-mumbai-678207 , UNDER_CONSTRUCTION, , , , RESIDENTIAL , 1BHK, 1BHK , " ""1"" ", , , " ""1"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672773-6523197b4bafe2f8.jpg"" ", " ""422"" ", " ""4190000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672775-37d2dedeb898bfd3.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 09:21:18.424""", " ""2025-09-09 09:21:18.424""", " Lodha Xperia Mall , 64C5+C63 Dombivli East Dombivli Maharashtra 421301 , 421201"
|
| 12 |
+
RESIDENTIAL, Balaji Kanha , STANDALONE , balaji-kanha--ashoknagar-chembur-mumbai-678207 , UNDER_CONSTRUCTION, , , , RESIDENTIAL , 2BHK, 2BHK , " ""2"" ", , , " ""2"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672776-9c48211b8fc08a50.jpg"" ", " ""580"" ", " ""5770000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672776-55a3d0d5d7d3bb44.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 09:21:18.424""", " ""2025-09-09 09:21:18.424""", " Lodha Xperia Mall , 64C5+C63 Dombivli East Dombivli Maharashtra 421301 , 421201"
|
| 13 |
+
RESIDENTIAL, testing , STANDALONE , testing-modelcolony-shivajinagar-pune-301013 , READY_TO_MOVE , 11.0, sdfghjhgfdfghjgfdfghgfgh, , RESIDENTIAL , 5BHK, , " ""8"" ", , , " ""8"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758174783708-6bab276d8a2b3207.jpg"" ", " ""9.79"" ", " ""10088000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758174623697-27c4f71a991e078c.jpg""""]"" ", , " ""asdfghjk"" ", " ""2025-09-18 05:58:45.853""", " ""2025-09-18 05:58:45.853""", " sdfgb , asdfgh , 123456"
|
| 14 |
+
RESIDENTIAL, testing , STANDALONE , testing-modelcolony-shivajinagar-pune-301013 , READY_TO_MOVE , 11.0, sdfghjhgfdfghjgfdfghgfgh, , RESIDENTIAL , 2BHK, , " ""10"" ", , , " ""2"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758175122464-bb8651e2ee2d0642.png"" ", " ""3"" ", " ""120000000""", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758175122464-0dead4f474b5ccbc.jpg""""]"" ", , " ""about property"" ", " ""2025-09-18 05:58:50.603""", " ""2025-09-18 05:58:50.603""", " sdfgb , asdfgh , 123456"
|
| 15 |
+
RESIDENTIAL, testring999 , COMPLEX , testring999-somwarpeth-camp-pune-222053 , UNDER_CONSTRUCTION, , dsgfhjk , 2025-09-25 00:00:00, RESIDENTIAL , 3BHK, 3BHK , " ""9"" ", , , " ""9"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758708115716-31db7b2bcb6394ec.webp""", " ""7"" ", " ""80000000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758708115716-b28e6ee1732f2e2b.webp""""]"" ", , " ""sdfghjn"" ", " ""2025-09-24 10:03:42.333""", " ""2025-09-24 10:03:42.333""", " esrdfghbj , sdfghj , 123456"
|
processed_data/left.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
processed_data/nobrokrage.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
requirements.txt
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
aiohappyeyeballs==2.6.1
|
| 2 |
+
aiohttp==3.13.0
|
| 3 |
+
aiosignal==1.4.0
|
| 4 |
+
annotated-types==0.7.0
|
| 5 |
+
anyio==4.11.0
|
| 6 |
+
async-timeout==4.0.3
|
| 7 |
+
attrs==25.4.0
|
| 8 |
+
certifi==2025.10.5
|
| 9 |
+
charset-normalizer==3.4.4
|
| 10 |
+
click==8.3.0
|
| 11 |
+
colorama==0.4.6
|
| 12 |
+
dataclasses-json==0.6.7
|
| 13 |
+
distro==1.9.0
|
| 14 |
+
dnspython==2.8.0
|
| 15 |
+
email-validator==2.3.0
|
| 16 |
+
exceptiongroup==1.3.0
|
| 17 |
+
faiss-cpu==1.12.0
|
| 18 |
+
fastapi==0.119.0
|
| 19 |
+
fastapi-cli==0.0.13
|
| 20 |
+
fastapi-cloud-cli==0.3.1
|
| 21 |
+
filelock==3.20.0
|
| 22 |
+
frozenlist==1.8.0
|
| 23 |
+
fsspec==2025.9.0
|
| 24 |
+
greenlet==3.2.4
|
| 25 |
+
groq==0.32.0
|
| 26 |
+
h11==0.16.0
|
| 27 |
+
httpcore==1.0.9
|
| 28 |
+
httptools==0.7.1
|
| 29 |
+
httpx==0.28.1
|
| 30 |
+
httpx-sse==0.4.3
|
| 31 |
+
huggingface-hub==0.35.3
|
| 32 |
+
idna==3.11
|
| 33 |
+
itsdangerous==2.2.0
|
| 34 |
+
Jinja2==3.1.6
|
| 35 |
+
joblib==1.5.2
|
| 36 |
+
jsonpatch==1.33
|
| 37 |
+
jsonpointer==3.0.0
|
| 38 |
+
langchain==0.3.27
|
| 39 |
+
langchain-community==0.3.31
|
| 40 |
+
langchain-core==0.3.79
|
| 41 |
+
langchain-groq==0.3.8
|
| 42 |
+
langchain-huggingface==0.3.1
|
| 43 |
+
langchain-text-splitters==0.3.11
|
| 44 |
+
langsmith==0.4.37
|
| 45 |
+
markdown-it-py==4.0.0
|
| 46 |
+
MarkupSafe==3.0.3
|
| 47 |
+
marshmallow==3.26.1
|
| 48 |
+
mdurl==0.1.2
|
| 49 |
+
mpmath==1.3.0
|
| 50 |
+
multidict==6.7.0
|
| 51 |
+
mypy_extensions==1.1.0
|
| 52 |
+
networkx==3.4.2
|
| 53 |
+
numpy==2.2.6
|
| 54 |
+
orjson==3.11.3
|
| 55 |
+
packaging==25.0
|
| 56 |
+
pandas==2.3.3
|
| 57 |
+
pillow==12.0.0
|
| 58 |
+
propcache==0.4.1
|
| 59 |
+
pydantic==2.12.2
|
| 60 |
+
pydantic-extra-types==2.10.6
|
| 61 |
+
pydantic-settings==2.11.0
|
| 62 |
+
pydantic_core==2.41.4
|
| 63 |
+
Pygments==2.19.2
|
| 64 |
+
pymongo==4.15.3
|
| 65 |
+
python-dateutil==2.9.0.post0
|
| 66 |
+
python-dotenv==1.1.1
|
| 67 |
+
python-multipart==0.0.20
|
| 68 |
+
pytz==2025.2
|
| 69 |
+
PyYAML==6.0.3
|
| 70 |
+
regex==2025.9.18
|
| 71 |
+
requests==2.32.5
|
| 72 |
+
requests-toolbelt==1.0.0
|
| 73 |
+
rich==14.2.0
|
| 74 |
+
rich-toolkit==0.15.1
|
| 75 |
+
rignore==0.7.1
|
| 76 |
+
safetensors==0.6.2
|
| 77 |
+
scikit-learn==1.7.2
|
| 78 |
+
scipy==1.15.3
|
| 79 |
+
sentence-transformers==5.1.1
|
| 80 |
+
sentry-sdk==2.42.0
|
| 81 |
+
shellingham==1.5.4
|
| 82 |
+
six==1.17.0
|
| 83 |
+
sniffio==1.3.1
|
| 84 |
+
SQLAlchemy==2.0.44
|
| 85 |
+
starlette==0.48.0
|
| 86 |
+
sympy==1.14.0
|
| 87 |
+
tenacity==9.1.2
|
| 88 |
+
threadpoolctl==3.6.0
|
| 89 |
+
tokenizers==0.22.1
|
| 90 |
+
torch==2.9.0
|
| 91 |
+
tqdm==4.67.1
|
| 92 |
+
transformers==4.57.1
|
| 93 |
+
typer==0.19.2
|
| 94 |
+
typing-inspect==0.9.0
|
| 95 |
+
typing-inspection==0.4.2
|
| 96 |
+
typing_extensions==4.15.0
|
| 97 |
+
tzdata==2025.2
|
| 98 |
+
ujson==5.11.0
|
| 99 |
+
urllib3==2.5.0
|
| 100 |
+
uvicorn==0.37.0
|
| 101 |
+
watchfiles==1.1.1
|
| 102 |
+
websockets==15.0.1
|
| 103 |
+
yarl==1.22.0
|
| 104 |
+
zstandard==0.25.0
|
src/chatbot.py
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# chatbot.py
|
| 2 |
+
import os
|
| 3 |
+
import re
|
| 4 |
+
import json
|
| 5 |
+
from typing import Dict, Any, List, Tuple, Optional
|
| 6 |
+
|
| 7 |
+
from langchain_huggingface import HuggingFaceEmbeddings
|
| 8 |
+
from langchain_community.vectorstores import FAISS
|
| 9 |
+
from langchain.schema import HumanMessage
|
| 10 |
+
from langchain_groq import ChatGroq # groq LLM wrapper
|
| 11 |
+
from langchain.schema import Document
|
| 12 |
+
from dotenv import load_dotenv
|
| 13 |
+
load_dotenv()
|
| 14 |
+
|
| 15 |
+
# -------- Safe absolute path ----------
|
| 16 |
+
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # project root
|
| 17 |
+
VECTORSTORE_DIR = os.getenv("VECTORSTORE_DIR", os.path.join(PROJECT_ROOT, "vectorstore"))
|
| 18 |
+
|
| 19 |
+
GROQ_API_KEY = os.getenv("GROQ_API_KEY")
|
| 20 |
+
|
| 21 |
+
# Load embeddings & vectorstore
|
| 22 |
+
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
|
| 23 |
+
faiss_index_path = os.path.join(VECTORSTORE_DIR, "index.faiss")
|
| 24 |
+
if not os.path.exists(faiss_index_path):
|
| 25 |
+
raise FileNotFoundError(f"FAISS index not found at {faiss_index_path}")
|
| 26 |
+
db = FAISS.load_local(VECTORSTORE_DIR, embeddings, allow_dangerous_deserialization=True)
|
| 27 |
+
|
| 28 |
+
# Instantiate Groq LLM
|
| 29 |
+
|
| 30 |
+
llm = ChatGroq(
|
| 31 |
+
api_key=GROQ_API_KEY,
|
| 32 |
+
model="llama-3.1-8b-instant"
|
| 33 |
+
)
|
| 34 |
+
# ---------------------------
|
| 35 |
+
# 1) Query parsing helpers
|
| 36 |
+
# ---------------------------
|
| 37 |
+
def parse_budget(text: str) -> Optional[float]:
|
| 38 |
+
"""
|
| 39 |
+
Parse budgets like:
|
| 40 |
+
- "under ₹1.2 Cr" -> returns numeric rupees (float) e.g. 12000000
|
| 41 |
+
- "under 1.2cr", "under 12000000"
|
| 42 |
+
Returns numeric rupee value or None.
|
| 43 |
+
"""
|
| 44 |
+
if not text:
|
| 45 |
+
return None
|
| 46 |
+
s = text.replace(",", "").lower()
|
| 47 |
+
# find ₹ or rupee symbols and numbers
|
| 48 |
+
m = re.search(r"under\s*[₹rs\.]*\s*([0-9]+(?:\.[0-9]+)?)\s*(cr|crore|l|lakhs|lakh|k)?", s)
|
| 49 |
+
if m:
|
| 50 |
+
num = float(m.group(1))
|
| 51 |
+
unit = (m.group(2) or "").lower()
|
| 52 |
+
if unit in ("cr", "crore"):
|
| 53 |
+
return num * 1e7
|
| 54 |
+
if unit in ("l", "lakh", "lakhs"):
|
| 55 |
+
return num * 1e5
|
| 56 |
+
if unit in ("k",):
|
| 57 |
+
return num * 1e3
|
| 58 |
+
# if no unit assume rupees raw
|
| 59 |
+
return num
|
| 60 |
+
# alternative: find direct rupee integers like 12000000
|
| 61 |
+
m2 = re.search(r"([0-9]{6,})", s)
|
| 62 |
+
if m2:
|
| 63 |
+
return float(m2.group(1))
|
| 64 |
+
return None
|
| 65 |
+
|
| 66 |
+
|
| 67 |
+
def parse_bhk(text: str) -> Optional[str]:
|
| 68 |
+
"""Return like '2BHK' or '3BHK' if mentioned."""
|
| 69 |
+
if not text:
|
| 70 |
+
return None
|
| 71 |
+
m = re.search(r"(\d+)\s*-?\s*bhk", text.lower())
|
| 72 |
+
if m:
|
| 73 |
+
return f"{m.group(1)}BHK"
|
| 74 |
+
return None
|
| 75 |
+
|
| 76 |
+
|
| 77 |
+
def parse_city(text: str) -> Optional[str]:
|
| 78 |
+
"""Very simple city detection — looks for common city names in text."""
|
| 79 |
+
if not text:
|
| 80 |
+
return None
|
| 81 |
+
s = text.lower()
|
| 82 |
+
# extend this list as you need
|
| 83 |
+
cities = ["pune", "mumbai", "delhi", "bangalore", "bangaluru", "chennai", "hyderabad", "kolkata"]
|
| 84 |
+
for c in cities:
|
| 85 |
+
if c in s:
|
| 86 |
+
# standardize "bangaluru" -> "Bangalore" etc if you prefer
|
| 87 |
+
return c.capitalize() if c != "bangaluru" else "Bangalore"
|
| 88 |
+
return None
|
| 89 |
+
|
| 90 |
+
|
| 91 |
+
def parse_status(text: str) -> Optional[str]:
|
| 92 |
+
"""Detect readiness intents"""
|
| 93 |
+
s = text.lower()
|
| 94 |
+
if "ready" in s or "ready to move" in s or "ready-to-move" in s:
|
| 95 |
+
return "READY_TO_MOVE"
|
| 96 |
+
if "under construction" in s or "uc" in s or "under-construction" in s:
|
| 97 |
+
return "UNDER_CONSTRUCTION"
|
| 98 |
+
return None
|
| 99 |
+
|
| 100 |
+
|
| 101 |
+
def parse_locality_or_project(text: str) -> Optional[str]:
|
| 102 |
+
"""Pick up locality words (heuristic). Returns substring if found after 'in' or 'near'."""
|
| 103 |
+
if not text:
|
| 104 |
+
return None
|
| 105 |
+
m = re.search(r"(?:in|near|at)\s+([a-zA-Z0-9\- ]{3,30})", text.lower())
|
| 106 |
+
if m:
|
| 107 |
+
return m.group(1).strip().title()
|
| 108 |
+
return None
|
| 109 |
+
|
| 110 |
+
|
| 111 |
+
def parse_query(query: str) -> Dict[str, Any]:
|
| 112 |
+
"""Aggregate all parsed filters."""
|
| 113 |
+
return {
|
| 114 |
+
"raw": query,
|
| 115 |
+
"budget_rupees": parse_budget(query),
|
| 116 |
+
"bhk": parse_bhk(query),
|
| 117 |
+
"city": parse_city(query),
|
| 118 |
+
"status": parse_status(query),
|
| 119 |
+
"locality_or_project": parse_locality_or_project(query),
|
| 120 |
+
}
|
| 121 |
+
|
| 122 |
+
|
| 123 |
+
# ---------------------------
|
| 124 |
+
# 2) Search + deterministic filter
|
| 125 |
+
# ---------------------------
|
| 126 |
+
def semantic_search(query: str, k: int = 10) -> List[Document]:
|
| 127 |
+
"""
|
| 128 |
+
Run similarity search over FAISS and return top-k Document objects.
|
| 129 |
+
"""
|
| 130 |
+
return db.similarity_search(query, k=k)
|
| 131 |
+
|
| 132 |
+
|
| 133 |
+
def apply_filters(docs: List[Document], filters: Dict[str, Any]) -> List[Document]:
|
| 134 |
+
"""Filter retrieved docs using structured metadata (price, city, BHK, status, locality)."""
|
| 135 |
+
budget = filters.get("budget_rupees")
|
| 136 |
+
bhk = filters.get("bhk")
|
| 137 |
+
city = filters.get("city")
|
| 138 |
+
status = filters.get("status")
|
| 139 |
+
locality = filters.get("locality_or_project")
|
| 140 |
+
|
| 141 |
+
def keep(doc: Document) -> bool:
|
| 142 |
+
md = doc.metadata or {}
|
| 143 |
+
# city filter
|
| 144 |
+
if city:
|
| 145 |
+
md_city = (md.get("city") or "").lower()
|
| 146 |
+
if city.lower() not in md_city:
|
| 147 |
+
return False
|
| 148 |
+
# bhk filter
|
| 149 |
+
if bhk:
|
| 150 |
+
md_bhk = (md.get("BHK") or md.get("bhk") or "").lower()
|
| 151 |
+
if bhk.lower() not in md_bhk:
|
| 152 |
+
return False
|
| 153 |
+
# price filter (budget_rupees)
|
| 154 |
+
if budget is not None:
|
| 155 |
+
price = md.get("price") or md.get("price_in_cr")
|
| 156 |
+
if price is None:
|
| 157 |
+
return False
|
| 158 |
+
# price might be stored either in rupees (price) or in crores (price_in_cr)
|
| 159 |
+
if md.get("price") is not None:
|
| 160 |
+
try:
|
| 161 |
+
if float(md.get("price")) > float(budget):
|
| 162 |
+
return False
|
| 163 |
+
except:
|
| 164 |
+
return False
|
| 165 |
+
else:
|
| 166 |
+
# price_in_cr present
|
| 167 |
+
try:
|
| 168 |
+
if float(md.get("price_in_cr")) * 1e7 > float(budget):
|
| 169 |
+
return False
|
| 170 |
+
except:
|
| 171 |
+
return False
|
| 172 |
+
# status filter
|
| 173 |
+
if status:
|
| 174 |
+
md_status = (md.get("status") or "").lower()
|
| 175 |
+
if status.lower() not in md_status:
|
| 176 |
+
return False
|
| 177 |
+
# locality filter — check in metadata locality or address or slug
|
| 178 |
+
if locality:
|
| 179 |
+
found = False
|
| 180 |
+
for key in ("locality", "address", "slug", "projectName"):
|
| 181 |
+
if key in md and md.get(key):
|
| 182 |
+
if locality.lower() in str(md.get(key)).lower():
|
| 183 |
+
found = True
|
| 184 |
+
break
|
| 185 |
+
if not found:
|
| 186 |
+
return False
|
| 187 |
+
return True
|
| 188 |
+
|
| 189 |
+
filtered = [d for d in docs if keep(d)]
|
| 190 |
+
return filtered
|
| 191 |
+
|
| 192 |
+
|
| 193 |
+
# ---------------------------
|
| 194 |
+
# 3) Create summary + cards input (no hallucination)
|
| 195 |
+
# ---------------------------
|
| 196 |
+
def build_context_for_llm(docs: List[Document]) -> str:
|
| 197 |
+
"""
|
| 198 |
+
Build a compact, plain text context from the retrieved docs.
|
| 199 |
+
We'll pass this to Groq LLM and instruct it to only use this data.
|
| 200 |
+
"""
|
| 201 |
+
lines = []
|
| 202 |
+
for i, d in enumerate(docs, 1):
|
| 203 |
+
md = d.metadata or {}
|
| 204 |
+
title = md.get("projectName") or md.get("slug") or "Unknown"
|
| 205 |
+
locality = md.get("locality") or ""
|
| 206 |
+
city = md.get("city") or ""
|
| 207 |
+
bhk = md.get("BHK") or md.get("bhk") or ""
|
| 208 |
+
price_cr = md.get("price_in_cr")
|
| 209 |
+
price_rupee = md.get("price")
|
| 210 |
+
price_str = (f"₹{round(price_cr,2)} Cr" if price_cr else (f"₹{int(price_rupee)}" if price_rupee else "N/A"))
|
| 211 |
+
status = md.get("status") or ""
|
| 212 |
+
amenities = md.get("amenities") or ""
|
| 213 |
+
possession = md.get("possessionDate") or ""
|
| 214 |
+
slug = md.get("slug") or ""
|
| 215 |
+
|
| 216 |
+
lines.append(
|
| 217 |
+
f"ITEM_{i} || title: {title} || city: {city} || locality: {locality} || bhk: {bhk} || price: {price_str} || status: {status} || possession: {possession} || amenities: {amenities} || slug: {slug}"
|
| 218 |
+
)
|
| 219 |
+
return "\n".join(lines)
|
| 220 |
+
|
| 221 |
+
|
| 222 |
+
# ---------------------------
|
| 223 |
+
# 4) Prompt to Groq (strict, grounded)
|
| 224 |
+
# ---------------------------
|
| 225 |
+
from langchain.schema import HumanMessage
|
| 226 |
+
import json, re
|
| 227 |
+
|
| 228 |
+
def generate_summary_and_cards(user_query: str, records_text: str) -> dict:
|
| 229 |
+
SUMMARY_PROMPT = f"""
|
| 230 |
+
You are an assistant for NoBrokerage.com. You will be given property records.
|
| 231 |
+
**INSTRUCTIONS:**
|
| 232 |
+
- Use ONLY the information in the provided records (do not hallucinate).
|
| 233 |
+
- Produce a JSON object with two keys: "summary" and "cards".
|
| 234 |
+
- "summary": 2-4 sentences summarizing matching properties, including price, BHK, readiness, localities, counts.
|
| 235 |
+
- "cards": list of at most 6 objects with keys: title, city_locality, bhk, price, project_name, possession_status, top_amenities (list of 1-3 strings), cta_url.
|
| 236 |
+
- If no records match, return:
|
| 237 |
+
{{"summary":"No matching properties found. I expanded the search and found X alternatives.","cards":[]}}
|
| 238 |
+
Records:
|
| 239 |
+
{records_text}
|
| 240 |
+
|
| 241 |
+
User query:
|
| 242 |
+
{user_query}
|
| 243 |
+
"""
|
| 244 |
+
|
| 245 |
+
# Call Groq LLM
|
| 246 |
+
resp = llm.generate([[HumanMessage(content=SUMMARY_PROMPT)]])
|
| 247 |
+
|
| 248 |
+
# Extract text
|
| 249 |
+
try:
|
| 250 |
+
text = resp.generations[0][0].text
|
| 251 |
+
except Exception:
|
| 252 |
+
text = str(resp)
|
| 253 |
+
|
| 254 |
+
# Parse JSON
|
| 255 |
+
try:
|
| 256 |
+
result_json = json.loads(text)
|
| 257 |
+
except json.JSONDecodeError:
|
| 258 |
+
# Attempt to extract JSON blob
|
| 259 |
+
match = re.search(r"(\{.*\})", text, re.S)
|
| 260 |
+
if match:
|
| 261 |
+
try:
|
| 262 |
+
result_json = json.loads(match.group(1))
|
| 263 |
+
except:
|
| 264 |
+
result_json = {"summary": "Error: Could not parse LLM output as JSON.", "cards": []}
|
| 265 |
+
else:
|
| 266 |
+
result_json = {"summary": "Error: Could not parse LLM output as JSON.", "cards": []}
|
| 267 |
+
|
| 268 |
+
# Ensure summary fallback is strictly formatted
|
| 269 |
+
if not result_json.get("summary"):
|
| 270 |
+
result_json["summary"] = f"No matching properties found for '{user_query}'."
|
| 271 |
+
|
| 272 |
+
return result_json
|
| 273 |
+
|
| 274 |
+
|
| 275 |
+
|
| 276 |
+
# ---------------------------
|
| 277 |
+
# 5) Main handler
|
| 278 |
+
# ---------------------------
|
| 279 |
+
def handle_query(query: str, k: int = 12) -> Dict[str, Any]:
|
| 280 |
+
"""
|
| 281 |
+
Full pipeline:
|
| 282 |
+
- parse query
|
| 283 |
+
- semantic search (k)
|
| 284 |
+
- deterministic filter
|
| 285 |
+
- pass filtered results to LLM for summary + cards (LLM is forced to use only these records)
|
| 286 |
+
"""
|
| 287 |
+
parsed = parse_query(query)
|
| 288 |
+
sem_docs = semantic_search(query, k=k)
|
| 289 |
+
|
| 290 |
+
# apply deterministic metadata filter
|
| 291 |
+
filtered = apply_filters(sem_docs, parsed)
|
| 292 |
+
|
| 293 |
+
# If none after filtering, optionally expand search: use original sem_docs as fallback
|
| 294 |
+
to_use = filtered if filtered else sem_docs[:6] # keep up to 6 for LLM context
|
| 295 |
+
|
| 296 |
+
# Build plain records text for LLM
|
| 297 |
+
records_text = build_context_for_llm(to_use)
|
| 298 |
+
|
| 299 |
+
# If absolutely no documents at all:
|
| 300 |
+
if len(to_use) == 0:
|
| 301 |
+
return {"summary": "No matching properties found and no alternatives available.", "cards": []}
|
| 302 |
+
|
| 303 |
+
llm_result = generate_summary_and_cards(query, records_text)
|
| 304 |
+
|
| 305 |
+
# Ensure cards also include CTA built from slug if missing formatting
|
| 306 |
+
cards = llm_result.get("cards", [])
|
| 307 |
+
for c, doc in zip(cards, to_use):
|
| 308 |
+
# ensure cta_url exists
|
| 309 |
+
if not c.get("cta_url") or c.get("cta_url") == "":
|
| 310 |
+
slug = doc.metadata.get("slug") or ""
|
| 311 |
+
c["cta_url"] = f"/project/{slug}"
|
| 312 |
+
return llm_result
|
| 313 |
+
|
| 314 |
+
|
| 315 |
+
# ---------------------------
|
| 316 |
+
# CLI interactive usage
|
| 317 |
+
# ---------------------------
|
| 318 |
+
if __name__ == "__main__":
|
| 319 |
+
print("NoBrokerage Chatbot (Groq) — demo (grounded summary + cards).")
|
| 320 |
+
print("Type 'exit' to quit.")
|
| 321 |
+
while True:
|
| 322 |
+
q = input("\nEnter user query: ").strip()
|
| 323 |
+
if q.lower() in ("exit", "quit"):
|
| 324 |
+
break
|
| 325 |
+
out = handle_query(q)
|
| 326 |
+
print("\n=== Summary ===")
|
| 327 |
+
print(out.get("summary"))
|
| 328 |
+
# print("\n=== Cards ===")
|
| 329 |
+
# print(json.dumps(out.get("cards", []), indent=2))
|
src/check_index.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from langchain_huggingface import HuggingFaceEmbeddings
|
| 2 |
+
from langchain_community.vectorstores import FAISS
|
| 3 |
+
|
| 4 |
+
# Path of vectorstore
|
| 5 |
+
DB_FAISS_PATH = "../vectorStore"
|
| 6 |
+
|
| 7 |
+
def check_faiss_index():
|
| 8 |
+
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
|
| 9 |
+
db = FAISS.load_local(DB_FAISS_PATH, embeddings, allow_dangerous_deserialization=True)
|
| 10 |
+
|
| 11 |
+
# Number of vectors stored in index.faiss
|
| 12 |
+
num_vectors = db.index.ntotal
|
| 13 |
+
|
| 14 |
+
# Number of documents (with metadata) stored in index.pkl
|
| 15 |
+
num_docs = len(db.docstore._dict)
|
| 16 |
+
|
| 17 |
+
print(f"📦 index.faiss contains {num_vectors} vectors")
|
| 18 |
+
print(f"📑 index.pkl contains {num_docs} metadata entries")
|
| 19 |
+
|
| 20 |
+
if __name__ == "__main__":
|
| 21 |
+
check_faiss_index()
|
src/ingest.py
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import pymongo
|
| 3 |
+
import pickle
|
| 4 |
+
from dotenv import load_dotenv
|
| 5 |
+
from langchain_community.vectorstores import FAISS
|
| 6 |
+
from langchain_huggingface import HuggingFaceEmbeddings
|
| 7 |
+
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
| 8 |
+
from langchain.schema import Document
|
| 9 |
+
from datetime import datetime
|
| 10 |
+
|
| 11 |
+
# -----------------------------
|
| 12 |
+
# 1. Load environment variables
|
| 13 |
+
# -----------------------------
|
| 14 |
+
load_dotenv()
|
| 15 |
+
MONGO_URI = os.getenv("MONGO_URI") # Mongo connection
|
| 16 |
+
DB_NAME = os.getenv("DB_NAME", "company_chatbot")
|
| 17 |
+
COLLECTION_NAME = os.getenv("COLLECTION_NAME", "processed_data")
|
| 18 |
+
VECTORSTORE_DIR = "../vectorstore"
|
| 19 |
+
os.makedirs(VECTORSTORE_DIR, exist_ok=True)
|
| 20 |
+
|
| 21 |
+
# -----------------------------
|
| 22 |
+
# 2. Connect to MongoDB
|
| 23 |
+
# -----------------------------
|
| 24 |
+
client = pymongo.MongoClient(MONGO_URI)
|
| 25 |
+
db = client[DB_NAME]
|
| 26 |
+
collection = db[COLLECTION_NAME]
|
| 27 |
+
|
| 28 |
+
# -----------------------------
|
| 29 |
+
# 3. Preprocessing helpers
|
| 30 |
+
# -----------------------------
|
| 31 |
+
def clean_string(val):
|
| 32 |
+
if val is None:
|
| 33 |
+
return ""
|
| 34 |
+
return str(val).replace('"', '').replace("'", '').strip()
|
| 35 |
+
|
| 36 |
+
def clean_numeric(val):
|
| 37 |
+
try:
|
| 38 |
+
return float(val)
|
| 39 |
+
except:
|
| 40 |
+
return None
|
| 41 |
+
|
| 42 |
+
def preprocess_document(doc):
|
| 43 |
+
"""Convert MongoDB doc to LangChain Document with full structured metadata"""
|
| 44 |
+
project_name = clean_string(doc.get("projectName"))
|
| 45 |
+
project_type = clean_string(doc.get("projectType"))
|
| 46 |
+
project_category = clean_string(doc.get("projectCategory"))
|
| 47 |
+
slug = clean_string(doc.get("slug"))
|
| 48 |
+
status = clean_string(doc.get("status"))
|
| 49 |
+
bhk = clean_string(doc.get("type") or doc.get("customBHK"))
|
| 50 |
+
price = clean_numeric(doc.get("price"))
|
| 51 |
+
carpet_area = clean_numeric(doc.get("carpetArea"))
|
| 52 |
+
bathrooms = clean_numeric(doc.get("bathrooms"))
|
| 53 |
+
balcony = clean_numeric(doc.get("balcony"))
|
| 54 |
+
furnished = clean_string(doc.get("furnishedType"))
|
| 55 |
+
lift = doc.get("lift", False)
|
| 56 |
+
possession_date = clean_string(doc.get("possessionDate"))
|
| 57 |
+
amenities = clean_string(doc.get("aboutProperty"))
|
| 58 |
+
address = clean_string(doc.get("Address info"))
|
| 59 |
+
|
| 60 |
+
# Extract city/locality from slug (fallback if missing)
|
| 61 |
+
parts = slug.split("-") if slug else []
|
| 62 |
+
locality = parts[-3].capitalize() if len(parts) >= 3 else ""
|
| 63 |
+
city = parts[-2].capitalize() if len(parts) >= 2 else ""
|
| 64 |
+
|
| 65 |
+
# Page content for embeddings (can include any text you want LLM to use)
|
| 66 |
+
content = f"""
|
| 67 |
+
Project Name: {project_name}
|
| 68 |
+
Type: {bhk}
|
| 69 |
+
Status: {status}
|
| 70 |
+
Price: {price}
|
| 71 |
+
Carpet Area: {carpet_area}
|
| 72 |
+
Bathrooms: {bathrooms}
|
| 73 |
+
Balcony: {balcony}
|
| 74 |
+
Furnishing: {furnished}
|
| 75 |
+
Lift: {lift}
|
| 76 |
+
Location: {locality}, {city}
|
| 77 |
+
Address: {address}
|
| 78 |
+
Amenities: {amenities}
|
| 79 |
+
"""
|
| 80 |
+
|
| 81 |
+
# Structured metadata
|
| 82 |
+
metadata = {
|
| 83 |
+
"id": str(doc.get("_id")),
|
| 84 |
+
"slug": slug,
|
| 85 |
+
"projectName": project_name,
|
| 86 |
+
"projectType": project_type,
|
| 87 |
+
"projectCategory": project_category,
|
| 88 |
+
"status": status,
|
| 89 |
+
"BHK": bhk,
|
| 90 |
+
"price": price,
|
| 91 |
+
"price_in_cr": round(price / 10000000, 2) if price else None,
|
| 92 |
+
"carpetArea": carpet_area,
|
| 93 |
+
"bathrooms": bathrooms,
|
| 94 |
+
"balcony": balcony,
|
| 95 |
+
"furnishedType": furnished,
|
| 96 |
+
"lift": lift,
|
| 97 |
+
"possessionDate": possession_date,
|
| 98 |
+
"city": city,
|
| 99 |
+
"locality": locality,
|
| 100 |
+
"address": address,
|
| 101 |
+
"amenities": amenities,
|
| 102 |
+
"createdAt": doc.get("createdAt"),
|
| 103 |
+
"updatedAt": doc.get("updatedAt")
|
| 104 |
+
}
|
| 105 |
+
|
| 106 |
+
return Document(page_content=" ".join(content.split()), metadata=metadata)
|
| 107 |
+
|
| 108 |
+
|
| 109 |
+
# -----------------------------
|
| 110 |
+
# 4. Fetch & preprocess all docs
|
| 111 |
+
# -----------------------------
|
| 112 |
+
raw_docs = list(collection.find({}))
|
| 113 |
+
documents = [preprocess_document(doc) for doc in raw_docs]
|
| 114 |
+
print(f"Fetched {len(documents)} documents from MongoDB")
|
| 115 |
+
|
| 116 |
+
# -----------------------------
|
| 117 |
+
# 5. Chunk documents
|
| 118 |
+
# -----------------------------
|
| 119 |
+
text_splitter = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=50)
|
| 120 |
+
docs = text_splitter.split_documents(documents)
|
| 121 |
+
print(f"After chunking → {len(docs)} chunks")
|
| 122 |
+
|
| 123 |
+
# -----------------------------
|
| 124 |
+
# 6. Generate embeddings
|
| 125 |
+
# -----------------------------
|
| 126 |
+
embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
|
| 127 |
+
vectorstore = FAISS.from_documents(docs, embedding_model)
|
| 128 |
+
|
| 129 |
+
# -----------------------------
|
| 130 |
+
# 7. Save FAISS index & metadata separately
|
| 131 |
+
# -----------------------------
|
| 132 |
+
# Save FAISS vectorstore (index + metadata) into the folder
|
| 133 |
+
vectorstore.save_local(VECTORSTORE_DIR)
|
| 134 |
+
print(f"✅ FAISS vectors and metadata saved in {VECTORSTORE_DIR}")
|
| 135 |
+
|
src/query.py
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
from langchain_huggingface import HuggingFaceEmbeddings
|
| 3 |
+
from langchain_community.vectorstores import FAISS
|
| 4 |
+
|
| 5 |
+
# Path to your saved FAISS vectorstore
|
| 6 |
+
VECTORSTORE_DIR = "../vectorStore"
|
| 7 |
+
|
| 8 |
+
def query_faiss():
|
| 9 |
+
# Load embeddings
|
| 10 |
+
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
|
| 11 |
+
|
| 12 |
+
# Load FAISS vectorstore
|
| 13 |
+
db = FAISS.load_local(VECTORSTORE_DIR, embeddings, allow_dangerous_deserialization=True)
|
| 14 |
+
|
| 15 |
+
print("✅ FAISS vectorstore loaded successfully.")
|
| 16 |
+
print(f"Total chunks in DB: {len(db.docstore._dict)}")
|
| 17 |
+
|
| 18 |
+
while True:
|
| 19 |
+
query = input("\nEnter your query (or type 'exit' to quit): ").strip()
|
| 20 |
+
if query.lower() == "exit":
|
| 21 |
+
print("Exiting...")
|
| 22 |
+
break
|
| 23 |
+
|
| 24 |
+
# Perform similarity search
|
| 25 |
+
results = db.similarity_search(query, k=5) # top 5 results
|
| 26 |
+
|
| 27 |
+
if not results:
|
| 28 |
+
print("❌ No matching documents found.")
|
| 29 |
+
else:
|
| 30 |
+
print(f"\n🔹 Top {len(results)} matches:")
|
| 31 |
+
for i, doc in enumerate(results, 1):
|
| 32 |
+
# Print metadata + first 200 chars of content
|
| 33 |
+
content_preview = doc.page_content[:200].replace("\n", " ")
|
| 34 |
+
print(f"{i}. {content_preview}")
|
| 35 |
+
print(f" Metadata: {doc.metadata}\n")
|
| 36 |
+
|
| 37 |
+
if __name__ == "__main__":
|
| 38 |
+
query_faiss()
|