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

XFEstudio/gpt4free

Fix Chatgpt4Online provider

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

代码差异

1 个文件 +47 -17
Modified g4f/Provider/Chatgpt4Online.py +47 -17
@@ -1,13 +1,14 @@
1 1 from __future__ import annotations
2 2
3 3 import re
4 import json
4 5 from aiohttp import ClientSession
5 6
6 from ..typing import Messages
7 from .base_provider import AsyncProvider
8 from .helper import format_prompt
7 from ..typing import Messages, AsyncResult
8 from .base_provider import AsyncGeneratorProvider
9 from .helper import get_random_string
9 10
10 class Chatgpt4Online(AsyncProvider):
11 class Chatgpt4Online(AsyncGeneratorProvider):
11 12 url = "https://chatgpt4online.org"
12 13 supports_message_history = True
13 14 supports_gpt_35_turbo = True
@@ -15,32 +16,61 @@ class Chatgpt4Online(AsyncProvider):
15 16 _wpnonce = None
16 17
17 18 @classmethod
18 async def create_async(
19 async def create_async_generator(
19 20 cls,
20 21 model: str,
21 22 messages: Messages,
22 23 proxy: str = None,
23 24 **kwargs
24 ) -> str:
25 async with ClientSession() as session:
25 ) -> AsyncResult:
26 headers = {
27 "accept": "*/*",
28 "accept-language": "en-US",
29 "content-type": "application/json",
30 "sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"",
31 "sec-ch-ua-mobile": "?0",
32 "sec-ch-ua-platform": "\"Windows\"",
33 "sec-fetch-dest": "empty",
34 "sec-fetch-mode": "cors",
35 "sec-fetch-site": "same-origin",
36 "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
37 "referer": "https://chatgpt4online.org/",
38 "referrer-policy": "strict-origin-when-cross-origin"
39 }
40 async with ClientSession(headers=headers) as session:
26 41 if not cls._wpnonce:
27 42 async with session.get(f"{cls.url}/", proxy=proxy) as response:
28 43 response.raise_for_status()
29 44 response = await response.text()
30 result = re.search(r'data-nonce="(.*?)"', response)
31
45 result = re.search(r'restNonce&quot;:&quot;(.*?)&quot;', response)
32 46 if result:
33 47 cls._wpnonce = result.group(1)
34 48 else:
35 49 raise RuntimeError("No nonce found")
36 50 data = {
37 "_wpnonce": cls._wpnonce,
38 "post_id": 58,
39 "url": "https://chatgpt4online.org",
40 "action": "wpaicg_chat_shortcode_message",
41 "message": format_prompt(messages),
42 "bot_id": 3405
51 "botId":"default",
52 "customId":None,
53 "session":"N/A",
54 "chatId":get_random_string(11),
55 "contextId":58,
56 "messages":messages[:-1],
57 "newMessage":messages[-1]["content"],
58 "newImageId":None,
59 "stream":True
43 60 }
44 async with session.post(f"{cls.url}/rizq", data=data, proxy=proxy) as response:
61 async with session.post(
62 f"{cls.url}/wp-json/mwai-ui/v1/chats/submit",
63 json=data,
64 proxy=proxy,
65 headers={"x-wp-nonce": cls._wpnonce}
66 ) as response:
45 67 response.raise_for_status()
46 return (await response.json())["data"]
68 async for line in response.content:
69 if line.startswith(b"data: "):
70 line = json.loads(line[6:])
71 if "type" not in line:
72 raise RuntimeError(f"Response: {line}")
73 elif line["type"] == "live":
74 yield line["data"]
75 elif line["type"] == "end":
76 break