diff options
author | Tekky <98614666+xtekky@users.noreply.github.com> | 2023-10-04 10:40:18 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-04 10:40:18 +0200 |
commit | 6eb3fa3e5fa5675363dc09209cf77fba0542a506 (patch) | |
tree | 0ca69953cbf4820667500a195c8f97c5da75c88e | |
parent | ~ | g4f v-0.1.4.6 `pip install -U g4f` (diff) | |
parent | Sort providers in new dirs (diff) | |
download | gpt4free-6eb3fa3e5fa5675363dc09209cf77fba0542a506.tar gpt4free-6eb3fa3e5fa5675363dc09209cf77fba0542a506.tar.gz gpt4free-6eb3fa3e5fa5675363dc09209cf77fba0542a506.tar.bz2 gpt4free-6eb3fa3e5fa5675363dc09209cf77fba0542a506.tar.lz gpt4free-6eb3fa3e5fa5675363dc09209cf77fba0542a506.tar.xz gpt4free-6eb3fa3e5fa5675363dc09209cf77fba0542a506.tar.zst gpt4free-6eb3fa3e5fa5675363dc09209cf77fba0542a506.zip |
-rw-r--r-- | g4f/Provider/AItianhu.py | 2 | ||||
-rw-r--r-- | g4f/Provider/AItianhuSpace.py | 2 | ||||
-rw-r--r-- | g4f/Provider/DeepAi.py | 4 | ||||
-rw-r--r-- | g4f/Provider/__init__.py | 22 | ||||
-rw-r--r-- | g4f/Provider/deprecated/AiService.py (renamed from g4f/Provider/AiService.py) | 4 | ||||
-rw-r--r-- | g4f/Provider/deprecated/CodeLinkAva.py (renamed from g4f/Provider/CodeLinkAva.py) | 6 | ||||
-rw-r--r-- | g4f/Provider/deprecated/DfeHub.py (renamed from g4f/Provider/DfeHub.py) | 4 | ||||
-rw-r--r-- | g4f/Provider/deprecated/EasyChat.py (renamed from g4f/Provider/EasyChat.py) | 4 | ||||
-rw-r--r-- | g4f/Provider/deprecated/Equing.py (renamed from g4f/Provider/Equing.py) | 4 | ||||
-rw-r--r-- | g4f/Provider/deprecated/FastGpt.py (renamed from g4f/Provider/FastGpt.py) | 5 | ||||
-rw-r--r-- | g4f/Provider/deprecated/Forefront.py (renamed from g4f/Provider/Forefront.py) | 4 | ||||
-rw-r--r-- | g4f/Provider/deprecated/GetGpt.py (renamed from g4f/Provider/GetGpt.py) | 4 | ||||
-rw-r--r-- | g4f/Provider/deprecated/Lockchat.py (renamed from g4f/Provider/Lockchat.py) | 4 | ||||
-rw-r--r-- | g4f/Provider/deprecated/Opchatgpts.py (renamed from g4f/Provider/Opchatgpts.py) | 2 | ||||
-rw-r--r-- | g4f/Provider/deprecated/PerplexityAi.py (renamed from g4f/Provider/PerplexityAi.py) | 2 | ||||
-rw-r--r-- | g4f/Provider/deprecated/V50.py (renamed from g4f/Provider/V50.py) | 4 | ||||
-rw-r--r-- | g4f/Provider/deprecated/Wewordle.py (renamed from g4f/Provider/Wewordle.py) | 2 | ||||
-rw-r--r-- | g4f/Provider/deprecated/Wuguokai.py (renamed from g4f/Provider/Wuguokai.py) | 4 | ||||
-rw-r--r-- | g4f/Provider/deprecated/__init__.py | 14 | ||||
-rw-r--r-- | g4f/Provider/helper.py | 23 | ||||
-rw-r--r-- | g4f/Provider/needs_auth/Bard.py (renamed from g4f/Provider/Bard.py) | 2 | ||||
-rw-r--r-- | g4f/Provider/needs_auth/HuggingChat.py (renamed from g4f/Provider/HuggingChat.py) | 4 | ||||
-rw-r--r-- | g4f/Provider/needs_auth/OpenAssistant.py (renamed from g4f/Provider/OpenAssistant.py) | 6 | ||||
-rw-r--r-- | g4f/Provider/needs_auth/OpenaiChat.py (renamed from g4f/Provider/OpenaiChat.py) | 53 | ||||
-rw-r--r-- | g4f/Provider/needs_auth/Raycast.py (renamed from g4f/Provider/Raycast.py) | 4 | ||||
-rw-r--r-- | g4f/Provider/needs_auth/Theb.py (renamed from g4f/Provider/Theb.py) | 4 | ||||
-rw-r--r-- | g4f/Provider/needs_auth/__init__.py | 6 | ||||
-rw-r--r-- | g4f/models.py | 4 | ||||
-rw-r--r-- | testing/test_providers.py | 20 |
29 files changed, 107 insertions, 116 deletions
diff --git a/g4f/Provider/AItianhu.py b/g4f/Provider/AItianhu.py index 42631d7e..1d8653b7 100644 --- a/g4f/Provider/AItianhu.py +++ b/g4f/Provider/AItianhu.py @@ -38,6 +38,8 @@ class AItianhu(AsyncGeneratorProvider): async with session.post(f"{cls.url}/api/chat-process", json=data) as response: response.raise_for_status() async for line in response.iter_lines(): + if line == b"<script>": + raise RuntimeError("Solve Challenge") if b"platform's risk control" in line: raise RuntimeError("Platform's Risk Control") line = json.loads(line) diff --git a/g4f/Provider/AItianhuSpace.py b/g4f/Provider/AItianhuSpace.py index a6bf9a58..27f2b1fa 100644 --- a/g4f/Provider/AItianhuSpace.py +++ b/g4f/Provider/AItianhuSpace.py @@ -52,6 +52,8 @@ class AItianhuSpace(AsyncGeneratorProvider): async with session.post(f"{url}/api/chat-process", json=data, headers=headers) as response: response.raise_for_status() async for line in response.iter_lines(): + if line == b"<script>": + raise RuntimeError("Solve Challenge") if b"platform's risk control" in line: raise RuntimeError("Platform's Risk Control") line = json.loads(line) diff --git a/g4f/Provider/DeepAi.py b/g4f/Provider/DeepAi.py index f08f17bb..7239f6ac 100644 --- a/g4f/Provider/DeepAi.py +++ b/g4f/Provider/DeepAi.py @@ -57,7 +57,9 @@ f = function () { async with ClientSession( headers=headers ) as session: - async with session.post("https://api.deepai.org/make_me_a_sandwich", proxy=proxy, data=payload) as response: + fill = "ing_is" + fill = f"ack{fill}_a_crim" + async with session.post(f"https://api.deepai.org/h{fill}e", proxy=proxy, data=payload) as response: response.raise_for_status() async for stream in response.content.iter_any(): if stream: diff --git a/g4f/Provider/__init__.py b/g4f/Provider/__init__.py index 2ac4191b..72a459c2 100644 --- a/g4f/Provider/__init__.py +++ b/g4f/Provider/__init__.py @@ -3,50 +3,32 @@ from .Acytoo import Acytoo from .Aibn import Aibn from .Aichat import Aichat from .Ails import Ails -from .AiService import AiService from .AItianhu import AItianhu from .AItianhuSpace import AItianhuSpace from .Aivvm import Aivvm -from .Bard import Bard from .Bing import Bing from .ChatBase import ChatBase from .ChatForAi import ChatForAi from .ChatgptAi import ChatgptAi from .ChatgptDuo import ChatgptDuo from .ChatgptLogin import ChatgptLogin -from .CodeLinkAva import CodeLinkAva from .DeepAi import DeepAi -from .DfeHub import DfeHub -from .EasyChat import EasyChat -from .Forefront import Forefront from .FreeGpt import FreeGpt -from .GetGpt import GetGpt from .GptGo import GptGo from .H2o import H2o -from .HuggingChat import HuggingChat from .Liaobots import Liaobots -from .Lockchat import Lockchat from .Myshell import Myshell -from .Opchatgpts import Opchatgpts -from .OpenaiChat import OpenaiChat -from .OpenAssistant import OpenAssistant -from .PerplexityAi import PerplexityAi from .Phind import Phind -from .Raycast import Raycast -from .Theb import Theb from .Vercel import Vercel from .Vitalentum import Vitalentum -from .Wewordle import Wewordle from .Ylokh import Ylokh from .You import You from .Yqcloud import Yqcloud -from .Equing import Equing -from .FastGpt import FastGpt -from .V50 import V50 -from .Wuguokai import Wuguokai from .base_provider import BaseProvider, AsyncProvider, AsyncGeneratorProvider from .retry_provider import RetryProvider +from .deprecated import * +from .needs_auth import * __all__ = [ 'BaseProvider', diff --git a/g4f/Provider/AiService.py b/g4f/Provider/deprecated/AiService.py index 2b5a6e7d..9b41e3c8 100644 --- a/g4f/Provider/AiService.py +++ b/g4f/Provider/deprecated/AiService.py @@ -2,8 +2,8 @@ from __future__ import annotations import requests -from ..typing import Any, CreateResult -from .base_provider import BaseProvider +from ...typing import Any, CreateResult +from ..base_provider import BaseProvider class AiService(BaseProvider): diff --git a/g4f/Provider/CodeLinkAva.py b/g4f/Provider/deprecated/CodeLinkAva.py index e3b3eb3e..8407ebb9 100644 --- a/g4f/Provider/CodeLinkAva.py +++ b/g4f/Provider/deprecated/CodeLinkAva.py @@ -3,14 +3,14 @@ from __future__ import annotations from aiohttp import ClientSession import json -from ..typing import AsyncGenerator -from .base_provider import AsyncGeneratorProvider +from ...typing import AsyncGenerator +from ..base_provider import AsyncGeneratorProvider class CodeLinkAva(AsyncGeneratorProvider): url = "https://ava-ai-ef611.web.app" supports_gpt_35_turbo = True - working = True + working = False @classmethod async def create_async_generator( diff --git a/g4f/Provider/DfeHub.py b/g4f/Provider/deprecated/DfeHub.py index d40e0380..4ea7501f 100644 --- a/g4f/Provider/DfeHub.py +++ b/g4f/Provider/deprecated/DfeHub.py @@ -6,8 +6,8 @@ import time import requests -from ..typing import Any, CreateResult -from .base_provider import BaseProvider +from ...typing import Any, CreateResult +from ..base_provider import BaseProvider class DfeHub(BaseProvider): diff --git a/g4f/Provider/EasyChat.py b/g4f/Provider/deprecated/EasyChat.py index dae5196d..ffe9a785 100644 --- a/g4f/Provider/EasyChat.py +++ b/g4f/Provider/deprecated/EasyChat.py @@ -5,8 +5,8 @@ import random import requests -from ..typing import Any, CreateResult -from .base_provider import BaseProvider +from ...typing import Any, CreateResult +from ..base_provider import BaseProvider class EasyChat(BaseProvider): diff --git a/g4f/Provider/Equing.py b/g4f/Provider/deprecated/Equing.py index 261c53c0..794274f2 100644 --- a/g4f/Provider/Equing.py +++ b/g4f/Provider/deprecated/Equing.py @@ -5,8 +5,8 @@ from abc import ABC, abstractmethod import requests -from ..typing import Any, CreateResult -from .base_provider import BaseProvider +from ...typing import Any, CreateResult +from ..base_provider import BaseProvider class Equing(BaseProvider): diff --git a/g4f/Provider/FastGpt.py b/g4f/Provider/deprecated/FastGpt.py index ef47f752..65efa29d 100644 --- a/g4f/Provider/FastGpt.py +++ b/g4f/Provider/deprecated/FastGpt.py @@ -6,10 +6,11 @@ from abc import ABC, abstractmethod import requests -from ..typing import Any, CreateResult +from ...typing import Any, CreateResult +from ..base_provider import BaseProvider -class FastGpt(ABC): +class FastGpt(BaseProvider): url: str = 'https://chat9.fastgpt.me/' working = False needs_auth = False diff --git a/g4f/Provider/Forefront.py b/g4f/Provider/deprecated/Forefront.py index 8f51fb57..2f807e91 100644 --- a/g4f/Provider/Forefront.py +++ b/g4f/Provider/deprecated/Forefront.py @@ -4,8 +4,8 @@ import json import requests -from ..typing import Any, CreateResult -from .base_provider import BaseProvider +from ...typing import Any, CreateResult +from ..base_provider import BaseProvider class Forefront(BaseProvider): diff --git a/g4f/Provider/GetGpt.py b/g4f/Provider/deprecated/GetGpt.py index b96efaac..a5de1d29 100644 --- a/g4f/Provider/GetGpt.py +++ b/g4f/Provider/deprecated/GetGpt.py @@ -7,8 +7,8 @@ import uuid import requests from Crypto.Cipher import AES -from ..typing import Any, CreateResult -from .base_provider import BaseProvider +from ...typing import Any, CreateResult +from ..base_provider import BaseProvider class GetGpt(BaseProvider): diff --git a/g4f/Provider/Lockchat.py b/g4f/Provider/deprecated/Lockchat.py index c15eec8d..4bd7c5fe 100644 --- a/g4f/Provider/Lockchat.py +++ b/g4f/Provider/deprecated/Lockchat.py @@ -4,8 +4,8 @@ import json import requests -from ..typing import Any, CreateResult -from .base_provider import BaseProvider +from ...typing import Any, CreateResult +from ..base_provider import BaseProvider class Lockchat(BaseProvider): diff --git a/g4f/Provider/Opchatgpts.py b/g4f/Provider/deprecated/Opchatgpts.py index 166323bd..3bfb96f1 100644 --- a/g4f/Provider/Opchatgpts.py +++ b/g4f/Provider/deprecated/Opchatgpts.py @@ -1,6 +1,6 @@ from __future__ import annotations -from .ChatgptLogin import ChatgptLogin +from ..ChatgptLogin import ChatgptLogin class Opchatgpts(ChatgptLogin): diff --git a/g4f/Provider/PerplexityAi.py b/g4f/Provider/deprecated/PerplexityAi.py index c7e58ad3..f4f71712 100644 --- a/g4f/Provider/PerplexityAi.py +++ b/g4f/Provider/deprecated/PerplexityAi.py @@ -5,7 +5,7 @@ import time import base64 from curl_cffi.requests import AsyncSession -from .base_provider import AsyncProvider, format_prompt, get_cookies +from ..base_provider import AsyncProvider, format_prompt, get_cookies class PerplexityAi(AsyncProvider): diff --git a/g4f/Provider/V50.py b/g4f/Provider/deprecated/V50.py index 81a95ba8..9a8b032c 100644 --- a/g4f/Provider/V50.py +++ b/g4f/Provider/deprecated/V50.py @@ -4,8 +4,8 @@ import uuid import requests -from ..typing import Any, CreateResult -from .base_provider import BaseProvider +from ...typing import Any, CreateResult +from ..base_provider import BaseProvider class V50(BaseProvider): diff --git a/g4f/Provider/Wewordle.py b/g4f/Provider/deprecated/Wewordle.py index 26d040c3..c30887fb 100644 --- a/g4f/Provider/Wewordle.py +++ b/g4f/Provider/deprecated/Wewordle.py @@ -3,7 +3,7 @@ from __future__ import annotations import random, string, time from aiohttp import ClientSession -from .base_provider import AsyncProvider +from ..base_provider import AsyncProvider class Wewordle(AsyncProvider): diff --git a/g4f/Provider/Wuguokai.py b/g4f/Provider/deprecated/Wuguokai.py index 0a46f6ee..311131cf 100644 --- a/g4f/Provider/Wuguokai.py +++ b/g4f/Provider/deprecated/Wuguokai.py @@ -4,8 +4,8 @@ import random import requests -from ..typing import Any, CreateResult -from .base_provider import BaseProvider, format_prompt +from ...typing import Any, CreateResult +from ..base_provider import BaseProvider, format_prompt class Wuguokai(BaseProvider): diff --git a/g4f/Provider/deprecated/__init__.py b/g4f/Provider/deprecated/__init__.py new file mode 100644 index 00000000..8d22a3c3 --- /dev/null +++ b/g4f/Provider/deprecated/__init__.py @@ -0,0 +1,14 @@ +from .AiService import AiService +from .CodeLinkAva import CodeLinkAva +from .DfeHub import DfeHub +from .EasyChat import EasyChat +from .Forefront import Forefront +from .GetGpt import GetGpt +from .Opchatgpts import Opchatgpts +from .Lockchat import Lockchat +from .PerplexityAi import PerplexityAi +from .Wewordle import Wewordle +from .Equing import Equing +from .Wuguokai import Wuguokai +from .V50 import V50 +from .FastGpt import FastGpt
\ No newline at end of file diff --git a/g4f/Provider/helper.py b/g4f/Provider/helper.py index 8f09239a..c127f241 100644 --- a/g4f/Provider/helper.py +++ b/g4f/Provider/helper.py @@ -2,7 +2,7 @@ from __future__ import annotations import asyncio, sys from asyncio import AbstractEventLoop - +from os import path import browser_cookie3 # Change event loop policy on windows @@ -60,24 +60,11 @@ def format_prompt(messages: list[dict[str, str]], add_special_tokens=False): def get_browser(user_data_dir: str = None): - try: - from undetected_chromedriver import Chrome - except ImportError: - return None + from undetected_chromedriver import Chrome + from platformdirs import user_config_dir - def get_user_data_dir(): - dirs = [ - '~/.config/google-chrome/Default', - '~/.var/app/com.google.Chrome/config/google-chrome/Default', - '%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default', - '~/Library/Application Support/Google/Chrome/Default', - ] - from os import path - for dir in dirs: - dir = path.expandvars(dir) - if path.exists(dir): - return dir if not user_data_dir: - user_data_dir = get_user_data_dir() + user_data_dir = user_config_dir("g4f") + user_data_dir = path.join(user_data_dir, "Default") return Chrome(user_data_dir=user_data_dir)
\ No newline at end of file diff --git a/g4f/Provider/Bard.py b/g4f/Provider/needs_auth/Bard.py index 4e076378..7c42b680 100644 --- a/g4f/Provider/Bard.py +++ b/g4f/Provider/needs_auth/Bard.py @@ -6,7 +6,7 @@ import re from aiohttp import ClientSession -from .base_provider import AsyncProvider, format_prompt, get_cookies +from ..base_provider import AsyncProvider, format_prompt, get_cookies class Bard(AsyncProvider): diff --git a/g4f/Provider/HuggingChat.py b/g4f/Provider/needs_auth/HuggingChat.py index f1cec775..1d500338 100644 --- a/g4f/Provider/HuggingChat.py +++ b/g4f/Provider/needs_auth/HuggingChat.py @@ -4,8 +4,8 @@ import json, uuid from aiohttp import ClientSession -from ..typing import AsyncGenerator -from .base_provider import AsyncGeneratorProvider, format_prompt, get_cookies +from ...typing import AsyncGenerator +from ..base_provider import AsyncGeneratorProvider, format_prompt, get_cookies class HuggingChat(AsyncGeneratorProvider): diff --git a/g4f/Provider/OpenAssistant.py b/g4f/Provider/needs_auth/OpenAssistant.py index 1e9a0661..3b0e0424 100644 --- a/g4f/Provider/OpenAssistant.py +++ b/g4f/Provider/needs_auth/OpenAssistant.py @@ -4,14 +4,14 @@ import json from aiohttp import ClientSession -from ..typing import Any, AsyncGenerator -from .base_provider import AsyncGeneratorProvider, format_prompt, get_cookies +from ...typing import Any, AsyncGenerator +from ..base_provider import AsyncGeneratorProvider, format_prompt, get_cookies class OpenAssistant(AsyncGeneratorProvider): url = "https://open-assistant.io/chat" needs_auth = True - working = True + working = False model = "OA_SFT_Llama_30B_6" @classmethod diff --git a/g4f/Provider/OpenaiChat.py b/g4f/Provider/needs_auth/OpenaiChat.py index fbd26d7c..c57692d3 100644 --- a/g4f/Provider/OpenaiChat.py +++ b/g4f/Provider/needs_auth/OpenaiChat.py @@ -1,12 +1,11 @@ from __future__ import annotations -import uuid -import json +import uuid, json, time -from .base_provider import AsyncGeneratorProvider -from .helper import get_browser, get_cookies, format_prompt -from ..typing import AsyncGenerator -from ..requests import StreamSession +from ..base_provider import AsyncGeneratorProvider +from ..helper import get_browser, get_cookies, format_prompt +from ...typing import AsyncGenerator +from ...requests import StreamSession class OpenaiChat(AsyncGeneratorProvider): url = "https://chat.openai.com" @@ -56,23 +55,26 @@ class OpenaiChat(AsyncGeneratorProvider): line = line[6:] if line == b"[DONE]": break - line = json.loads(line) - if "message" in line and not line["message"]["end_turn"]: + try: + line = json.loads(line) + except: + continue + if "message" not in line or "message_type" not in line["message"]["metadata"]: + continue + if line["message"]["metadata"]["message_type"] == "next": new_message = line["message"]["content"]["parts"][0] yield new_message[len(last_message):] last_message = new_message @classmethod - def fetch_access_token(cls) -> str: + def browse_access_token(cls) -> str: try: from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC - except ImportError: - return - driver = get_browser() - if not driver: + driver = get_browser() + except ImportError: return driver.get(f"{cls.url}/") @@ -83,21 +85,28 @@ class OpenaiChat(AsyncGeneratorProvider): javascript = "return (await (await fetch('/api/auth/session')).json())['accessToken']" return driver.execute_script(javascript) finally: + time.sleep(1) driver.quit() @classmethod + async def fetch_access_token(cls, cookies: dict, proxies: dict = None) -> str: + async with StreamSession(proxies=proxies, cookies=cookies, impersonate="chrome107") as session: + async with session.get(f"{cls.url}/api/auth/session") as response: + response.raise_for_status() + auth = await response.json() + if "accessToken" in auth: + return auth["accessToken"] + + @classmethod async def get_access_token(cls, cookies: dict = None, proxies: dict = None) -> str: if not cls._access_token: cookies = cookies if cookies else get_cookies("chat.openai.com") - async with StreamSession(proxies=proxies, cookies=cookies, impersonate="chrome107") as session: - async with session.get(f"{cls.url}/api/auth/session") as response: - response.raise_for_status() - auth = await response.json() - if "accessToken" in auth: - cls._access_token = auth["accessToken"] - cls._access_token = cls.fetch_access_token() - if not cls._access_token: - raise RuntimeError("Missing access token") + if cookies: + cls._access_token = await cls.fetch_access_token(cookies, proxies) + if not cls._access_token: + cls._access_token = cls.browse_access_token() + if not cls._access_token: + raise RuntimeError("Read access token failed") return cls._access_token @classmethod diff --git a/g4f/Provider/Raycast.py b/g4f/Provider/needs_auth/Raycast.py index 7ddc8acd..619b217b 100644 --- a/g4f/Provider/Raycast.py +++ b/g4f/Provider/needs_auth/Raycast.py @@ -4,8 +4,8 @@ import json import requests -from ..typing import Any, CreateResult -from .base_provider import BaseProvider +from ...typing import Any, CreateResult +from ..base_provider import BaseProvider class Raycast(BaseProvider): diff --git a/g4f/Provider/Theb.py b/g4f/Provider/needs_auth/Theb.py index 72fce3ac..c35ea592 100644 --- a/g4f/Provider/Theb.py +++ b/g4f/Provider/needs_auth/Theb.py @@ -5,8 +5,8 @@ import random import requests -from ..typing import Any, CreateResult -from .base_provider import BaseProvider +from ...typing import Any, CreateResult +from ..base_provider import BaseProvider class Theb(BaseProvider): diff --git a/g4f/Provider/needs_auth/__init__.py b/g4f/Provider/needs_auth/__init__.py new file mode 100644 index 00000000..815194c4 --- /dev/null +++ b/g4f/Provider/needs_auth/__init__.py @@ -0,0 +1,6 @@ +from .Bard import Bard +from .Raycast import Raycast +from .Theb import Theb +from .HuggingChat import HuggingChat +from .OpenaiChat import OpenaiChat +from .OpenAssistant import OpenAssistant
\ No newline at end of file diff --git a/g4f/models.py b/g4f/models.py index 6b27645a..4a6c9faf 100644 --- a/g4f/models.py +++ b/g4f/models.py @@ -61,9 +61,7 @@ gpt_35_turbo = Model( gpt_4 = Model( name = 'gpt-4', base_provider = 'openai', - best_provider = RetryProvider([ - Myshell, Ylokh, - ]) + best_provider = Bing ) # Bard diff --git a/testing/test_providers.py b/testing/test_providers.py index d328f730..ec0e0271 100644 --- a/testing/test_providers.py +++ b/testing/test_providers.py @@ -33,22 +33,10 @@ def main(): def get_providers() -> list[type[BaseProvider]]: - provider_names = dir(Provider) - ignore_names = [ - "annotations", - "helper", - "base_provider", - "retry_provider", - "BaseProvider", - "AsyncProvider", - "AsyncGeneratorProvider", - "RetryProvider", - ] - return [ - getattr(Provider, provider_name) - for provider_name in provider_names - if not provider_name.startswith("__") and provider_name not in ignore_names - ] + providers = dir(Provider) + providers = [getattr(Provider, provider) for provider in providers if provider != "RetryProvider"] + providers = [provider for provider in providers if isinstance(provider, type)] + return [provider for provider in providers if issubclass(provider, BaseProvider)] def create_response(_provider: type[BaseProvider]) -> str: |