返回提交历史
Modified
docs/providers-and-models.md
+1
-0
Added
g4f/Provider/GPROChat.py
+76
-0
Modified
g4f/Provider/__init__.py
+1
-0
XFEstudio/gpt4free
New provider added GPROChat
20f2d188
代码差异
3 个文件
+78
-0
@@ -41,6 +41,7 @@
41
41
|[gemini.google.com](https://gemini.google.com)|`g4f.Provider.Gemini`|✔|❌|❌|✔||✔|
42
42
|[ai.google.dev](https://ai.google.dev)|`g4f.Provider.GeminiPro`|✔|❌|✔|?||✔|
43
43
|[developers.sber.ru](https://developers.sber.ru/gigachat)|`g4f.Provider.GigaChat`|✔|❌|❌|✔||✔|
44
|[gprochat.com](https://gprochat.com)|`g4f.Provider.GPROChat`|`gemini-pro`|❌|❌|✔|[Active](https://img.shields.io/badge/Active-brightgreen)|❌|
44
45
|[console.groq.com/playground](https://console.groq.com/playground)|`g4f.Provider.Groq`|✔|❌|❌|?||✔|
45
46
|[huggingface.co/chat](https://huggingface.co/chat)|`g4f.Provider.HuggingChat`|`llama-3.1-70b, command-r-plus, mixtral-8x7b, mixtral-8x7b-dpo, mistral-7b, phi-3-mini-4k`|❌|❌|✔||❌|
46
47
|[huggingface.co](https://huggingface.co/chat)|`g4f.Provider.HuggingFace`|✔|❌|❌|✔||❌|
@@ -0,0 +1,76 @@
1
from __future__ import annotations
2
3
import time
4
from hashlib import sha256
5
6
from aiohttp import BaseConnector, ClientSession
7
8
from ..errors import RateLimitError
9
from ..requests import raise_for_status
10
from ..requests.aiohttp import get_connector
11
from ..typing import AsyncResult, Messages
12
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
13
14
15
class GPROChat(AsyncGeneratorProvider, ProviderModelMixin):
16
url = "https://gprochat.com/"
17
working = True
18
supports_stream = True
19
supports_message_history = True
20
default_model = 'gemini-pro'
21
22
@classmethod
23
async def create_async_generator(
24
cls,
25
model: str,
26
messages: Messages,
27
proxy: str = None,
28
connector: BaseConnector = None,
29
**kwargs,
30
) -> AsyncResult:
31
headers = {
32
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0",
33
"Accept": "*/*",
34
"Accept-Language": "en-US,en;q=0.5",
35
"Accept-Encoding": "gzip, deflate, br",
36
"Content-Type": "text/plain;charset=UTF-8",
37
"Referer": f"{cls.url}/",
38
"Origin": cls.url,
39
"Sec-Fetch-Dest": "empty",
40
"Sec-Fetch-Mode": "cors",
41
"Sec-Fetch-Site": "same-origin",
42
"Connection": "keep-alive",
43
"TE": "trailers",
44
}
45
async with ClientSession(
46
connector=get_connector(connector, proxy), headers=headers
47
) as session:
48
timestamp = int(time.time() * 1e3)
49
data = {
50
"messages": [
51
{
52
"role": "model" if message["role"] == "assistant" else "user",
53
"parts": [{"text": message["content"]}],
54
}
55
for message in messages
56
],
57
"time": timestamp,
58
"pass": None,
59
"sign": generate_signature(timestamp, messages[-1]["content"]),
60
}
61
async with session.post(
62
f"{cls.url}/api/generate", json=data, proxy=proxy
63
) as response:
64
if response.status == 500:
65
if "Quota exceeded" in await response.text():
66
raise RateLimitError(
67
f"Response {response.status}: Rate limit reached"
68
)
69
await raise_for_status(response)
70
async for chunk in response.content.iter_any():
71
yield chunk.decode(errors="ignore")
72
73
74
def generate_signature(time: int, text: str, secret: str = ""):
75
message = f"{time}:{text}:{secret}"
76
return sha256(message.encode()).hexdigest()
@@ -39,6 +39,7 @@ from .FreeGpt import FreeGpt
39
39
from .FreeNetfly import FreeNetfly
40
40
from .GeminiPro import GeminiPro
41
41
from .GigaChat import GigaChat
42
from .GPROChat import GPROChat
42
43
from .HuggingChat import HuggingChat
43
44
from .HuggingFace import HuggingFace
44
45
from .Koala import Koala