import os import requests import gradio as gr from datetime import datetime # API Configuration API_KEY = os.getenv('StableCogKey') API_HOST = 'https://api.stablecog.com' headers = { 'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application/json' } # Global state for pagination current_outputs = [] current_page = 0 page_size = 10 def get_models(): """Fetch and display available models""" try: url = f'{API_HOST}/v1/image/generation/models' response = requests.get(url, headers=headers, timeout=10) if response.status_code == 200: data = response.json() models = data.get('models', []) # Format display display_text = f"📊 Found {len(models)} models\n" display_text += f"⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n" for i, model in enumerate(models, 1): name = model.get('name', 'Unknown') model_type = model.get('type', 'unknown') description = model.get('description', 'No description') display_text += f"{i}. 🔹 **{name}**\n" display_text += f" 📝 {description}\n" display_text += f" 🏷️ Type: {model_type}\n" display_text += f" 🌍 Public: {'✅' if model.get('is_public') else '❌'}\n" display_text += f" ⭐ Default: {'✅' if model.get('is_default') else '❌'}\n" display_text += f" 👥 Community: {'✅' if model.get('is_community') else '❌'}\n" display_text += "─" * 40 + "\n" return display_text, str(data) else: return f"❌ Error {response.status_code}", f"Error: {response.text}" except Exception as e: return f"❌ Error: {str(e)}", "No data" def fetch_outputs(): """Fetch outputs from API""" global current_outputs try: url = f'{API_HOST}/v1/image/generation/outputs' response = requests.get(url, headers=headers, timeout=10) if response.status_code == 200: data = response.json() current_outputs = data.get('outputs', []) return data else: return None except: return None def update_outputs_display(): """Update outputs display with current page""" global current_outputs, current_page, page_size if not current_outputs: return "📭 No outputs found. Generate some images first!", "
No images found
", "[]" total = len(current_outputs) total_pages = (total + page_size - 1) // page_size # Ceiling division # Calculate page bounds start_idx = current_page * page_size end_idx = min(start_idx + page_size, total) page_outputs = current_outputs[start_idx:end_idx] # Format display display_text = f"📊 Total outputs: {total}\n" display_text += f"📄 Page {current_page + 1} of {total_pages}\n" display_text += f"🖼️ Showing {start_idx + 1}-{end_idx} of {total}\n" display_text += f"⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n" # Create gallery HTML with lightbox gallery_html = """ " # Add pagination controls gallery_html += f""" """ return display_text, gallery_html, str(current_outputs) def load_outputs(): """Load outputs from API and display first page""" global current_page current_page = 0 data = fetch_outputs() if data: return update_outputs_display() else: return "❌ Failed to load outputs", "
Failed to load outputs
", "[]" def next_page(): """Go to next page""" global current_page if current_outputs: total_pages = (len(current_outputs) + page_size - 1) // page_size if current_page < total_pages - 1: current_page += 1 return update_outputs_display() def prev_page(): """Go to previous page""" global current_page if current_page > 0: current_page -= 1 return update_outputs_display() # Create Gradio interface with gr.Blocks(title="StableCog Dashboard") as demo: gr.Markdown("# 🎯 StableCog Dashboard") with gr.Tabs(): with gr.Tab("🤖 Models"): with gr.Row(): models_display = gr.Textbox(label="Available Models", lines=25) models_raw = gr.Code(label="Raw JSON", language="json", lines=25) check_models_btn = gr.Button("🔄 Refresh Models", variant="primary") check_models_btn.click(get_models, outputs=[models_display, models_raw]) with gr.Tab("🖼️ Outputs"): with gr.Row(): with gr.Column(scale=1): outputs_display = gr.Textbox(label="Output Details", lines=25) with gr.Column(scale=2): outputs_gallery = gr.HTML(label="Image Gallery") with gr.Row(): outputs_raw = gr.Code(label="Raw JSON", language="json", lines=15) with gr.Row(): load_outputs_btn = gr.Button("🔄 Load Outputs", variant="primary") prev_page_btn = gr.Button("◀ Previous Page") next_page_btn = gr.Button("Next Page ▶") # JavaScript for pagination js = """ """ gr.HTML(js) # Connect buttons load_outputs_btn.click( load_outputs, outputs=[outputs_display, outputs_gallery, outputs_raw] ) prev_page_btn.click( prev_page, outputs=[outputs_display, outputs_gallery, outputs_raw] ) next_page_btn.click( next_page, outputs=[outputs_display, outputs_gallery, outputs_raw] ) if __name__ == "__main__": demo.launch()