bahi-bh commited on
Commit
25d2f7e
Β·
verified Β·
1 Parent(s): a0f406c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +141 -85
app.py CHANGED
@@ -1,6 +1,10 @@
1
  #!/usr/bin/env python3
2
  # -*- coding: utf-8 -*-
3
 
 
 
 
 
4
  import time
5
  import random
6
  import traceback
@@ -8,16 +12,24 @@ import logging
8
 
9
  from fastapi import FastAPI, HTTPException, Request
10
  from fastapi.middleware.cors import CORSMiddleware
 
11
  from pydantic import BaseModel
12
- import uvicorn
13
 
14
- from g4f.client import Client
15
 
16
  # =====================================================
17
- # IMPORT SAFE PROVIDERS ONLY
18
  # =====================================================
19
 
20
- import g4f.Provider as Provider
 
 
 
 
 
 
 
 
21
 
22
  # =====================================================
23
  # CONFIG
@@ -25,9 +37,10 @@ import g4f.Provider as Provider
25
 
26
  API_KEY = "sk-your-secret-key"
27
 
28
- MODEL = "gpt-4o-mini"
 
 
29
 
30
- MAX_RETRIES = 10
31
  TIMEOUT = 60
32
 
33
  # =====================================================
@@ -47,7 +60,7 @@ logger = logging.getLogger("smart-g4f")
47
 
48
  app = FastAPI(
49
  title="Smart G4F Gateway",
50
- version="2.0"
51
  )
52
 
53
  # =====================================================
@@ -63,14 +76,51 @@ app.add_middleware(
63
  )
64
 
65
  # =====================================================
66
- # API KEY AUTH
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  # =====================================================
68
 
69
  def verify_api_key(req: Request):
70
 
71
- # =========================================
72
  # Authorization: Bearer
73
- # =========================================
74
 
75
  auth = req.headers.get("Authorization")
76
 
@@ -81,60 +131,27 @@ def verify_api_key(req: Request):
81
  if token == API_KEY:
82
  return True
83
 
84
- # =========================================
85
  # x-api-key
86
- # =========================================
87
 
88
  x_api_key = req.headers.get("x-api-key")
89
 
90
  if x_api_key and x_api_key.strip() == API_KEY:
91
  return True
92
 
93
- # =========================================
94
- # FAILED
95
- # =========================================
96
-
97
  raise HTTPException(
98
  status_code=403,
99
  detail="Invalid API Key"
100
  )
101
 
102
  # =====================================================
103
- # SAFE PROVIDERS
104
  # =====================================================
105
 
106
- SAFE_PROVIDERS = []
107
-
108
- PREFERRED = [
109
- ("Blackbox", "blackboxai"),
110
- ("Free2GPT", "gpt-4o-mini"),
111
- ("DuckDuckGo", "gpt-4o-mini"),
112
- ]
113
-
114
- for provider_name, provider_model in PREFERRED:
115
-
116
- try:
117
-
118
- provider = getattr(Provider, provider_name)
119
-
120
- SAFE_PROVIDERS.append({
121
- "provider": provider,
122
- "model": provider_model
123
- })
124
-
125
- except Exception as e:
126
-
127
- logger.warning(f"Provider load failed: {provider_name} -> {e}")
128
-
129
- random.shuffle(SAFE_PROVIDERS)
130
-
131
- logger.info(f"[+] SAFE PROVIDERS: {len(SAFE_PROVIDERS)}")
132
 
133
- # =====================================================
134
- # CLIENT
135
- # =====================================================
136
 
137
- client = Client()
138
 
139
  # =====================================================
140
  # SMART G4F
@@ -180,7 +197,7 @@ class SmartG4F:
180
 
181
  # =================================================
182
 
183
- def ask(self, prompt):
184
 
185
  last_error = None
186
 
@@ -192,16 +209,17 @@ class SmartG4F:
192
  break
193
 
194
  provider = item["provider"]
195
- model = item["model"]
 
196
 
197
  try:
198
 
199
  logger.info(
200
- f"[+] Trying provider={provider.__name__} model={model}"
201
  )
202
 
