import os import json from google.oauth2 import service_account import streamlit as st import openai def setup_gcp_auth(): """Setup GCP authentication from HF Spaces, environment variables, or Streamlit secrets.""" try: # Option 1: HF Spaces environment variable if "GCP_CREDENTIALS" in os.environ: gcp_credentials = json.loads(os.getenv("GCP_CREDENTIALS")) print("✅ Using GCP credentials from HF Spaces environment variable") credentials = service_account.Credentials.from_service_account_info(gcp_credentials) return credentials # Option 2: Local environment variable pointing to file elif "GOOGLE_APPLICATION_CREDENTIALS" in os.environ: credentials_path = os.environ["GOOGLE_APPLICATION_CREDENTIALS"] print(f"✅ Using GCP credentials from file at {credentials_path}") credentials = service_account.Credentials.from_service_account_file(credentials_path) return credentials # Option 3: Streamlit secrets elif "gcp_credentials" in st.secrets: gcp_credentials = st.secrets["gcp_credentials"] # Handle different secret formats if isinstance(gcp_credentials, dict) or hasattr(gcp_credentials, 'to_dict'): # Convert AttrDict to dict if needed if hasattr(gcp_credentials, 'to_dict'): gcp_credentials = gcp_credentials.to_dict() print("✅ Using GCP credentials from Streamlit secrets (dict format)") credentials = service_account.Credentials.from_service_account_info(gcp_credentials) return credentials else: # Assume it's a JSON string try: gcp_credentials_dict = json.loads(gcp_credentials) print("✅ Using GCP credentials from Streamlit secrets (JSON string)") credentials = service_account.Credentials.from_service_account_info(gcp_credentials_dict) return credentials except json.JSONDecodeError: print("⚠️ GCP credentials in Streamlit secrets is not valid JSON, trying as file path") if os.path.exists(gcp_credentials): credentials = service_account.Credentials.from_service_account_file(gcp_credentials) return credentials else: raise ValueError("GCP credentials format not recognized") else: raise ValueError("No GCP credentials found in environment or Streamlit secrets") except Exception as e: error_msg = f"❌ Authentication error: {str(e)}" print(error_msg) st.error(error_msg) raise def setup_openai_auth(): """Setup OpenAI API authentication from environment variables or Streamlit secrets.""" try: # Option 1: Standard environment variable if "OPENAI_API_KEY" in os.environ: openai.api_key = os.getenv("OPENAI_API_KEY") print("✅ Using OpenAI API key from environment variable") return # Option 2: HF Spaces environment variable with different name elif "OPENAI_KEY" in os.environ: openai.api_key = os.getenv("OPENAI_KEY") print("✅ Using OpenAI API key from HF Spaces environment variable") return # Option 3: Streamlit secrets elif "openai_api_key" in st.secrets: openai.api_key = st.secrets["openai_api_key"] print("✅ Using OpenAI API key from Streamlit secrets") return else: raise ValueError("No OpenAI API key found in environment or Streamlit secrets") except Exception as e: error_msg = f"❌ OpenAI authentication error: {str(e)}" print(error_msg) st.error(error_msg) raise def setup_all_auth(): """Setup all authentication in one call""" gcp_creds = setup_gcp_auth() setup_openai_auth() return gcp_creds