CryptoSentinel_AI / app /sentiment.py
mgbam's picture
Update app/sentiment.py
061fd19 verified
raw
history blame
1.7 kB
"""
Sentiment analysis module using Hugging Face Inference API to avoid local model downloads.
"""
import os
import hashlib
import logging
from functools import lru_cache
import httpx
# Environment variables (set HF_API_TOKEN in your Space's Settings)
HF_API_TOKEN = os.getenv("HF_API_TOKEN", "")
API_URL = "https://api-inference.huggingface.co/models/distilbert-base-uncased-finetuned-sst-2-english"
HEADERS = {"Authorization": f"Bearer {HF_API_TOKEN}"}
# In-memory cache for latest sentiment
class SentimentCache:
latest_id: int = 0
latest_result: dict = {}
@classmethod
def _hash(cls, text: str) -> str:
return hashlib.sha256(text.encode()).hexdigest()
@classmethod
@lru_cache(maxsize=128)
def _analyze(cls, text: str):
try:
response = httpx.post(API_URL, headers=HEADERS, json={"inputs": text}, timeout=20)
response.raise_for_status()
data = response.json()
# Expecting list of {label, score}
if isinstance(data, list) and data:
return data[0]
raise ValueError("Unexpected response format: %s" % data)
except Exception as e:
logging.error("❌ Sentiment API error: %s", e)
return {"label": "ERROR", "score": 0.0}
@classmethod
def compute(cls, text: str):
"""Trigger sentiment inference via API and update latest result."""
res = cls._analyze(text)
cls.latest_id += 1
cls.latest_result = {
"text": text,
"label": res.get("label"),
"score": round(res.get("score", 0.0), 4)
}
logging.info("βœ… Sentiment computed: %s", cls.latest_result)