summaryrefslogtreecommitdiffstats
path: root/g4f/Provider
diff options
context:
space:
mode:
authorTekky <98614666+xtekky@users.noreply.github.com>2023-10-22 23:55:32 +0200
committerGitHub <noreply@github.com>2023-10-22 23:55:32 +0200
commit955fb4bbaa3c31787bbe699aa913f22ec3a4a639 (patch)
treec298e3feb1110b047a74cdb224024b412712323a /g4f/Provider
parentMerge pull request #1122 from Luneye/patch-2 (diff)
parentDebug logging support (diff)
downloadgpt4free-955fb4bbaa3c31787bbe699aa913f22ec3a4a639.tar
gpt4free-955fb4bbaa3c31787bbe699aa913f22ec3a4a639.tar.gz
gpt4free-955fb4bbaa3c31787bbe699aa913f22ec3a4a639.tar.bz2
gpt4free-955fb4bbaa3c31787bbe699aa913f22ec3a4a639.tar.lz
gpt4free-955fb4bbaa3c31787bbe699aa913f22ec3a4a639.tar.xz
gpt4free-955fb4bbaa3c31787bbe699aa913f22ec3a4a639.tar.zst
gpt4free-955fb4bbaa3c31787bbe699aa913f22ec3a4a639.zip
Diffstat (limited to 'g4f/Provider')
-rw-r--r--g4f/Provider/AItianhuSpace.py4
-rw-r--r--g4f/Provider/ChatgptFree.py16
-rw-r--r--g4f/Provider/helper.py34
-rw-r--r--g4f/Provider/needs_auth/OpenaiChat.py47
-rw-r--r--g4f/Provider/retry_provider.py8
5 files changed, 65 insertions, 44 deletions
diff --git a/g4f/Provider/AItianhuSpace.py b/g4f/Provider/AItianhuSpace.py
index 51297bcd..46856060 100644
--- a/g4f/Provider/AItianhuSpace.py
+++ b/g4f/Provider/AItianhuSpace.py
@@ -1,7 +1,7 @@
from __future__ import annotations
import random, json
-from ..debug import logging
+from .. import debug
from ..typing import AsyncResult, Messages
from ..requests import StreamSession
from .base_provider import AsyncGeneratorProvider, format_prompt, get_cookies
@@ -36,7 +36,7 @@ class AItianhuSpace(AsyncGeneratorProvider):
rand = ''.join(random.choice(chars) for _ in range(6))
domain = f"{rand}.{domains[model]}"
- if logging:
+ if debug.logging:
print(f"AItianhuSpace | using domain: {domain}")
if not cookies:
diff --git a/g4f/Provider/ChatgptFree.py b/g4f/Provider/ChatgptFree.py
index 8b7d04c4..806ff7cc 100644
--- a/g4f/Provider/ChatgptFree.py
+++ b/g4f/Provider/ChatgptFree.py
@@ -14,7 +14,7 @@ from .helper import format_prompt, get_cookies
class ChatgptFree(AsyncProvider):
url = "https://chatgptfree.ai"
supports_gpt_35_turbo = True
- working = True
+ working = False
_post_id = None
_nonce = None
@@ -24,6 +24,7 @@ class ChatgptFree(AsyncProvider):
model: str,
messages: Messages,
proxy: str = None,
+ timeout: int = 120,
cookies: dict = None,
**kwargs
) -> str:
@@ -45,14 +46,19 @@ class ChatgptFree(AsyncProvider):
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
- 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
+ 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
}
- async with StreamSession(headers=headers,
- impersonate="chrome107", proxies={"https": proxy}, timeout=10) as session:
+ async with StreamSession(
+ headers=headers,
+ cookies=cookies,
+ impersonate="chrome107",
+ proxies={"https": proxy},
+ timeout=timeout
+ ) as session:
if not cls._nonce:
- async with session.get(f"{cls.url}/", cookies=cookies) as response:
+ async with session.get(f"{cls.url}/") as response:
response.raise_for_status()
response = await response.text()
diff --git a/g4f/Provider/helper.py b/g4f/Provider/helper.py
index 096293b2..1b00ace5 100644
--- a/g4f/Provider/helper.py
+++ b/g4f/Provider/helper.py
@@ -3,13 +3,14 @@ from __future__ import annotations
import sys
import asyncio
import webbrowser
-import http.cookiejar
from os import path
from asyncio import AbstractEventLoop
+from platformdirs import user_config_dir
+
from ..typing import Dict, Messages
from browser_cookie3 import chrome, chromium, opera, opera_gx, brave, edge, vivaldi, firefox, BrowserCookieError
-
+from .. import debug
# Change event loop policy on windows
if sys.platform == 'win32':
@@ -44,7 +45,6 @@ def get_event_loop() -> AbstractEventLoop:
)
def init_cookies():
-
urls = [
'https://chat-gpt.org',
'https://www.aitianhu.com',
@@ -72,16 +72,26 @@ def init_cookies():
# Load cookies for a domain from all supported browsers.
# Cache the results in the "_cookies" variable.
def get_cookies(domain_name=''):
- cj = http.cookiejar.CookieJar()
- for cookie_fn in [chrome, chromium, opera, opera_gx, brave, edge, vivaldi, firefox]:
+ if domain_name in _cookies:
+ return _cookies[domain_name]
+ def g4f(domain_name):
+ user_data_dir = user_config_dir("g4f")
+ cookie_file = path.join(user_data_dir, "Default", "Cookies")
+ if not path.exists(cookie_file):
+ return []
+ return chrome(cookie_file, domain_name)
+ cookies = {}
+ for cookie_fn in [g4f, chrome, chromium, opera, opera_gx, brave, edge, vivaldi, firefox]:
try:
- for cookie in cookie_fn(domain_name=domain_name):
- cj.set_cookie(cookie)
- except BrowserCookieError:
+ cookie_jar = cookie_fn(domain_name=domain_name)
+ if len(cookie_jar) and debug.logging:
+ print(f"Read cookies from {cookie_fn.__name__} for {domain_name}")
+ for cookie in cookie_jar:
+ if cookie.name not in cookies:
+ cookies[cookie.name] = cookie.value
+ except BrowserCookieError as e:
pass
-
- _cookies[domain_name] = {cookie.name: cookie.value for cookie in cj}
-
+ _cookies[domain_name] = cookies
return _cookies[domain_name]
@@ -100,10 +110,8 @@ def format_prompt(messages: Messages, add_special_tokens=False) -> str:
def get_browser(user_data_dir: str = None):
from undetected_chromedriver import Chrome
- from platformdirs import user_config_dir
if not 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/needs_auth/OpenaiChat.py b/g4f/Provider/needs_auth/OpenaiChat.py
index b4b4a670..14619958 100644
--- a/g4f/Provider/needs_auth/OpenaiChat.py
+++ b/g4f/Provider/needs_auth/OpenaiChat.py
@@ -3,7 +3,7 @@ from __future__ import annotations
import uuid, json, time
from ..base_provider import AsyncGeneratorProvider
-from ..helper import get_browser, get_cookies, format_prompt
+from ..helper import get_browser, get_cookies, format_prompt, get_event_loop
from ...typing import AsyncResult, Messages
from ...requests import StreamSession
@@ -73,26 +73,33 @@ class OpenaiChat(AsyncGeneratorProvider):
last_message = new_message
@classmethod
- 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
+ async def browse_access_token(cls) -> str:
+ def browse() -> 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
- driver = get_browser()
- except ImportError:
- return
+ driver = get_browser()
+ except ImportError:
+ return
- driver.get(f"{cls.url}/")
- try:
- WebDriverWait(driver, 1200).until(
- EC.presence_of_element_located((By.ID, "prompt-textarea"))
- )
- javascript = "return (await (await fetch('/api/auth/session')).json())['accessToken']"
- return driver.execute_script(javascript)
- finally:
- time.sleep(1)
- driver.quit()
+ driver.get(f"{cls.url}/")
+ try:
+ WebDriverWait(driver, 1200).until(
+ EC.presence_of_element_located((By.ID, "prompt-textarea"))
+ )
+ javascript = "return (await (await fetch('/api/auth/session')).json())['accessToken']"
+ return driver.execute_script(javascript)
+ finally:
+ driver.close()
+ time.sleep(0.1)
+ driver.quit()
+ loop = get_event_loop()
+ return await loop.run_in_executor(
+ None,
+ browse
+ )
@classmethod
async def fetch_access_token(cls, cookies: dict, proxies: dict = None) -> str:
@@ -110,7 +117,7 @@ class OpenaiChat(AsyncGeneratorProvider):
if cookies:
cls._access_token = await cls.fetch_access_token(cookies, proxies)
if not cls._access_token:
- cls._access_token = cls.browse_access_token()
+ cls._access_token = await cls.browse_access_token()
if not cls._access_token:
raise RuntimeError("Read access token failed")
return cls._access_token
diff --git a/g4f/Provider/retry_provider.py b/g4f/Provider/retry_provider.py
index 39d61c35..5979e15b 100644
--- a/g4f/Provider/retry_provider.py
+++ b/g4f/Provider/retry_provider.py
@@ -5,13 +5,13 @@ import random
from typing import List, Type, Dict
from ..typing import CreateResult, Messages
from .base_provider import BaseProvider, AsyncProvider
+from .. import debug
class RetryProvider(AsyncProvider):
__name__: str = "RetryProvider"
working: bool = True
supports_stream: bool = True
- logging: bool = False
def __init__(
self,
@@ -39,7 +39,7 @@ class RetryProvider(AsyncProvider):
started: bool = False
for provider in providers:
try:
- if self.logging:
+ if debug.logging:
print(f"Using {provider.__name__} provider")
for token in provider.create_completion(model, messages, stream, **kwargs):
@@ -51,7 +51,7 @@ class RetryProvider(AsyncProvider):
except Exception as e:
self.exceptions[provider.__name__] = e
- if self.logging:
+ if debug.logging:
print(f"{provider.__name__}: {e.__class__.__name__}: {e}")
if started:
raise e
@@ -77,7 +77,7 @@ class RetryProvider(AsyncProvider):
)
except Exception as e:
self.exceptions[provider.__name__] = e
- if self.logging:
+ if debug.logging:
print(f"{provider.__name__}: {e.__class__.__name__}: {e}")
self.raise_exceptions()