sonyps1928 commited on
Commit
b4a4c25
Β·
1 Parent(s): 8511f5e

update app

Browse files
Files changed (2) hide show
  1. app.py +81 -155
  2. requirements.txt +4 -4
app.py CHANGED
@@ -1,205 +1,131 @@
1
  import gradio as gr
2
  import os
3
- import time
4
- from collections import defaultdict
5
  from transformers import GPT2LMHeadModel, GPT2Tokenizer
6
  import torch
7
 
8
- # Load secrets from environment
 
 
9
  HF_TOKEN = os.getenv("HF_TOKEN")
10
- API_KEY = os.getenv("API_KEY")
11
  ADMIN_PASSWORD = os.getenv("ADMIN_PASSWORD")
12
 
13
- print("πŸ” Security Status:")
14
- print(f" HF_TOKEN: {'βœ… Set' if HF_TOKEN else '❌ Not set'}")
15
- print(f" API_KEY: {'βœ… Set' if API_KEY else '❌ Not set'}")
16
- print(f" ADMIN_PASSWORD: {'βœ… Set' if ADMIN_PASSWORD else '❌ Not set'}")
17
-
18
- # Simple rate limiting
19
- request_counts = defaultdict(list)
20
-
21
- # Load model
22
- model_name = "gpt2"
23
- print("πŸ“¦ Loading model...")
24
 
 
 
25
  try:
26
- if HF_TOKEN:
27
- tokenizer = GPT2Tokenizer.from_pretrained(model_name, token=HF_TOKEN)
28
- model = GPT2LMHeadModel.from_pretrained(model_name, token=HF_TOKEN)
29
- print("βœ… Model loaded with HF token")
30
- else:
31
- tokenizer = GPT2Tokenizer.from_pretrained(model_name)
32
- model = GPT2LMHeadModel.from_pretrained(model_name)
33
- print("βœ… Model loaded without token")
34
-
35
  tokenizer.pad_token = tokenizer.eos_token
36
- print("βœ… Model ready!")
37
-
38
  except Exception as e:
39
- print(f"❌ Model loading failed: {e}")
40
- raise
41
 
42
- def check_api_key(provided_key):
43
- """Simple API key validation with rate limiting"""
44
- if not API_KEY:
45
- return True, "Public access"
46
-
47
- if not provided_key or provided_key != API_KEY:
48
- return False, "Invalid or missing API key"
49
-
50
- # Simple rate limiting (100 requests per hour)
51
- now = time.time()
52
- hour_ago = now - 3600
53
-
54
- # Clean old requests
55
- request_counts[provided_key] = [
56
- t for t in request_counts[provided_key] if t > hour_ago
57
- ]
58
-
59
- if len(request_counts[provided_key]) >= 100:
60
- return False, "Rate limit exceeded (100/hour)"
61
-
62
- request_counts[provided_key].append(now)
63
- return True, f"Authenticated ({len(request_counts[provided_key])}/100)"
64
-
65
- def generate_text(prompt, max_length, temperature, top_p, top_k, api_key):
66
- """Generate text with GPT-2"""
67
-
68
- # API key check
69
- valid, msg = check_api_key(api_key)
70
- if not valid:
71
- return f"πŸ”’ Error: {msg}"
72
-
73
- # Input validation
74
- if not prompt.strip():
75
- return "❌ Please enter a prompt"
76
 
77
- if len(prompt) > 1000:
78
- return "❌ Prompt too long (max 1000 chars)"
79
 
80
  try:
81
- print(f"πŸ”‘ {msg}")
82
- print(f"πŸ“ Generating: {prompt[:50]}...")
83
 
84
- # Encode input
85
- inputs = tokenizer.encode(
86
- prompt,
87
- return_tensors="pt",
88
- max_length=400,
89
- truncation=True
90
- )
91
 
92
- # Generate
93
  with torch.no_grad():
94
  outputs = model.generate(
95
  inputs,
96
- max_length=min(inputs.shape[1] + max_length, 500),
97
- temperature=max(0.1, min(2.0, temperature)),
98
- top_p=max(0.1, min(1.0, top_p)),
99
- top_k=max(1, min(100, top_k)),
100
  do_sample=True,
101
  pad_token_id=tokenizer.eos_token_id,
102
- num_return_sequences=1,
103
  no_repeat_ngram_size=2
104
  )
