Friday, 12 June 2026

How to share Live Location with user interface

 Neeche ek minimum working example hai jisme:

  • React user apni location send karta hai.

  • FastAPI JWT se user identify karta hai.

  • Backend friend list check karta hai.

  • Sirf friends ko location update milta hai.

  • Frontend map ki jagah simple console update dikhata hai (map baad me add kar sakte ho).


Backend (FastAPI)

Dummy Friend Data

FRIENDS = {
    1: [2, 3],
    2: [1],
    3: [1]
}

User 1 ki location sirf 2 aur 3 dekh sakte hain.


main.py

from fastapi import FastAPI, WebSocket, WebSocketDisconnect
import jwt
import json

app = FastAPI()

SECRET_KEY = "mysecret"

active_connections = {}

FRIENDS = {
    1: [2, 3],
    2: [1],
    3: [1]
}


def get_user_from_token(token: str):
    try:
        payload = jwt.decode(
            token,
            SECRET_KEY,
            algorithms=["HS256"]
        )

        return payload["user_id"]

    except Exception:
        return None


@app.websocket("/ws/location")
async def location_socket(websocket: WebSocket):

    token = websocket.query_params.get("token")

    user_id = get_user_from_token(token)

    if not user_id:
        await websocket.close(code=1008)
        return

    await websocket.accept()

    active_connections[user_id] = websocket

    print(f"User {user_id} connected")

    try:
        while True:

            data = await websocket.receive_text()

            payload = json.loads(data)

            location_update = {
                "type": "location_update",
                "user_id": user_id,
                "lat": payload["lat"],
                "lng": payload["lng"]
            }

            friend_ids = FRIENDS.get(user_id, [])

            for friend_id in friend_ids:

                friend_socket = active_connections.get(friend_id)

                if friend_socket:

                    await friend_socket.send_json(
                        location_update
                    )

    except WebSocketDisconnect:

        active_connections.pop(user_id, None)

        print(f"User {user_id} disconnected")

JWT Generate Example

import jwt

token = jwt.encode(
    {"user_id": 1},
    "mysecret",
    algorithm="HS256"
)

print(token)

React Sender (Location Owner)

User 1 ki location continuously bhejega.

import { useEffect } from "react";

export default function ShareLocation() {

  useEffect(() => {

    const token =
      "USER_1_JWT_TOKEN";

    const ws = new WebSocket(
      `ws://localhost:8000/ws/location?token=${token}`
    );

    let watchId;

    ws.onopen = () => {

      watchId =
        navigator.geolocation.watchPosition(
          (position) => {

            ws.send(
              JSON.stringify({
                lat:
                  position.coords.latitude,
                lng:
                  position.coords.longitude
              })
            );

          },
          console.error,
          {
            enableHighAccuracy: true
          }
        );
    };

    return () => {

      navigator.geolocation.clearWatch(
        watchId
      );

      ws.close();
    };

  }, []);

  return (
    <h2>
      Sharing Location...
    </h2>
  );
}

React Friend Side

User 2 ya User 3.

Ye sirf updates receive karega.

import { useEffect, useState } from "react";

export default function FriendTracker() {

  const [locations, setLocations] =
    useState({});

  useEffect(() => {

    const token =
      "USER_2_JWT_TOKEN";

    const ws = new WebSocket(
      `ws://localhost:8000/ws/location?token=${token}`
    );

    ws.onmessage = (event) => {

      const data =
        JSON.parse(event.data);

      setLocations((prev) => ({
        ...prev,
        [data.user_id]: {
          lat: data.lat,
          lng: data.lng
        }
      }));
    };

    return () => ws.close();

  }, []);

  return (
    <div>

      <h2>
        Friend Locations
      </h2>

      {Object.entries(locations).map(
        ([userId, loc]) => (

          <div key={userId}>

            User {userId}

            <br />

            Lat: {loc.lat}

            <br />

            Lng: {loc.lng}

          </div>
        )
      )}

    </div>
  );
}

Real Production Version

Dummy dictionary ki jagah:

friend_ids = await db.fetch_all("""
SELECT friend_id
FROM friendships
WHERE user_id = :user_id
AND status = 'accepted'
""")

Better Structure

users
------
id

friendships
------
user_id
friend_id
status

location_shares
------
owner_id
viewer_id
expires_at

locations
------
user_id
latitude
longitude
updated_at

Location send karne se pehle:

allowed_users = get_location_viewers(
    user_id
)

Fir:

for viewer in allowed_users:
    send_location()

Is model me tum WhatsApp jaisa feature bana sakte ho:

  • Friend request

  • Accept request

  • Live location sharing

  • Share for 15 min

  • Share for 1 hour

  • Stop sharing

  • Last seen location

  • Multiple friends tracking

aur backend hi enforce karega ki location sirf authorized friends ko mile.












Bilkul. Real apps me location hamesha share nahi hoti. User button dabata hai:

  • Start Sharing → location bhejna start

  • Stop Sharing → location bhejna band

Iske liye frontend me watchPosition() ka watchId save karte hain aur backend ko bhi batate hain ki sharing on/off hai.


React

import { useRef, useState } from "react";

export default function LiveLocation() {
  const [sharing, setSharing] = useState(false);

  const wsRef = useRef(null);
  const watchIdRef = useRef(null);

  const startSharing = () => {
    const token = localStorage.getItem("token");

    const ws = new WebSocket(
      `ws://localhost:8000/ws/share-location?token=${token}`
    );

    wsRef.current = ws;

    ws.onopen = () => {
      watchIdRef.current =
        navigator.geolocation.watchPosition(
          (position) => {
            ws.send(
              JSON.stringify({
                type: "location",
                lat: position.coords.latitude,
                lng: position.coords.longitude,
              })
            );
          },
          console.error,
          {
            enableHighAccuracy: true,
          }
        );

      setSharing(true);
    };
  };

  const stopSharing = () => {
    if (watchIdRef.current) {
      navigator.geolocation.clearWatch(
        watchIdRef.current
      );
    }

    if (
      wsRef.current &&
      wsRef.current.readyState === WebSocket.OPEN
    ) {
      wsRef.current.send(
        JSON.stringify({
          type: "stop_sharing",
        })
      );

      wsRef.current.close();
    }

    setSharing(false);
  };

  return (
    <div>
      {!sharing ? (
        <button onClick={startSharing}>
          Start Live Location
        </button>
      ) : (
        <button onClick={stopSharing}>
          Stop Live Location
        </button>
      )}
    </div>
  );
}

FastAPI

Connection management:

from fastapi import FastAPI, WebSocket
import json

app = FastAPI()

active_connections = {}

WebSocket Endpoint

@app.websocket("/ws/share-location")
async def share_location(
    websocket: WebSocket
):
    token = websocket.query_params.get(
        "token"
    )

    user_id = verify_jwt(token)

    await websocket.accept()

    active_connections[user_id] = websocket

    try:

        while True:

            raw = await websocket.receive_text()

            data = json.loads(raw)

            if data["type"] == "stop_sharing":

                print(
                    f"{user_id} stopped sharing"
                )

                break

            if data["type"] == "location":

                lat = data["lat"]
                lng = data["lng"]

                friends = get_friends(user_id)

                for friend_id in friends:

                    friend_socket = (
                        active_connections.get(
                            friend_id
                        )
                    )

                    if friend_socket:

                        await friend_socket.send_json(
                            {
                                "type":
                                "friend_location",
                                "user_id":
                                user_id,
                                "lat":
                                lat,
                                "lng":
                                lng,
                            }
                        )

    finally:

        active_connections.pop(
            user_id,
            None
        )

        await websocket.close()

Better Approach (Recommended)

Database me store karo ki sharing active hai ya nahi.

Table:

CREATE TABLE location_sharing (
    user_id UUID PRIMARY KEY,
    is_active BOOLEAN,
    started_at TIMESTAMP
);

Start button:

UPDATE location_sharing
SET is_active = true
WHERE user_id = ?

Stop button:

UPDATE location_sharing
SET is_active = false
WHERE user_id = ?

Broadcast se pehle:

if not is_sharing_enabled(user_id):
    continue

WhatsApp Style

Agar WhatsApp jaisa banana hai:

User click:

Share Live Location

Options:

15 minutes
1 hour
8 hours

DB:

user_id
expires_at

Check:

if datetime.utcnow() > expires_at:
    stop_sharing()

To location automatically band ho jayegi.


Typical Production Flow

User A
 |
 | Start Sharing Button
 v
watchPosition()
 |
WebSocket
 |
FastAPI
 |
Check friends
 |
Send updates
 |
Friend B
Friend C


User A
 |
 | Stop Sharing Button
 v
clearWatch()
 |
WebSocket close
 |
Backend removes connection
 |
Location sharing stopped

Is tarah user ke paas poora control rahega: ek button se start, dusre click se stop, aur sirf authorized friends ko hi location updates milengi.

Thursday, 11 June 2026

Create virtual env and export

 In a GitHub Codespace (or any Linux-based terminal), you can create a Python virtual environment and export its installed packages like this:

1. Create a virtual environment

From your project directory:

python3 -m venv .venv

This creates a virtual environment in a folder named .venv.


2. Activate the virtual environment

source .venv/bin/activate

Your prompt should change to show something like:

(.venv) user@codespace:~/project$

3. Install packages

For example:

pip install flask requests pandas

Or install from an existing requirements file:

pip install -r requirements.txt

4. Export installed libraries to requirements.txt

Once all dependencies are installed:

pip freeze > requirements.txt

This generates a file such as:

flask==3.1.0
pandas==2.3.0
requests==2.32.3

5. Recreate the environment later

On another machine or Codespace:

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Useful verification commands

Check which Python and pip are being used:

which python
which pip

They should point inside .venv:

/workspaces/my-project/.venv/bin/python
/workspaces/my-project/.venv/bin/pip

Deactivate the virtual environment

When you're done:

deactivate

A common workflow in Codespaces is:

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt   # or install packages manually
pip freeze > requirements.txt

You may also want to add .venv/ to your .gitignore so the virtual environment itself isn't committed to Git:

.venv/

Monday, 1 June 2026

llm se structure output nikalwane ke liye

 Haan, PydanticOutputParser to ek standard tarika hai. Lekin jo technique tum shayad yaad kar rahe ho wo OutputFixingParser ya RetryOutputParser ho sakti hai.

Jab model structured output support nahi karta (ya galat JSON de deta hai), tab ye parsers kaafi useful hote hain.

1. OutputFixingParser

Agar model ne almost sahi output diya hai but formatting thodi kharab hai, to ye automatically LLM se fix karwa deta hai.

from langchain.output_parsers import OutputFixingParser
from langchain_core.output_parsers import PydanticOutputParser

parser = PydanticOutputParser(pydantic_object=Person)

fixing_parser = OutputFixingParser.from_llm(
    parser=parser,
    llm=model
)

chain = template | model | fixing_parser

result = chain.invoke({"place": "indian"})
print(result)

Example

Model output:

Name: Raj
Age: 25
City: Delhi

Parser ko JSON chahiye tha.

OutputFixingParser internally LLM ko bolta hai:

"Is output ko required JSON format me convert karo"

Aur phir return karta hai:

Person(
    name="Raj",
    age=25,
    city="Delhi"
)

2. RetryOutputParser

Ye aur powerful hai.

Agar parsing fail ho jaye to original prompt + model output dono lekar model ko dubara bhejta hai.

from langchain.output_parsers import RetryOutputParser

parser = PydanticOutputParser(pydantic_object=Person)

retry_parser = RetryOutputParser.from_llm(
    parser=parser,
    llm=model
)

prompt_value = template.invoke({"place": "indian"})

response = model.invoke(prompt_value)

result = retry_parser.parse_with_prompt(
    response.content,
    prompt_value
)

print(result)

Internal Flow

Prompt
   ↓
LLM
   ↓
Bad Output
   ↓
Parse Failed
   ↓
RetryOutputParser
   ↓
LLM ko original prompt + error bhejta hai
   ↓
Correct JSON
   ↓