203
  response = client.chat.completions.create(
204
- model=model,
205
  provider=provider,
206
  messages=[
207
  {
@@ -215,14 +233,17 @@ class SmartG4F:
215
  text = None
216
 
217
  try:
 
218
  text = response.choices[0].message.content
219
- except:
 
 
220
  text = str(response)
221
 
222
  if text and text.strip():
223
 
224
  logger.info(
225
- f"[+] Success provider={provider.__name__}"
226
  )
227
 
228
  return {
@@ -236,7 +257,7 @@ class SmartG4F:
236
  last_error = str(e)
237
 
238
  logger.warning(
239
- f"[-] Failed provider={provider.__name__} error={e}"
240
  )
241
 
242
  self.mark_bad(provider)
@@ -249,14 +270,6 @@ class SmartG4F:
249
 
250
  smart = SmartG4F()
251
 
252
- # =====================================================
253
- # REQUEST MODEL
254
- # =====================================================
255
-
256
- class ChatRequest(BaseModel):
257
-
258
- prompt: str
259
-
260
  # =====================================================
261
  # ROOT
262
  # =====================================================
@@ -268,9 +281,9 @@ async def root():
268
  return {
269
  "status": "online",
270
  "service": "Smart G4F Gateway",
271
- "version": "2.0",
272
  "providers": len(SAFE_PROVIDERS),
273
- "auth": [
274
  "Authorization: Bearer",
275
  "x-api-key"
276
  ]
@@ -297,21 +310,34 @@ async def health():
297
 
298
  async def models():
299
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
300
  return {
301
  "object": "list",
302
- "data": [
303
- {
304
- "id": item["model"],
305
- "object": "model",
306
- "owned_by": item["provider"].__name__,
307
- "created": int(time.time())
308
- }
309
- for item in SAFE_PROVIDERS
310
- ]
311
  }
312
 
313
  # =====================================================
314
- # CHAT
315
  # =====================================================
316
 
317
  @app.post("/chat")
@@ -320,9 +346,21 @@ async def chat(req: Request, body: ChatRequest):
320
 
321
  verify_api_key(req)
322
 
 
 
 
 
 
 
 
 
 
323
  try:
324
 
325
- result = smart.ask(body.prompt)
 
 
 
326
 
327
  return {
328
  "success": True,
@@ -341,7 +379,7 @@ async def chat(req: Request, body: ChatRequest):
341
  )
342
 
343
  # =====================================================
344
- # OPENAI STYLE ENDPOINT
345
  # =====================================================
346
 
347
  @app.post("/v1/chat/completions")
@@ -350,11 +388,23 @@ async def openai_chat(req: Request, body: ChatRequest):
350
 
351
  verify_api_key(req)
352
 
 
 
 
 
 
 
 
 
 
353
  try:
354
 
355
- result = smart.ask(body.prompt)
 
 
 
356
 
357
- return {
358
  "id": f"chatcmpl-{random.randint(100000,999999)}",
359
  "object": "chat.completion",
360
  "created": int(time.time()),
@@ -368,8 +418,13 @@ async def openai_chat(req: Request, body: ChatRequest):
368
  },
369
  "finish_reason": "stop"
370
  }
371
- ]
372
- }
 
 
 
 
 
373
 
374
  except Exception as e:
375
 
@@ -457,7 +512,7 @@ button {{
457
 
458
  <body>
459
 
460
- <h2>πŸ€– Smart G4F Gateway</h2>
461
 
462
  <div id="chat"></div>
463
 
@@ -506,7 +561,8 @@ async function send() {{
506
  }},
507
 
508
  body: JSON.stringify({{
509
- prompt: text
 
510
  }})
511
  }});
512
 
@@ -538,14 +594,14 @@ if __name__ == "__main__":
538
  print("""
539
 
540
  ╔══════════════════════════════════════╗
541
- β•‘ SMART G4F GATEWAY β•‘
542
  ╠══════════════════════════════════════╣
543
- β•‘ VERSION : 2.0 β•‘
544
  β•‘ AUTH : ENABLED β•‘
545
- β•‘ MODEL : gpt-4o-mini β•‘
546
  β•‘ TEST UI : /test β•‘
547
  β•‘ CHAT : /chat β•‘
548
  β•‘ OPENAI : /v1/chat/completions β•‘
 
549
  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
550
 
551
  """)
 
1
  #!/usr/bin/env python3
2
  # -*- coding: utf-8 -*-
3
 
4
+ # =====================================================
5
+ # SMART G4F GATEWAY v3.0
6
+ # =====================================================
7
+
8
  import time
9
  import random
10
  import traceback
 
12
 
13
  from fastapi import FastAPI, HTTPException, Request
14
  from fastapi.middleware.cors import CORSMiddleware
15
+ from fastapi.responses import JSONResponse
16
  from pydantic import BaseModel
 
17
 
18
+ import uvicorn
19
 
20
  # =====================================================
21
+ # SAFE IMPORTS
22
  # =====================================================
23
 
24
+ try:
25
+
26
+ from g4f.client import Client
27
+ import g4f.Provider as Provider
28
+
29
+ except Exception as e:
30
+
31
+ print(f"[FATAL] G4F IMPORT ERROR: {e}")
32
+ raise e
33
 
34
  # =====================================================
35
  # CONFIG
 
37
 
38
  API_KEY = "sk-your-secret-key"
39
 
40
+ DEFAULT_MODEL = "gpt-4o-mini"
41
+
42
+ MAX_RETRIES = 5
43
 
 
44
  TIMEOUT = 60
45
 
46
  # =====================================================
 
60
 
61
  app = FastAPI(
62
  title="Smart G4F Gateway",
63
+ version="3.0"
64
  )
65
 
66
  # =====================================================
 
76
  )
