XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 1
返回提交历史

XFEstudio/gpt4free

Add support for crewai, Fix infinity run in OpenaiChat

eb4e90e8
hlohaus <983577+hlohaus@users.noreply.github.com>
提交于

代码差异

3 个文件 +24 -22
Modified g4f/Provider/needs_auth/OpenaiChat.py +10 -8
@@ -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:
Modified g4f/client/stubs.py +2 -2
@@ -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 )
Modified g4f/requests/raise_for_status.py +12 -12
@@ -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):