返回提交历史
Modified
g4f/api/__init__.py
+1
-5
Modified
g4f/gui/client/static/css/style.css
+1
-1
Modified
g4f/gui/client/static/js/chat.v1.js
+17
-1
Modified
g4f/gui/server/api.py
+11
-3
Modified
g4f/models.py
+32
-18
XFEstudio/gpt4free
Show only enabled models in gui
eff97ed3
代码差异
5 个文件
+62
-28
@@ -276,16 +276,12 @@ class Api:
276
276
HTTP_200_OK: {"model": List[ModelResponseModel]},
277
277
})
278
278
async def models():
279
model_list = dict(
280
(model, g4f.models.ModelUtils.convert[model])
281
for model in g4f.Model.__all__()
282
)
283
279
return [{
284
280
'id': model_id,
285
281
'object': 'model',
286
282
'created': 0,
287
283
'owned_by': model.base_provider
288
} for model_id, model in model_list.items()]
284
} for model_id, model in g4f.models.ModelUtils.convert.items()]
289
285
290
286
@self.app.get("/v1/models/{model_name}", responses={
291
287
HTTP_200_OK: {"model": ModelResponseModel},
@@ -778,7 +778,7 @@ select:hover,
778
778
background-color: var(--button-hover);
779
779
}
780
780
781
#provider option:disabled[value] {
781
#provider option:disabled[value], #model option:disabled[value] {
782
782
display: none;
783
783
}
784
784
@@ -1296,6 +1296,13 @@ async function on_load() {
1296
1296
1297
1297
const load_provider_option = (input, provider_name) => {
1298
1298
if (input.checked) {
1299
modelSelect.querySelectorAll(`option[data-disabled_providers*="${provider_name}"]`).forEach(
1300
(el) => {
1301
el.dataset.disabled_providers = el.dataset.disabled_providers ? el.dataset.disabled_providers.split(" ").filter((provider) => provider!=provider_name).join(" ") : "";
1302
el.dataset.providers = (el.dataset.providers ? el.dataset.providers + " " : "") + provider_name;
1303
modelSelect.querySelectorAll(`option[value="${el.value}"]`).forEach((o)=>o.removeAttribute("disabled", "disabled"))
1304
}
1305
);
1299
1306
providerSelect.querySelectorAll(`option[value="${provider_name}"]`).forEach(
1300
1307
(el) => el.removeAttribute("disabled")
1301
1308
);
@@ -1303,6 +1310,13 @@ const load_provider_option = (input, provider_name) => {
1303
1310
(el) => el.removeAttribute("disabled")
1304
1311
);
1305
1312
} else {
1313
modelSelect.querySelectorAll(`option[data-providers*="${provider_name}"]`).forEach(
1314
(el) => {
1315
el.dataset.providers = el.dataset.providers ? el.dataset.providers.split(" ").filter((provider) => provider!=provider_name).join(" ") : "";
1316
el.dataset.disabled_providers = (el.dataset.disabled_providers ? el.dataset.disabled_providers + " " : "") + provider_name;
1317
if (!el.dataset.providers) modelSelect.querySelectorAll(`option[value="${el.value}"]`).forEach((o)=>o.setAttribute("disabled", "disabled"))
1318
}
1319
);
1306
1320
providerSelect.querySelectorAll(`option[value="${provider_name}"]`).forEach(
1307
1321
(el) => el.setAttribute("disabled", "disabled")
1308
1322
);
@@ -1342,7 +1356,9 @@ async function on_api() {
1342
1356
models = await api("models");
1343
1357
models.forEach((model) => {
1344
1358
let option = document.createElement("option");
1345
option.value = option.text = option.dataset.label = model;
1359
option.value = model.name;
1360
option.text = model.name + (model.image ? " (Image Generation)" : "");
1361
option.dataset.providers = model.providers.join(" ");
1346
1362
modelSelect.appendChild(option);
1347
1363
});
1348
1364
providers = await api("providers")
@@ -13,7 +13,7 @@ from g4f.errors import VersionNotFoundError
13
13
from g4f.image import ImagePreview, ImageResponse, copy_images, ensure_images_dir, images_dir
14
14
from g4f.Provider import ProviderType, __providers__, __map__
15
15
from g4f.providers.base_provider import ProviderModelMixin
16
from g4f.providers.retry_provider import BaseRetryProvider
16
from g4f.providers.retry_provider import IterListProvider
17
17
from g4f.providers.response import BaseConversation, FinishReason, SynthesizeData
18
18
from g4f.client.service import convert_to_provider
19
19
from g4f import debug
@@ -24,7 +24,15 @@ conversations: dict[dict[str, BaseConversation]] = {}
24
24
class Api:
25
25
@staticmethod
26
26
def get_models():
27
return models._all_models
27
return [{
28
"name": model.name,
29
"image": isinstance(model, models.ImageModel),
30
"providers": [
31
getattr(provider, "parent", provider.__name__)
32
for provider in providers
33
]
34
}
35
for model, providers in models.__models__.values()]
28
36
29
37
@staticmethod
30
38
def get_provider_models(provider: str, api_key: str = None):
@@ -126,7 +134,7 @@ class Api:
126
134
for chunk in result:
127
135
if first:
128
136
first = False
129
if isinstance(provider, BaseRetryProvider):
137
if isinstance(provider, IterListProvider):
130
138
provider = provider.last_provider
131
139
yield self._format_json("provider", {**provider.get_dict(), "model": model})
132
140
if isinstance(chunk, BaseConversation):
@@ -59,6 +59,9 @@ class Model:
59
59
"""Returns a list of all model names."""
60
60
return _all_models
61
61
62
class ImageModel(Model):
63
pass
64
62
65
### Default ###
63
66
default = Model(
64
67
name = "",
@@ -559,100 +562,98 @@ any_uncensored = Model(
559
562
#############
560
563
561
564
### Stability AI ###
562
sdxl = Model(
565
sdxl = ImageModel(
563
566
name = 'sdxl',
564
567
base_provider = 'Stability AI',
565
568
best_provider = IterListProvider([ReplicateHome, Airforce])
566
569
567
570
)
568
571
569
sd_3 = Model(
572
sd_3 = ImageModel(
570
573
name = 'sd-3',
571
574
base_provider = 'Stability AI',
572
575
best_provider = ReplicateHome
573
574
576
)
575
577
576
578
### Playground ###
577
playground_v2_5 = Model(
579
playground_v2_5 = ImageModel(
578
580
name = 'playground-v2.5',
579
581
base_provider = 'Playground AI',
580
582
best_provider = ReplicateHome
581
582
583
)
583
584
584
585
585
586
### Flux AI ###
586
flux = Model(
587
flux = ImageModel(
587
588
name = 'flux',
588
589
base_provider = 'Flux AI',
589
590
best_provider = IterListProvider([Blackbox, Airforce])
590
591
)
591
592
592
flux_pro = Model(
593
flux_pro = ImageModel(
593
594
name = 'flux-pro',
594
595
base_provider = 'Flux AI',
595
596
best_provider = Airforce
596
597
)
597
598
598
flux_dev = Model(
599
flux_dev = ImageModel(
599
600
name = 'flux-dev',
600
601
base_provider = 'Flux AI',
601
602
best_provider = AmigoChat
602
603
)
603
604
604
flux_realism = Model(
605
flux_realism = ImageModel(
605
606
name = 'flux-realism',
606
607
base_provider = 'Flux AI',
607
608
best_provider = IterListProvider([Airforce, AmigoChat])
608
609
)
609
610
610
flux_anime = Model(
611
flux_anime = ImageModel(
611
612
name = 'flux-anime',
612
613
base_provider = 'Flux AI',
613
614
best_provider = Airforce
614
615
)
615
616
616
flux_3d = Model(
617
flux_3d = ImageModel(
617
618
name = 'flux-3d',
618
619
base_provider = 'Flux AI',
619
620
best_provider = Airforce
620
621
)
621
622
622
flux_disney = Model(
623
flux_disney = ImageModel(
623
624
name = 'flux-disney',
624
625
base_provider = 'Flux AI',
625
626
best_provider = Airforce
626
627
)
627
628
628
flux_pixel = Model(
629
flux_pixel = ImageModel(
629
630
name = 'flux-pixel',
630
631
base_provider = 'Flux AI',
631
632
best_provider = Airforce
632
633
)
633
634
634
flux_4o = Model(
635
flux_4o = ImageModel(
635
636
name = 'flux-4o',
636
637
base_provider = 'Flux AI',
637
638
best_provider = Airforce
638
639
)
639
640
640
641
### OpenAI ###
641
dall_e_3 = Model(
642
dall_e_3 = ImageModel(
642
643
name = 'dall-e-3',
643
644
base_provider = 'OpenAI',
644
645
best_provider = IterListProvider([Airforce, CopilotAccount, OpenaiAccount, MicrosoftDesigner, BingCreateImages])
645
646
)
646
647
647
648
### Recraft ###
648
recraft_v3 = Model(
649
recraft_v3 = ImageModel(
649
650
name = 'recraft-v3',
650
651
base_provider = 'Recraft',
651
652
best_provider = AmigoChat
652
653
)
653
654
654
655
### Other ###
655
any_dark = Model(
656
any_dark = ImageModel(
656
657
name = 'any-dark',
657
658
base_provider = 'Other',
658
659
best_provider = Airforce
@@ -863,4 +864,17 @@ class ModelUtils:
863
864
'any-dark': any_dark,
864
865
}
865
866
866
_all_models = list(ModelUtils.convert.keys())
867
# Create a list of all working models
868
__models__ = {model.name: (model, providers) for model, providers in [
869
(model, [provider for provider in providers if provider.working])
870
for model, providers in [
871
(model, model.best_provider.providers
872
if isinstance(model.best_provider, IterListProvider)
873
else [model.best_provider]
874
if model.best_provider is not None
875
else [])
876
for model in ModelUtils.convert.values()]
877
] if providers}
878
# Update the ModelUtils.convert with the working models
879
ModelUtils.convert = {model.name: model for model, _ in __models__.values()}
880
_all_models = list(ModelUtils.convert.keys())