bahi-bh commited on
Commit
054226c
·
verified ·
1 Parent(s): d2e502e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +134 -79
app.py CHANGED
@@ -11,12 +11,6 @@ import logging
11
 
12
  import g4f
13
  from g4f.client import Client
14
- from g4f.Provider import (
15
- Blackbox,
16
- DeepInfra,
17
- PerplexityLabs,
18
- HuggingChat
19
- )
20
 
21
  # =====================================================
22
  # LOGGING
@@ -31,29 +25,13 @@ logger = logging.getLogger(__name__)
31
 
32
  API_KEY = "sk-your-secret-key"
33
 
34
- # =====================================================
35
- # PROVIDER MAPPING - التعديل الدقيق #1
36
- # =====================================================
37
-
38
- REAL_PROVIDERS = {
39
- "gpt-4o": Blackbox,
40
- "gpt-4o-mini": DeepInfra,
41
- "gpt-4": Blackbox,
42
- "gpt-3.5-turbo": DeepInfra,
43
- "claude-3-haiku": HuggingChat,
44
- "llama-3.1-70b": DeepInfra,
45
- "mixtral-8x7b": DeepInfra,
46
- "deepseek-chat": Blackbox,
47
- "gemini-pro": PerplexityLabs
48
- }
49
-
50
  # =====================================================
51
  # FASTAPI
52
  # =====================================================
53
 
54
  app = FastAPI(
55
  title="Universal AI Gateway",
56
- version="4.0.0"
57
  )
58
 
59
  # =====================================================
@@ -69,7 +47,7 @@ app.add_middleware(
69
  )
70
 
71
  # =====================================================
72
- # MODELS
73
  # =====================================================
74
 
75
  class Message(BaseModel):
@@ -91,7 +69,7 @@ def verify_api_key(req: Request):
91
 
92
  auth = req.headers.get("Authorization")
93
 
94
- # السماح للاختبار
95
  if not auth:
96
  return True
97
 
@@ -111,6 +89,84 @@ def verify_api_key(req: Request):
111
 
112
  return True
113
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  # =====================================================
115
  # ROOT
116
  # =====================================================
@@ -121,7 +177,9 @@ async def root():
121
  return {
122
  "status": "online",
123
  "service": "Universal AI Gateway",
124
- "version": "4.0.0"
 
 
125
  }
126
 
127
  # =====================================================
@@ -131,53 +189,30 @@ async def root():
131
  @app.get("/v1/models")
132
  async def get_models():
133
 
134
- models_data = []
135
-
136
  fallback_models = [
137
  "gpt-4o-mini",
138
  "gpt-4o",
139
  "gpt-4",
140
  "gpt-3.5-turbo",
141
  "claude-3-haiku",
 
 
 
142
  "llama-3.1-70b",
143
  "mixtral-8x7b",
144
- "deepseek-chat",
145
- "gemini-pro"
146
  ]
147
 
148
- try:
149
-
150
- if hasattr(g4f.models, "_all_models"):
151
-
152
- all_models = list(g4f.models._all_models)
153
-
154
- for model in all_models[:50]:
155
-
156
- models_data.append({
157
- "id": str(model),
158
- "object": "model",
159
- "created": int(time.time()),
160
- "owned_by": "g4f"
161
- })
162
-
163
- except Exception as e:
164
-
165
- logger.error(f"Models error: {e}")
166
 
167
- # fallback - التعديل الدقيق #2
168
- if not models_data:
169
 
170
- for model in fallback_models:
171
- provider_name = "g4f"
172
- if model in REAL_PROVIDERS:
173
- provider_name = REAL_PROVIDERS[model].__name__
174
-
175
- models_data.append({
176
- "id": model,
177
- "object": "model",
178
- "created": int(time.time()),
179
- "owned_by": provider_name
180
- })
181
 