105
 
106
- # Decode result
107
- generated = tokenizer.decode(outputs[0], skip_special_tokens=True)
108
- result = generated[len(prompt):].strip()
109
 
110
- print(f"βœ… Generated {len(result)} characters")
111
- return result if result else "❌ No text generated"
 
 
 
112
 
113
  except Exception as e:
114
- error = f"❌ Generation failed: {str(e)}"
115
- print(error)
116
- return error
117
 
118
- # Create simple interface - NO COMPLEX THEMES OR CSS
119
- demo = gr.Blocks(title="GPT-2 Text Generator")
120
 
121
- with demo:
122
- # Simple header
123
- gr.Markdown("# πŸ€– GPT-2 Text Generator")
124
-
125
- # Security info
126
- if API_KEY:
127
- gr.Markdown("πŸ”’ **API Authentication Required**")
128
- else:
129
- gr.Markdown("πŸ”“ **Public Access Mode**")
130
 
131
  with gr.Row():
132
  with gr.Column():
133
- # Input section
134
- prompt = gr.Textbox(
135
- label="Prompt",
136
- placeholder="Enter your text prompt...",
137
  lines=3
138
  )
139
 
140
- # API key input (only if needed)
141
- if API_KEY:
142
- api_key = gr.Textbox(
143
- label="API Key",
144
- type="password",
145
- placeholder="Enter API key..."
146
- )
147
- else:
148
- api_key = gr.Textbox(value="", visible=False)
149
-
150
- # Parameters
151
- max_length = gr.Slider(
152
- 10, 200, 100,
153
- label="Max Length"
154
- )
155
- temperature = gr.Slider(
156
- 0.1, 2.0, 0.7,
157
- label="Temperature"
158
  )
159
- top_p = gr.Slider(
160
- 0.1, 1.0, 0.9,
161
- label="Top-p"
162
- )
163
- top_k = gr.Slider(
164
- 1, 100, 50,
165
- label="Top-k"
166
  )
167
 
168
- # Generate button
169
- generate_btn = gr.Button("Generate", variant="primary")
170
 
171
  with gr.Column():
172
- # Output
173
- output = gr.Textbox(
174
  label="Generated Text",
175
- lines=10,
176
  placeholder="Generated text will appear here..."
177
  )
178
 
179
- # Examples
180
- gr.Examples([
181
- ["Once upon a time"],
182
- ["The future of AI is"],
183
- ["In a world where technology"],
184
- ], inputs=prompt)
 
 
 
185
 
186
- # Connect function
187
- generate_btn.click(
188
- generate_text,
189
- inputs=[prompt, max_length, temperature, top_p, top_k, api_key],
190
- outputs=output
191
  )
192
 
193
- # Simple launch - MINIMAL CONFIGURATION
 
 
194
  if __name__ == "__main__":
195
- auth = ("admin", ADMIN_PASSWORD) if ADMIN_PASSWORD else None
196
-
197
- if auth:
198
- print("πŸ” Admin auth enabled")
199
-
200
- print("πŸš€ Starting server...")
201
-
202
- # MINIMAL launch config that works on HF Spaces
203
- demo.launch(auth=auth)
204
-
205
- print("βœ… Server running!")
 
1
  import gradio as gr
2
  import os
 
 
3
  from transformers import GPT2LMHeadModel, GPT2Tokenizer
4
  import torch
5
 
6
+ print("πŸš€ Starting GPT-2 Text Generator...")
7
+
8
+ # Load environment variables
9
  HF_TOKEN = os.getenv("HF_TOKEN")
10
+ API_KEY = os.getenv("API_KEY")
11
  ADMIN_PASSWORD = os.getenv("ADMIN_PASSWORD")
12
 
13
+ print(f"HF_TOKEN: {'Set' if HF_TOKEN else 'Not set'}")
14
+ print(f"API_KEY: {'Set' if API_KEY else 'Not set'}")
15
+ print(f"ADMIN_PASSWORD: {'Set' if ADMIN_PASSWORD else 'Not set'}")
 
 
 
 
 
 
 
 
16
 
17
+ # Load model and tokenizer
18
+ print("Loading GPT-2 model...")
19
  try:
