import gradio as gr import torch from transformers import DistilBertTokenizer, DistilBertForSequenceClassification from huggingface_hub import hf_hub_download import joblib import random import os # Function to load the model from HuggingFace def load_model_from_hf(model_id="jersonalvr/random"): # Create a cache directory cache_dir = os.path.join(os.path.expanduser("~"), ".cache", "random_number_generator") os.makedirs(cache_dir, exist_ok=True) # Download tokenizer tokenizer = DistilBertTokenizer.from_pretrained(model_id, cache_dir=cache_dir) # Download model model = DistilBertForSequenceClassification.from_pretrained(model_id, cache_dir=cache_dir) # Download label encoder try: label_encoder_path = hf_hub_download( repo_id=model_id, filename="label_encoder.joblib", cache_dir=cache_dir ) label_encoder = joblib.load(label_encoder_path) except Exception as e: print(f"Error downloading label encoder: {e}") # Fallback: create a basic label encoder from sklearn.preprocessing import LabelEncoder label_encoder = LabelEncoder() label_encoder.classes_ = ['generar_numero_unico', 'generar_numero_digitos', 'generar_numeros_rango', 'generar_numeros_sin_rango'] return model, tokenizer, label_encoder # Function to predict intent def predict_intent(prompt, model, tokenizer, label_encoder): inputs = tokenizer( prompt, return_tensors="pt", max_length=32, truncation=True, padding='max_length' ) with torch.no_grad(): logits = model(**inputs).logits pred_id = torch.argmax(logits, dim=1).item() intent = label_encoder.inverse_transform([pred_id])[0] return intent # Intelligent parameter extraction def extract_parameters(prompt): # Basic parameter extraction logic params = { "count": 1, "min": 0, "max": 9999 } # Look for number of numbers if "un número" in prompt or "un numero" in prompt: params["count"] = 1 elif any(word in prompt for word in ["2 números", "2 numeros", "dos números", "dos numeros"]): params["count"] = 2 elif any(word in prompt for word in ["3 números", "3 numeros", "tres números", "tres numeros"]): params["count"] = 3 elif any(word in prompt for word in ["4 números", "4 numeros", "cuatro números", "cuatro numeros"]): params["count"] = 4 elif any(word in prompt for word in ["5 números", "5 numeros", "cinco números", "cinco numeros"]): params["count"] = 5 elif any(word in prompt for word in ["10 números", "10 numeros", "diez números", "diez numeros"]): params["count"] = 10 # Look for specific ranges ranges = [ (0, 9, "un dígito", "un digito"), (10, 99, "dos dígitos", "dos digitos"), (100, 999, "tres dígitos", "tres digitos"), (1000, 9999, "cuatro dígitos", "cuatro digitos"), ] for min_val, max_val, *range_words in ranges: if any(word in prompt.lower() for word in range_words): params["min"] = min_val params["max"] = max_val break # Custom range extraction import re range_match = re.search(r'entre\s+(-?\d+)\s+y\s+(-?\d+)', prompt.lower()) if range_match: params["min"] = int(range_match.group(1)) params["max"] = int(range_match.group(2)) return params # Function to generate numbers def generate_numbers(intent_params, distinct=False): count = intent_params["count"] min_val = intent_params["min"] max_val = intent_params["max"] # Handle distinct numbers case if distinct and count <= (max_val - min_val + 1): return random.sample(range(min_val, max_val + 1), count) else: return [random.randint(min_val, max_val) for _ in range(count)] # Predefined example prompts EXAMPLE_PROMPTS = [ "Dame un número de dos dígitos", "Genera 3 números entre 1 y 10", "Necesito un número aleatorio", "Dame 5 números de tres dígitos", "Quiero 2 números entre 100 y 200" ] def number_generator(prompt, distinct): # Load model and utilities model, tokenizer, label_encoder = load_model_from_hf() # Predict intent intent = predict_intent(prompt, model, tokenizer, label_encoder) # Extract parameters intelligently intent_params = extract_parameters(prompt) # Generate numbers numbers = generate_numbers(intent_params, distinct) return { "Prompt": prompt, "Intent": intent, "Parameters": intent_params, "Generated Numbers": numbers } # Create Gradio interface def create_gradio_app(): iface = gr.Interface( fn=number_generator, inputs=[ gr.Textbox(label="Enter your prompt"), gr.Checkbox(label="Distinct Numbers", value=False) ], outputs=[ gr.JSON(label="Result"), ], title="Random Number Generator with Intent Classification", description="Generate numbers based on your natural language prompt", examples=[[prompt, False] for prompt in EXAMPLE_PROMPTS], theme="default" ) return iface # Launch the app if __name__ == "__main__": app = create_gradio_app() app.launch(share=True)