Update app.py
Browse files
app.py
CHANGED
|
@@ -50,7 +50,7 @@ class UserCreate(BaseModel):
|
|
| 50 |
class APIResponse(BaseModel):
|
| 51 |
success: bool
|
| 52 |
data: Any = None
|
| 53 |
-
error: str = None
|
| 54 |
timestamp: datetime = datetime.now()
|
| 55 |
|
| 56 |
# ----------------- Enhanced Logger -----------------
|
|
@@ -324,14 +324,20 @@ class GemmaSaaSService:
|
|
| 324 |
|
| 325 |
return APIResponse(
|
| 326 |
success=success,
|
| 327 |
-
data={"api_key": api_key} if success else None,
|
| 328 |
error=message if not success else None
|
| 329 |
)
|
| 330 |
except ValidationError as e:
|
| 331 |
-
return APIResponse(
|
|
|
|
|
|
|
|
|
|
| 332 |
except Exception as e:
|
| 333 |
logger.error(f"Service error creating user: {e}")
|
| 334 |
-
return APIResponse(
|
|
|
|
|
|
|
|
|
|
| 335 |
|
| 336 |
async def generate_text(self, prompt: str, api_key: str, **kwargs) -> APIResponse:
|
| 337 |
"""Generate text with authentication and rate limiting"""
|
|
@@ -339,11 +345,17 @@ class GemmaSaaSService:
|
|
| 339 |
# Validate API key
|
| 340 |
user = await self.db.validate_api_key(api_key)
|
| 341 |
if not user:
|
| 342 |
-
return APIResponse(
|
|
|
|
|
|
|
|
|
|
| 343 |
|
| 344 |
# Check rate limit
|
| 345 |
if not await self.db.check_rate_limit(user['id']):
|
| 346 |
-
return APIResponse(
|
|
|
|
|
|
|
|
|
|
| 347 |
|
| 348 |
# Generate text
|
| 349 |
request = GenerationRequest(prompt=prompt, **kwargs)
|
|
@@ -362,18 +374,27 @@ class GemmaSaaSService:
|
|
| 362 |
}
|
| 363 |
)
|
| 364 |
else:
|
| 365 |
-
return APIResponse(
|
|
|
|
|
|
|
|
|
|
| 366 |
|
| 367 |
except Exception as e:
|
| 368 |
logger.error(f"Service error generating text: {e}")
|
| 369 |
-
return APIResponse(
|
|
|
|
|
|
|
|
|
|
| 370 |
|
| 371 |
async def get_user_stats(self, api_key: str) -> APIResponse:
|
| 372 |
"""Get user statistics"""
|
| 373 |
try:
|
| 374 |
user = await self.db.validate_api_key(api_key)
|
| 375 |
if not user:
|
| 376 |
-
return APIResponse(
|
|
|
|
|
|
|
|
|
|
| 377 |
|
| 378 |
stats = {
|
| 379 |
"name": user.get('name'),
|
|
@@ -391,7 +412,10 @@ class GemmaSaaSService:
|
|
| 391 |
|
| 392 |
except Exception as e:
|
| 393 |
logger.error(f"Error getting user stats: {e}")
|
| 394 |
-
return APIResponse(
|
|
|
|
|
|
|
|
|
|
| 395 |
|
| 396 |
# ----------------- Enhanced UI -----------------
|
| 397 |
class GradioInterface:
|
|
@@ -803,6 +827,20 @@ class GradioInterface:
|
|
| 803 |
return response.error, {}, False
|
| 804 |
|
| 805 |
async def handle_user_creation(name, email, plan):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 806 |
response = await self.service.create_user(name, email, plan)
|
| 807 |
|
| 808 |
if response.success:
|
|
|
|
| 50 |
class APIResponse(BaseModel):
|
| 51 |
success: bool
|
| 52 |
data: Any = None
|
| 53 |
+
error: Optional[str] = None
|
| 54 |
timestamp: datetime = datetime.now()
|
| 55 |
|
| 56 |
# ----------------- Enhanced Logger -----------------
|
|
|
|
| 324 |
|
| 325 |
return APIResponse(
|
| 326 |
success=success,
|
| 327 |
+
data={"api_key": api_key, "message": message} if success else None,
|
| 328 |
error=message if not success else None
|
| 329 |
)
|
| 330 |
except ValidationError as e:
|
| 331 |
+
return APIResponse(
|
| 332 |
+
success=False,
|
| 333 |
+
error=f"Validation error: {str(e)}"
|
| 334 |
+
)
|
| 335 |
except Exception as e:
|
| 336 |
logger.error(f"Service error creating user: {e}")
|
| 337 |
+
return APIResponse(
|
| 338 |
+
success=False,
|
| 339 |
+
error="Internal service error"
|
| 340 |
+
)
|
| 341 |
|
| 342 |
async def generate_text(self, prompt: str, api_key: str, **kwargs) -> APIResponse:
|
| 343 |
"""Generate text with authentication and rate limiting"""
|
|
|
|
| 345 |
# Validate API key
|
| 346 |
user = await self.db.validate_api_key(api_key)
|
| 347 |
if not user:
|
| 348 |
+
return APIResponse(
|
| 349 |
+
success=False,
|
| 350 |
+
error="⚠️ Invalid API key"
|
| 351 |
+
)
|
| 352 |
|
| 353 |
# Check rate limit
|
| 354 |
if not await self.db.check_rate_limit(user['id']):
|
| 355 |
+
return APIResponse(
|
| 356 |
+
success=False,
|
| 357 |
+
error="⚠️ Rate limit exceeded. Try again later."
|
| 358 |
+
)
|
| 359 |
|
| 360 |
# Generate text
|
| 361 |
request = GenerationRequest(prompt=prompt, **kwargs)
|
|
|
|
| 374 |
}
|
| 375 |
)
|
| 376 |
else:
|
| 377 |
+
return APIResponse(
|
| 378 |
+
success=False,
|
| 379 |
+
error=text
|
| 380 |
+
)
|
| 381 |
|
| 382 |
except Exception as e:
|
| 383 |
logger.error(f"Service error generating text: {e}")
|
| 384 |
+
return APIResponse(
|
| 385 |
+
success=False,
|
| 386 |
+
error="Internal service error"
|
| 387 |
+
)
|
| 388 |
|
| 389 |
async def get_user_stats(self, api_key: str) -> APIResponse:
|
| 390 |
"""Get user statistics"""
|
| 391 |
try:
|
| 392 |
user = await self.db.validate_api_key(api_key)
|
| 393 |
if not user:
|
| 394 |
+
return APIResponse(
|
| 395 |
+
success=False,
|
| 396 |
+
error="Invalid API key"
|
| 397 |
+
)
|
| 398 |
|
| 399 |
stats = {
|
| 400 |
"name": user.get('name'),
|
|
|
|
| 412 |
|
| 413 |
except Exception as e:
|
| 414 |
logger.error(f"Error getting user stats: {e}")
|
| 415 |
+
return APIResponse(
|
| 416 |
+
success=False,
|
| 417 |
+
error="Error retrieving stats"
|
| 418 |
+
)
|
| 419 |
|
| 420 |
# ----------------- Enhanced UI -----------------
|
| 421 |
class GradioInterface:
|
|
|
|
| 827 |
return response.error, {}, False
|
| 828 |
|
| 829 |
async def handle_user_creation(name, email, plan):
|
| 830 |
+
if not name or not name.strip():
|
| 831 |
+
return (
|
| 832 |
+
f'<div class="alert-error">❌ Name is required</div>',
|
| 833 |
+
"",
|
| 834 |
+
False
|
| 835 |
+
)
|
| 836 |
+
|
| 837 |
+
if not email or not email.strip():
|
| 838 |
+
return (
|
| 839 |
+
f'<div class="alert-error">❌ Email is required</div>',
|
| 840 |
+
"",
|
| 841 |
+
False
|
| 842 |
+
)
|
| 843 |
+
|
| 844 |
response = await self.service.create_user(name, email, plan)
|
| 845 |
|
| 846 |
if response.success:
|