Skip to content

Commit 555eebe

Browse files
committed
Merge branch 'pre-release'
2 parents 777dad4 + 672d72b commit 555eebe

File tree

4 files changed

+146
-15
lines changed

4 files changed

+146
-15
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ Experience the power of ChatGPT with a user-friendly interface, enhanced jailbre
1313
I have created a new version of FreeGPT WebUI using the [ChimeraGPT API](https://chimeragpt.adventblocks.cc/).
1414
<br>
1515
<br>
16-
This free API allows you to use various AI chat models, including <strong>GPT-4, GPT-4-32k, Claude-2, Claude-2-100k, and more.</strong> <br>
16+
This free API allows you to use various AI chat models, including <strong>GPT-4, GPT-4-32k, llama-2 and more.</strong> <br>
1717
Check out the project here: [FreeGPT WebUI - Chimera Version](https://github.com/ramonvc/freegpt-webui/tree/chimeragpt-version).
1818

1919
## Project Hosting and Demonstration 🌐🚀

client/css/settings.css

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
.settings-container {
2-
margin: 24px 0px 8px 0px;
3-
justify-content: center;
2+
color: var(--colour-2);
3+
margin: 24px 0px 8px 0px;
4+
justify-content: center;
45
}
56

67
.settings-container span {
7-
font-size: 0.875rem;
8-
margin: 0;
8+
font-size: 0.875rem;
9+
margin: 0;
910
}
1011

1112
.settings-container label {
12-
width: 24px;
13-
height: 16px;
13+
width: 24px;
14+
height: 16px;
1415
}
1516

1617
.settings-container .field {
17-
justify-content: space-between;
18+
justify-content: space-between;
1819
}
1920

2021
.settings-container .checkbox input + label,
@@ -28,17 +29,16 @@
2829
}
2930

3031
.settings-container .checkbox label:after {
31-
left: 2px;
32-
width: 10px;
33-
height: 10px;
32+
left: 2px;
33+
width: 10px;
34+
height: 10px;
3435
}
3536

3637
.settings-container .checkbox input:checked + label:after {
37-
left: calc(100% - 2px - 10px);
38+
left: calc(100% - 2px - 10px);
3839
}
3940

4041
.settings-container .dropdown {
41-
padding: 4px 8px;
42-
font-size: 0.75rem;
42+
padding: 4px 8px;
43+
font-size: 0.75rem;
4344
}
44-

g4f/active_providers.py

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import uuid
2+
import g4f
3+
from g4f import ChatCompletion
4+
5+
TEST_PROMPT = "Generate a sentence with 'ocean'"
6+
EXPECTED_RESPONSE_CONTAINS = "ocean"
7+
8+
9+
class Provider:
10+
def __init__(self, name, models):
11+
"""
12+
Initialize the provider with its name and models.
13+
"""
14+
self.name = name
15+
self.models = models if isinstance(models, list) else [models]
16+
17+
def __str__(self):
18+
return self.name
19+
20+
21+
class ModelProviderManager:
22+
def __init__(self):
23+
"""
24+
Initialize the manager that manages the working (active) providers for each model.
25+
"""
26+
self._working_model_providers = {}
27+
28+
def add_provider(self, model, provider_name):
29+
"""
30+
Add a provider to the working provider list of the specified model.
31+
"""
32+
if model not in self._working_model_providers:
33+
self._working_model_providers[model] = []
34+
self._working_model_providers[model].append(provider_name)
35+
36+
def get_working_providers(self):
37+
"""
38+
Return the currently active providers for each model.
39+
"""
40+
return self._working_model_providers
41+
42+
43+
def _fetch_providers_having_models():
44+
"""
45+
Get providers that have models from g4f.Providers.
46+
"""
47+
model_providers = []
48+
49+
for provider_name in dir(g4f.Provider):
50+
provider = getattr(g4f.Provider, provider_name)
51+
52+
if _is_provider_applicable(provider):
53+
model_providers.append(Provider(provider_name, provider.model))
54+
55+
return model_providers
56+
57+
58+
def _is_provider_applicable(provider):
59+
"""
60+
Check if the provider has a model and doesn't require authentication.
61+
"""
62+
return (hasattr(provider, 'model') and
63+
hasattr(provider, '_create_completion') and
64+
hasattr(provider, 'needs_auth') and
65+
not provider.needs_auth)
66+
67+
68+
def _generate_test_messages():
69+
"""
70+
Generate messages for testing.
71+
"""
72+
return [{"role": "system", "content": "You are a trained AI assistant."},
73+
{"role": "user", "content": TEST_PROMPT}]
74+
75+
76+
def _manage_chat_completion(manager, model_providers, test_messages):
77+
"""
78+
Generate chat completion for each provider's models and handle positive and negative results.
79+
"""
80+
for provider in model_providers:
81+
for model in provider.models:
82+
try:
83+
response = _generate_chat_response(
84+
provider.name, model, test_messages)
85+
if EXPECTED_RESPONSE_CONTAINS in response.lower():
86+
_print_success_response(provider, model)
87+
manager.add_provider(model, provider.name)
88+
else:
89+
raise Exception(f"Unexpected response: {response}")
90+
except Exception as error:
91+
_print_error_response(provider, model, error)
92+
93+
94+
def _generate_chat_response(provider_name, model, test_messages):
95+
"""
96+
Generate a chat response given a provider name, a model, and test messages.
97+
"""
98+
return ChatCompletion.create(
99+
model=model,
100+
messages=test_messages,
101+
chatId=str(uuid.uuid4()),
102+
provider=getattr(g4f.Provider, provider_name)
103+
)
104+
105+
106+
def _print_success_response(provider, model):
107+
print(f"\u2705 [{provider}] - [{model}]: Success")
108+
109+
110+
def _print_error_response(provider, model, error):
111+
print(f"\u26D4 [{provider}] - [{model}]: Error - {str(error)}")
112+
113+
114+
def get_active_model_providers():
115+
"""
116+
Get providers that are currently working (active).
117+
"""
118+
model_providers = _fetch_providers_having_models()
119+
test_messages = _generate_test_messages()
120+
manager = ModelProviderManager()
121+
122+
_manage_chat_completion(manager, model_providers, test_messages)
123+
124+
return manager.get_working_providers()

get_working_providers.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from g4f.active_providers import get_active_model_providers
2+
3+
working_providers = get_active_model_providers()
4+
5+
print("\nWorking providers by model:")
6+
for model, providers in working_providers.items():
7+
print(f"{model}: {', '.join(providers)}")

0 commit comments

Comments
 (0)