Spaces:
Sleeping
Sleeping
| 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) |