# === Imports === import os import time import requests from dotenv import load_dotenv from supabase import create_client from sentence_transformers import SentenceTransformer from openai import OpenAI # === Load Environment Variables === load_dotenv() # === Supabase Configuration === SUPABASE_URL = "https://lmpazoxzucnlqqxjoihi.supabase.co" SUPABASE_KEY = os.getenv("SUPABASE_API_KEY") if not SUPABASE_KEY: raise ValueError("SUPABASE_KEY is not set in the environment variables.") supabase = create_client(SUPABASE_URL, SUPABASE_KEY) # === Embedding Model for Scoring === embedding_model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2") # === Hugging Face API Configuration === HF_API_TOKEN = os.getenv("HF_API_TOKEN") if not HF_API_TOKEN: raise ValueError("Missing Hugging Face API key. Check your .env file.") HF_HEADERS = {"Authorization": f"Bearer {HF_API_TOKEN}"} # === Hugging Face Model Endpoints === HF_MODELS = { "pegasus": "https://router.huggingface.co/hf-inference/models/google/pegasus-xsum", "gemma": "tgi" # Used as the model name with OpenAI-compatible client } # === OpenAI-Compatible Client (for Gemma) === client = OpenAI( base_url="https://vzwjawyxvu030jsw.us-east-1.aws.endpoints.huggingface.cloud/v1/", api_key=HF_API_TOKEN, ) # === Optional: General Query Helper (for non-chat models like pegasus) === def query(payload, model="pegasus", retries=5, delay=5): """ Sends a request to the Hugging Face API with retries and error handling. """ if model not in HF_MODELS: raise ValueError(f"Invalid model name: {model}. Available: {list(HF_MODELS.keys())}") api_url = HF_MODELS[model] for attempt in range(retries): try: response = requests.post(api_url, headers=HF_HEADERS, json=payload, timeout=10) if response.status_code == 401: print("❌ Unauthorized (401). Check HF_API_TOKEN.") return None if response.status_code == 402: print("💰 Payment Required (402). Free tier may not support this model.") return None if response.status_code in [500, 503]: print(f"⚠️ Server error ({response.status_code}) on attempt {attempt + 1}. Retrying in {delay}s...") time.sleep(delay) continue response.raise_for_status() return response.json() except requests.exceptions.Timeout: print(f"⏳ Timeout on attempt {attempt + 1}. Retrying in {delay}s...") time.sleep(delay) except requests.exceptions.RequestException as e: print(f"❌ Request failed: {e}") time.sleep(delay) print("🚨 All retry attempts failed.") return None