random / app.py
jersonalvr's picture
Upload app.py
66f4381 verified
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)