20
+ tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
21
+ model = GPT2LMHeadModel.from_pretrained("gpt2")
 
 
 
 
 
 
 
22
  tokenizer.pad_token = tokenizer.eos_token
23
+ print("βœ… Model loaded successfully!")
 
24
  except Exception as e:
25
+ print(f"❌ Error loading model: {e}")
26
+ raise e
27
 
28
+ def generate_text(prompt, max_length=100, temperature=0.7):
29
+ """Simple text generation function"""
30
+ if not prompt:
31
+ return "Please enter a prompt"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
 
33
+ if len(prompt) > 500:
34
+ return "Prompt too long (max 500 characters)"
35
 
36
  try:
37
+ print(f"Generating text for: {prompt[:30]}...")
 
38
 
39
+ # Encode the prompt
40
+ inputs = tokenizer.encode(prompt, return_tensors="pt", max_length=300, truncation=True)
 
 
 
 
 
41
 
42
+ # Generate text
43
  with torch.no_grad():
44
  outputs = model.generate(
45
  inputs,
46
+ max_length=inputs.shape[1] + max_length,
47
+ temperature=temperature,
 
 
48
  do_sample=True,
49
  pad_token_id=tokenizer.eos_token_id,
50
+ eos_token_id=tokenizer.eos_token_id,
51
  no_repeat_ngram_size=2
52
  )
53
 
54
+ # Decode the output
55
+ generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
 
56
 
57
+ # Extract only the new text (remove the original prompt)
58
+ new_text = generated_text[len(prompt):].strip()
59
+
60
+ print(f"βœ… Generated {len(new_text)} characters")
61
+ return new_text if new_text else "No text generated. Try a different prompt."
62
 
63
  except Exception as e:
64
+ error_msg = f"Error generating text: {str(e)}"
65
+ print(f"❌ {error_msg}")
66
+ return error_msg
67
 
68
+ # Create the Gradio interface
69
+ print("Creating Gradio interface...")
70
 
71
+ with gr.Blocks() as demo:
72
+ gr.Markdown("# GPT-2 Text Generator")
73
+ gr.Markdown("Enter a prompt and click generate to create text using GPT-2")
 
 
 
 
 
 
74
 
75
  with gr.Row():
76
  with gr.Column():
77
+ prompt_input = gr.Textbox(
78
+ label="Enter your prompt",
79
+ placeholder="Type your text here...",
 
80
  lines=3
81
  )
82
 
83
+ max_length_slider = gr.Slider(
84
+ minimum=20,
85
+ maximum=200,
86
+ value=100,
87
+ step=10,
88
+ label="Max length of generated text"
 
 
 
 
 
 
 
 
 
 
 
 
89
  )
90
+
91
+ temperature_slider = gr.Slider(
92
+ minimum=0.1,
93
+ maximum=1.5,
94
+ value=0.7,
95
+ step=0.1,
96
+ label="Temperature (creativity)"
97
  )
98
 
99
+ generate_button = gr.Button("Generate Text", variant="primary")
 
100
 
101
  with gr.Column():
102
+ output_text = gr.Textbox(
 
103
  label="Generated Text",
104
+ lines=8,
105
  placeholder="Generated text will appear here..."
106
  )
107
 
108
+ # Add some example prompts
109
+ gr.Examples(
110
+ examples=[
111
+ "Once upon a time",
112
+ "The future of technology is",
113
+ "In a world where",
114
+ ],
115
+ inputs=prompt_input
116
+ )
117
 
118
+ # Connect the generate function
119
+ generate_button.click(
120
+ fn=generate_text,
121
+ inputs=[prompt_input, max_length_slider, temperature_slider],
122
+ outputs=output_text
123
  )
124
 
125
+ # Launch the app
126
+ print("Launching Gradio app...")
127
+
128
  if __name__ == "__main__":
129
+ demo.launch()
130
+
131
+ print("βœ… App is running!")
 
 
 
 
 
 
 
 
requirements.txt CHANGED
@@ -1,4 +1,4 @@
1
- gradio
2
- transformers
3
- torch
4
- tokenizers
 
1
+ gradio==4.44.0
2
+ transformers==4.44.2
3
+ torch==2.4.1
4
+ tokenizers==0.19.1