Spaces:
Sleeping
Sleeping
| import os | |
| import re | |
| import streamlit as st | |
| def _get(name: str, required: bool = True) -> str | None: | |
| val = os.getenv(name) | |
| if val: | |
| return val | |
| # try Streamlit secrets only if Streamlit is present | |
| try: | |
| import streamlit as st # noqa | |
| val = st.secrets.get(name) | |
| except Exception: | |
| val = None | |
| if not val and required: | |
| raise RuntimeError(f"Missing secret: {name}") | |
| return val | |
| # ββ Supabase project keys ββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| SUPABASE_URL = _get("SUPABASE_URL") | |
| SUPABASE_ANON_KEY = _get("SUPABASE_ANON_KEY") | |
| # Only use SERVICE_KEY in trusted server-side code (not browser-exposed paths) | |
| SUPABASE_SERVICE_KEY = os.getenv("SUPABASE_SERVICE_KEY") or st.secrets.get("SUPABASE_SERVICE_KEY") | |
| # ββ API keys βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| OPENAI_KEY = os.getenv("OPENAI_API_KEY") | |
| HF_KEY = os.getenv("HF_TOKEN") | |
| GNEWS_KEY = os.getenv("GNEWS_KEY") | |
| # ββ Models βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| OPENAI_CHAT_MODEL = os.getenv("OPENAI_CHAT_MODEL", "gpt-4.1-mini") | |
| OPENAI_CLASSIFIER_MODEL = os.getenv("OPENAI_CLASSIFIER_MODEL", "gpt-4.1-mini") | |
| HF_EMBEDDING_MODEL = os.getenv("HF_EMBEDDING_MODEL", "intfloat/e5-large-v2") | |
| # ββ Legacy globals (kept for backward-compat) ββββββββββββββββββββββββββββββββββ | |
| MY_SUPABASE_UUID = os.getenv("MY_SUPABASE_UUID", "18b4ef7c-8f18-4fcf-98f2-eaa6d5485a54") | |
| # ββ Username = cleaned email helpers βββββββββββββββββββββββββββββββββββββββββββ | |
| _USERNAME_SAFE_RE = re.compile(r"[^a-z0-9_-]+") | |
| def username_from_email(email: str | None) -> str: | |
| """ | |
| Build a path-safe username from an email: | |
| - take local-part (before '@'), lowercase | |
| - keep only [a-z0-9_-], replace others with '-' | |
| """ | |
| if not email: | |
| return "user" | |
| local = email.split("@", 1)[0].lower().strip() | |
| safe = _USERNAME_SAFE_RE.sub("-", local).strip("-") | |
| return safe or "user" | |
| # ββ Session β globals refresh (no external deps) βββββββββββββββββββββββββββββββ | |
| def refresh_user_context() -> None: | |
| """ | |
| Re-sync legacy globals from Streamlit session after login. | |
| """ | |
| user_id = st.session_state.get("uuid") | |
| email = st.session_state.get("email") | |
| username = st.session_state.get("username") or username_from_email(email) | |
| # ββ Public getters used across the app ββββββββββββββββββββββββββββββββββββββββ | |
| def get_uuid() -> str | None: | |
| """ | |
| Preferred source: st.session_state['uuid']. | |
| """ | |
| return st.session_state.get("uuid") | |
| def get_username() -> str | None: | |
| """ | |
| Preferred: st.session_state['username'] (email-derived). | |
| Fallbacks (in order): | |
| - derive from st.session_state['email'] | |
| """ | |
| return ( | |
| st.session_state.get("username") | |
| or username_from_email(st.session_state.get("email")) | |
| ) | |