182
  return {
183
  "object": "list",
@@ -204,12 +239,16 @@ async def chat_completions(
204
  for m in body.messages
205
  ]
206
 
 
 
 
 
207
  logger.info(
208
- f"Request model={body.model} stream={body.stream}"
209
  )
210
 
211
  # =================================================
212
- # STREAMING
213
  # =================================================
214
 
215
  if body.stream:
@@ -218,12 +257,11 @@ async def chat_completions(
218
 
219
  try:
220
 
221
- # التعديل الدقيق #3 - استخدام المزود الحقيقي
222
- provider = REAL_PROVIDERS.get(body.model, None)
223
- client = Client(provider=provider) if provider else Client()
224
 
225
  response = client.chat.completions.create(
226
  model=body.model,
 
227
  messages=messages,
228
  stream=True
229
  )
@@ -237,9 +275,9 @@ async def chat_completions(
237
  content = ""
238
 
239
  if (
240
- chunk.choices
 
241
  and chunk.choices[0].delta
242
- and chunk.choices[0].delta.content
243
  ):
244
  content = chunk.choices[0].delta.content
245
 
@@ -265,11 +303,9 @@ async def chat_completions(
265
 
266
  await asyncio.sleep(0)
267
 
268
- except Exception as chunk_error:
269
 
270
- logger.error(
271
- f"Chunk error: {chunk_error}"
272
- )
273
 
274
  final_payload = {
275
  "id": chunk_id,
@@ -285,7 +321,15 @@ async def chat_completions(
285
  ]
286
  }
287
 
288
- yield f"data: {json.dumps(final_payload)}\n\error_payload = {
 
 
 
 
 
 
 
 
289
  "error": {
290
  "message": str(e),
291
  "type": "server_error"
@@ -305,18 +349,17 @@ async def chat_completions(
305
  )
306
 
307
  # =================================================
308
- # NORMAL RESPONSE
309
  # =================================================
310
 
311
  try:
312
 
313
- # التعديل الدقيق #4 - استخدام المزود الحقيقي
314
- provider = REAL_PROVIDERS.get(body.model, None)
315
- client = Client(provider=provider) if provider else Client()
316
 
317
  response = await asyncio.to_thread(
318
  client.chat.completions.create,
319
  model=body.model,
 
320
  messages=messages
321
  )
322
 
@@ -351,13 +394,25 @@ async def chat_completions(
351
 
352
  except Exception as e:
353
 
354
- logger.error(f"Chat error: {e}")
355
 
356
  raise HTTPException(
357
  status_code=500,
358
  detail=str(e)
359
  )
360
 
 
 
 
 
 
 
 
 
 
 
 
 
361
  # =====================================================
362
  # RUN
363
  # =====================================================
@@ -370,4 +425,4 @@ if __name__ == "__main__":
370
  app,
371
  host="0.0.0.0",
372
  port=7860
373
- )
 
11
 
12
  import g4f
13
  from g4f.client import Client
 
 
 
 
 
 
14
 
15
  # =====================================================
16
  # LOGGING
 
25
 
26
  API_KEY = "sk-your-secret-key"
27
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  # =====================================================
29
  # FASTAPI
30
  # =====================================================
31
 
32
  app = FastAPI(
33
  title="Universal AI Gateway",
34
+ version="5.0.0"
35
  )
36
 
37
  # =====================================================
 
47
  )
48
 
49
  # =====================================================
50
+ # REQUEST MODELS
51
  # =====================================================
52
 
53
  class Message(BaseModel):
 
69
 
70
  auth = req.headers.get("Authorization")
71
 
72
+ # السماح بالاختبار
73
  if not auth:
74
  return True
75
 
 
89
 
90
  return True
91
 
92
+ # =====================================================
93
+ # PROVIDERS
94
+ # =====================================================
95
+
96
+ def get_provider(provider_name):
97
+
98
+ providers_map = {}
99
+
100
+ # Duck.ai
101
+ if hasattr(g4f.Provider, "DuckDuckGo"):
102
+ providers_map["duck"] = g4f.Provider.DuckDuckGo
103
+ providers_map["duckduckgo"] = g4f.Provider.DuckDuckGo
104
+
105
+ # Blackbox
106
+ if hasattr(g4f.Provider, "Blackbox"):
107
+ providers_map["blackbox"] = g4f.Provider.Blackbox
108
+
109
+ # Free2GPT
110
+ if hasattr(g4f.Provider, "Free2GPT"):
111
+ providers_map["free2gpt"] = g4f.Provider.Free2GPT
112
+
113
+ # Copilot
114
+ if hasattr(g4f.Provider, "Copilot"):
115
+ providers_map["copilot"] = g4f.Provider.Copilot
116
+
117
+ # Liaobots
118
+ if hasattr(g4f.Provider, "Liaobots"):
119
+ providers_map["liaobots"] = g4f.Provider.Liaobots
120
+
121
+ # Gemini
122
+ if hasattr(g4f.Provider, "Gemini"):
123
+ providers_map["gemini"] = g4f.Provider.Gemini
124
+
125
+ # DeepInfra
126
+ if hasattr(g4f.Provider, "DeepInfra"):
127
+ providers_map["deepinfra"] = g4f.Provider.DeepInfra
128
+
129
+ # Pollinations
130
+ if hasattr(g4f.Provider, "PollinationsAI"):
131
+ providers_map["pollinations"] = g4f.Provider.PollinationsAI
132
+
133
+ return providers_map.get(provider_name.lower())
134
+
135
+ # =====================================================
136
+ # MODEL ROUTING
137
+ # =====================================================
138
+
139
+ def detect_provider(model_name: str):
140
+
141
+ model = model_name.lower()
142
+
143
+ # GPT Models -> Duck.ai أولاً
144
+ if "gpt" in model:
145
+ return "duck"
146
+
147
+ # Claude
148
+ if "claude" in model:
149
+ return "liaobots"
150
+
151
+ # Gemini
152
+ if "gemini" in model:
153
+ return "gemini"
154
+
155
+ # DeepSeek
156
+ if "deepseek" in model:
157
+ return "deepinfra"
158
+
159
+ # Llama
160
+ if "llama" in model:
161
+ return "deepinfra"
162
+
163
+ # Mixtral
164
+ if "mixtral" in model:
165
+ return "deepinfra"
166
+
167
+ # fallback
168
+ return "duck"
169
+
170
  # =====================================================
171
  # ROOT
172
  # =====================================================
 
177
  return {
178
  "status": "online",
179
  "service": "Universal AI Gateway",
180
+ "version": "5.0.0",
181
+ "g4f": True,
182
+ "duck_ai": True
183
  }
184
 
185
  # =====================================================
 
189
  @app.get("/v1/models")
190
  async def get_models():
191
 
 
 
192
  fallback_models = [
193
  "gpt-4o-mini",
194
  "gpt-4o",
195
  "gpt-4",
196
  "gpt-3.5-turbo",
197
  "claude-3-haiku",
198
+ "claude-3-sonnet",
199
+ "gemini-pro",
200
+ "gemini-1.5-flash",
201
  "llama-3.1-70b",
202
  "mixtral-8x7b",
203
+ "deepseek-chat"
 
204
  ]
205
 
206
+ models_data = []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
207
 
208
+ for model in fallback_models:
 
209
 
210
+ models_data.append({
211
+ "id": model,
212
+ "object": "model",
213
+ "created": int(time.time()),
214
+ "owned_by": "g4f"
215
+ })
 
 
 
 
 
216
 
217
  return {
218
  "object": "list",
 
239
  for m in body.messages
240
  ]
241
 
242
+ provider_name = detect_provider(body.model)
243
+
244
+ provider = get_provider(provider_name)
245
+
246
  logger.info(
247
+ f"MODEL={body.model} | PROVIDER={provider_name}"
248
  )
249
 
250
  # =================================================
251
+ # STREAM
252
  # =================================================
253
 
254
  if body.stream:
 
257
 
258
  try:
259
 
260
+ client = Client()
 
 
261
 
262
  response = client.chat.completions.create(
263
  model=body.model,
264
+ provider=provider,
265
  messages=messages,
266
  stream=True
267
  )
 
275
  content = ""
276
 
277
  if (
278
+ hasattr(chunk, "choices")
279
+ and chunk.choices
280
  and chunk.choices[0].delta
 
281
  ):
282
  content = chunk.choices[0].delta.content
283
 
 
303
 
304
  await asyncio.sleep(0)
305
 
306
+ except Exception as e:
307
 
308
+ logger.error(f"Chunk Error: {e}")
 
 
309
 
310
  final_payload = {
311
  "id": chunk_id,
 
321
  ]
322
  }
323
 
324
+ yield f"data: {json.dumps(final_payload)}\n\n"
325
+
326
+ yield "data: [DONE]\n\n"
327
+
328
+ except Exception as e:
329
+
330
+ logger.error(f"Streaming Error: {e}")
331
+
332
+ error_payload = {
333
  "error": {
334
  "message": str(e),
335
  "type": "server_error"
 
349
  )
350
 
351
  # =================================================
352
+ # NORMAL
353
  # =================================================
354
 
355
  try:
356
 
357
+ client = Client()
 
 
358
 
359
  response = await asyncio.to_thread(
360
  client.chat.completions.create,
361
  model=body.model,
362
+ provider=provider,
363
  messages=messages
364
  )
365
 
 
394
 
395
  except Exception as e:
396
 
397
+ logger.error(f"Chat Error: {e}")
398
 
399
  raise HTTPException(
400
  status_code=500,
401
  detail=str(e)
402
  )
403
 
404
+ # =====================================================
405
+ # HEALTH
406
+ # =====================================================
407
+
408
+ @app.get("/health")
409
+ async def health():
410
+
411
+ return {
412
+ "ok": True,
413
+ "time": int(time.time())
414
+ }
415
+
416
  # =====================================================
417
  # RUN
418
  # =====================================================
 
425
  app,
426
  host="0.0.0.0",
427
  port=7860
428
+ )