Rbeachg93's picture
Upload folder using huggingface_hub
af61338 verified
import gradio as gr
import json
import os
from datetime import datetime
import requests
from huggingface_hub import HfApi, login
from pathlib import Path
# Configuration management class
class ConfigManager:
def __init__(self, config_file="config.json"):
self.config_file = config_file
self.default_config = {
"app_name": "Gradio Configurator",
"theme": "soft",
"primary_color": "blue",
"font_size": "medium",
"show_header": True,
"show_footer": True,
"max_items": 10,
"api_enabled": False,
"last_updated": str(datetime.now()),
"ai_model": "TheBloke/SauerkrautLM-Mixtral-8x7B-Instruct-GGUF",
"ai_enabled": True,
"temperature": 0.7,
"max_tokens": 512
}
self.load_config()
def load_config(self):
"""Load configuration from file or use defaults"""
try:
if os.path.exists(self.config_file):
with open(self.config_file, 'r') as f:
self.config = json.load(f)
else:
self.config = self.default_config.copy()
self.save_config()
except Exception as e:
print(f"Error loading config: {e}")
self.config = self.default_config.copy()
def save_config(self):
"""Save current configuration to file"""
try:
with open(self.config_file, 'w') as f:
json.dump(self.config, f, indent=2)
return True
except Exception as e:
print(f"Error saving config: {e}")
return False
def update_config(self, **kwargs):
"""Update configuration with new values"""
for key, value in kwargs.items():
if key in self.config:
self.config[key] = value
self.config["last_updated"] = str(datetime.now())
return self.save_config()
def get_config(self):
"""Get current configuration"""
return self.config
def reset_config(self):
"""Reset to default configuration"""
self.config = self.default_config.copy()
return self.save_config()
# Initialize config manager
config_manager = ConfigManager()
def update_configuration(
app_name,
theme,
primary_color,
font_size,
show_header,
show_footer,
max_items,
api_enabled,
ai_enabled,
temperature,
max_tokens
):
"""Update and save configuration"""
success = config_manager.update_config(
app_name=app_name,
theme=theme,
primary_color=primary_color,
font_size=font_size,
show_header=show_header,
show_footer=show_footer,
max_items=max_items,
api_enabled=api_enabled,
ai_enabled=ai_enabled,
temperature=temperature,
max_tokens=max_tokens
)
if success:
current_config = config_manager.get_config()
return (
f"Configuration updated successfully!\nLast updated: {current_config['last_updated']}",
json.dumps(current_config, indent=2)
)
else:
return "Failed to update configuration", ""
def reset_configuration():
"""Reset to default configuration"""
success = config_manager.reset_config()
if success:
current_config = config_manager.get_config()
return (
f"Configuration reset to defaults!\nLast updated: {current_config['last_updated']}",
json.dumps(current_config, indent=2)
)
else:
return "Failed to reset configuration", ""
def load_current_config():
"""Load and display current configuration"""
current_config = config_manager.get_config()
return json.dumps(current_config, indent=2)
def get_model_info():
"""Get information about the SauerkrautLM model"""
model_id = "TheBloke/SauerkrautLM-Mixtral-8x7B-Instruct-GGUF"
try:
api = HfApi()
model_info = api.model_info(model_id)
info_text = f"""
## 🤖 SauerkrautLM-Mixtral-8x7B-Instruct-GGUF
**Model ID:** {model_id}
**Author:** {model_info.author}
**Last Modified:** {model_info.lastModified}
**Downloads:** {model_info.downloads}
### Model Description:
{SauerkrautLM-Mixtral-8x7B-Instruct is a high-quality Mistral-7B model fine-tuned on a large amount of data, with a focus on German and English language, as well as code. It comes with an instruct fine-tune on top of the base model, and supports a context length of 32,768 tokens.}
### Key Features:
- ✅ German & English language support
- ✅ Code generation capabilities
- ✅ 32,768 token context length
- ✅ High-quality instruction following
- ✅ GGUF format for efficient inference
"""
return info_text
except Exception as e:
return f"Could not fetch model info: {str(e)}"
def ai_assistant(prompt, chat_history):
"""AI assistant powered by SauerkrautLM"""
config = config_manager.get_config()
if not config.get("ai_enabled", True):
return "AI is disabled in configuration."
try:
# In a real implementation, this would call the actual model API
# For demo purposes, we'll simulate a response
system_message = """You are a helpful AI assistant specialized in configuration management.
You help users understand and configure their Gradio applications.
Be concise and provide clear, actionable advice."""
# Simulated AI response (replace with actual API call)
response = f"""
Here's my analysis and recommendation for your configuration:
**Your Request:** {prompt}
**Recommendation:**
Based on the SauerkrautLM-Mixtral-8x7B-Instruct model's capabilities, I suggest:
1. For theme selection: The '{config.get('theme', 'soft')}' theme is a good choice for most applications
2. Consider adjusting your primary color to match your brand identity
3. The current font size ('{config.get('font_size', 'medium')}') should work well for most users
**Configuration Tips:**
- Enable API access if you need programmatic control
- Adjust max_items based on your expected user load
- The AI model supports both German and English, so you can configure in either language
Would you like me to suggest specific configuration values?
"""
return response
except Exception as e:
return f"AI Assistant Error: {str(e)}"
# Create custom theme based on configuration
def create_theme():
"""Create theme based on current configuration"""
config = config_manager.get_config()
theme_map = {
"soft": gr.themes.Soft,
"glass": gr.themes.Glass,
"monochrome": gr.themes.Monochrome,
"base": gr.themes.Base
}
base_theme = theme_map.get(config["theme"].lower(), gr.themes.Soft)
return base_theme(
primary_hue=config["primary_color"],
text_size="lg" if config["font_size"] == "large" else "md",
spacing_size="lg" if config["font_size"] == "large" else "md"
)
# Custom CSS for better styling
custom_css = """
.gradio-container {
max-width: 1200px !important;
}
.config-section {
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 16px;
margin-bottom: 16px;
}
.config-title {
font-size: 1.2rem;
font-weight: 600;
margin-bottom: 12px;
color: var(--primary-600);
}
.status-success {
color: #10b981;
font-weight: 500;
}
.status-error {
color: #ef4444;
font-weight: 500;
}
.json-output {
font-family: 'Courier New', monospace;
background-color: #f3f4f6;
padding: 12px;
border-radius: 4px;
max-height: 400px;
overflow-y: auto;
}
.ai-section {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 20px;
border-radius: 12px;
margin: 20px 0;
}
.model-card {
background: white;
color: #374151;
padding: 16px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
"""
# Create the Gradio interface
with gr.Blocks() as demo:
# Header with "Built with anycoder" link
gr.Markdown("""
# 🚀 AI-Powered Configuration Manager
**Built with [anycoder](https://huggingface.co/spaces/akhaliq/anycoder)**
""")
gr.Markdown("Configure your application settings with AI assistance from SauerkrautLM-Mixtral-8x7B-Instruct-GGUF")
with gr.Tabs():
# AI Assistant Tab
with gr.Tab("🤖 AI Assistant"):
gr.Markdown("## AI Configuration Assistant")
gr.Markdown("Get intelligent recommendations for your configuration using SauerkrautLM")
with gr.Row():
with gr.Column(scale=2):
ai_prompt = gr.Textbox(
label="Ask the AI Assistant",
placeholder="Ask about configuration best practices, theme selection, or any other questions...",
lines=3
)
ai_submit = gr.Button("Get AI Recommendation", variant="primary")
ai_response = gr.Markdown("AI response will appear here...")
with gr.Column(scale=1):
with gr.Accordion("AI Settings", open=True):
ai_enabled = gr.Checkbox(
label="Enable AI Assistant",
value=config_manager.get_config()["ai_enabled"],
info="Toggle AI-powered recommendations"
)
temperature = gr.Slider(
minimum=0.1,
maximum=1.0,
value=config_manager.get_config()["temperature"],
step=0.1,
label="AI Temperature",
info="Higher values make output more random"
)
max_tokens = gr.Slider(
minimum=64,
maximum=1024,
value=config_manager.get_config()["max_tokens"],
step=64,
label="Max Tokens",
info="Maximum response length"
)
# Model Information
with gr.Column(elem_classes="model-card"):
model_info = gr.Markdown(get_model_info())
# Configuration Tab
with gr.Tab("⚙️ Configuration"):
with gr.Column(elem_classes="config-section"):
gr.Markdown("## Application Settings", elem_classes="config-title")
with gr.Row():
with gr.Column():
app_name = gr.Textbox(
label="Application Name",
value=config_manager.get_config()["app_name"],
placeholder="Enter application name"
)
theme_select = gr.Dropdown(
choices=["Soft", "Glass", "Monochrome", "Base"],
label="Theme",
value=config_manager.get_config()["theme"],
info="Select the visual theme"
)
primary_color = gr.Dropdown(
choices=["blue", "red", "green", "purple", "orange", "pink"],
label="Primary Color",
value=config_manager.get_config()["primary_color"],
info="Main accent color"
)
with gr.Column():
font_size = gr.Radio(
choices=["small", "medium", "large"],
label="Font Size",
value=config_manager.get_config()["font_size"],
info="Base font size"
)
show_header = gr.Checkbox(
label="Show Header",
value=config_manager.get_config()["show_header"],
info="Display header section"
)
show_footer = gr.Checkbox(
label="Show Footer",
value=config_manager.get_config()["show_footer"],
info="Display footer section"
)
max_items = gr.Slider(
minimum=1,
maximum=50,
value=config_manager.get_config()["max_items"],
step=1,
label="Max Items",
info="Maximum number of items to display"
)
api_enabled = gr.Checkbox(
label="Enable API",
value=config_manager.get_config()["api_enabled"],
info="Enable API endpoints"
)
with gr.Row():
update_btn = gr.Button("Update Configuration", variant="primary")
reset_btn = gr.Button("Reset to Defaults", variant="secondary")
status_output = gr.Markdown("Ready to configure", elem_classes="status-success")
with gr.Column(elem_classes="config-section"):
gr.Markdown("## Current Configuration", elem_classes="config-title")
config_json = gr.JSON(
value=config_manager.get_config(),
label="Configuration JSON",
elem_classes="json-output"
)
refresh_btn = gr.Button("Refresh Configuration", variant="stop")
# Preview Tab
with gr.Tab("👁️ Preview"):
gr.Markdown("## Configuration Preview")
gr.Markdown("This shows how your configuration affects the application appearance.")
with gr.Row():
with gr.Column():
gr.Markdown("### Sample Components")
sample_text = gr.Textbox(label="Text Input", placeholder="Sample text input")
sample_slider = gr.Slider(0, 100, value=50, label="Sample Slider")
sample_button = gr.Button("Sample Button", variant="primary")
gr.Markdown("### Configuration Info")
preview_info = gr.Markdown(f"""
**Current Theme:** {config_manager.get_config()['theme']}
**Primary Color:** {config_manager.get_config()['primary_color']}
**Font Size:** {config_manager.get_config()['font_size']}
**Last Updated:** {config_manager.get_config()['last_updated']}
""")
with gr.Column():
gr.Markdown("### Theme Preview")
theme_preview = gr.Markdown("""
This section shows how different components look with your selected theme.
The colors, spacing, and typography are all controlled by your configuration.
""")
with gr.Accordion("Theme Details", open=False):
gr.Markdown(f"""
- **Theme Type:** {config_manager.get_config()['theme']}
- **Primary Hue:** {config_manager.get_config()['primary_color']}
- **Text Size:** {config_manager.get_config()['font_size']}
- **Spacing:** Medium
- **Radius:** Medium
""")
# Advanced Tab
with gr.Tab("🔧 Advanced"):
gr.Markdown("## Advanced Configuration")
with gr.Column(elem_classes="config-section"):
gr.Markdown("### Export/Import Configuration", elem_classes="config-title")
with gr.Row():
export_btn = gr.Button("Export Configuration", variant="primary")
import_btn = gr.Button("Import Configuration", variant="secondary")
export_output = gr.File(label="Download Configuration File")
import_input = gr.File(label="Upload Configuration File", file_types=[".json"])
import_status = gr.Markdown("Ready to import", elem_classes="status-success")
# Event listeners
update_btn.click(
fn=update_configuration,
inputs=[
app_name,
theme_select,
primary_color,
font_size,
show_header,
show_footer,
max_items,
api_enabled,
ai_enabled,
temperature,
max_tokens
],
outputs=[status_output, config_json],
api_visibility="public"
)
reset_btn.click(
fn=reset_configuration,
inputs=None,
outputs=[status_output, config_json],
api_visibility="public"
)
refresh_btn.click(
fn=load_current_config,
inputs=None,
outputs=config_json,
api_visibility="public"
)
ai_submit.click(
fn=ai_assistant,
inputs=[ai_prompt],
outputs=ai_response,
api_visibility="public"
)
def export_config():
config = config_manager.get_config()
config_file = "config_export.json"
with open(config_file, 'w') as f:
json.dump(config, f, indent=2)
return config_file
export_btn.click(
fn=export_config,
inputs=None,
outputs=export_output,
api_visibility="public"
)
def import_config_file(file):
try:
if file is not None:
with open(file.name, 'r') as f:
new_config = json.load(f)
# Validate and update config
for key, value in new_config.items():
if key in config_manager.default_config:
config_manager.config[key] = value
config_manager.save_config()
return f"Configuration imported successfully from {file.name}"
except Exception as e:
return f"Error importing configuration: {str(e)}"
import_btn.click(
fn=import_config_file,
inputs=import_input,
outputs=import_status,
api_visibility="public"
)
# Launch the application with custom theme
demo.launch(
theme=create_theme(),
css=custom_css,
footer_links=[
{"label": "Built with anycoder", "url": "https://huggingface.co/spaces/akhaliq/anycoder"},
{"label": "SauerkrautLM Model", "url": "https://huggingface.co/TheBloke/SauerkrautLM-Mixtral-8x7B-Instruct-GGUF"},
{"label": "Gradio Docs", "url": "https://www.gradio.app/docs"},
{"label": "GitHub", "url": "https://github.com/gradio-app/gradio"}
],
show_error=True,
title="AI Configuration Manager"
)