File size: 1,710 Bytes
e370f3a
d1406e8
51ce63b
d1406e8
 
270b445
efbfb8b
bb68426
ad421bc
270b445
51ce63b
 
270b445
 
efbfb8b
e370f3a
ad421bc
51ce63b
ad421bc
 
270b445
 
a4b560c
bb68426
ad421bc
e370f3a
 
 
 
 
0527279
ad421bc
 
0527279
ad421bc
0527279
 
ad421bc
e370f3a
 
 
 
efa5f27
51ce63b
bb68426
a4b560c
51ce63b
 
 
a4b560c
270b445
e370f3a
51ce63b
e370f3a
 
ad421bc
e370f3a
ad421bc
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import gradio as gr
import requests
import os
import faiss
import numpy as np
import json
from sentence_transformers import SentenceTransformer

# βœ… Load context data
with open("texts.json", "r", encoding="utf-8") as f:
    texts = json.load(f)

index = faiss.read_index("faiss_index.bin")
embed_model = SentenceTransformer("all-MiniLM-L6-v2")

API_KEY = os.environ.get("OPENROUTER_API_KEY")
MODEL = "qwen/qwen-2.5-coder-32b-instruct:free"

# βœ… RAG context retriever
def get_context(query, top_k=5):
    query_vec = embed_model.encode([query])
    D, I = index.search(np.array(query_vec), top_k)
    return "\n".join([texts[i] for i in I[0]])

# βœ… Chat handler
def chat_fn(message, history):
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }

    context = get_context(message)

    messages = [
        {"role": "system", "content": f"You are a helpful assistant. ONLY use the context below to answer:\n\n{context}"}
    ]

    for user, assistant in history:
        messages.append({"role": "user", "content": user})
        messages.append({"role": "assistant", "content": assistant})

    messages.append({"role": "user", "content": message})

    payload = {
        "model": MODEL,
        "messages": messages
    }

    try:
        response = requests.post("https://openrouter.ai/api/v1/chat/completions", headers=headers, json=payload)
        response.raise_for_status()
        reply = response.json()["choices"][0]["message"]["content"]
    except Exception as e:
        reply = f"❌ Error: {e}"

    return reply

# βœ… Launch chatbot without title or description
gr.ChatInterface(
    fn=chat_fn,
    theme="soft"
).launch()