AdaptiveUIDemo / app.py
tinsaeberhane's picture
Create app.py
6ea987b verified
Raw
History Blame Contribute Delete
5.52 kB
import gradio as gr
from transformers import pipeline
import json
import time
from datetime import datetime
import os
class AdaptiveUI:
def __init__(self):
self.sentiment_model = pipeline("sentiment-analysis")
self.preferences_file = "user_preferences.json"
self.load_preferences()
def load_preferences(self):
if os.path.exists(self.preferences_file):
with open(self.preferences_file, 'r') as f:
self.preferences = json.load(f)
else:
self.preferences = {
'usage_count': 0,
'avg_text_length': 100,
'advanced_mode_uses': 0,
'last_layout': 'simple',
'common_features': set(),
'last_used': None
}
def save_preferences(self):
# Convert set to list for JSON serialization
prefs_to_save = self.preferences.copy()
prefs_to_save['common_features'] = list(self.preferences['common_features'])
with open(self.preferences_file, 'w') as f:
json.dump(prefs_to_save, f)
def should_show_advanced(self):
return self.preferences['usage_count'] > 5 or self.preferences['advanced_mode_uses'] > 2
def update_preferences(self, text_length, used_features):
self.preferences['usage_count'] += 1
self.preferences['avg_text_length'] = (
(self.preferences['avg_text_length'] * (self.preferences['usage_count'] - 1) + text_length)
/ self.preferences['usage_count']
)
if 'advanced' in used_features:
self.preferences['advanced_mode_uses'] += 1
self.preferences['common_features'].update(used_features)
self.preferences['last_used'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.save_preferences()
def analyze(self, text, show_advanced):
# Update usage patterns
self.update_preferences(len(text), {'advanced'} if show_advanced else {'basic'})
# Get sentiment analysis
result = self.sentiment_model(text)[0]
# Determine interface adaptations
adaptations = []
# Adapt based on text length
if len(text) > self.preferences['avg_text_length'] * 1.5:
adaptations.append("Expanded text area for longer inputs")
elif len(text) < self.preferences['avg_text_length'] * 0.5:
adaptations.append("Compact text area for brief inputs")
# Adapt based on usage frequency
if self.preferences['usage_count'] > 10:
adaptations.append("Advanced features unlocked")
# Adapt based on time of day
current_hour = datetime.now().hour
if current_hour >= 20 or current_hour <= 6:
adaptations.append("Night mode activated")
return {
'sentiment': result['label'],
'confidence': f"{result['score']:.2%}",
'adaptations': "\n".join(adaptations),
'show_advanced': self.should_show_advanced(),
'input_size': 'large' if self.preferences['avg_text_length'] > 150 else 'normal'
}
def create_interface():
ui = AdaptiveUI()
with gr.Blocks(theme=gr.themes.Soft()) as interface:
gr.Markdown("# Adaptive Sentiment Analysis")
# Input Section
with gr.Row():
with gr.Column(scale=2):
text_input = gr.Textbox(
label="Enter Text",
placeholder=f"Suggested length: {int(ui.preferences['avg_text_length'])} characters",
lines=4 if ui.preferences['avg_text_length'] > 150 else 2
)
show_advanced = gr.Checkbox(
label="Advanced Mode",
value=ui.should_show_advanced(),
visible=ui.preferences['usage_count'] > 5
)
analyze_btn = gr.Button("Analyze Text")
# Output Section
with gr.Column(scale=2):
sentiment_output = gr.Label(label="Sentiment")
with gr.Group(visible=False) as advanced_group:
confidence_output = gr.Label(label="Confidence")
adaptations_output = gr.Textbox(
label="Interface Adaptations",
lines=3
)
def process_text(text, show_adv):
result = ui.analyze(text, show_adv)
# Update interface based on adaptations
return {
sentiment_output: result['sentiment'],
confidence_output: result['confidence'],
adaptations_output: result['adaptations'],
advanced_group: gr.Group(visible=show_adv),
text_input: gr.Textbox(lines=4 if result['input_size'] == 'large' else 2),
show_advanced: gr.Checkbox(visible=result['show_advanced'])
}
# Event handlers
analyze_btn.click(
fn=process_text,
inputs=[text_input, show_advanced],
outputs=[
sentiment_output,
confidence_output,
adaptations_output,
advanced_group,
text_input,
show_advanced
]
)
return interface
# Launch the app
if __name__ == "__main__":
demo = create_interface()
demo.launch()