返回提交历史
Modified
g4f/Provider/needs_auth/OpenaiChat.py
+10
-8
Modified
g4f/client/stubs.py
+2
-2
Modified
g4f/requests/raise_for_status.py
+12
-12
XFEstudio/gpt4free
Add support for crewai, Fix infinity run in OpenaiChat
eb4e90e8
代码差异
3 个文件
+24
-22
@@ -26,7 +26,7 @@ from ...image import ImageRequest, to_image, to_bytes, is_accepted_format
26
26
from ...errors import MissingAuthError, NoValidHarFileError
27
27
from ...providers.response import JsonConversation, FinishReason, SynthesizeData, AuthResult, ImageResponse
28
28
from ...providers.response import Sources, TitleGeneration, RequestLogin, Parameters, Reasoning
29
from ..helper import format_cookies
29
from ..helper import format_cookies, get_last_user_message
30
30
from ..openai.models import default_model, default_image_model, models, image_models, text_models
31
31
from ..openai.har_file import get_request_config
32
32
from ..openai.har_file import RequestConfig, arkReq, arkose_url, start_url, conversation_url, backend_url, backend_anon_url
@@ -404,7 +404,7 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
404
404
if action != "continue":
405
405
data["parent_message_id"] = getattr(conversation, "parent_message_id", conversation.message_id)
406
406
conversation.parent_message_id = None
407
messages = messages if conversation_id is None else [messages[-1]]
407
messages = messages if conversation_id is None else [{"role": "user", "content": get_last_user_message(messages)}]
408
408
data["messages"] = cls.create_messages(messages, image_requests, ["search"] if web_search else None)
409
409
headers = {
410
410
**cls._headers,
@@ -426,7 +426,7 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
426
426
headers=headers
427
427
) as response:
428
428
cls._update_request_args(auth_result, session)
429
if response.status in (401, 403):
429
if response.status in (401, 403, 429):
430
430
raise MissingAuthError("Access token is not valid")
431
431
await raise_for_status(response)
432
432
buffer = u""
@@ -596,8 +596,10 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
596
596
browser, stop_browser = await get_nodriver(proxy=proxy)
597
597
try:
598
598
page = browser.main_tab
599
def on_request(event: nodriver.cdp.network.RequestWillBeSent):
599
def on_request(event: nodriver.cdp.network.RequestWillBeSent, page=None):
600
600
if event.request.url == start_url or event.request.url.startswith(conversation_url):
601
if cls.request_config.headers is None:
602
cls.request_config.headers = {}
601
603
for key, value in event.request.headers.items():
602
604
cls.request_config.headers[key.lower()] = value
603
605
elif event.request.url in (backend_url, backend_anon_url):
@@ -621,18 +623,18 @@ class OpenaiChat(AsyncAuthedProvider, ProviderModelMixin):
621
623
page.add_handler(nodriver.cdp.network.RequestWillBeSent, on_request)
622
624
page = await browser.get(cls.url)
623
625
user_agent = await page.evaluate("window.navigator.userAgent")
624
await page.select("#prompt-textarea", 240)
625
await page.evaluate("document.getElementById('prompt-textarea').innerText = 'Hello'")
626
await page.select("textarea.text-token-text-primary", 240)
627
await page.evaluate("document.querySelector('textarea.text-token-text-primary').value = 'Hello'")
626
628
await page.evaluate("document.querySelector('[data-testid=\"send-button\"]').click()")
627
629
while True:
628
if cls._api_key is not None or not cls.needs_auth:
629
break
630
630
body = await page.evaluate("JSON.stringify(window.__remixContext)")
631
631
if body:
632
632
match = re.search(r'"accessToken":"(.*?)"', body)
633
633
if match:
634
634
cls._api_key = match.group(1)
635
635
break
636
if cls._api_key is not None or not cls.needs_auth:
637
break
636
638
await asyncio.sleep(1)
637
639
while True:
638
640
if cls.request_config.proof_token:
@@ -27,7 +27,7 @@ class BaseModel(BaseModel):
27
27
return cls.construct(**data)
28
28
29
29
class TokenDetails(BaseModel):
30
pass
30
cached_tokens: int
31
31
32
32
class UsageModel(BaseModel):
33
33
prompt_tokens: int
@@ -42,7 +42,7 @@ class UsageModel(BaseModel):
42
42
prompt_tokens=prompt_tokens,
43
43
completion_tokens=completion_tokens,
44
44
total_tokens=total_tokens,
45
prompt_tokens_details=TokenDetails.model_construct(**prompt_tokens_details if prompt_tokens_details else {}),
45
prompt_tokens_details=TokenDetails.model_construct(**prompt_tokens_details if prompt_tokens_details else {"cached_tokens": 0}),
46
46
completion_tokens_details=TokenDetails.model_construct(**completion_tokens_details if completion_tokens_details else {}),
47
47
**kwargs
48
48
)
@@ -23,21 +23,21 @@ def is_openai(text: str) -> bool:
23
23
async def raise_for_status_async(response: Union[StreamResponse, ClientResponse], message: str = None):
24
24
if response.ok:
25
25
return
26
text = (await response.text()).strip()
27
26
if message is None:
28
content_type = response.headers.get("content-type", "")
29
if content_type.startswith("application/json"):
30
try:
31
data = await response.json()
32
message = data.get("error")
33
if isinstance(message, dict):
34
message = data.get("message")
35
except Exception:
36
pass
37
else:
27
# content_type = response.headers.get("content-type", "")
28
# if content_type.startswith("application/json"):
29
# try:
30
# data = await response.json()
31
# message = data.get("error")
32
# if isinstance(message, dict):
33
# message = data.get("message")
34
# except Exception:
35
# pass
36
# else:
37
text = (await response.text()).strip()
38
38
is_html = content_type.startswith("text/html") or text.startswith("<!DOCTYPE")
39
39
message = "HTML content" if is_html else text
40
if message == "HTML content":
40
if message is None or message == "HTML content":
41
41
if response.status == 520:
42
42
message = "Unknown error (Cloudflare)"
43
43
elif response.status in (429, 402):