# class PrecomputedEmbeddings(Embeddings): # def __init__(self, embeddings: List[List[float]]): # self.embeddings = embeddings # Store all precomputed vectors # def embed_documents(self, texts: List[str]) -> List[List[float]]: # return self.embeddings # Return the precomputed ones (order must match!) # def embed_query(self, text): # return self.embeddings[0] # def embedder(texts: List[str]) -> List[List[float]]: # embeddings = [] # base_url = "http://192.168.0.49:1234" # ✅ Add 'http://' # embed_url = f"{base_url}/v1/embeddings" # headers = {"Content-Type": "application/json"} # for text in texts: # payload = { # "model": "text-embedding-qwen3-embedding-8b", # "input": text # } # try: # response = requests.post(embed_url, json=payload, headers=headers) # ✅ POST not GET # if response.status_code == 200: # data = response.json() # ✅ Parse JSON! # embedding = data["data"][0]["embedding"] # ✅ Extract the actual vector # embeddings.append(embedding) # else: # print(f"❌ Embedding failed for '{text[:30]}...': {response.status_code} - {response.text}") # # Optionally: insert placeholder zeros if you need to continue # # embeddings.append([0.0] * 768) # ← adjust dimension as needed! # except Exception as e: # print(f"⚠️ Exception embedding '{text[:30]}...': {e}") # # embeddings.append([0.0] * 768) # fallback # return embeddings # def store_chunks_with_embeddings_locally(chunks, db_path="./local_faiss_db"): # """ # Stores pre-computed chunks and their embeddings into a local FAISS database. # Args: # chunks: list of LangChain Document objects (with page_content and metadata) # embeddings: list of embedding vectors (list of lists of floats) — must match length of chunks # db_path: where to save the FAISS index files locally # """ # texts = [chunk.page_content for chunk in chunks] # embeddings = embedder(texts) # if len(chunks) != len(embeddings): # raise ValueError(f"Mismatch! Got {len(chunks)} chunks but {len(embeddings)} embeddings.") # # Create LangChain Document list (we already have this) # documents = chunks # assuming they're already Document objects # # Build FAISS vectorstore using precomputed embeddings # # FAISS.from_embeddings() lets us pass our own embeddings + texts # vectorstore = FAISS.from_embeddings( # text_embeddings=list(zip([doc.page_content for doc in documents], embeddings)), # embedding=PrecomputedEmbeddings(embeddings[0]) # We’ll define this next # ) # # Save to disk # vectorstore.save_local(db_path) # print(f"✅ Successfully stored {len(chunks)} chunks + embeddings into local FAISS DB at '{db_path}'")