You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gpt4free/g4f/__init__.py

116 lines
3.6 KiB
Python

from __future__ import annotations
11 months ago
from requests import get
from g4f.models import Model, ModelUtils
from .Provider import BaseProvider
from .typing import Messages, CreateResult, Union
11 months ago
from .debug import logging
version = '0.1.6.1'
version_check = True
11 months ago
def check_pypi_version() -> None:
try:
11 months ago
response = get("https://pypi.org/pypi/g4f/json").json()
latest_version = response["info"]["version"]
11 months ago
if version != latest_version:
print(f'New pypi version: {latest_version} (current: {version}) | pip install -U g4f')
11 months ago
except Exception as e:
print(f'Failed to check g4f pypi version: {e}')
def get_model_and_provider(model : Union[Model, str],
provider : Union[type[BaseProvider], None],
stream : bool) -> tuple[Model, type[BaseProvider]]:
if isinstance(model, str):
11 months ago
if model in ModelUtils.convert:
model = ModelUtils.convert[model]
else:
raise ValueError(f'The model: {model} does not exist')
if not provider:
11 months ago
provider = model.best_provider
if not provider:
raise RuntimeError(f'No provider found for model: {model}')
11 months ago
if not provider.working:
raise RuntimeError(f'{provider.__name__} is not working')
11 months ago
if not provider.supports_stream and stream:
raise ValueError(f'{provider.__name__} does not support "stream" argument')
11 months ago
if logging:
print(f'Using {provider.__name__} provider')
return model, provider
class ChatCompletion:
@staticmethod
def create(
model: Union[Model, str],
messages : Messages,
provider : Union[type[BaseProvider], None] = None,
stream : bool = False,
auth : Union[str, None] = None,
**kwargs
) -> Union[CreateResult, str]:
model, provider = get_model_and_provider(model, provider, stream)
if provider.needs_auth and not auth:
raise ValueError(
f'{provider.__name__} requires authentication (use auth=\'cookie or token or jwt ...\' param)')
11 months ago
if provider.needs_auth:
kwargs['auth'] = auth
result = provider.create_completion(model.name, messages, stream, **kwargs)
return result if stream else ''.join(result)
@staticmethod
async def create_async(
11 months ago
model: Union[Model, str],
messages: Messages,
11 months ago
provider: Union[type[BaseProvider], None] = None,
stream: bool = False,
**kwargs
) -> str:
if stream:
raise ValueError(f'"create_async" does not support "stream" argument')
model, provider = get_model_and_provider(model, provider, False)
return await provider.create_async(model.name, messages, **kwargs)
class Completion:
@staticmethod
def create(
11 months ago
model: str,
prompt: str,
provider: Union[type[BaseProvider], None] = None,
stream: bool = False,
**kwargs
) -> Union[CreateResult, str]:
allowed_models = [
'code-davinci-002',
'text-ada-001',
'text-babbage-001',
'text-curie-001',
'text-davinci-002',
'text-davinci-003'
]
11 months ago
if model not in allowed_models:
raise Exception(f'ValueError: Can\'t use {model} with Completion.create()')
11 months ago
model, provider = get_model_and_provider(model, provider, stream)
11 months ago
result = provider.create_completion(model.name, [{"role": "user", "content": prompt}], stream, **kwargs)
return result if stream else ''.join(result)
if version_check:
check_pypi_version()