Pydantic Object

3. Sabse modern tarika (Recommended)

Aajkal LangChain me generally:

structured_llm = model.with_structured_output(Person)

result = structured_llm.invoke(
    "Generate a fictional Indian person"
)

print(result)

Lekin ye tabhi kaam karega jab underlying model/tool calling ya structured output support karta ho.


Agar model structured output support nahi karta

Meri preference:

parser = PydanticOutputParser(pydantic_object=Person)

fixing_parser = OutputFixingParser.from_llm(
    parser=parser,
    llm=model
)

chain = prompt | model | fixing_parser

Kyuki:

  • Simple hai

  • Retry logic mil jata hai

  • JSON formatting issues handle karta hai

  • Open-source models (Llama, Mistral, Gemma etc.) ke saath bhi kaafi achha chalta hai

Aur agar tum LangChain v0.3+/LCEL use kar rahe ho to ek aur advanced pattern hai:

parser.get_format_instructions()
RetryOutputParser

Ye production me kaafi use hota hai jab local/open-source models se reliable structured JSON nikalwana ho.

how to like if ek document fetch and then usse sematic search document

 AISS + BM25 hybrid retrieval ka idea ye hai:

  1. BM25 exact keyword matching karega.
  2. FAISS semantic similarity (embeddings) se retrieve karega.
  3. Dono ke scores combine karoge.
  4. Top results ko optionally reranker ko doge.

Install

pip install faiss-cpu rank-bm25 sentence-transformers numpy

Step 1: Documents

docs = [
"Transformers use self attention mechanism.",
"BERT is a bidirectional transformer model.",
"CNNs are commonly used for image classification.",
"Attention improves long range dependency modeling.",
"Vision Transformers achieve strong image recognition results."
]

Step 2: BM25 Index

from rank_bm25 import BM25Okapi

tokenized_docs = [doc.lower().split() for doc in docs]

bm25 = BM25Okapi(tokenized_docs)

Step 3: FAISS Index

from sentence_transformers import SentenceTransformer
import faiss
import numpy as np

model = SentenceTransformer(
"sentence-transformers/all-MiniLM-L6-v2"
)

doc_embeddings = model.encode(
docs,
convert_to_numpy=True
)

dimension = doc_embeddings.shape[1]

faiss_index = faiss.IndexFlatL2(dimension)
faiss_index.add(doc_embeddings)

Step 4: Hybrid Retrieval

def hybrid_search(query, top_k=3):

# ---------- BM25 ----------
bm25_scores = bm25.get_scores(
query.lower().split()
)

# normalize
bm25_scores = (
bm25_scores - bm25_scores.min()
) / (
bm25_scores.max() - bm25_scores.min() + 1e-8
)

# ---------- FAISS ----------
query_embedding = model.encode(
[query],
convert_to_numpy=True
)

distances, indices = faiss_index.search(
query_embedding,
len(docs)
)

faiss_scores = np.zeros(len(docs))

for rank, idx in enumerate(indices[0]):
similarity = 1 / (1 + distances[0][rank])
faiss_scores[idx] = similarity

faiss_scores = (
faiss_scores - faiss_scores.min()
) / (
faiss_scores.max() - faiss_scores.min() + 1e-8
)

# ---------- Hybrid Score ----------
alpha = 0.5

hybrid_scores = (
alpha * bm25_scores
+
(1 - alpha) * faiss_scores
)

ranked_indices = np.argsort(
hybrid_scores
)[::-1][:top_k]

results = []

for idx in ranked_indices:
results.append({
"document": docs[idx],
"hybrid_score": float(hybrid_scores[idx]),
"bm25_score": float(bm25_scores[idx]),
"vector_score": float(faiss_scores[idx])
})

return results

Step 5: Query

results = hybrid_search(
"transformer attention"
)

for r in results:
print(r)

Output roughly:

{
'document': 'Transformers use self attention mechanism.',
'hybrid_score': 0.96
}

{
'document': 'BERT is a bidirectional transformer model.',
'hybrid_score': 0.84
}

{
'document': 'Attention improves long range dependency modeling.',
'hybrid_score': 0.81
}

