File size: 2,435 Bytes
a7eb20d
d411917
a7eb20d
 
 
 
345d10b
d411917
 
 
 
 
a814516
d411917
 
 
 
 
 
 
a7eb20d
 
1fe6e3b
d411917
a7eb20d
20d5756
 
981d40d
a7eb20d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20d5756
a7eb20d
981d40d
 
20d5756
a702cfd
981d40d
 
a702cfd
981d40d
 
aad84fe
20d5756
 
e827c31
a7eb20d
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
64
65
66
import os
import shutil
from fastapi import FastAPI, Request
from sentence_transformers import SentenceTransformer, util
import torch
import requests

# πŸ” Paksa semua cache ke path aman di Hugging Face Spaces
HF_CACHE = "/tmp/hf"
os.environ["TRANSFORMERS_CACHE"] = HF_CACHE
os.environ["HF_HOME"] = HF_CACHE
os.makedirs(HF_CACHE, exist_ok=True)

# βœ… Bersihkan cache jika terkunci
if os.path.exists(f"{HF_CACHE}/models--sentence-transformers--paraphrase-MiniLM-L3-v2.lock"):
    os.remove(f"{HF_CACHE}/models--sentence-transformers--paraphrase-MiniLM-L3-v2.lock")
if os.path.exists(f"{HF_CACHE}/models--sentence-transformers--paraphrase-MiniLM-L3-v2"):
    shutil.rmtree(f"{HF_CACHE}/models--sentence-transformers--paraphrase-MiniLM-L3-v2", ignore_errors=True)

# πŸ” Supabase
SUPABASE_URL = "https://olbjfxlclotxtnpjvpfj.supabase.co"
SUPABASE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im9sYmpmeGxjbG90eHRucGp2cGZqIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTIyMzYwMDEsImV4cCI6MjA2NzgxMjAwMX0.7q_o5DCFEAAysnWXMChH4MI5qNhIVc4OgpT5JvgYxc0"

# πŸ”„ Gunakan model kecil dan cepat
model = SentenceTransformer("sentence-transformers/paraphrase-MiniLM-L3-v2")

app = FastAPI()

def get_faq_from_supabase(uid):
    url = f"{SUPABASE_URL}/rest/v1/faq_texts?uid=eq.{uid}"
    headers = {
        "apikey": SUPABASE_KEY,
        "Authorization": f"Bearer {SUPABASE_KEY}",
        "Content-Type": "application/json"
    }
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        data = r.json()
        return [{"q": d["question"], "a": d["answer"]} for d in data]
    except Exception as e:
        print("❌ Supabase error:", e)
        return []

@app.post("/predict")
async def predict(request: Request):
    body = await request.json()
    uid, question = body.get("data", [None, None])
    
    if not uid or not question:
        return {"data": ["UID atau pertanyaan tidak valid."]}
    
    faqs = get_faq_from_supabase(uid)
    if not faqs:
        return {"data": ["FAQ tidak ditemukan untuk UID ini."]}

    questions = [f["q"] for f in faqs]
    answers = [f["a"] for f in faqs]

    embeddings = model.encode(questions, convert_to_tensor=True)
    query_embedding = model.encode(question, convert_to_tensor=True)

    similarity = util.pytorch_cos_sim(query_embedding, embeddings)
    best_idx = torch.argmax(similarity).item()

    return {"data": [answers[best_idx]]}