import gradio as gr from models import generate_image, MODEL_ID from config import APPLE_TENCENT_THEME from typing import Optional, Union from huggingface_hub import whoami def verify_pro_status(token: Optional[Union[gr.OAuthToken, str]]) -> bool: """Verifies if the user is a Hugging Face PRO user or part of an enterprise org.""" if not token: return False if isinstance(token, gr.OAuthToken): token_str = token.token elif isinstance(token, str): token_str = token else: return False try: user_info = whoami(token=token_str) return ( user_info.get("isPro", False) or any(org.get("isEnterprise", False) for org in user_info.get("orgs", [])) ) except Exception as e: print(f"Could not verify user's PRO/Enterprise status: {e}") return False def generate_image_with_pro_check(prompt: str, profile: Optional[gr.OAuthProfile] = None, oauth_token: Optional[gr.OAuthToken] = None): """ Wrapper function that checks if user is PRO before generating image. """ if profile is None: raise gr.Error("Please Sign in with Hugging Face to use this app") # Check if user has PRO status if not verify_pro_status(oauth_token): raise gr.Error( "This app is exclusively for Hugging Face PRO subscribers. " "Please upgrade at https://huggingface.co/subscribe/pro to access this feature." ) # User is PRO, proceed with image generation return generate_image(prompt) def create_ui(): with gr.Blocks(title=f"Tencent HunyuanImage-3.0 Demo", theme=APPLE_TENCENT_THEME) as demo: gr.HTML( f"
" f"

Tencent {MODEL_ID.split('/')[-1]}

" f"

Generate images using Tencent's state-of-the-art model hosted by FAL AI.

" f"

⚠️ This app is exclusively for Hugging Face PRO subscribers.

" f"

🚀 Subscribe to PRO

" f"Built with anycoder" f"
" ) # Add login button - required for OAuth gr.LoginButton() # PRO status message area pro_message = gr.Markdown(visible=False) main_interface = gr.Column(visible=False) with main_interface: with gr.Row(): with gr.Column(scale=1): prompt_input = gr.Textbox( label="Prompt", placeholder="e.g., A detailed watercolor painting of a small red fox sleeping on a pile of autumn leaves.", lines=4 ) generate_btn = gr.Button("🎨 Generate Image", variant="primary") with gr.Column(scale=1): output_image = gr.Image( label="Generated Image", height=512, width=512, interactive=False, show_download_button=True ) # Set up the event listener - note the function now takes OAuthProfile and OAuthToken generate_btn.click( fn=generate_image_with_pro_check, inputs=[prompt_input], outputs=[output_image], queue=False, api_name=False, show_api=False, ) # Example usage guidance with queue features disabled gr.Examples( examples=[ "A detailed watercolor painting of a small red fox sleeping on a pile of autumn leaves.", "A futuristic city skyline at sunset with flying cars", "A mystical forest with glowing mushrooms and fireflies", "An astronaut riding a horse on Mars", ], inputs=prompt_input, outputs=output_image, fn=generate_image_with_pro_check, cache_examples=False, api_name=False, show_api=False, ) gr.Markdown("

Thank you for being a PRO subscriber! 🤗

") # Control access based on PRO status def control_access(profile: Optional[gr.OAuthProfile] = None, oauth_token: Optional[gr.OAuthToken] = None): if not profile: return ( gr.update(visible=False), # main_interface gr.update(visible=True, value=( "## 👋 Welcome!\n\n" "Please **Sign in with Hugging Face** using the button above to continue." )) # pro_message ) if verify_pro_status(oauth_token): return ( gr.update(visible=True), # main_interface gr.update(visible=False) # pro_message ) else: message = ( "## ✨ Exclusive Access for PRO Users\n\n" "Thank you for your interest! This app is available exclusively for our Hugging Face **PRO** members.\n\n" "With PRO, you'll get:\n" "- Access to exclusive Spaces like this one\n" "- Increased GPU quotas\n" "- Early access to new features\n" "- Priority support\n\n" "### [**Become a PRO Today!**](https://huggingface.co/subscribe/pro)\n\n" "*Already a PRO member? Try logging out and back in if you're having issues.*" ) return ( gr.update(visible=False), # main_interface gr.update(visible=True, value=message) # pro_message ) # Load event to check access on page load demo.load(control_access, inputs=None, outputs=[main_interface, pro_message]) return demo if __name__ == "__main__": app = create_ui() # Launch without special auth parameters # OAuth is enabled via Space metadata (hf_oauth: true in README.md) app.launch( show_api=False, enable_monitoring=False, quiet=True, )