77
 
78
  # =====================================================
79
+ # PROVIDERS
80
+ # =====================================================
81
+
82
+ SAFE_PROVIDERS = []
83
+
84
+ PROVIDERS = [
85
+ ("Blackbox", "blackboxai"),
86
+ ("Free2GPT", "gpt-4o-mini"),
87
+ ("DuckDuckGo", "gpt-4o-mini"),
88
+ ]
89
+
90
+ for provider_name, model_name in PROVIDERS:
91
+
92
+ try:
93
+
94
+ provider = getattr(Provider, provider_name)
95
+
96
+ SAFE_PROVIDERS.append({
97
+ "provider": provider,
98
+ "model": model_name
99
+ })
100
+
101
+ logger.info(f"[+] Loaded provider: {provider_name}")
102
+
103
+ except Exception as e:
104
+
105
+ logger.warning(f"[-] Failed provider {provider_name}: {e}")
106
+
107
+ random.shuffle(SAFE_PROVIDERS)
108
+
109
+ logger.info(f"[+] TOTAL SAFE PROVIDERS: {len(SAFE_PROVIDERS)}")
110
+
111
+ # =====================================================
112
+ # CLIENT
113
+ # =====================================================
114
+
115
+ client = Client()
116
+
117
+ # =====================================================
118
+ # AUTH
119
  # =====================================================
120
 
121
  def verify_api_key(req: Request):
122
 
 
123
  # Authorization: Bearer
 
124
 
125
  auth = req.headers.get("Authorization")
126
 
 
131
  if token == API_KEY:
132
  return True
133
 
 
134
  # x-api-key
 
135
 
136
  x_api_key = req.headers.get("x-api-key")
137
 
138
  if x_api_key and x_api_key.strip() == API_KEY:
139
  return True
140
 
 
 
 
 
141
  raise HTTPException(
142
  status_code=403,
143
  detail="Invalid API Key"
144
  )
145
 
146
  # =====================================================
147
+ # REQUEST MODEL
148
  # =====================================================
149
 
150
+ class ChatRequest(BaseModel):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
 
152
+ prompt: str = ""
 
 
153
 
154
+ model: str = DEFAULT_MODEL
155
 
156
  # =====================================================
157
  # SMART G4F
 
197
 
198
  # =================================================
199
 
200
+ def ask(self, prompt, model=DEFAULT_MODEL):
201
 
202
  last_error = None
203
 
 
209
  break
210
 
211
  provider = item["provider"]
212
+
213
+ provider_model = item["model"]
214
 
215
  try:
216
 
217
  logger.info(
218
+ f"[+] Trying provider={provider.__name__}"
219
  )
220
 
