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

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
Heiner Lohaus <hlohaus@users.noreply.github.com>
提交于

代码差异

15 个文件 +179 -87
Modified g4f/Provider/AiChatOnline.py +1 -1
@@ -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
Modified g4f/Provider/Aura.py +2 -3
@@ -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(
Modified g4f/Provider/ChatgptAi.py +1 -1
@@ -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
Modified g4f/Provider/ChatgptDemo.py +1 -1
@@ -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(
Modified g4f/Provider/ChatgptNext.py +2 -3
@@ -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",
Modified g4f/Provider/Chatxyz.py +1 -1
@@ -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
Modified g4f/Provider/FlowGpt.py +6 -2
@@ -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": [],
Modified g4f/Provider/You.py +10 -9
@@ -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
Modified g4f/Provider/__init__.py +1 -1
@@ -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
Modified g4f/Provider/needs_auth/OpenaiChat.py +22 -11
@@ -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: "):
Modified g4f/__init__.py +2 -2
@@ -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:
Modified g4f/client.py +16 -8
@@ -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)
Modified g4f/providers/retry_provider.py +108 -22
Modified g4f/providers/types.py +1 -19
Modified g4f/typing.py +5 -3