返回提交历史
Modified
g4f/client/client.py
+8
-9
Modified
g4f/models.py
+0
-42
XFEstudio/gpt4free
The prefix function has been removed
e6627d8d
代码差异
2 个文件
+8
-51
@@ -184,12 +184,8 @@ class Completions:
184
184
ignore_stream: bool = False,
185
185
**kwargs
186
186
) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]:
187
# We use ModelUtils to obtain the model object.
188
model_instance = ModelUtils.get_model(model)
189
190
# We receive the model and the provider.
191
model_name, provider = get_model_and_provider(
192
model_instance.name, # We use the model name from the object.
187
model, provider = get_model_and_provider(
188
model,
193
189
self.provider if provider is None else provider,
194
190
stream,
195
191
ignored,
@@ -200,8 +196,9 @@ class Completions:
200
196
stop = [stop] if isinstance(stop, str) else stop
201
197
202
198
if asyncio.iscoroutinefunction(provider.create_completion):
199
# Run the asynchronous function in an event loop
203
200
response = asyncio.run(provider.create_completion(
204
model_name, # We use a model based on the object.
201
model,
205
202
messages,
206
203
stream=stream,
207
204
**filter_none(
@@ -214,7 +211,7 @@ class Completions:
214
211
))
215
212
else:
216
213
response = provider.create_completion(
217
model_name, # We use a model from the object.
214
model,
218
215
messages,
219
216
stream=stream,
220
217
**filter_none(
@@ -228,19 +225,21 @@ class Completions:
228
225
229
226
if stream:
230
227
if hasattr(response, '__aiter__'):
228
# It's an async generator, wrap it into a sync iterator
231
229
response = to_sync_iter(response)
232
230
231
# Now 'response' is an iterator
233
232
response = iter_response(response, stream, response_format, max_tokens, stop)
234
233
response = iter_append_model_and_provider(response)
235
234
return response
236
235
else:
237
236
if hasattr(response, '__aiter__'):
237
# If response is an async generator, collect it into a list
238
238
response = list(to_sync_iter(response))
239
239
response = iter_response(response, stream, response_format, max_tokens, stop)
240
240
response = iter_append_model_and_provider(response)
241
241
return next(response)
242
242
243
244
243
async def async_create(
245
244
self,
246
245
messages: Messages,
@@ -891,17 +891,6 @@ any_dark = Model(
891
891
892
892
)
893
893
894
895
class ModelVersions:
896
# Global Prefixes for All Models
897
GLOBAL_PREFIXES = [":latest"]
898
899
# Specific Prefixes for Particular Models
900
MODEL_SPECIFIC_PREFIXES = {
901
#frozenset(["gpt-3.5-turbo", "gpt-4"]): [":custom1", ":custom2"]
902
#frozenset(["gpt-3.5-turbo"]): [":custom"],
903
}
904
905
894
class ModelUtils:
906
895
"""
907
896
Utility class for mapping string identifiers to Model instances.
@@ -1174,35 +1163,4 @@ class ModelUtils:
1174
1163
'any-dark': any_dark,
1175
1164
}
1176
1165
1177
@classmethod
1178
def get_model(cls, model_name: str) -> Model:
1179
# Checking for specific prefixes
1180
for model_set, specific_prefixes in ModelVersions.MODEL_SPECIFIC_PREFIXES.items():
1181
for prefix in specific_prefixes:
1182
if model_name.endswith(prefix):
1183
base_name = model_name[:-len(prefix)]
1184
if base_name in model_set:
1185
return cls.convert.get(base_name, None)
1186
1187
# Check for global prefixes
1188
for prefix in ModelVersions.GLOBAL_PREFIXES:
1189
if model_name.endswith(prefix):
1190
base_name = model_name[:-len(prefix)]
1191
return cls.convert.get(base_name, None)
1192
1193
# Check without prefix
1194
if model_name in cls.convert:
1195
return cls.convert[model_name]
1196
1197
raise KeyError(f"Model {model_name} not found")
1198
1199
@classmethod
1200
def get_available_versions(cls, model_name: str) -> list[str]:
1201
# Obtaining prefixes for a specific model
1202
prefixes = ModelVersions.GLOBAL_PREFIXES.copy()
1203
for model_set, specific_prefixes in ModelVersions.MODEL_SPECIFIC_PREFIXES.items():
1204
if model_name in model_set:
1205
prefixes.extend(specific_prefixes)
1206
return prefixes
1207
1208
1166
_all_models = list(ModelUtils.convert.keys())