|
import os
|
|
import json
|
|
import requests
|
|
from typing import Dict, Optional, List, Any
|
|
|
|
class HuggingFaceSpaceHelper:
|
|
"""Helper utilities for integrating with Hugging Face Spaces"""
|
|
|
|
def __init__(self):
|
|
self.hf_token = os.getenv("HF_TOKEN")
|
|
self.space_name = os.getenv("HF_SPACE_NAME")
|
|
self.is_in_space = self._is_huggingface_space()
|
|
|
|
def _is_huggingface_space(self) -> bool:
|
|
"""Check if code is running in a Hugging Face Space"""
|
|
return os.path.exists("/opt/conda/bin/python") and os.getenv("SPACE_ID") is not None
|
|
|
|
def get_space_url(self) -> str:
|
|
"""Get the URL for the current HF space"""
|
|
if not self.space_name:
|
|
return "Not running in a named HF Space"
|
|
return f"https://huggingface.co/spaces/{self.space_name}"
|
|
|
|
def get_gradio_url(self) -> str:
|
|
"""Get the Gradio URL for the Space"""
|
|
if not self.space_name:
|
|
return ""
|
|
return f"https://{self.space_name}.hf.space"
|
|
|
|
def get_hostname(self) -> str:
|
|
"""Get the appropriate hostname for services in HF Spaces"""
|
|
if self.is_in_space:
|
|
|
|
return "localhost"
|
|
return "0.0.0.0"
|
|
|
|
def get_port_mapping(self) -> Dict[int, int]:
|
|
"""Get mappings for ports in HF spaces vs local environment"""
|
|
|
|
return {
|
|
7860: 7860,
|
|
8000: 8000,
|
|
8001: 8001,
|
|
|
|
}
|
|
|
|
def get_hf_metadata(self) -> Dict[str, Any]:
|
|
"""Get metadata about the HF Space environment"""
|
|
metadata = {
|
|
"is_huggingface_space": self.is_in_space,
|
|
"space_name": self.space_name,
|
|
"space_url": self.get_space_url(),
|
|
"gradio_url": self.get_gradio_url(),
|
|
}
|
|
|
|
|
|
if self.is_in_space:
|
|
metadata.update({
|
|
"space_id": os.getenv("SPACE_ID"),
|
|
"space_runtime": os.getenv("SPACE_RUNTIME"),
|
|
"container_hostname": os.getenv("HOSTNAME"),
|
|
"python_path": os.getenv("PYTHONPATH"),
|
|
})
|
|
|
|
return metadata
|
|
|
|
def get_env_file_path(self) -> str:
|
|
"""Get appropriate .env file path based on environment"""
|
|
if self.is_in_space:
|
|
return "/app/.env"
|
|
return ".env"
|
|
|
|
def get_mongodb_uri(self) -> Optional[str]:
|
|
"""Get the MongoDB URI, potentially customized for HF Space environment"""
|
|
|
|
mongo_uri = os.getenv("MONGODB_URI")
|
|
|
|
|
|
if not mongo_uri and self.is_in_space:
|
|
try:
|
|
|
|
from huggingface_hub import get_space_runtime
|
|
runtime = get_space_runtime()
|
|
mongo_uri = runtime.get_secret("MONGODB_URI")
|
|
except:
|
|
pass
|
|
|
|
return mongo_uri
|
|
|
|
def install_dependencies(self, packages: List[str]):
|
|
"""Install Python packages if needed (useful for HF Spaces)"""
|
|
if not self.is_in_space:
|
|
return
|
|
|
|
import subprocess
|
|
try:
|
|
subprocess.check_call(["pip", "install", "--no-cache-dir"] + packages)
|
|
print(f"Successfully installed: {', '.join(packages)}")
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"Failed to install packages: {e}")
|
|
|
|
if __name__ == "__main__":
|
|
hf_helper = HuggingFaceSpaceHelper()
|
|
print(json.dumps(hf_helper.get_hf_metadata(), indent=2))
|
|
print(f"MongoDB URI: {hf_helper.get_mongodb_uri() or 'Not configured'}")
|
|
print(f"Environment file path: {hf_helper.get_env_file_path()}")
|
|
|