返回提交历史
Modified
g4f/Provider/AiChatOnline.py
+1
-1
Modified
g4f/Provider/Aura.py
+2
-3
Modified
g4f/Provider/ChatgptAi.py
+1
-1
Modified
g4f/Provider/ChatgptDemo.py
+1
-1
Modified
g4f/Provider/ChatgptNext.py
+2
-3
Modified
g4f/Provider/Chatxyz.py
+1
-1
Modified
g4f/Provider/FlowGpt.py
+6
-2
Modified
g4f/Provider/You.py
+10
-9
Modified
g4f/Provider/__init__.py
+1
-1
Modified
g4f/Provider/needs_auth/OpenaiChat.py
+22
-11
Modified
g4f/__init__.py
+2
-2
Modified
g4f/client.py
+16
-8
Modified
g4f/providers/retry_provider.py
+108
-22
Modified
g4f/providers/types.py
+1
-19
Modified
g4f/typing.py
+5
-3
XFEstudio/gpt4free
Update some providers Improve read access_token in OpenaiChat Add IterProvider Add system message support in FlowGpt Filter none values in new Client
84812b96
代码差异
15 个文件
+179
-87
@@ -9,7 +9,7 @@ from .helper import get_random_string
9
9
10
10
class AiChatOnline(AsyncGeneratorProvider):
11
11
url = "https://aichatonline.org"
12
working = True
12
working = False
13
13
supports_gpt_35_turbo = True
14
14
supports_message_history = False
15
15
@@ -6,9 +6,8 @@ from ..typing import AsyncResult, Messages
6
6
from .base_provider import AsyncGeneratorProvider
7
7
8
8
class Aura(AsyncGeneratorProvider):
9
url = "https://openchat.team"
10
working = True
11
supports_gpt_35_turbo = True
9
url = "https://openchat.team"
10
working = True
12
11
13
12
@classmethod
14
13
async def create_async_generator(
@@ -9,7 +9,7 @@ from .base_provider import AsyncGeneratorProvider
9
9
10
10
class ChatgptAi(AsyncGeneratorProvider):
11
11
url = "https://chatgpt.ai"
12
working = True
12
working = False
13
13
supports_message_history = True
14
14
supports_gpt_35_turbo = True
15
15
_system = None
@@ -10,7 +10,7 @@ from .helper import format_prompt
10
10
class ChatgptDemo(AsyncGeneratorProvider):
11
11
url = "https://chat.chatgptdemo.net"
12
12
supports_gpt_35_turbo = True
13
working = True
13
working = False
14
14
15
15
@classmethod
16
16
async def create_async_generator(
@@ -4,8 +4,7 @@ import json
4
4
from aiohttp import ClientSession
5
5
6
6
from ..typing import AsyncResult, Messages
7
from .base_provider import AsyncGeneratorProvider
8
from .helper import format_prompt
7
from ..providers.base_provider import AsyncGeneratorProvider
9
8
10
9
11
10
class ChatgptNext(AsyncGeneratorProvider):
@@ -24,7 +23,7 @@ class ChatgptNext(AsyncGeneratorProvider):
24
23
if not model:
25
24
model = "gpt-3.5-turbo"
26
25
headers = {
27
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/119.0",
26
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:122.0) Gecko/20100101 Firefox/122.0",
28
27
"Accept": "text/event-stream",
29
28
"Accept-Language": "de,en-US;q=0.7,en;q=0.3",
30
29
"Accept-Encoding": "gzip, deflate, br",
@@ -8,7 +8,7 @@ from .base_provider import AsyncGeneratorProvider
8
8
9
9
class Chatxyz(AsyncGeneratorProvider):
10
10
url = "https://chat.3211000.xyz"
11
working = True
11
working = False
12
12
supports_gpt_35_turbo = True
13
13
supports_message_history = True
14
14
@@ -51,12 +51,16 @@ class FlowGpt(AsyncGeneratorProvider, ProviderModelMixin):
51
51
"TE": "trailers"
52
52
}
53
53
async with ClientSession(headers=headers) as session:
54
history = [message for message in messages[:-1] if message["role"] != "system"]
55
system_message = "\n".join([message["content"] for message in messages if message["role"] == "system"])
56
if not system_message:
57
system_message = "You are helpful assistant. Follow the user's instructions carefully."
54
58
data = {
55
59
"model": model,
56
60
"nsfw": False,
57
61
"question": messages[-1]["content"],
58
"history": [{"role": "assistant", "content": "Hello, how can I help you today?"}, *messages[:-1]],
59
"system": kwargs.get("system_message", "You are helpful assistant. Follow the user's instructions carefully."),
62
"history": [{"role": "assistant", "content": "Hello, how can I help you today?"}, *history],
63
"system": system_message,
60
64
"temperature": kwargs.get("temperature", 0.7),
61
65
"promptId": f"model-{model}",
62
66
"documentIds": [],
@@ -3,9 +3,9 @@ from __future__ import annotations
3
3
import json
4
4
import base64
5
5
import uuid
6
from aiohttp import ClientSession, FormData
6
from aiohttp import ClientSession, FormData, BaseConnector
7
7
8
from ..typing import AsyncGenerator, Messages, ImageType, Cookies
8
from ..typing import AsyncResult, Messages, ImageType, Cookies
9
9
from .base_provider import AsyncGeneratorProvider
10
10
from ..providers.helper import get_connector, format_prompt
11
11
from ..image import to_bytes
@@ -26,12 +26,13 @@ class You(AsyncGeneratorProvider):
26
26
messages: Messages,
27
27
image: ImageType = None,
28
28
image_name: str = None,
29
connector: BaseConnector = None,
29
30
proxy: str = None,
30
31
chat_mode: str = "default",
31
32
**kwargs,
32
) -> AsyncGenerator:
33
) -> AsyncResult:
33
34
async with ClientSession(
34
connector=get_connector(kwargs.get("connector"), proxy),
35
connector=get_connector(connector, proxy),
35
36
headers=DEFAULT_HEADERS
36
37
) as client:
37
38
if image:
@@ -72,13 +73,13 @@ class You(AsyncGeneratorProvider):
72
73
response.raise_for_status()
73
74
async for line in response.content:
74
75
if line.startswith(b'event: '):
75
event = line[7:-1]
76
event = line[7:-1].decode()
76
77
elif line.startswith(b'data: '):
77
if event == b"youChatUpdate" or event == b"youChatToken":
78
if event in ["youChatUpdate", "youChatToken"]:
78
79
data = json.loads(line[6:-1])
79
if event == b"youChatToken" and "youChatToken" in data:
80
yield data["youChatToken"]
81
elif event == b"youChatUpdate" and "t" in data:
80
if event == "youChatToken" and event in data:
81
yield data[event]
82
elif event == "youChatUpdate" and "t" in data:
82
83
yield data["t"]
83
84
84
85
@classmethod
@@ -1,7 +1,7 @@
1
1
from __future__ import annotations
2
2
3
3
from ..providers.types import BaseProvider, ProviderType
4
from ..providers.retry_provider import RetryProvider
4
from ..providers.retry_provider import RetryProvider, IterProvider
5
5
from ..providers.base_provider import AsyncProvider, AsyncGeneratorProvider
6
6
from ..providers.create_images import CreateImagesProvider
7
7
@@ -334,39 +334,49 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
334
334
335
335
# Read api_key from args
336
336
api_key = kwargs["access_token"] if "access_token" in kwargs else api_key
337
# If no cached args
337
338
if cls._args is None:
338
339
if api_key is None:
339
340
# Read api_key from cookies
340
341
cookies = get_cookies("chat.openai.com", False) if cookies is None else cookies
341
342
api_key = cookies["access_token"] if "access_token" in cookies else api_key
342
343
cls._args = cls._create_request_args(cookies)
343
344
else:
345
# Read api_key from cache
346
api_key = cls._args["headers"]["Authorization"] if "Authorization" in cls._args["headers"] else None
347
344
348
async with StreamSession(
345
349
proxies={"https": proxy},
346
350
impersonate="chrome",
347
351
timeout=timeout
348
352
) as session:
353
# Read api_key from session cookies
349
354
if api_key is None and cookies:
350
# Read api_key from session
351
355
api_key = await cls.fetch_access_token(session, cls._args["headers"])
352
353
if api_key is not None:
354
cls._args["headers"]["Authorization"] = f"Bearer {api_key}"
356
# Load default model
357
if cls.default_model is None:
355
358
try:
356
cls.default_model = await cls.get_default_model(session, cls._args["headers"])
359
if cookies and not model and api_key is not None:
360
cls._args["headers"]["Authorization"] = api_key
361
cls.default_model = cls.get_model(await cls.get_default_model(session, cls._args["headers"]))
362
elif api_key:
363
cls.default_model = cls.get_model(model or "gpt-3.5-turbo")
357
364
except Exception as e:
358
365
if debug.logging:
366
print("OpenaiChat: Load default_model failed")
359
367
print(f"{e.__class__.__name__}: {e}")
360
361
if cls.default_model is None:
368
# Browse api_key and update default model
369
if api_key is None or cls.default_model is None:
362
370
login_url = os.environ.get("G4F_LOGIN_URL")
363
371
if login_url:
364
372
yield f"Please login: [ChatGPT]({login_url})\n\n"
365
373
try:
366
374
cls._args = cls.browse_access_token(proxy)
367
375
except MissingRequirementsError:
368
raise MissingAuthError(f'Missing or invalid "access_token". Add a new "api_key" please')
369
cls.default_model = await cls.get_default_model(session, cls._args["headers"])
376
raise MissingAuthError(f'Missing "access_token". Add a "api_key" please')
377
cls.default_model = cls.get_model(await cls.get_default_model(session, cls._args["headers"]))
378
else:
379
cls._args["headers"]["Authorization"] = api_key
370
380
371
381
try:
372
382
image_response = await cls.upload_image(
@@ -409,7 +419,8 @@ class OpenaiChat(AsyncGeneratorProvider, ProviderModelMixin):
409
419
) as response:
410
420
cls._update_request_args(session)
411
421
if not response.ok:
412
raise RuntimeError(f"Response {response.status}: {await response.text()}")
422
message = f"{await response.text()} headers:\n{json.dumps(cls._args['headers'], indent=4)}"
423
raise RuntimeError(f"Response {response.status}: {message}")
413
424
last_message: int = 0
414
425
async for line in response.iter_lines():
415
426
if not line.startswith(b"data: "):
@@ -10,7 +10,7 @@ from .cookies import get_cookies, set_cookies
10
10
from . import debug, version
11
11
from .providers.types import BaseRetryProvider, ProviderType
12
12
from .providers.base_provider import ProviderModelMixin
13
from .providers.retry_provider import RetryProvider
13
from .providers.retry_provider import IterProvider
14
14
15
15
def get_model_and_provider(model : Union[Model, str],
16
16
provider : Union[ProviderType, str, None],
@@ -48,7 +48,7 @@ def get_model_and_provider(model : Union[Model, str],
48
48
provider_list = [ProviderUtils.convert[p] for p in provider.split() if p in ProviderUtils.convert]
49
49
if not provider_list:
50
50
raise ProviderNotFoundError(f'Providers not found: {provider}')
51
provider = RetryProvider(provider_list, False)
51
provider = IterProvider(provider_list)
52
52
elif provider in ProviderUtils.convert:
53
53
provider = ProviderUtils.convert[provider]
54
54
else:
@@ -7,7 +7,7 @@ import random
7
7
import string
8
8
9
9
from .stubs import ChatCompletion, ChatCompletionChunk, Image, ImagesResponse
10
from .typing import Union, Generator, Messages, ImageType
10
from .typing import Union, Iterator, Messages, ImageType
11
11
from .providers.types import BaseProvider, ProviderType
12
12
from .image import ImageResponse as ImageProviderResponse
13
13
from .Provider.BingCreateImages import BingCreateImages
@@ -17,7 +17,7 @@ from . import get_model_and_provider, get_last_provider
17
17
18
18
ImageProvider = Union[BaseProvider, object]
19
19
Proxies = Union[dict, str]
20
IterResponse = Generator[Union[ChatCompletion, ChatCompletionChunk], None, None]
20
IterResponse = Iterator[Union[ChatCompletion, ChatCompletionChunk]]
21
21
22
22
def read_json(text: str) -> dict:
23
23
"""
@@ -110,6 +110,12 @@ class Client():
110
110
elif "https" in self.proxies:
111
111
return self.proxies["https"]
112
112
113
def filter_none(**kwargs):
114
for key in list(kwargs.keys()):
115
if kwargs[key] is None:
116
del kwargs[key]
117
return kwargs
118
113
119
class Completions():
114
120
def __init__(self, client: Client, provider: ProviderType = None):
115
121
self.client: Client = client
@@ -126,7 +132,7 @@ class Completions():
126
132
stop: Union[list[str], str] = None,
127
133
api_key: str = None,
128
134
**kwargs
129
) -> Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]]:
135
) -> Union[ChatCompletion, Iterator[ChatCompletionChunk]]:
130
136
model, provider = get_model_and_provider(
131
137
model,
132
138
self.provider if provider is None else provider,
@@ -135,11 +141,13 @@ class Completions():
135
141
)
136
142
stop = [stop] if isinstance(stop, str) else stop
137
143
response = provider.create_completion(
138
model, messages, stream,
139
proxy=self.client.get_proxy(),
140
max_tokens=max_tokens,
141
stop=stop,
142
api_key=self.client.api_key if api_key is None else api_key,
144
model, messages, stream,
145
**filter_none(
146
proxy=self.client.get_proxy(),
147
max_tokens=max_tokens,
148
stop=stop,
149
api_key=self.client.api_key if api_key is None else api_key
150
),
143
151
**kwargs
144
152
)
145
153
response = iter_response(response, stream, response_format, max_tokens, stop)