bahi-bh commited on
Commit
f535544
·
verified ·
1 Parent(s): 3f93c4e

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +174 -24
main.py CHANGED
@@ -14,15 +14,19 @@ from typing import List, Optional
14
 
15
  # ================= Logging =================
16
 
17
- logging.basicConfig(level=logging.INFO)
 
 
 
 
18
  logger=logging.getLogger(__name__)
19
 
20
 
21
  # ================= App =================
22
 
23
  app=FastAPI(
24
- title="G4F OpenAI Compatible",
25
- version="1.0"
26
  )
27
 
28
  app.add_middleware(
@@ -51,6 +55,8 @@ class ChatRequest(BaseModel):
51
  messages:List[ChatMessage]
52
  stream:bool=False
53
  provider:Optional[str]=None
 
 
54
 
55
 
56
  # ================= Auth =================
@@ -84,10 +90,72 @@ def verify_key(auth:str):
84
  )
85
 
86
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  # ================= Health =================
88
 
89
  @app.get("/")
90
- async def health():
91
 
92
  return {
93
  "status":"online"
@@ -101,28 +169,38 @@ async def models(
101
  authorization:str=Header(None)
102
  ):
103
 
104
- verify_key(authorization)
 
 
105
 
106
  try:
107
 
108
- models=[]
109
 
110
- if hasattr(g4f.models,"ModelUtils"):
 
 
 
111
 
112
- models=list(
113
  g4f.models.ModelUtils.convert.keys()
114
  )
115
 
116
- models=sorted(
117
- list(set(models))
118
  )
119
 
120
- if not models:
 
 
121
 
122
- models=[
123
  "gpt-4o-mini",
124
  "gpt-4",
125
- "gpt-3.5-turbo"
 
 
 
 
126
  ]
127
 
128
  return {
@@ -130,12 +208,15 @@ async def models(
130
  "object":"list",
131
 
132
  "data":[
 
133
  {
134
  "id":m,
135
  "object":"model",
136
  "owned_by":"g4f"
137
  }
138
- for m in models
 
 
139
  ]
140
  }
141
 
@@ -148,10 +229,12 @@ async def models(
148
  "object":"list",
149
 
150
  "data":[
 
151
  {
152
  "id":"gpt-4o-mini",
153
  "object":"model"
154
  }
 
155
  ]
156
  }
157
 
@@ -164,7 +247,9 @@ async def chat(
164
  authorization:str=Header(None)
165
  ):
166
 
167
- verify_key(authorization)
 
 
168
 
169
  try:
170
 
@@ -189,8 +274,19 @@ async def chat(
189
  None
190
  )
191
 
 
 
 
 
 
 
 
 
 
 
 
192
 
193
- # ===== STREAM =====
194
 
195
  if body.stream:
196
 
@@ -199,10 +295,12 @@ async def chat(
199
  try:
200
 
201
  response=g4f.ChatCompletion.create(
 
202
  model=body.model,
203
  messages=messages,
204
  provider=provider,
205
  stream=True
 
206
  )
207
 
208
  for chunk in response:
@@ -242,7 +340,7 @@ async def chat(
242
  logger.exception(e)
243
 
244
  yield (
245
- f"data: {json.dumps({'error':str(e)})}\n\n"
246
  )
247
 
248
 
@@ -252,7 +350,7 @@ async def chat(
252
  )
253
 
254
 
255
- # ===== NORMAL =====
256
 
257
  response=await asyncio.to_thread(
258
 
@@ -261,17 +359,18 @@ async def chat(
261
  model=body.model,
262
  messages=messages,
263
  provider=provider
 
264
  )
265
 
 
266
  return {
267
 
268
  "id":"chatcmpl",
269
 
270
  "object":"chat.completion",
271
 
272
- "created":int(
273
- time.time()
274
- ),
275
 
276
  "model":
277
  body.model,
@@ -284,7 +383,8 @@ async def chat(
284
 
285
  "message":{
286
 
287
- "role":"assistant",
 
288
 
289
  "content":
290
  str(response)
@@ -293,12 +393,12 @@ async def chat(
293
 
294
  "finish_reason":
295
  "stop"
 
296
  }
297
 
298
  ]
299
  }
300
 
301
-
302
  except Exception as e:
303
 
304
  logger.exception(e)
@@ -306,4 +406,54 @@ async def chat(
306
  raise HTTPException(
307
  status_code=500,
308
  detail=str(e)
309
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
  # ================= Logging =================
16
 
17
+ logging.basicConfig(
18
+ level=logging.INFO,
19
+ format="%(asctime)s %(levelname)s %(message)s"
20
+ )
21
+
22
  logger=logging.getLogger(__name__)
23
 
24
 
25
  # ================= App =================
26
 
27
  app=FastAPI(
28
+ title="G4F Smart Gateway",
29
+ version="2.0"
30
  )
31
 
32
  app.add_middleware(
 
55
  messages:List[ChatMessage]
56
  stream:bool=False
57
  provider:Optional[str]=None
58
+ temperature:Optional[float]=0.7
59
+ max_tokens:Optional[int]=2048
60
 
61
 
62
  # ================= Auth =================
 
90
  )
91
 
92
 
93
+ # ================= Provider Selection =================
94
+
95
+ def choose_provider(model:str):
96
+
97
+ model=model.lower()
98
+
99
+ try:
100
+
101
+ if "qwen" in model:
102
+
103
+ return getattr(
104
+ g4f.Provider,
105
+ "DeepInfra",
106
+ None
107
+ )
108
+
109
+ elif "perplexity" in model:
110
+
111
+ return getattr(
112
+ g4f.Provider,
113
+ "PerplexityLabs",
114
+ None
115
+ )
116
+
117
+ elif "llama" in model:
118
+
119
+ return getattr(
120
+ g4f.Provider,
121
+ "DeepInfra",
122
+ None
123
+ )
124
+
125
+ elif "claude" in model:
126
+
127
+ return getattr(
128
+ g4f.Provider,
129
+ "OpenaiChat",
130
+ None
131
+ )
132
+
133
+ elif "gemini" in model:
134
+
135
+ return getattr(
136
+ g4f.Provider,
137
+ "OpenaiChat",
138
+ None
139
+ )
140
+
141
+ elif "gpt" in model:
142
+
143
+ return getattr(
144
+ g4f.Provider,
145
+ "OpenaiChat",
146
+ None
147
+ )
148
+
149
+ except:
150
+ pass
151
+
152
+ return None
153
+
154
+
155
  # ================= Health =================
156
 
157
  @app.get("/")
158
+ async def root():
159
 
160
  return {
161
  "status":"online"
 
169
  authorization:str=Header(None)
170
  ):
171
 
172
+ verify_key(
173
+ authorization
174
+ )
175
 
176
  try:
177
 
178
+ found=[]
179
 
180
+ if hasattr(
181
+ g4f.models,
182
+ "ModelUtils"
183
+ ):
184
 
185
+ found=list(
186
  g4f.models.ModelUtils.convert.keys()
187
  )
188
 
189
+ found=sorted(
190
+ list(set(found))
191
  )
192
 
193
+ if not found:
194
+
195
+ found=[
196
 
 
197
  "gpt-4o-mini",
198
  "gpt-4",
199
+ "gpt-3.5-turbo",
200
+ "qwen-2.5-72b",
201
+ "llama-3-70b",
202
+ "perplexity"
203
+
204
  ]
205
 
206
  return {
 
208
  "object":"list",
209
 
210
  "data":[
211
+
212
  {
213
  "id":m,
214
  "object":"model",
215
  "owned_by":"g4f"
216
  }
217
+
218
+ for m in found
219
+
220
  ]
221
  }
222
 
 
229
  "object":"list",
230
 
231
  "data":[
232
+
233
  {
234
  "id":"gpt-4o-mini",
235
  "object":"model"
236
  }
237
+
238
  ]
239
  }
240
 
 
247
  authorization:str=Header(None)
248
  ):
249
 
250
+ verify_key(
251
+ authorization
252
+ )
253
 
254
  try:
255
 
 
274
  None
275
  )
276
 
277
+ else:
278
+
279
+ provider=choose_provider(
280
+ body.model
281
+ )
282
+
283
+
284
+ logger.info(
285
+ f"Model={body.model} Provider={provider}"
286
+ )
287
+
288
 
289
+ # ========= STREAM =========
290
 
291
  if body.stream:
292
 
 
295
  try:
296
 
297
  response=g4f.ChatCompletion.create(
298
+
299
  model=body.model,
300
  messages=messages,
301
  provider=provider,
302
  stream=True
303
+
304
  )
305
 
306
  for chunk in response:
 
340
  logger.exception(e)
341
 
342
  yield (
343
+ f"data:{json.dumps({'error':str(e)})}\n\n"
344
  )
345
 
346
 
 
350
  )
351
 
352
 
353
+ # ========= NORMAL =========
354
 
355
  response=await asyncio.to_thread(
356
 
 
359
  model=body.model,
360
  messages=messages,
361
  provider=provider
362
+
363
  )
364
 
365
+
366
  return {
367
 
368
  "id":"chatcmpl",
369
 
370
  "object":"chat.completion",
371
 
372
+ "created":
373
+ int(time.time()),
 
374
 
375
  "model":
376
  body.model,
 
383
 
384
  "message":{
385
 
386
+ "role":
387
+ "assistant",
388
 
389
  "content":
390
  str(response)
 
393
 
394
  "finish_reason":
395
  "stop"
396
+
397
  }
398
 
399
  ]
400
  }
401
 
 
402
  except Exception as e:
403
 
404
  logger.exception(e)
 
406
  raise HTTPException(
407
  status_code=500,
408
  detail=str(e)
409
+ )
410
+
411
+
412
+ # ================= Test =================
413
+
414
+ @app.get("/test/{model}")
415
+ async def test_model(
416
+ model:str
417
+ ):
418
+
419
+ try:
420
+
421
+ provider=choose_provider(
422
+ model
423
+ )
424
+
425
+ result=await asyncio.to_thread(
426
+
427
+ g4f.ChatCompletion.create,
428
+
429
+ model=model,
430
+
431
+ provider=provider,
432
+
433
+ messages=[
434
+
435
+ {
436
+ "role":"user",
437
+ "content":"hello"
438
+ }
439
+
440
+ ]
441
+ )
442
+
443
+ return {
444
+
445
+ "model":model,
446
+ "provider":str(provider),
447
+ "working":True
448
+
449
+ }
450
+
451
+ except Exception as e:
452
+
453
+ return {
454
+
455
+ "model":model,
456
+ "working":False,
457
+ "error":str(e)
458
+
459
+ }