import random, string import sys from pathlib import Path sys.path.append(str(Path(__file__).parent.parent)) from g4f import BaseProvider, models, Provider def main(): providers = get_providers() results: list[list[str | bool]] = [] for _provider in providers: print("start", _provider.__name__) actual_working = judge(_provider) expected_working = _provider.working match = actual_working == expected_working results.append([_provider.__name__, expected_working, actual_working, match]) print("failed provider list") for result in results: if not result[3]: print(result) def get_providers() -> list[type[BaseProvider]]: provider_names = dir(Provider) ignore_names = [ "base_provider", "BaseProvider", ] provider_names = [ provider_name for provider_name in provider_names if not provider_name.startswith("__") and provider_name not in ignore_names ] return [getattr(Provider, provider_name) for provider_name in provider_names] def create_response(_provider: type[BaseProvider], _str: str) -> str: model = ( models.gpt_35_turbo.name if _provider is not Provider.H2o else models.falcon_7b.name ) response = _provider.create_completion( model=model, messages=[{"role": "user", "content": f"just output \"{_str}\""}], stream=False, ) return "".join(response) def judge(_provider: type[BaseProvider]) -> bool: if _provider.needs_auth: return _provider.working try: _str = "".join(random.choices(string.ascii_letters + string.digits, k=4)) response = create_response(_provider, _str) assert type(response) is str return len(response) > 1 and _str in response except Exception as e: print(f"{_provider.__name__}: {str(e)}") return False if __name__ == "__main__": main()