221
  response = client.chat.completions.create(
222
+ model=model or provider_model,
223
  provider=provider,
224
  messages=[
225
  {
 
233
  text = None
234
 
235
  try:
236
+
237
  text = response.choices[0].message.content
238
+
239
+ except Exception:
240
+
241
  text = str(response)
242
 
243
  if text and text.strip():
244
 
245
  logger.info(
246
+ f"[+] SUCCESS provider={provider.__name__}"
247
  )
248
 
249
  return {
 
257
  last_error = str(e)
258
 
259
  logger.warning(
260
+ f"[-] FAILED provider={provider.__name__} error={e}"
261
  )
262
 
263
  self.mark_bad(provider)
 
270
 
271
  smart = SmartG4F()
272
 
 
 
 
 
 
 
 
 
273
  # =====================================================
274
  # ROOT
275
  # =====================================================
 
281
  return {
282
  "status": "online",
283
  "service": "Smart G4F Gateway",
284
+ "version": "3.0",
285
  "providers": len(SAFE_PROVIDERS),
286
+ "auth_methods": [
287
  "Authorization: Bearer",
288
  "x-api-key"
289
  ]
 
310
 
311
  async def models():
312
 
313
+ data = [
314
+ {
315
+ "id": "gpt-4o-mini",
316
+ "object": "model",
317
+ "owned_by": "openai",
318
+ "created": int(time.time())
319
+ },
320
+ {
321
+ "id": "blackboxai",
322
+ "object": "model",
323
+ "owned_by": "blackbox",
324
+ "created": int(time.time())
325
+ },
326
+ {
327
+ "id": "gpt-3.5-turbo",
328
+ "object": "model",
329
+ "owned_by": "openai",
330
+ "created": int(time.time())
331
+ }
332
+ ]
333
+
334
  return {
335
  "object": "list",
336
+ "data": data
 
 
 
 
 
 
 
 
337
  }
338
 
339
  # =====================================================
340
+ # SIMPLE CHAT
341
  # =====================================================
342
 
343
  @app.post("/chat")
 
346
 
347
  verify_api_key(req)
348
 
349
+ prompt = body.prompt.strip()
350
+
351
+ if not prompt:
352
+
353
+ raise HTTPException(
354
+ status_code=400,
355
+ detail="Prompt is empty"
356
+ )
357
+
358
  try:
359
 
360
+ result = smart.ask(
361
+ prompt=prompt,
362
+ model=body.model
363
+ )
364
 
365
  return {
366
  "success": True,
 
379
  )
380
 
381
  # =====================================================
382
+ # OPENAI API
383
  # =====================================================
384
 
385
  @app.post("/v1/chat/completions")
 
388
 
389
  verify_api_key(req)
390
 
391
+ prompt = body.prompt.strip()
392
+
393
+ if not prompt:
394
+
395
+ raise HTTPException(
396
+ status_code=400,
397
+ detail="Prompt is empty"
398
+ )
399
+
400
  try:
401
 
402
+ result = smart.ask(
403
+ prompt=prompt,
404
+ model=body.model
405
+ )
406
 
407
+ return JSONResponse({
408
  "id": f"chatcmpl-{random.randint(100000,999999)}",
409
  "object": "chat.completion",
410
  "created": int(time.time()),
 
418
  },
419
  "finish_reason": "stop"
420
  }
421
+ ],
422
+ "usage": {
423
+ "prompt_tokens": 0,
424
+ "completion_tokens": 0,
425
+ "total_tokens": 0
426
+ }
427
+ })
428
 
429
  except Exception as e:
430
 
 
512
 
513
  <body>
514
 
515
+ <h2>πŸ€– Smart G4F Gateway v3.0</h2>
516
 
517
  <div id="chat"></div>
518
 
 
561
  }},
562
 
563
  body: JSON.stringify({{
564
+ prompt: text,
565
+ model: "gpt-4o-mini"
566
  }})
567
  }});
568
 
 
594
  print("""
595
 
596
  ╔══════════════════════════════════════╗
597
+ β•‘ SMART G4F GATEWAY β•‘
598
  ╠══════════════════════════════════════╣
599
+ β•‘ VERSION : 3.0 β•‘
600
  β•‘ AUTH : ENABLED β•‘
 
601
  β•‘ TEST UI : /test β•‘
602
  β•‘ CHAT : /chat β•‘
603
  β•‘ OPENAI : /v1/chat/completions β•‘
604
+ β•‘ MODELS : /v1/models β•‘
605
  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
606
 
607
  """)