vineet124jig commited on
Commit
d1f60b0
·
verified ·
1 Parent(s): abbf824

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +55 -6
app.py CHANGED
@@ -1,17 +1,67 @@
1
  import gradio as gr
2
  import requests
3
- from PIL import Image
4
- import io
5
- import os
 
 
6
  BASE_URL = "https://api.jigsawstack.com/v1"
 
 
 
 
 
 
 
 
 
7
 
8
- headers = {"x-api-key": os.getenv("JIGSAWSTACK_API_KEY")}
 
 
 
 
 
 
 
 
 
 
9
 
 
 
 
 
 
 
 
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
  # ----------------- JigsawStack API Wrasppers ------------------
13
 
14
- def summarize(text, url, file_store_key, summary_type, max_points, max_characters):
 
 
 
 
 
 
 
15
  # Validate that at least one input method is provided
16
  if not text and not url and not file_store_key:
17
  return "Error: Please provide either text, URL, or file store key"
@@ -57,7 +107,6 @@ def summarize(text, url, file_store_key, summary_type, max_points, max_character
57
  return "Error: max_characters must be a valid number"
58
 
59
  try:
60
- print(payload)
61
  r = requests.post(f"{BASE_URL}/ai/summary", headers=headers, json=payload)
62
  r.raise_for_status()
63
  result = r.json()
 
1
  import gradio as gr
2
  import requests
3
+ import json
4
+ import os
5
+ import time
6
+ from collections import defaultdict
7
+
8
  BASE_URL = "https://api.jigsawstack.com/v1"
9
+ headers = {
10
+ "x-api-key": os.getenv("JIGSAWSTACK_API_KEY")
11
+ }
12
+
13
+
14
+ # Rate limiting configuration
15
+ request_times = defaultdict(list)
16
+ MAX_REQUESTS = 1 # Maximum requests per time window
17
+ TIME_WINDOW = 3600 # Time window in seconds (1 hour)
18
 
19
+ def get_real_ip(request: gr.Request):
20
+ """Extract real IP address using x-forwarded-for header or fallback"""
21
+ if not request:
22
+ return "unknown"
23
+
24
+ forwarded = request.headers.get("x-forwarded-for")
25
+ if forwarded:
26
+ ip = forwarded.split(",")[0].strip() # First IP in the list is the client's
27
+ else:
28
+ ip = request.client.host # fallback
29
+ return ip
30
 
31
+ def check_rate_limit(request: gr.Request):
32
+ """Check if the current request exceeds rate limits"""
33
+ if not request:
34
+ return True, "Rate limit check failed - no request info"
35
+
36
+ ip = get_real_ip(request)
37
+ now = time.time()
38
 
39
+ # Clean up old timestamps outside the time window
40
+ request_times[ip] = [t for t in request_times[ip] if now - t < TIME_WINDOW]
41
+
42
+
43
+ # Check if rate limit exceeded
44
+ if len(request_times[ip]) >= MAX_REQUESTS:
45
+ time_remaining = int(TIME_WINDOW - (now - request_times[ip][0]))
46
+ time_remaining_minutes = round(time_remaining / 60, 1)
47
+ time_window_minutes = round(TIME_WINDOW / 60, 1)
48
+
49
+ return False, f"Rate limit exceeded. You can make {MAX_REQUESTS} requests per {time_window_minutes} minutes. Try again in {time_remaining_minutes} minutes."
50
+
51
+ # Add current request timestamp
52
+ request_times[ip].append(now)
53
+ return True, ""
54
 
55
  # ----------------- JigsawStack API Wrasppers ------------------
56
 
57
+ def summarize(text, url, file_store_key, summary_type, max_points, max_characters, request: gr.Request):
58
+ """Summarize text, URL, or file store key using JigsawStack Summary API"""
59
+
60
+ # Check rate limit first
61
+ rate_limit_ok, rate_limit_msg = check_rate_limit(request)
62
+ if not rate_limit_ok:
63
+ return rate_limit_msg
64
+
65
  # Validate that at least one input method is provided
66
  if not text and not url and not file_store_key:
67
  return "Error: Please provide either text, URL, or file store key"
 
107
  return "Error: max_characters must be a valid number"
108
 
109
  try:
 
110
  r = requests.post(f"{BASE_URL}/ai/summary", headers=headers, json=payload)
111
  r.raise_for_status()
112
  result = r.json()