返回提交历史
Modified
g4f/Provider/Airforce.py
+2
-2
Modified
g4f/Provider/airforce/AirforceChat.py
+5
-5
Modified
g4f/Provider/airforce/AirforceImage.py
+24
-31
Modified
g4f/models.py
+8
-0
XFEstudio/gpt4free
Update (g4f/models.py g4f/Provider/airforce/ g4f/Provider/Airforce.py)
db347ef0
代码差异
4 个文件
+39
-38
@@ -12,8 +12,8 @@ from .airforce.AirforceImage import AirforceImage
12
12
13
13
class Airforce(AsyncGeneratorProvider, ProviderModelMixin):
14
14
url = "https://api.airforce"
15
api_endpoint_completions = AirforceChat.api_endpoint_completions
16
api_endpoint_imagine2 = AirforceImage.api_endpoint_imagine2
15
api_endpoint_completions = AirforceChat.api_endpoint
16
api_endpoint_imagine2 = AirforceImage.api_endpoint
17
17
working = True
18
18
supports_stream = AirforceChat.supports_stream
19
19
supports_system_message = AirforceChat.supports_system_message
@@ -46,7 +46,7 @@ def split_messages(messages: Messages, chunk_size: int = 995) -> Messages:
46
46
47
47
class AirforceChat(AsyncGeneratorProvider, ProviderModelMixin):
48
48
label = "AirForce Chat"
49
api_endpoint_completions = "https://api.airforce/chat/completions" # Замініть на реальний ендпоінт
49
api_endpoint = "https://api.airforce/chat/completions"
50
50
supports_stream = True
51
51
supports_system_message = True
52
52
supports_message_history = True
@@ -118,8 +118,8 @@ class AirforceChat(AsyncGeneratorProvider, ProviderModelMixin):
118
118
'openchat-3.5-0106',
119
119
120
120
# qwen
121
#'Qwen1.5-72B-Chat', Пуста відповідь
122
#'Qwen1.5-110B-Chat', Пуста відповідь
121
#'Qwen1.5-72B-Chat', # Empty answer
122
#'Qwen1.5-110B-Chat', # Empty answer
123
123
'Qwen2-72B-Instruct',
124
124
'Qwen2.5-7B-Instruct-Turbo',
125
125
'Qwen2.5-72B-Instruct-Turbo',
@@ -350,7 +350,7 @@ class AirforceChat(AsyncGeneratorProvider, ProviderModelMixin):
350
350
}
351
351
352
352
async with ClientSession(headers=headers) as session:
353
async with session.post(cls.api_endpoint_completions, json=data, proxy=proxy) as response:
353
async with session.post(cls.api_endpoint, json=data, proxy=proxy) as response:
354
354
response.raise_for_status()
355
355
text = ""
356
356
if stream:
@@ -362,7 +362,7 @@ class AirforceChat(AsyncGeneratorProvider, ProviderModelMixin):
362
362
chunk = json.loads(json_str)
363
363
if 'choices' in chunk and chunk['choices']:
364
364
content = chunk['choices'][0].get('delta', {}).get('content', '')
365
text += content # Збираємо дельти
365
text += content
366
366
except json.JSONDecodeError as e:
367
367
print(f"Error decoding JSON: {json_str}, Error: {e}")
368
368
elif line.strip() == "[DONE]":
@@ -1,46 +1,47 @@
1
1
from __future__ import annotations
2
2
3
3
from aiohttp import ClientSession
4
from urllib.parse import urlencode
4
5
import random
5
6
6
7
from ...typing import AsyncResult, Messages
7
from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
8
8
from ...image import ImageResponse
9
from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
9
10
10
11
11
12
class AirforceImage(AsyncGeneratorProvider, ProviderModelMixin):
12
13
label = "Airforce Image"
13
14
#url = "https://api.airforce"
14
api_endpoint_imagine2 = "https://api.airforce/imagine2"
15
api_endpoint = "https://api.airforce/imagine2"
15
16
#working = True
16
17
17
18
default_model = 'flux'
18
19
image_models = [
19
20
'flux',
20
'flux-realism',
21
'flux-realism',
21
22
'flux-anime',
22
23
'flux-3d',
23
24
'flux-disney',
24
25
'flux-pixel',
25
26
'flux-4o',
26
27
'any-dark',
28
'any-uncensored',
27
29
'stable-diffusion-xl-base',
28
30
'stable-diffusion-xl-lightning',
31
'Flux-1.1-Pro',
29
32
]
30
33
models = [*image_models]
31
34
32
35
model_aliases = {
33
36
"sdxl": "stable-diffusion-xl-base",
34
"sdxl": "stable-diffusion-xl-lightning",
37
"sdxl": "stable-diffusion-xl-lightning",
38
"flux-pro": "Flux-1.1-Pro",
35
39
}
36
37
40
38
41
@classmethod
39
42
def get_model(cls, model: str) -> str:
40
43
if model in cls.models:
41
44
return model
42
elif model in cls.model_aliases:
43
return cls.model_aliases[model]
44
45
else:
45
46
return cls.default_model
46
47
@@ -49,49 +50,41 @@ class AirforceImage(AsyncGeneratorProvider, ProviderModelMixin):
49
50
cls,
50
51
model: str,
51
52
messages: Messages,
52
size: str = '1:1',
53
size: str = '1:1', # "1:1", "16:9", "9:16", "21:9", "9:21", "1:2", "2:1"
53
54
proxy: str = None,
54
55
**kwargs
55
56
) -> AsyncResult:
56
57
model = cls.get_model(model)
57
58
58
59
headers = {
59
'accept': '*/*',
60
'accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
60
61
'accept-language': 'en-US,en;q=0.9',
61
'authorization': 'Bearer missing api key',
62
62
'cache-control': 'no-cache',
63
'origin': 'https://llmplayground.net',
63
'dnt': '1',
64
64
'pragma': 'no-cache',
65
65
'priority': 'u=1, i',
66
66
'referer': 'https://llmplayground.net/',
67
67
'sec-ch-ua': '"Not?A_Brand";v="99", "Chromium";v="130"',
68
68
'sec-ch-ua-mobile': '?0',
69
69
'sec-ch-ua-platform': '"Linux"',
70
'sec-fetch-dest': 'empty',
71
'sec-fetch-mode': 'cors',
70
'sec-fetch-dest': 'image',
71
'sec-fetch-mode': 'no-cors',
72
72
'sec-fetch-site': 'cross-site',
73
73
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36'
74
74
}
75
75
76
76
async with ClientSession(headers=headers) as session:
77
prompt = messages[-1]['content']
78
seed = random.randint(0, 4294967295)
77
seed = random.randint(0, 58463)
79
78
params = {
80
79
'model': model,
81
'prompt': prompt,
80
'prompt': messages[-1]["content"],
82
81
'size': size,
83
'seed': str(seed)
82
'seed': seed
84
83
}
85
async with session.get(cls.api_endpoint_imagine2, params=params, proxy=proxy) as response:
86
response.raise_for_status()
87
if response.status == 200:
88
content_type = response.headers.get('Content-Type', '')
89
if 'image' in content_type:
90
image_url = str(response.url)
91
yield ImageResponse(image_url, alt="Airforce generated image")
92
else:
93
content = await response.text()
94
yield f"Unexpected content type: {content_type}\nResponse content: {content}"
84
full_url = f"{cls.api_endpoint}?{urlencode(params)}"
85
86
async with session.get(full_url, headers=headers, proxy=proxy) as response:
87
if response.status == 200 and response.headers.get('content-type', '').startswith('image'):
88
yield ImageResponse(images=[full_url], alt="Generated Image")
95
89
else:
96
error_content = await response.text()
97
yield f"Error: {error_content}"
90
raise Exception(f"Error: status {response.status}, content type {response.headers.get('content-type')}")
@@ -688,6 +688,13 @@ flux = Model(
688
688
689
689
)
690
690
691
flux_pro = Model(
692
name = 'flux-pro',
693
base_provider = 'Flux AI',
694
best_provider = IterListProvider([Airforce])
695
696
)
697
691
698
flux_realism = Model(
692
699
name = 'flux-realism',
693
700
base_provider = 'Flux AI',
@@ -983,6 +990,7 @@ class ModelUtils:
983
990
984
991
### Flux AI ###
985
992
'flux': flux,
993
'flux-pro': flux_pro,
986
994
'flux-realism': flux_realism,
987
995
'flux-anime': flux_anime,
988
996
'flux-3d': flux_3d,