Skip to content

Commit f3d8d31

Browse files
committed
- added: Load variables from .env file.
- patch: Exclude selenium dependents providers from test. [#33](#33) - patch: Show more gpt4free models. - added: Test logging flag.
1 parent 25ff09f commit f3d8d31

File tree

6 files changed

+120
-17
lines changed

6 files changed

+120
-17
lines changed

docs/CHANGELOG.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,4 +406,13 @@ For instance:
406406

407407
**What's new?**
408408

409-
- added: Provider [poe](https://poe.com). Supports multiple models. Thanks to [snowby666/poe-api-wrapper](https://github.com/snowby666/poe-api-wrapper).
409+
- added: Provider [poe](https://poe.com). Supports multiple models. Thanks to [snowby666/poe-api-wrapper](https://github.com/snowby666/poe-api-wrapper).
410+
411+
## v0.5.1
412+
413+
**What's new?**
414+
415+
- added: Load variables from `.env` file.
416+
- patch: Exclude selenium dependents providers from test. [#33](https://github.com/Simatwa/python-tgpt/issues/33)
417+
- patch: Show more gpt4free models.
418+
- added: Test logging flag.

docs/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,9 @@ For example, for the option `--provider`, you would set an environment variable
557557

558558
The environment variables can be overridden by explicitly declaring new value.
559559

560+
> [!TIP]
561+
> Save the variables in a `.env` file in your current directory or export the them in your `.zshrc` file.
562+
560563
> [!NOTE]
561564
> This is not limited to any command.
562565

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ pyyaml==6.0.1
1212
matplotlib
1313
gpt4all==2.2.0
1414
poe-api-wrapper==1.3.6
15+
envist==0.0.4

setup.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"pyperclip==1.8.2",
2222
"colorama==0.4.6",
2323
"g4f>=0.2.1.2",
24+
"envist==0.0.4",
2425
]
2526

2627
EXTRA_REQUIRE = {
@@ -37,7 +38,7 @@
3738

3839
setup(
3940
name="python-tgpt",
40-
version="0.5.0",
41+
version="0.5.1",
4142
license="MIT",
4243
author="Smartwa",
4344
maintainer="Smartwa",
@@ -81,6 +82,7 @@
8182
"gpt4free",
8283
"gpt4all-cli",
8384
"gptcli",
85+
"poe-api",
8486
],
8587
long_description=Path.open("README.md", encoding="utf-8").read(),
8688
long_description_content_type="text/markdown",

src/pytgpt/console.py

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,12 @@
3131
from WebChatGPT.console import chat as webchatgpt
3232
from colorama import Fore
3333
from colorama import init as init_colorama
34+
from envist import Envist
3435

3536
init_colorama(autoreset=True)
3637

38+
Envist() # loads .env variables
39+
3740
logging.basicConfig(
3841
format="%(asctime)s - %(levelname)s : %(message)s ", # [%(module)s,%(lineno)s]", # for debug purposes
3942
datefmt="%H:%M:%S",
@@ -96,10 +99,18 @@ def run_system_command(
9699
return (False, e)
97100

98101
def g4f_providers_in_dict(
99-
url=True, working=True, stream=False, context=False, gpt35=False, gpt4=False
102+
url=True,
103+
working=True,
104+
stream=False,
105+
context=False,
106+
gpt35=False,
107+
gpt4=False,
108+
selenium=False,
100109
):
101110
from pytgpt import g4f
111+
import g4f.Provider.selenium as selenium_based
102112

113+
selenium_based_providers: list = dir(selenium_based)
103114
hunted_providers = []
104115
required_attrs = (
105116
"url",
@@ -132,6 +143,13 @@ def sanitize_provider(provider: object):
132143
provider_meta["gpt35_turbo"] = provider.supports_gpt_35_turbo
133144
if gpt4:
134145
provider_meta["gpt4"] = provider.supports_gpt_4
146+
if selenium:
147+
try:
148+
selenium_based_providers.index(provider_meta["name"])
149+
value = True
150+
except ValueError:
151+
value = False
152+
provider_meta["non_selenium"] = value
135153

136154
hunted_providers.append(provider_meta)
137155

@@ -1937,9 +1955,15 @@ def update(extra, log, sudo):
19371955
@click.option(
19381956
"-4", "--gpt4", is_flag=True, help="Restrict to providers supporting gpt4 model"
19391957
)
1958+
@click.option(
1959+
"-se",
1960+
"--selenium",
1961+
is_flag=True,
1962+
help="Restrict to selenium dependent providers",
1963+
)
19401964
@click.option("-j", "--json", is_flag=True, help="Format output in json")
19411965
@click.help_option("-h", "--help")
1942-
def show(target, working, url, stream, context, gpt35, gpt4, json):
1966+
def show(target, working, url, stream, context, gpt35, gpt4, selenium, json):
19431967
"""List available models and providers"""
19441968
available_targets = ["models", "providers"]
19451969
assert (
@@ -1959,15 +1983,14 @@ def show(target, working, url, stream, context, gpt35, gpt4, json):
19591983
context=context,
19601984
gpt35=gpt35,
19611985
gpt4=gpt4,
1986+
selenium=selenium,
19621987
),
19631988
)
19641989
)
19651990
)
1966-
hunted_providers = (
1967-
hunted_providers[1:]
1968-
if hunted_providers[0] is None
1969-
else hunted_providers
1970-
)
1991+
while None in hunted_providers:
1992+
hunted_providers.remove(None)
1993+
19711994
hunted_providers.sort()
19721995
if json:
19731996
rich.print_json(data=dict(providers=hunted_providers), indent=4)
@@ -2020,8 +2043,13 @@ def show(target, working, url, stream, context, gpt35, gpt4, json):
20202043
"llama7b-v2-chat",
20212044
],
20222045
)
2046+
for provider in pytgpt.g4f.Provider.__providers__:
2047+
if hasattr(provider, "models"):
2048+
models[provider.__name__] = provider.models
20232049
if json:
20242050
for key, value in models.items():
2051+
while None in value:
2052+
value.remove(None)
20252053
value.sort()
20262054
models[key] = value
20272055

@@ -2083,21 +2111,41 @@ def gui(port, address, debug, open):
20832111
help="Test n amount of providers at once",
20842112
default=5,
20852113
)
2086-
@click.option("-q", "--quiet", is_flag=True, help="Suppress all stdout")
2114+
@click.option("-q", "--quiet", is_flag=True, help="Suppress progress bar")
20872115
@click.option(
20882116
"-j", "--json", is_flag=True, help="Stdout test results in json format"
20892117
)
20902118
@click.option("-d", "--dry-test", is_flag=True, help="Return previous test results")
20912119
@click.option(
20922120
"-b", "--best", is_flag=True, help="Stdout the fastest provider <name only>"
20932121
)
2122+
@click.option(
2123+
"-se",
2124+
"--selenium",
2125+
help="Test even selenium dependent providers",
2126+
is_flag=True,
2127+
)
2128+
@click.option(
2129+
"-dl",
2130+
"--disable-logging",
2131+
is_flag=True,
2132+
help="Disable logging",
2133+
)
20942134
@click.option("-y", "--yes", is_flag=True, help="Okay to all confirmations")
20952135
@click.help_option("-h", "--help")
2096-
def test(timeout, thread, quiet, json, dry_test, best, yes):
2136+
def test(
2137+
timeout, thread, quiet, json, dry_test, best, selenium, disable_logging, yes
2138+
):
20972139
"""Test and save working providers"""
20982140
from pytgpt.gpt4free import utils
20992141

2100-
test = utils.TestProviders(test_at_once=thread, quiet=quiet, timeout=timeout)
2142+
test = utils.TestProviders(
2143+
test_at_once=thread,
2144+
quiet=quiet,
2145+
timeout=timeout,
2146+
selenium=selenium,
2147+
do_log=disable_logging == False,
2148+
)
21012149
if best:
21022150
click.secho(test.best)
21032151
return

src/pytgpt/gpt4free/utils.py

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,26 +47,66 @@ def is_working(provider: str) -> bool:
4747

4848
class TestProviders:
4949

50-
def __init__(self, test_at_once: int = 5, quiet: bool = False, timeout: int = 20):
50+
def __init__(
51+
self,
52+
test_at_once: int = 5,
53+
quiet: bool = False,
54+
timeout: int = 20,
55+
selenium: bool = False,
56+
do_log: bool = True,
57+
):
5158
"""Constructor
5259
5360
Args:
5461
test_at_once (int, optional): Test n providers at once. Defaults to 5.
5562
quiet (bool, optinal): Disable stdout. Defaults to False.
5663
timout (int, optional): Thread timeout for each provider. Defaults to 20.
64+
selenium (bool, optional): Test even selenium dependent providers. Defaults to False.
65+
do_log (bool, optional): Flag to control logging. Defaults to True.
5766
"""
5867
self.test_at_once: int = test_at_once
5968
self.quiet = quiet
6069
self.timeout = timeout
70+
self.do_log = do_log
71+
self.__logger = logging.getLogger(__name__)
6172
self.working_providers: list = [
6273
provider.__name__
6374
for provider in g4f.Provider.__providers__
6475
if provider.working
6576
]
77+
78+
if not selenium:
79+
import g4f.Provider.selenium as selenium_based
80+
from g4f import webdriver
81+
82+
webdriver.has_requirements = False
83+
selenium_based_providers: list = dir(selenium_based)
84+
for provider in self.working_providers:
85+
try:
86+
selenium_based_providers.index(provider)
87+
except ValueError:
88+
pass
89+
else:
90+
self.__log(
91+
30, f"Dropping provider - {provider} - [Selenium dependent]"
92+
)
93+
self.working_providers.remove(provider)
94+
6695
self.results_path: Path = results_path
6796
self.__create_empty_file(ignore_if_found=True)
6897
self.results_file_is_empty: bool = False
6998

99+
def __log(
100+
self,
101+
level: int,
102+
message: str,
103+
):
104+
"""class logger"""
105+
if self.do_log:
106+
self.__logger.log(level, message)
107+
else:
108+
pass
109+
70110
def __create_empty_file(self, ignore_if_found: bool = False):
71111
if ignore_if_found and self.results_path.is_file():
72112
return
@@ -97,7 +137,7 @@ def test_provider(self, name: str):
97137
current_results = load(fh)
98138
new_result = dict(time=time() - start_time, name=name)
99139
current_results["results"].append(new_result)
100-
logging.info(f"Test result - {new_result['name']} - {new_result['time']}")
140+
self.__log(20, f"Test result - {new_result['name']} - {new_result['time']}")
101141

102142
with self.results_path.open("w") as fh:
103143
dump(current_results, fh)
@@ -111,7 +151,7 @@ def main(
111151
# Create a progress bar
112152
total = len(self.working_providers)
113153
with Progress() as progress:
114-
logging.info(f"Testing {total} providers : {self.working_providers}")
154+
self.__log(20, f"Testing {total} providers : {self.working_providers}")
115155
task = progress.add_task(
116156
f"[cyan]Testing...[{self.test_at_once}]",
117157
total=total,
@@ -156,7 +196,7 @@ def get_results(self, run: bool = False, best: bool = False) -> list[dict]:
156196
if run:
157197
raise Exception("Unable to find working g4f provider")
158198
else:
159-
logging.warning("Hunting down working g4f providers.")
199+
self.__log(30, "Hunting down working g4f providers.")
160200
return self.get_results(run=True, best=best)
161201

162202
time_list = []
@@ -182,6 +222,6 @@ def best(self):
182222
def auto(self):
183223
"""Best working provider"""
184224
for result in self.get_results(run=False, best=False):
185-
logging.info("Confirming working status of provider : " + result["name"])
225+
self.__log(20, "Confirming working status of provider : " + result["name"])
186226
if is_working(result["name"]):
187227
return result["name"]

0 commit comments

Comments
 (0)