返回提交历史
Modified
g4f/Provider/needs_auth/OpenaiAccount.py
+5
-1
Modified
g4f/Provider/needs_auth/OpenaiChat.py
+34
-32
Modified
g4f/Provider/openai/har_file.py
+1
-1
Modified
g4f/Provider/openai/new.py
+5
-2
Modified
setup.py
+4
-0
XFEstudio/gpt4free
Fix links in Readme, update OpenaiChat provider
7f8e5181
代码差异
5 个文件
+49
-36
@@ -5,4 +5,8 @@ from .OpenaiChat import OpenaiChat
5
5
class OpenaiAccount(OpenaiChat):
6
6
needs_auth = True
7
7
parent = "OpenaiChat"
8
image_models = ["dall-e"]
8
image_models = ["dall-e-3", "gpt-4", "gpt-4o"]
9
default_vision_model = "gpt-4o"
10
default_image_model = "dall-e-3"
11
models = [*OpenaiChat.fallback_models, default_image_model]
12
model_aliases = {default_image_model: default_vision_model}
@@ -7,6 +7,7 @@ import json
7
7
import base64
8
8
import time
9
9
import requests
10
import random
10
11
from copy import copy
11
12
12
13
try:
@@ -77,11 +78,8 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
77
78
supports_message_history = True
78
79
supports_system_message = True
79
80
default_model = "auto"
80
default_vision_model = "gpt-4o"
81
default_image_model = "dall-e-3"
82
fallback_models = [default_model, "gpt-4", "gpt-4o", "gpt-4o-mini", "gpt-4o-canmore", "o1-preview", "o1-mini", default_image_model]
81
fallback_models = [default_model, "gpt-4", "gpt-4o", "gpt-4o-mini", "gpt-4o-canmore", "o1-preview", "o1-mini"]
83
82
vision_models = fallback_models
84
image_models = fallback_models
85
83
synthesize_content_type = "audio/mpeg"
86
84
87
85
_api_key: str = None
@@ -97,7 +95,6 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
97
95
response.raise_for_status()
98
96
data = response.json()
99
97
cls.models = [model.get("slug") for model in data.get("models")]
100
cls.models.append(cls.default_image_model)
101
98
except Exception:
102
99
cls.models = cls.fallback_models
103
100
return cls.models
@@ -296,27 +293,28 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
296
293
"""
297
294
if cls.needs_auth:
298
295
await cls.login(proxy)
299
300
296
async with StreamSession(
301
297
proxy=proxy,
302
298
impersonate="chrome",
303
299
timeout=timeout
304
300
) as session:
301
image_request = None
305
302
if not cls.needs_auth:
306
cls._create_request_args(cookies)
307
RequestConfig.proof_token = get_config(cls._headers.get("user-agent"))
308
async with session.get(cls.url, headers=cls._headers) as response:
309
cls._update_request_args(session)
310
await raise_for_status(response)
311
try:
312
image_request = await cls.upload_image(session, cls._headers, image, image_name) if image else None
313
except Exception as e:
314
image_request = None
315
debug.log("OpenaiChat: Upload image failed")
316
debug.log(f"{e.__class__.__name__}: {e}")
303
if cls._headers is None:
304
cls._create_request_args(cookies)
305
async with session.get(cls.url, headers=INIT_HEADERS) as response:
306
cls._update_request_args(session)
307
await raise_for_status(response)
308
else:
309
async with session.get(cls.url, headers=cls._headers) as response:
310
cls._update_request_args(session)
311
await raise_for_status(response)
312
try:
313
image_request = await cls.upload_image(session, cls._headers, image, image_name) if image else None
314
except Exception as e:
315
debug.log("OpenaiChat: Upload image failed")
316
debug.log(f"{e.__class__.__name__}: {e}")
317
317
model = cls.get_model(model)
318
if model == cls.default_image_model:
319
model = cls.default_vision_model
320
318
if conversation is None:
321
319
conversation = Conversation(conversation_id, str(uuid.uuid4()) if parent_id is None else parent_id)
322
320
else:
@@ -347,6 +345,8 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
347
345
raise MissingAuthError("No arkose token found in .har file")
348
346
349
347
if "proofofwork" in chat_requirements:
348
if RequestConfig.proof_token is None:
349
RequestConfig.proof_token = get_config(cls._headers.get("user-agent"))
350
350
proofofwork = generate_proof_token(
351
351
**chat_requirements["proofofwork"],
352
352
user_agent=cls._headers.get("user-agent"),
@@ -364,7 +364,7 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
364
364
"model": model,
365
365
"timezone_offset_min":-60,
366
366
"timezone":"Europe/Berlin",
367
"history_and_training_disabled": history_disabled and not auto_continue and not return_conversation,
367
"history_and_training_disabled": history_disabled and not auto_continue and not return_conversation or not cls.needs_auth,
368
368
"conversation_mode":{"kind":"primary_assistant","plugin_ids":None},
369
369
"force_paragen":False,
370
370
"force_paragen_model_slug":"",
@@ -374,7 +374,7 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
374
374
"system_hints": ["search"] if web_search else None,
375
375
"supported_encodings":["v1"],
376
376
"conversation_origin":None,
377
"client_contextual_info":{"is_dark_mode":False,"time_since_loaded":14,"page_height":578,"page_width":1850,"pixel_ratio":1,"screen_height":1080,"screen_width":1920},
377
"client_contextual_info":{"is_dark_mode":False,"time_since_loaded":random.randint(20, 500),"page_height":578,"page_width":1850,"pixel_ratio":1,"screen_height":1080,"screen_width":1920},
378
378
"paragen_stream_type_override":None,
379
379
"paragen_cot_summary_display_override":"allow",
380
380
"supports_buffering":True
@@ -501,8 +501,6 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
501
501
await get_request_config(proxy)
502
502
cls._create_request_args(RequestConfig.cookies, RequestConfig.headers)
503
503
cls._set_api_key(RequestConfig.access_token)
504
if RequestConfig.proof_token is None:
505
RequestConfig.proof_token = get_config(cls._headers.get("user-agent"))
506
504
except NoValidHarFileError:
507
505
if has_nodriver:
508
506
if RequestConfig.access_token is None:
@@ -516,7 +514,6 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
516
514
page = browser.main_tab
517
515
def on_request(event: nodriver.cdp.network.RequestWillBeSent):
518
516
if event.request.url == start_url or event.request.url.startswith(conversation_url):
519
RequestConfig.access_request_id = event.request_id
520
517
RequestConfig.headers = event.request.headers
521
518
elif event.request.url in (backend_url, backend_anon_url):
522
519
if "OpenAI-Sentinel-Proof-Token" in event.request.headers:
@@ -538,20 +535,25 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
538
535
await page.send(nodriver.cdp.network.enable())
539
536
page.add_handler(nodriver.cdp.network.RequestWillBeSent, on_request)
540
537
page = await browser.get(cls.url)
541
await asyncio.sleep(1)
542
body = await page.evaluate("JSON.stringify(window.__remixContext)")
543
if body:
544
match = re.search(r'"accessToken":"(.*?)"', body)
545
if match:
546
RequestConfig.access_token = match.group(1)
547
for c in await page.send(nodriver.cdp.network.get_cookies([cls.url])):
548
RequestConfig.cookies[c.name] = c.value
549
538
user_agent = await page.evaluate("window.navigator.userAgent")
550
539
await page.select("#prompt-textarea", 240)
551
540
while True:
552
541
if RequestConfig.access_token:
553
542
break
543
body = await page.evaluate("JSON.stringify(window.__remixContext)")
544
if body:
545
match = re.search(r'"accessToken":"(.*?)"', body)
546
if match:
547
RequestConfig.access_token = match.group(1)
548
break
554
549
await asyncio.sleep(1)
550
while True:
551
if RequestConfig.proof_token:
552
break
553
await asyncio.sleep(1)
554
RequestConfig.data_build = await page.evaluate("document.documentElement.getAttribute('data-build')")
555
for c in await page.send(nodriver.cdp.network.get_cookies([cls.url])):
556
RequestConfig.cookies[c.name] = c.value
555
557
await page.close()
556
558
cls._create_request_args(RequestConfig.cookies, RequestConfig.headers, user_agent=user_agent)
557
559
cls._set_api_key(RequestConfig.access_token)
@@ -25,7 +25,6 @@ conversation_url = "https://chatgpt.com/c/"
25
25
class RequestConfig:
26
26
cookies: dict = None
27
27
headers: dict = None
28
access_request_id: str = None
29
28
access_token: str = None
30
29
proof_token: list = None
31
30
turnstile_token: str = None
@@ -33,6 +32,7 @@ class RequestConfig:
33
32
arkose_token: str = None
34
33
headers: dict = {}
35
34
cookies: dict = {}
35
data_build: str = "prod-697873d7e78bb14df6e13af3a91fa237cc4db415"
36
36
37
37
class arkReq:
38
38
def __init__(self, arkURL, arkBx, arkHeader, arkBody, arkCookies, userAgent):
@@ -14,6 +14,8 @@ from datetime import (
14
14
timezone
15
15
)
16
16
17
from .har_file import RequestConfig
18
17
19
cores = [16, 24, 32]
18
20
screens = [3000, 4000, 6000]
19
21
maxAttempts = 500000
@@ -386,7 +388,7 @@ def get_config(user_agent):
386
388
random.random(),
387
389
user_agent,
388
390
None,
389
"prod-0b673b9a04fb6983c1417b587f2f31173eafa605", #document.documentElement.getAttribute("data-build"),
391
RequestConfig.data_build, #document.documentElement.getAttribute("data-build"),
390
392
"en-US",
391
393
"en-US,es-US,en,es",
392
394
0,
@@ -396,7 +398,8 @@ def get_config(user_agent):
396
398
time.perf_counter(),
397
399
str(uuid.uuid4()),
398
400
"",
399
8
401
8,
402
int(time.time()),
400
403
]
401
404
402
405
return config
@@ -8,6 +8,10 @@ here = os.path.abspath(os.path.dirname(__file__))
8
8
with codecs.open(os.path.join(here, 'README.md'), encoding='utf-8') as fh:
9
9
long_description = '\n' + fh.read()
10
10
11
long_description = long_description.replace("[!NOTE]", "")
12
long_description = long_description.replace("(docs/", "(https://github.com/xtekky/gpt4free/blob/main/docs/")
13
long_description = long_description.replace("(docs/images/", "(https://raw.githubusercontent.com/xtekky/gpt4free/refs/heads/main/docs/images/")
14
11
15
INSTALL_REQUIRE = [
12
16
"requests",
13
17
"aiohttp",