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

XFEstudio/gpt4free

Fix links in Readme, update OpenaiChat provider

7f8e5181
Heiner Lohaus <hlohaus@users.noreply.github.com>
提交于

代码差异

5 个文件 +49 -36
Modified g4f/Provider/needs_auth/OpenaiAccount.py +5 -1
@@ -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}
Modified g4f/Provider/needs_auth/OpenaiChat.py +34 -32
@@ -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)
Modified g4f/Provider/openai/har_file.py +1 -1
@@ -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):
Modified g4f/Provider/openai/new.py +5 -2
@@ -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
Modified setup.py +4 -0
@@ -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",