import gradio as gr import requests import json import os import faiss import numpy as np from sentence_transformers import SentenceTransformer # Load files index = faiss.read_index("faiss_index.bin") with open("texts.json", "r") as f: texts = json.load(f) # Embedding model model = SentenceTransformer("all-MiniLM-L6-v2") # API key API_KEY = os.environ.get("OPENROUTER_API_KEY") MODEL = "deepseek/deepseek-chat-v3-0324:free" # Function: Get relevant chunks def get_relevant_context(query, k=5): query_vector = model.encode([query]) scores, indices = index.search(np.array(query_vector), k) return [texts[i] for i in indices[0] if i < len(texts)] # Chatbot logic def chat_with_data(message, history): greetings = ["hi", "hello", "hey", "salam", "assalamualaikum"] message_lower = message.lower().strip() if any(greet in message_lower for greet in greetings): return "👋 Hello! How can I assist you regarding LogiqCurve today?" context = get_relevant_context(message) if not context or all(len(c.strip()) < 10 for c in context): return "❌ Sorry, I can only answer questions based on content from LogiqCurve.com." context_text = "\n".join(context) prompt = ( f"You are a helpful assistant for LogiqCurve.\n" f"ONLY use the context below to answer the user. Do not use any outside knowledge.\n\n" f"Context:\n{context_text}\n\n" f"User question: {message}\n\n" f"Answer strictly using the context above." ) messages = [ {"role": "system", "content": "You are a strict assistant who only answers using provided context."}, {"role": "user", "content": prompt} ] headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } payload = { "model": MODEL, "messages": messages } try: res = requests.post("https://openrouter.ai/api/v1/chat/completions", headers=headers, json=payload) res.raise_for_status() reply = res.json()["choices"][0]["message"]["content"] except Exception as e: reply = f"❌ Error: {e}" return reply # UI gr.ChatInterface( fn=chat_with_data, title="MK Private Assistant", description="Ask me about LogiqCurve services. I respond only using website data.", theme="soft" ).launch()