jersonalvr commited on
Commit
66f4381
·
verified ·
1 Parent(s): cbd4704

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +164 -0
app.py ADDED
@@ -0,0 +1,164 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import torch
3
+ from transformers import DistilBertTokenizer, DistilBertForSequenceClassification
4
+ from huggingface_hub import hf_hub_download
5
+ import joblib
6
+ import random
7
+ import os
8
+
9
+ # Function to load the model from HuggingFace
10
+ def load_model_from_hf(model_id="jersonalvr/random"):
11
+ # Create a cache directory
12
+ cache_dir = os.path.join(os.path.expanduser("~"), ".cache", "random_number_generator")
13
+ os.makedirs(cache_dir, exist_ok=True)
14
+
15
+ # Download tokenizer
16
+ tokenizer = DistilBertTokenizer.from_pretrained(model_id, cache_dir=cache_dir)
17
+
18
+ # Download model
19
+ model = DistilBertForSequenceClassification.from_pretrained(model_id, cache_dir=cache_dir)
20
+
21
+ # Download label encoder
22
+ try:
23
+ label_encoder_path = hf_hub_download(
24
+ repo_id=model_id,
25
+ filename="label_encoder.joblib",
26
+ cache_dir=cache_dir
27
+ )
28
+ label_encoder = joblib.load(label_encoder_path)
29
+ except Exception as e:
30
+ print(f"Error downloading label encoder: {e}")
31
+ # Fallback: create a basic label encoder
32
+ from sklearn.preprocessing import LabelEncoder
33
+ label_encoder = LabelEncoder()
34
+ label_encoder.classes_ = ['generar_numero_unico', 'generar_numero_digitos', 'generar_numeros_rango', 'generar_numeros_sin_rango']
35
+
36
+ return model, tokenizer, label_encoder
37
+
38
+ # Function to predict intent
39
+ def predict_intent(prompt, model, tokenizer, label_encoder):
40
+ inputs = tokenizer(
41
+ prompt,
42
+ return_tensors="pt",
43
+ max_length=32,
44
+ truncation=True,
45
+ padding='max_length'
46
+ )
47
+
48
+ with torch.no_grad():
49
+ logits = model(**inputs).logits
50
+
51
+ pred_id = torch.argmax(logits, dim=1).item()
52
+ intent = label_encoder.inverse_transform([pred_id])[0]
53
+ return intent
54
+
55
+ # Intelligent parameter extraction
56
+ def extract_parameters(prompt):
57
+ # Basic parameter extraction logic
58
+ params = {
59
+ "count": 1,
60
+ "min": 0,
61
+ "max": 9999
62
+ }
63
+
64
+ # Look for number of numbers
65
+ if "un número" in prompt or "un numero" in prompt:
66
+ params["count"] = 1
67
+ elif any(word in prompt for word in ["2 números", "2 numeros", "dos números", "dos numeros"]):
68
+ params["count"] = 2
69
+ elif any(word in prompt for word in ["3 números", "3 numeros", "tres números", "tres numeros"]):
70
+ params["count"] = 3
71
+ elif any(word in prompt for word in ["4 números", "4 numeros", "cuatro números", "cuatro numeros"]):
72
+ params["count"] = 4
73
+ elif any(word in prompt for word in ["5 números", "5 numeros", "cinco números", "cinco numeros"]):
74
+ params["count"] = 5
75
+ elif any(word in prompt for word in ["10 números", "10 numeros", "diez números", "diez numeros"]):
76
+ params["count"] = 10
77
+
78
+ # Look for specific ranges
79
+ ranges = [
80
+ (0, 9, "un dígito", "un digito"),
81
+ (10, 99, "dos dígitos", "dos digitos"),
82
+ (100, 999, "tres dígitos", "tres digitos"),
83
+ (1000, 9999, "cuatro dígitos", "cuatro digitos"),
84
+ ]
85
+
86
+ for min_val, max_val, *range_words in ranges:
87
+ if any(word in prompt.lower() for word in range_words):
88
+ params["min"] = min_val
89
+ params["max"] = max_val
90
+ break
91
+
92
+ # Custom range extraction
93
+ import re
94
+ range_match = re.search(r'entre\s+(-?\d+)\s+y\s+(-?\d+)', prompt.lower())
95
+ if range_match:
96
+ params["min"] = int(range_match.group(1))
97
+ params["max"] = int(range_match.group(2))
98
+
99
+ return params
100
+
101
+ # Function to generate numbers
102
+ def generate_numbers(intent_params, distinct=False):
103
+ count = intent_params["count"]
104
+ min_val = intent_params["min"]
105
+ max_val = intent_params["max"]
106
+
107
+ # Handle distinct numbers case
108
+ if distinct and count <= (max_val - min_val + 1):
109
+ return random.sample(range(min_val, max_val + 1), count)
110
+ else:
111
+ return [random.randint(min_val, max_val) for _ in range(count)]
112
+
113
+ # Predefined example prompts
114
+ EXAMPLE_PROMPTS = [
115
+ "Dame un número de dos dígitos",
116
+ "Genera 3 números entre 1 y 10",
117
+ "Necesito un número aleatorio",
118
+ "Dame 5 números de tres dígitos",
119
+ "Quiero 2 números entre 100 y 200"
120
+ ]
121
+
122
+ def number_generator(prompt, distinct):
123
+ # Load model and utilities
124
+ model, tokenizer, label_encoder = load_model_from_hf()
125
+
126
+ # Predict intent
127
+ intent = predict_intent(prompt, model, tokenizer, label_encoder)
128
+
129
+ # Extract parameters intelligently
130
+ intent_params = extract_parameters(prompt)
131
+
132
+ # Generate numbers
133
+ numbers = generate_numbers(intent_params, distinct)
134
+
135
+ return {
136
+ "Prompt": prompt,
137
+ "Intent": intent,
138
+ "Parameters": intent_params,
139
+ "Generated Numbers": numbers
140
+ }
141
+
142
+ # Create Gradio interface
143
+ def create_gradio_app():
144
+ iface = gr.Interface(
145
+ fn=number_generator,
146
+ inputs=[
147
+ gr.Textbox(label="Enter your prompt"),
148
+ gr.Checkbox(label="Distinct Numbers", value=False)
149
+ ],
150
+ outputs=[
151
+ gr.JSON(label="Result"),
152
+ ],
153
+ title="Random Number Generator with Intent Classification",
154
+ description="Generate numbers based on your natural language prompt",
155
+ examples=[[prompt, False] for prompt in EXAMPLE_PROMPTS],
156
+ theme="default"
157
+ )
158
+
159
+ return iface
160
+
161
+ # Launch the app
162
+ if __name__ == "__main__":
163
+ app = create_gradio_app()
164
+ app.launch(share=True)