Production Version

Industry mein generally:

Query

BM25 Top 50
+
Vector Search Top 50

Merge

Cross Encoder Reranker

Top 5

LLM

Example reranker:

from sentence_transformers import CrossEncoder

reranker = CrossEncoder(
"cross-encoder/ms-marco-MiniLM-L-6-v2"
)

pairs = [
[query, doc]
for doc in candidate_docs
]

scores = reranker.predict(pairs)

Ye FAISS + BM25 se aaye 50-100 candidates ko re-rank karta hai aur retrieval quality kaafi improve ho jati hai.

Research-paper RAG ke liye agar tum LangChain use kar rahe ho, to main FAISS + BM25 + CrossEncoder reranking ka complete end-to-end pipeline bhi dikha sakta hoon jo arXiv PDFs par directly kaam kare.




ha de example code full uska




Agar tum arXiv papers → chunking → FAISS + BM25 → CrossEncoder reranking → LLM banana chahte ho, to ye ek realistic end-to-end example hai.

Install

pip install pymupdf
pip install sentence-transformers
pip install faiss-cpu
pip install rank-bm25
pip install langchain
pip install langchain-community
pip install arxiv

1. Download Paper from arXiv

import arxiv

search = arxiv.Search(
query="Retrieval Augmented Generation",
max_results=1
)

paper = next(search.results())

pdf_url = paper.pdf_url

print(pdf_url)

2. Extract PDF Text

import requests
import fitz

pdf_path = "paper.pdf"

response = requests.get(pdf_url)

with open(pdf_path, "wb") as f:
f.write(response.content)

doc = fitz.open(pdf_path)

text = ""

for page in doc:
text += page.get_text()

print(text[:1000])

3. Chunking

from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)

chunks = splitter.split_text(text)

print("Chunks:", len(chunks))

4. Create Embeddings

from sentence_transformers import SentenceTransformer

embedding_model = SentenceTransformer(
"BAAI/bge-small-en-v1.5"
)

embeddings = embedding_model.encode(
chunks,
convert_to_numpy=True,
show_progress_bar=True
)

5. Build FAISS Index

import faiss
import numpy as np

dimension = embeddings.shape[1]

faiss_index = faiss.IndexFlatIP(dimension)

faiss.normalize_L2(embeddings)

faiss_index.add(embeddings)

print("Indexed:", faiss_index.ntotal)

6. Build BM25 Index

from rank_bm25 import BM25Okapi

tokenized_chunks = [
chunk.lower().split()
for chunk in chunks
]

bm25 = BM25Okapi(tokenized_chunks)

7. Hybrid Retrieval

def hybrid_retrieve(
query,
faiss_top_k=20,
bm25_top_k=20
):

# -----------------
# BM25
# -----------------

bm25_scores = bm25.get_scores(
query.lower().split()
)

bm25_top_ids = np.argsort(
bm25_scores
)[::-1][:bm25_top_k]

# -----------------
# FAISS
# -----------------

query_embedding = embedding_model.encode(
[query],
convert_to_numpy=True
)

faiss.normalize_L2(query_embedding)

distances, indices = faiss_index.search(
query_embedding,
faiss_top_k
)

# -----------------
# Merge Candidates
# -----------------

candidates = set(
bm25_top_ids.tolist()
)

candidates.update(
indices[0].tolist()
)

return list(candidates)

8. Cross Encoder Reranker

Ye sabse important part hai.

from sentence_transformers import CrossEncoder

reranker = CrossEncoder(
"cross-encoder/ms-marco-MiniLM-L-6-v2"
)

9. Retrieve + Rerank

def retrieve_and_rerank(
query,
top_k=5
):

candidate_ids = hybrid_retrieve(query)

candidate_chunks = [
chunks[i]
for i in candidate_ids
]

pairs = [
[query, chunk]
for chunk in candidate_chunks
]

scores = reranker.predict(pairs)

ranked = sorted(
zip(candidate_chunks, scores),
key=lambda x: x[1],
reverse=True
)

return ranked[:top_k]

10. Test Retrieval

