返回提交历史
Modified
g4f/Provider/needs_auth/OpenaiChat.py
+59
-51
Modified
g4f/Provider/openai/models.py
+3
-2
Modified
g4f/requests/__init__.py
+0
-6
Modified
g4f/requests/curl_cffi.py
+0
-1
XFEstudio/gpt4free
fix: Update default model to "auto" and adjust system hints in OpenaiChat
2827fe65
代码差异
4 个文件
+62
-60
@@ -16,7 +16,6 @@ from ...requests.curl_cffi import AsyncSession
16
16
17
17
try:
18
18
import zendriver as nodriver
19
20
19
has_nodriver = True
21
20
except ImportError:
22
21
has_nodriver = False
@@ -444,6 +443,11 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
444
443
conversation.finish_reason = None
445
444
sources = OpenAISources([])
446
445
references = ContentReferences()
446
system_hints = ["picture_v2"] if image_model else []
447
if reasoning_effort == "high":
448
system_hints.append("reason")
449
if web_search:
450
system_hints.append("search")
447
451
while conversation.finish_reason is None:
448
452
conduit_token = None
449
453
if cls._api_key is not None:
@@ -455,10 +459,7 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
455
459
"timezone_offset_min": -120,
456
460
"timezone": "Europe/Berlin",
457
461
"conversation_mode": {"kind": "primary_assistant"},
458
"system_hints": [
459
"picture_v2"
460
] if image_model else [],
461
"thinking_effort": "extended" if reasoning_effort == "high" else "standard",
462
"system_hints": system_hints,
462
463
"supports_buffering": True,
463
464
"supported_encodings": ["v1"]
464
465
}
@@ -467,19 +468,19 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
467
468
if conversation.conversation_id is not None and not temporary:
468
469
data["conversation_id"] = conversation.conversation_id
469
470
async with session.post(
470
prepare_url,
471
json=data,
472
headers=cls._headers
471
prepare_url,
472
json=data,
473
headers=cls._headers
473
474
) as response:
474
475
await raise_for_status(response)
475
476
conduit_token = (await response.json())["conduit_token"]
476
477
async with session.post(
477
f"{cls.url}/backend-anon/sentinel/chat-requirements"
478
if cls._api_key is None else
479
f"{cls.url}/backend-api/sentinel/chat-requirements",
480
json={"p": None if not getattr(auth_result, "proof_token", None) else get_requirements_token(
481
getattr(auth_result, "proof_token", None))},
482
headers=cls._headers
478
f"{cls.url}/backend-anon/sentinel/chat-requirements"
479
if cls._api_key is None else
480
f"{cls.url}/backend-api/sentinel/chat-requirements",
481
json={"p": None if not getattr(auth_result, "proof_token", None) else get_requirements_token(
482
getattr(auth_result, "proof_token", None))},
483
headers=cls._headers
483
484
) as response:
484
485
if response.status in (401, 403):
485
486
raise MissingAuthError(f"Response status: {response.status}")
@@ -520,8 +521,7 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
520
521
"timezone": "Europe/Berlin",
521
522
"conversation_mode": {"kind": "primary_assistant"},
522
523
"enable_message_followups": True,
523
"system_hints": ["search"] if web_search else None,
524
"thinking_effort": "extended" if reasoning_effort == "high" else "standard",
524
"system_hints": system_hints,
525
525
"supports_buffering": True,
526
526
"supported_encodings": ["v1"],
527
527
"client_contextual_info": {"is_dark_mode": False, "time_since_loaded": random.randint(20, 500),
@@ -564,11 +564,11 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
564
564
if need_turnstile and getattr(auth_result, "turnstile_token", None) is not None:
565
565
headers['openai-sentinel-turnstile-token'] = auth_result.turnstile_token
566
566
async with session.post(
567
backend_anon_url
568
if cls._api_key is None else
569
backend_url,
570
json=data,
571
headers=headers
567
backend_anon_url
568
if cls._api_key is None else
569
backend_url,
570
json=data,
571
headers=headers
572
572
) as response:
573
573
cls._update_request_args(auth_result, session)
574
574
if response.status in (401, 403, 429, 500):
@@ -722,19 +722,19 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
722
722
723
723
@classmethod
724
724
async def wss_media(
725
cls,
726
_session,
727
conversation: Conversation,
728
headers: Dict[str, str],
729
auth_result: AuthResult,
730
timeout: Optional[int] = 20,
725
cls,
726
_session,
727
conversation: Conversation,
728
headers: Dict[str, str],
729
auth_result: AuthResult,
730
timeout: Optional[int] = 20,
731
731
):
732
732
seen_assets: Set[str] = set()
733
733
async with AsyncSession(
734
timeout=timeout,
735
impersonate="chrome",
736
headers=headers,
737
cookies=auth_result.cookies
734
timeout=timeout,
735
impersonate="chrome",
736
headers=headers,
737
cookies=auth_result.cookies
738
738
) as session:
739
739
response = await session.get(
740
740
"https://chatgpt.com/backend-api/celsius/ws/user",
@@ -789,13 +789,13 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
789
789
790
790
@classmethod
791
791
async def wait_media(
792
cls,
793
session,
794
conversation,
795
headers: Dict[str, str],
796
auth_result: AuthResult,
797
poll_interval: int = 10,
798
timeout: Optional[int] = None,
792
cls,
793
session,
794
conversation,
795
headers: Dict[str, str],
796
auth_result: AuthResult,
797
poll_interval: int = 10,
798
timeout: Optional[int] = None,
799
799
) -> AsyncGenerator[Any, None]:
800
800
start_time = asyncio.get_event_loop().time()
801
801
seen_assets: Set[str] = set()
@@ -1106,17 +1106,25 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
1106
1106
for _ in range(3):
1107
1107
try:
1108
1108
if cls.needs_auth:
1109
await page.select('[data-testid="accounts-profile-button"]', 300)
1110
textarea = await page.select("#prompt-textarea", 300)
1111
await textarea.send_keys("Hello")
1112
await asyncio.sleep(1)
1109
try:
1110
await page.select('[data-testid="accounts-profile-button"]', 300)
1111
except TimeoutError:
1112
continue
1113
try:
1114
textarea = await page.select("#prompt-textarea", 300)
1115
await textarea.send_keys("Hello")
1116
await asyncio.sleep(1)
1117
except TimeoutError:
1118
continue
1113
1119
except nodriver.core.connection.ProtocolException:
1114
1120
continue
1115
1121
break
1116
button = await page.select("[data-testid=\"send-button\"]")
1117
if button:
1122
try:
1123
button = await page.select("[data-testid=\"send-button\"]")
1118
1124
await button.click()
1119
debug.log("OpenaiChat: 'Hello' sended")
1125
debug.log("OpenaiChat: 'Hello' sended")
1126
except TimeoutError:
1127
pass
1120
1128
while True:
1121
1129
body = await page.evaluate("JSON.stringify(window.__remixContext)", return_by_value=True)
1122
1130
if hasattr(body, "value"):
@@ -1131,12 +1139,12 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
1131
1139
await asyncio.sleep(1)
1132
1140
debug.log("OpenaiChat: Waiting for access token...")
1133
1141
debug.log(f"OpenaiChat: Access token: {'False' if cls._api_key is None else cls._api_key[:12] + '...'}")
1134
while True:
1135
if cls.request_config.proof_token:
1136
break
1137
await asyncio.sleep(1)
1138
debug.log("OpenaiChat: Waiting for proof token...")
1139
debug.log(f"OpenaiChat: Proof token: Yes")
1142
#while True:
1143
# if cls.request_config.proof_token:
1144
# break
1145
# await asyncio.sleep(1)
1146
# debug.log("OpenaiChat: Waiting for proof token...")
1147
#debug.log(f"OpenaiChat: Proof token: Yes")
1140
1148
cls.request_config.data_build = await page.evaluate("document.documentElement.getAttribute('data-build')")
1141
1149
cls.request_config.cookies = await page.send(get_cookies([cls.url]))
1142
1150
await page.close()
@@ -1,10 +1,11 @@
1
default_model = "gpt-5-2"
1
default_model = "auto"
2
2
default_image_model = "gpt-image"
3
3
image_models = [default_image_model]
4
text_models = [default_model, "gpt-5-2-instant", "gpt-5-2-thinking", "gpt-5-1", "gpt-5-1-instant", "gpt-5-1-thinking", "gpt-5", "gpt-5-instant", "gpt-5-thinking", "gpt-4", "gpt-4.1", "gpt-4.1-mini", "gpt-4.5", "gpt-4o", "gpt-4o-mini", "o1", "o1-mini", "o3-mini", "o3-mini-high", "o4-mini", "o4-mini-high"]
4
text_models = [default_model, "gpt-5-2", "gpt-5-2-instant", "gpt-5-2-thinking", "gpt-5-1", "gpt-5-1-instant", "gpt-5-1-thinking", "gpt-5", "gpt-5-instant", "gpt-5-thinking", "gpt-4", "gpt-4.1", "gpt-4.1-mini", "gpt-4.5", "gpt-4o", "gpt-4o-mini", "o1", "o1-mini", "o3-mini", "o3-mini-high", "o4-mini", "o4-mini-high"]
5
5
vision_models = text_models
6
6
models = text_models + image_models
7
7
model_aliases = {
8
"gpt-5.2": "gpt-5-2",
8
9
"gpt-5.1": "gpt-5-1",
9
10
"gpt-4.1": "gpt-4-1",
10
11
"gpt-4.1-mini": "gpt-4-1-mini",
@@ -221,12 +221,6 @@ async def get_nodriver(
221
221
)
222
222
except FileNotFoundError as e:
223
223
raise MissingRequirementsError(e)
224
except Exception as e:
225
if util.get_registered_instances():
226
debug.error(e)
227
browser = util.get_registered_instances().pop()
228
else:
229
raise
230
224
231
225
async def on_stop():
232
226
try:
@@ -5,7 +5,6 @@ try:
5
5
has_curl_cffi = True
6
6
except ImportError:
7
7
# Fallback for systems where curl_cffi is not available or causes illegal instruction errors
8
from typing import Any
9
8
class AsyncSession:
10
9
def __init__(self, *args, **kwargs):
11
10
raise ImportError("curl_cffi is not available on this platform")