results = retrieve_and_rerank(
"How does retrieval augmented generation work?"
)

for idx, (chunk, score) in enumerate(results):

print("=" * 80)
print("Rank:", idx + 1)
print("Score:", score)
print(chunk[:1000])

11. Pass Context to LLM

query = "How does retrieval augmented generation work?"

retrieved_docs = retrieve_and_rerank(
query,
top_k=3
)

context = "\n\n".join(
doc
for doc, score in retrieved_docs
)

Prompt:

prompt = f"""
Answer only from the provided context.

Context:
{context}

Question:
{query}
"""

Then send prompt to Gemini/OpenAI/Llama.


Better Version for Research Papers

Research papers ke liye main ye architecture use karta:

arXiv PDF

PyMuPDF

Section-aware chunking

BGE Embeddings

FAISS

BM25

Candidate Merge

CrossEncoder Reranker

Top 5 Chunks

LLM

Ye simple vector search se kaafi better retrieval deta hai, especially jab paper mein terms jaise "RAG", "Retrieval-Augmented Generation", "retriever", "dense retrieval" alag-alag jagah likhe ho. BM25 exact keywords pakad leta hai aur FAISS semantic similarity. CrossEncoder final ranking improve karta hai.

Saturday, 30 May 2026

added second repo in current repo as folder

 Agar tum us repo ko bas ek normal folder ki tarah rakhna chahte ho aur uske saare files parent repo ke saath GitHub par push karna chahte ho, toh Option 2 sahi hai.

Steps

  1. Inner repository ki .git directory hatao:
rm -rf lecture_16_langsmith/langsmith-masterclass/.git -> ye uss repo ka name leture_!6_langsmith wale folder mein that angsmithmaster class wali repo
  1. Agar pehle se add ho chuka hai toh cache saaf karo:
git rm --cached -r lecture_16_langsmith/langsmith-masterclass

sql

 WITH filtered AS (

    SELECT *

    FROM Kurtis

    WHERE stock_quantity > 20

      AND color IN ('Red', 'Green')

      AND date_added BETWEEN DATE '2024-08-01' AND DATE '2024-11-01'

),

ranked AS (

    SELECT *,

           DENSE_RANK() OVER (

               PARTITION BY brand, size

               ORDER BY price DESC

           ) AS rnk

    FROM filtered

),

selected AS (

    SELECT *

    FROM ranked

    WHERE rnk = 1

),

stock_totals AS (

    SELECT brand,

           size,

           SUM(stock_quantity) AS total_stock

    FROM selected

    GROUP BY brand, size

)

SELECT

    s.brand,

    s.size,

    s.color,

    s.price,

    t.total_stock

FROM selected s

JOIN stock_totals t

  ON s.brand = t.brand

 AND s.size = t.size

ORDER BY

    s.brand,

    t.total_stock DESC,

    s.price DESC;




















SELECT

    k.brand,

    k.size,

    k.color,

    k.price,

    s.total_stock

FROM Kurtis k

JOIN (

    SELECT

        brand,

        size,

        SUM(stock_quantity) AS total_stock

    FROM Kurtis

    WHERE stock_quantity > 20

      AND color IN ('Red', 'Green')

      AND date_added BETWEEN '2024-08-01' AND '2024-11-01'

    GROUP BY brand, size

) s

ON k.brand = s.brand

AND k.size = s.size

WHERE k.stock_quantity > 20

  AND k.color IN ('Red', 'Green')

  AND k.date_added BETWEEN '2024-08-01' AND '2024-11-01'

  AND k.price = (

      SELECT MAX(price)

      FROM Kurtis k2

      WHERE k2.brand = k.brand

        AND k2.size = k.size

        AND k2.stock_quantity > 20

        AND k2.color IN ('Red', 'Green')

        AND k2.date_added BETWEEN '2024-08-01' AND '2024-11-01'

  )

ORDER BY k.brand, s.total_stock DESC, k.price DESC;

Hello

How to share Live Location with user interface

 Neeche ek minimum working example hai jisme: React user apni location send karta hai. FastAPI JWT se user identify karta hai. Backend frie...