返回提交历史
Added
g4f/Provider/AI365VIP.py
+67
-0
Modified
g4f/Provider/Blackbox.py
+25
-12
Added
g4f/Provider/Chatgpt4o.py
+83
-0
Modified
g4f/Provider/ChatgptFree.py
+1
-1
Added
g4f/Provider/DDG.py
+117
-0
Added
g4f/Provider/Feedough.py
+78
-0
Modified
g4f/Provider/FreeChatgpt.py
+56
-41
Modified
g4f/Provider/FreeGpt.py
+39
-27
Modified
g4f/Provider/GeminiProChat.py
+5
-4
Modified
g4f/Provider/HuggingChat.py
+2
-4
Modified
g4f/Provider/HuggingFace.py
+9
-3
Modified
g4f/Provider/Koala.py
+24
-12
Modified
g4f/Provider/Liaobots.py
+133
-35
Modified
g4f/Provider/MetaAI.py
+4
-3
Added
g4f/Provider/ReplicateHome.py
+136
-0
Modified
g4f/Provider/__init__.py
+6
-10
XFEstudio/gpt4free
Add files via upload
a8ab2ad7
代码差异
16 个文件
+785
-152
@@ -0,0 +1,67 @@
1
from __future__ import annotations
2
3
from aiohttp import ClientSession
4
5
from ..typing import AsyncResult, Messages
6
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
7
from .helper import format_prompt
8
9
10
class AI365VIP(AsyncGeneratorProvider, ProviderModelMixin):
11
url = "https://chat.ai365vip.com"
12
api_endpoint = "/api/chat"
13
working = True
14
supports_gpt_35_turbo = True
15
supports_gpt_4 = True
16
default_model = 'gpt-3.5-turbo'
17
models = [
18
'gpt-3.5-turbo',
19
'gpt-4o',
20
'claude-3-haiku-20240307',
21
]
22
model_aliases = {
23
"claude-3-haiku": "claude-3-haiku-20240307",
24
}
25
26
@classmethod
27
async def create_async_generator(
28
cls,
29
model: str,
30
messages: Messages,
31
proxy: str = None,
32
**kwargs
33
) -> AsyncResult:
34
headers = {
35
"accept": "*/*",
36
"accept-language": "en-US,en;q=0.9",
37
"content-type": "application/json",
38
"dnt": "1",
39
"origin": "https://chat.ai365vip.com",
40
"priority": "u=1, i",
41
"referer": "https://chat.ai365vip.com/en",
42
"sec-ch-ua": '"Not/A)Brand";v="8", "Chromium";v="126"',
43
"sec-ch-ua-mobile": "?0",
44
"sec-ch-ua-platform": '"Linux"',
45
"sec-fetch-dest": "empty",
46
"sec-fetch-mode": "cors",
47
"sec-fetch-site": "same-origin",
48
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
49
}
50
async with ClientSession(headers=headers) as session:
51
data = {
52
"model": {
53
"id": model,
54
"name": {
55
"gpt-3.5-turbo": "GPT-3.5",
56
"claude-3-haiku-20240307": "claude-3-haiku",
57
"gpt-4o": "GPT-4O"
58
}.get(model, model),
59
},
60
"messages": [{"role": "user", "content": format_prompt(messages)}],
61
"prompt": "You are a helpful assistant.",
62
}
63
async with session.post(f"{cls.url}{cls.api_endpoint}", json=data, proxy=proxy) as response:
64
response.raise_for_status()
65
async for chunk in response.content:
66
if chunk:
67
yield chunk.decode()
@@ -2,31 +2,35 @@ from __future__ import annotations
2
2
3
3
import uuid
4
4
import secrets
5
from aiohttp import ClientSession
5
import re
6
from aiohttp import ClientSession, ClientResponse
7
from typing import AsyncGenerator, Optional
6
8
7
9
from ..typing import AsyncResult, Messages, ImageType
8
10
from ..image import to_data_uri
9
from .base_provider import AsyncGeneratorProvider
11
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
10
12
11
class Blackbox(AsyncGeneratorProvider):
13
class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
12
14
url = "https://www.blackbox.ai"
13
15
working = True
16
default_model = 'blackbox'
14
17
15
18
@classmethod
16
19
async def create_async_generator(
17
20
cls,
18
21
model: str,
19
22
messages: Messages,
20
proxy: str = None,
21
image: ImageType = None,
22
image_name: str = None,
23
proxy: Optional[str] = None,
24
image: Optional[ImageType] = None,
25
image_name: Optional[str] = None,
23
26
**kwargs
24
) -> AsyncResult:
27
) -> AsyncGenerator[str, None]:
25
28
if image is not None:
26
29
messages[-1]["data"] = {
27
"fileText": image_name,
30
"fileText": image_name,
28
31
"imageBase64": to_data_uri(image)
29
32
}
33
30
34
headers = {
31
35
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
32
36
"Accept": "*/*",
@@ -40,9 +44,11 @@ class Blackbox(AsyncGeneratorProvider):
40
44
"Alt-Used": "www.blackbox.ai",
41
45
"Connection": "keep-alive",
42
46
}
47
43
48
async with ClientSession(headers=headers) as session:
44
49
random_id = secrets.token_hex(16)
45
50
random_user_id = str(uuid.uuid4())
51
46
52
data = {
47
53
"messages": messages,
48
54
"id": random_id,
@@ -55,10 +61,17 @@ class Blackbox(AsyncGeneratorProvider):
55
61
"playgroundMode": False,
56
62
"webSearchMode": False,
57
63
"userSystemPrompt": "",
58
"githubToken": None
64
"githubToken": None,
65
"maxTokens": None
59
66
}
60
async with session.post(f"{cls.url}/api/chat", json=data, proxy=proxy) as response:
67
68
async with session.post(
69
f"{cls.url}/api/chat", json=data, proxy=proxy
70
) as response: # type: ClientResponse
61
71
response.raise_for_status()
62
async for chunk in response.content:
72
async for chunk in response.content.iter_any():
63
73
if chunk:
64
yield chunk.decode()
74
# Decode the chunk and clean up unwanted prefixes using a regex
75
decoded_chunk = chunk.decode()
76
cleaned_chunk = re.sub(r'\$@\$.+?\$@\$|\$@\$', '', decoded_chunk)
77
yield cleaned_chunk
@@ -0,0 +1,83 @@
1
from __future__ import annotations
2
3
import re
4
from ..requests import StreamSession, raise_for_status
5
from ..typing import Messages
6
from .base_provider import AsyncProvider, ProviderModelMixin
7
from .helper import format_prompt
8
9
10
class Chatgpt4o(AsyncProvider, ProviderModelMixin):
11
url = "https://chatgpt4o.one"
12
supports_gpt_4 = True
13
working = True
14
_post_id = None
15
_nonce = None
16
default_model = 'gpt-4o'
17
18
19
@classmethod
20
async def create_async(
21
cls,
22
model: str,
23
messages: Messages,
24
proxy: str = None,
25
timeout: int = 120,
26
cookies: dict = None,
27
**kwargs
28
) -> str:
29
headers = {
30
'authority': 'chatgpt4o.one',
31
'accept': '*/*',
32
'accept-language': 'en,fr-FR;q=0.9,fr;q=0.8,es-ES;q=0.7,es;q=0.6,en-US;q=0.5,am;q=0.4,de;q=0.3',
33
'origin': 'https://chatgpt4o.one',
34
'referer': 'https://chatgpt4o.one',
35
'sec-ch-ua': '"Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99"',
36
'sec-ch-ua-mobile': '?0',
37
'sec-ch-ua-platform': '"macOS"',
38
'sec-fetch-dest': 'empty',
39
'sec-fetch-mode': 'cors',
40
'sec-fetch-site': 'same-origin',
41
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
42
}
43
44
async with StreamSession(
45
headers=headers,
46
cookies=cookies,
47
impersonate="chrome",
48
proxies={"all": proxy},
49
timeout=timeout
50
) as session:
51
52
if not cls._post_id or not cls._nonce:
53
async with session.get(f"{cls.url}/") as response:
54
await raise_for_status(response)
55
response_text = await response.text()
56
57
post_id_match = re.search(r'data-post-id="([0-9]+)"', response_text)
58
nonce_match = re.search(r'data-nonce="(.*?)"', response_text)
59
60
if not post_id_match:
61
raise RuntimeError("No post ID found")
62
cls._post_id = post_id_match.group(1)
63
64
if not nonce_match:
65
raise RuntimeError("No nonce found")
66
cls._nonce = nonce_match.group(1)
67
68
prompt = format_prompt(messages)
69
data = {
70
"_wpnonce": cls._nonce,
71
"post_id": cls._post_id,
72
"url": cls.url,
73
"action": "wpaicg_chat_shortcode_message",
74
"message": prompt,
75
"bot_id": "0"
76
}
77
78
async with session.post(f"{cls.url}/wp-admin/admin-ajax.php", data=data, cookies=cookies) as response:
79
await raise_for_status(response)
80
response_json = await response.json()
81
if "data" not in response_json:
82
raise RuntimeError("Unexpected response structure: 'data' field missing")
83
return response_json["data"]
@@ -10,7 +10,7 @@ from .helper import format_prompt
10
10
class ChatgptFree(AsyncProvider):
11
11
url = "https://chatgptfree.ai"
12
12
supports_gpt_35_turbo = True
13
working = False
13
working = True
14
14
_post_id = None
15
15
_nonce = None
16
16
@@ -0,0 +1,117 @@
1
from __future__ import annotations
2
3
import json
4
import aiohttp
5
import asyncio
6
from typing import Optional
7
import base64
8
9
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
10
from .helper import get_connector
11
from ..typing import AsyncResult, Messages
12
from ..requests.raise_for_status import raise_for_status
13
from ..providers.conversation import BaseConversation
14
15
class DDG(AsyncGeneratorProvider, ProviderModelMixin):
16
url = base64.b64decode("aHR0cHM6Ly9kdWNrZHVja2dvLmNvbS9haWNoYXQ=").decode("utf-8")
17
working = True
18
supports_gpt_35_turbo = True
19
supports_message_history = True
20
21
default_model = "gpt-3.5-turbo-0125"
22
models = ["gpt-3.5-turbo-0125", "claude-3-haiku-20240307", "meta-llama/Llama-3-70b-chat-hf", "mistralai/Mixtral-8x7B-Instruct-v0.1"]
23
model_aliases = {
24
"gpt-3.5-turbo": "gpt-3.5-turbo-0125",
25
"claude-3-haiku": "claude-3-haiku-20240307",
26
"llama-3-70b": "meta-llama/Llama-3-70b-chat-hf",
27
"mixtral-8x7B": "mistralai/Mixtral-8x7B-Instruct-v0.1"
28
}
29
30
# Obfuscated URLs and headers
31
status_url = base64.b64decode("aHR0cHM6Ly9kdWNrZHVja2dvLmNvbS9kdWNrY2hhdC92MS9zdGF0dXM=").decode("utf-8")
32
chat_url = base64.b64decode("aHR0cHM6Ly9kdWNrZHVja2dvLmNvbS9kdWNrY2hhdC92MS9jaGF0").decode("utf-8")
33
referer = base64.b64decode("aHR0cHM6Ly9kdWNrZHVja2dvLmNvbS8=").decode("utf-8")
34
origin = base64.b64decode("aHR0cHM6Ly9kdWNrZHVja2dvLmNvbQ==").decode("utf-8")
35
36
user_agent = 'Mozilla/5.0 (Windows NT 10.0; rv:127.0) Gecko/20100101 Firefox/127.0'
37
headers = {
38
'User-Agent': user_agent,
39
'Accept': 'text/event-stream',
40
'Accept-Language': 'en-US,en;q=0.5',
41
'Accept-Encoding': 'gzip, deflate, br, zstd',
42
'Referer': referer,
43
'Content-Type': 'application/json',
44
'Origin': origin,
45
'Connection': 'keep-alive',
46
'Cookie': 'dcm=3',
47
'Sec-Fetch-Dest': 'empty',
48
'Sec-Fetch-Mode': 'cors',
49
'Sec-Fetch-Site': 'same-origin',
50
'Pragma': 'no-cache',
51
'TE': 'trailers'
52
}
53
54
@classmethod
55
async def get_vqd(cls, session: aiohttp.ClientSession) -> Optional[str]:
56
try:
57
async with session.get(cls.status_url, headers={"x-vqd-accept": "1"}) as response:
58
await raise_for_status(response)
59
return response.headers.get("x-vqd-4")
60
except Exception as e:
61
print(f"Error getting VQD: {e}")
62
return None
63
64
@classmethod
65
async def create_async_generator(
66
cls,
67
model: str,
68
messages: Messages,
69
proxy: str = None,
70
connector: aiohttp.BaseConnector = None,
71
conversation: Conversation = None,
72
return_conversation: bool = False,
73
**kwargs
74
) -> AsyncResult:
75
async with aiohttp.ClientSession(headers=cls.headers, connector=get_connector(connector, proxy)) as session:
76
vqd_4 = None
77
if conversation is not None and len(messages) > 1:
78
vqd_4 = conversation.vqd_4
79
messages = [*conversation.messages, messages[-2], messages[-1]]
80
else:
81
for _ in range(3): # Try up to 3 times to get a valid VQD
82
vqd_4 = await cls.get_vqd(session)
83
if vqd_4:
84
break
85
await asyncio.sleep(1) # Wait a bit before retrying
86
87
if not vqd_4:
88
raise Exception("Failed to obtain a valid VQD token")
89
90
messages = [messages[-1]] # Only use the last message for new conversations
91
92
payload = {
93
'model': cls.get_model(model),
94
'messages': [{'role': m['role'], 'content': m['content']} for m in messages]
95
}
96
97
async with session.post(cls.chat_url, json=payload, headers={"x-vqd-4": vqd_4}) as response:
98
await raise_for_status(response)
99
if return_conversation:
100
yield Conversation(vqd_4, messages)
101
102
async for line in response.content:
103
if line.startswith(b"data: "):
104
chunk = line[6:]
105
if chunk.startswith(b"[DONE]"):
106
break
107
try:
108
data = json.loads(chunk)
109
if "message" in data and data["message"]:
110
yield data["message"]
111
except json.JSONDecodeError:
112
print(f"Failed to decode JSON: {chunk}")
113
114
class Conversation(BaseConversation):
115
def __init__(self, vqd_4: str, messages: Messages) -> None:
116
self.vqd_4 = vqd_4
117
self.messages = messages
@@ -0,0 +1,78 @@
1
from __future__ import annotations
2
3
import json
4
import asyncio
5
from aiohttp import ClientSession, TCPConnector
6
from urllib.parse import urlencode
7
8
from ..typing import AsyncResult, Messages
9
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
10
from .helper import format_prompt
11
12
13
class Feedough(AsyncGeneratorProvider, ProviderModelMixin):
14
url = "https://www.feedough.com"
15
api_endpoint = "/wp-admin/admin-ajax.php"
16
working = True
17
default_model = ''
18
19
@classmethod
20
async def create_async_generator(
21
cls,
22
model: str,
23
messages: Messages,
24
proxy: str = None,
25
**kwargs
26
) -> AsyncResult:
27
headers = {
28
"accept": "*/*",
29
"accept-language": "en-US,en;q=0.9",
30
"content-type": "application/x-www-form-urlencoded;charset=UTF-8",
31
"dnt": "1",
32
"origin": cls.url,
33
"referer": f"{cls.url}/ai-prompt-generator/",
34
"sec-ch-ua": '"Not/A)Brand";v="8", "Chromium";v="126"',
35
"sec-ch-ua-mobile": "?0",
36
"sec-ch-ua-platform": '"Linux"',
37
"sec-fetch-dest": "empty",
38
"sec-fetch-mode": "cors",
39
"sec-fetch-site": "same-origin",
40
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
41
}
42
43
connector = TCPConnector(ssl=False)
44
45
async with ClientSession(headers=headers, connector=connector) as session:
46
data = {
47
"action": "aixg_generate",
48
"prompt": format_prompt(messages),
49
"aixg_generate_nonce": "110c021031"
50
}
51
52
try:
53
async with session.post(
54
f"{cls.url}{cls.api_endpoint}",
55
data=urlencode(data),
56
proxy=proxy
57
) as response:
58
response.raise_for_status()
59
response_text = await response.text()
60
try:
61
response_json = json.loads(response_text)
62
if response_json.get("success") and "data" in response_json:
63
message = response_json["data"].get("message", "")
64
yield message
65
except json.JSONDecodeError:
66
yield response_text
67
except Exception as e:
68
print(f"An error occurred: {e}")
69
70
@classmethod
71
async def run(cls, *args, **kwargs):
72
async for item in cls.create_async_generator(*args, **kwargs):
73
yield item
74
75
tasks = asyncio.all_tasks()
76
for task in tasks:
77
if not task.done():
78
await task
@@ -1,17 +1,27 @@
1
1
from __future__ import annotations
2
3
2
import json
4
from aiohttp import ClientSession, ClientTimeout
5
3
from aiohttp import ClientSession
6
4
from ..typing import AsyncResult, Messages
7
5
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
8
from ..requests.raise_for_status import raise_for_status
6
from .helper import format_prompt
7
9
8
10
9
class FreeChatgpt(AsyncGeneratorProvider, ProviderModelMixin):
11
url = "https://free.chatgpt.org.uk"
10
url = "https://chat.chatgpt.org.uk"
11
api_endpoint = "/api/openai/v1/chat/completions"
12
12
working = True
13
supports_message_history = True
14
default_model = "google-gemini-pro"
13
supports_gpt_35_turbo = True
14
default_model = 'gpt-3.5-turbo'
15
models = [
16
'gpt-3.5-turbo',
17
'SparkDesk-v1.1',
18
'deepseek-coder',
19
'deepseek-chat',
20
'Qwen2-7B-Instruct',
21
'glm4-9B-chat',
22
'chatglm3-6B',
23
'Yi-1.5-9B-Chat',
24
]
15
25
16
26
@classmethod
17
27
async def create_async_generator(
@@ -19,45 +29,50 @@ class FreeChatgpt(AsyncGeneratorProvider, ProviderModelMixin):
19
29
model: str,
20
30
messages: Messages,
21
31
proxy: str = None,
22
timeout: int = 120,
23
32
**kwargs
24
33
) -> AsyncResult:
25
34
headers = {
26
"Accept": "application/json, text/event-stream",
27
"Content-Type":"application/json",
28
"Accept-Encoding": "gzip, deflate, br",
29
"Accept-Language": "en-US,en;q=0.5",
30
"Host":"free.chatgpt.org.uk",
31
"Referer":f"{cls.url}/",
32
"Origin":f"{cls.url}",
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",
35
"accept": "application/json, text/event-stream",
36
"accept-language": "en-US,en;q=0.9",
37
"content-type": "application/json",
38
"dnt": "1",
39
"origin": cls.url,
40
"referer": f"{cls.url}/",
41
"sec-ch-ua": '"Not/A)Brand";v="8", "Chromium";v="126"',
42
"sec-ch-ua-mobile": "?0",
43
"sec-ch-ua-platform": '"Linux"',
44
"sec-fetch-dest": "empty",
45
"sec-fetch-mode": "cors",
46
"sec-fetch-site": "same-origin",
47
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
37
48
}
38
async with ClientSession(headers=headers, timeout=ClientTimeout(timeout)) as session:
49
async with ClientSession(headers=headers) as session:
50
prompt = format_prompt(messages)
39
51
data = {
40
"messages": messages,
52
"messages": [
53
{"role": "system", "content": "\nYou are ChatGPT, a large language model trained by OpenAI.\nKnowledge cutoff: 2021-09\nCurrent model: gpt-3.5-turbo\nCurrent time: Thu Jul 04 2024 21:35:59 GMT+0300 (Eastern European Summer Time)\nLatex inline: \\(x^2\\) \nLatex block: $$e=mc^2$$\n\n"},
54
{"role": "user", "content": prompt}
55
],
41
56
"stream": True,
42
"model": cls.get_model(""),
43
"temperature": kwargs.get("temperature", 0.5),
44
"presence_penalty": kwargs.get("presence_penalty", 0),
45
"frequency_penalty": kwargs.get("frequency_penalty", 0),
46
"top_p": kwargs.get("top_p", 1)
57
"model": model,
58
"temperature": 0.5,
59
"presence_penalty": 0,
60
"frequency_penalty": 0,
61
"top_p": 1
47
62
}
48
async with session.post(f'{cls.url}/api/openai/v1/chat/completions', json=data, proxy=proxy) as response:
49
await raise_for_status(response)
50
started = False
63
async with session.post(f"{cls.url}{cls.api_endpoint}", json=data, proxy=proxy) as response:
64
response.raise_for_status()
65
accumulated_text = ""
51
66
async for line in response.content:
52
if line.startswith(b"data: [DONE]"):
53
break
54
elif line.startswith(b"data: "):
55
line = json.loads(line[6:])
56
if(line["choices"]==[]):
57
continue
58
chunk = line["choices"][0]["delta"].get("content")
59
if chunk:
60
started = True
61
yield chunk
62
if not started:
63
raise RuntimeError("Empty response")
67
if line:
68
line_str = line.decode().strip()
69
if line_str == "data: [DONE]":
70
yield accumulated_text
71
break
72
elif line_str.startswith("data: "):
73
try:
74
chunk = json.loads(line_str[6:])
75
delta_content = chunk.get("choices", [{}])[0].get("delta", {}).get("content", "")
76
accumulated_text += delta_content
77
except json.JSONDecodeError:
78
pass
@@ -1,55 +1,67 @@
1
1
from __future__ import annotations
2
2
3
import time, hashlib, random
4
5
from ..typing import AsyncResult, Messages
3
import time
4
import hashlib
5
import random
6
from typing import AsyncGenerator, Optional, Dict, Any
7
from ..typing import Messages
6
8
from ..requests import StreamSession, raise_for_status
7
9
from .base_provider import AsyncGeneratorProvider
8
10
from ..errors import RateLimitError
9
11
10
domains = [
12
# Constants
13
DOMAINS = [
11
14
"https://s.aifree.site",
12
15
"https://v.aifree.site/"
13
16
]
17
RATE_LIMIT_ERROR_MESSAGE = "当前地区当日额度已消耗完"
18
14
19
15
20
class FreeGpt(AsyncGeneratorProvider):
16
url = "https://freegptsnav.aifree.site"
17
working = True
18
supports_message_history = True
19
supports_system_message = True
20
supports_gpt_35_turbo = True
21
url: str = "https://freegptsnav.aifree.site"
22
working: bool = True
23
supports_message_history: bool = True
24
supports_system_message: bool = True
25
supports_gpt_35_turbo: bool = True
21
26
22
27
@classmethod
23
28
async def create_async_generator(
24
29
cls,
25
30
model: str,
26
31
messages: Messages,
27
proxy: str = None,
32
proxy: Optional[str] = None,
28
33
timeout: int = 120,
29
**kwargs
30
) -> AsyncResult:
34
**kwargs: Any
35
) -> AsyncGenerator[str, None]:
36
prompt = messages[-1]["content"]
37
timestamp = int(time.time())
38
data = cls._build_request_data(messages, prompt, timestamp)
39
40
domain = random.choice(DOMAINS)
41
31
42
async with StreamSession(
32
43
impersonate="chrome",
33
44
timeout=timeout,
34
proxies={"all": proxy}
45
proxies={"all": proxy} if proxy else None
35
46
) as session:
36
prompt = messages[-1]["content"]
37
timestamp = int(time.time())
38
data = {
39
"messages": messages,
40
"time": timestamp,
41
"pass": None,
42
"sign": generate_signature(timestamp, prompt)
43
}
44
domain = random.choice(domains)
45
47
async with session.post(f"{domain}/api/generate", json=data) as response:
46
48
await raise_for_status(response)
47
49
async for chunk in response.iter_content():
48
chunk = chunk.decode(errors="ignore")
49
if chunk == "当前地区当日额度已消耗完":
50
chunk_decoded = chunk.decode(errors="ignore")
51
if chunk_decoded == RATE_LIMIT_ERROR_MESSAGE:
50
52
raise RateLimitError("Rate limit reached")
51
yield chunk
52
53
def generate_signature(timestamp: int, message: str, secret: str = ""):
53
yield chunk_decoded
54
55
@staticmethod
56
def _build_request_data(messages: Messages, prompt: str, timestamp: int, secret: str = "") -> Dict[str, Any]:
57
return {
58
"messages": messages,
59
"time": timestamp,
60
"pass": None,
61
"sign": generate_signature(timestamp, prompt, secret)
62
}
63
64
65
def generate_signature(timestamp: int, message: str, secret: str = "") -> str:
54
66
data = f"{timestamp}:{message}:{secret}"
55
67
return hashlib.sha256(data.encode()).hexdigest()
@@ -9,13 +9,14 @@ from ..errors import RateLimitError
9
9
from ..requests import raise_for_status
10
10
from ..requests.aiohttp import get_connector
11
11
from ..typing import AsyncResult, Messages
12
from .base_provider import AsyncGeneratorProvider
12
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
13
13
14
14
15
class GeminiProChat(AsyncGeneratorProvider):
15
class GeminiProChat(AsyncGeneratorProvider, ProviderModelMixin):
16
16
url = "https://www.chatgot.one/"
17
17
working = True
18
18
supports_message_history = True
19
default_model = ''
19
20
20
21
@classmethod
21
22
async def create_async_generator(
@@ -32,8 +33,8 @@ class GeminiProChat(AsyncGeneratorProvider):
32
33
"Accept-Language": "en-US,en;q=0.5",
33
34
"Accept-Encoding": "gzip, deflate, br",
34
35
"Content-Type": "text/plain;charset=UTF-8",
35
"Referer": "https://gemini-chatbot-sigma.vercel.app/",
36
"Origin": "https://gemini-chatbot-sigma.vercel.app",
36
"Referer": f"{cls.url}/",
37
"Origin": cls.url,
37
38
"Sec-Fetch-Dest": "empty",
38
39
"Sec-Fetch-Mode": "cors",
39
40
"Sec-Fetch-Site": "same-origin",
@@ -13,15 +13,13 @@ class HuggingChat(AbstractProvider, ProviderModelMixin):
13
13
supports_stream = True
14
14
default_model = "mistralai/Mixtral-8x7B-Instruct-v0.1"
15
15
models = [
16
"HuggingFaceH4/zephyr-orpo-141b-A35b-v0.1",
17
16
'CohereForAI/c4ai-command-r-plus',
17
'meta-llama/Meta-Llama-3-70B-Instruct',
18
18
'mistralai/Mixtral-8x7B-Instruct-v0.1',
19
'google/gemma-1.1-7b-it',
20
19
'NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO',
20
'01-ai/Yi-1.5-34B-Chat',
21
21
'mistralai/Mistral-7B-Instruct-v0.2',
22
'meta-llama/Meta-Llama-3-70B-Instruct',
23
22
'microsoft/Phi-3-mini-4k-instruct',
24
'01-ai/Yi-1.5-34B-Chat'
25
23
]
26
24
27
25
model_aliases = {
@@ -12,10 +12,16 @@ from ..requests.raise_for_status import raise_for_status
12
12
class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin):
13
13
url = "https://huggingface.co/chat"
14
14
working = True
15
needs_auth = True
15
16
supports_message_history = True
16
17
models = [
17
"mistralai/Mixtral-8x7B-Instruct-v0.1",
18
"mistralai/Mistral-7B-Instruct-v0.2"
18
'CohereForAI/c4ai-command-r-plus',
19
'meta-llama/Meta-Llama-3-70B-Instruct',
20
'mistralai/Mixtral-8x7B-Instruct-v0.1',
21
'NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO',
22
'01-ai/Yi-1.5-34B-Chat',
23
'mistralai/Mistral-7B-Instruct-v0.2',
24
'microsoft/Phi-3-mini-4k-instruct',
19
25
]
20
26
default_model = "mistralai/Mixtral-8x7B-Instruct-v0.1"
21
27
@@ -74,4 +80,4 @@ def format_prompt(messages: Messages) -> str:
74
80
for idx, message in enumerate(messages)
75
81
if message["role"] == "assistant"
76
82
])
77
return f"{history}<s>[INST] {question} [/INST]"
83
return f"{history}<s>[INST] {question} [/INST]"
@@ -1,7 +1,8 @@
1
1
from __future__ import annotations
2
2
3
3
import json
4
from aiohttp import ClientSession, BaseConnector
4
from typing import AsyncGenerator, Optional, List, Dict, Union, Any
5
from aiohttp import ClientSession, BaseConnector, ClientResponse
5
6
6
7
from ..typing import AsyncResult, Messages
7
8
from .base_provider import AsyncGeneratorProvider
@@ -19,12 +20,13 @@ class Koala(AsyncGeneratorProvider):
19
20
cls,
20
21
model: str,
21
22
messages: Messages,
22
proxy: str = None,
23
connector: BaseConnector = None,
24
**kwargs
25
) -> AsyncResult:
23
proxy: Optional[str] = None,
24
connector: Optional[BaseConnector] = None,
25
**kwargs: Any
26
) -> AsyncGenerator[Dict[str, Union[str, int, float, List[Dict[str, Any]], None]], None]:
26
27
if not model:
27
28
model = "gpt-3.5-turbo"
29
28
30
headers = {
29
31
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:122.0) Gecko/20100101 Firefox/122.0",
30
32
"Accept": "text/event-stream",
@@ -40,13 +42,17 @@ class Koala(AsyncGeneratorProvider):
40
42
"Sec-Fetch-Site": "same-origin",
41
43
"TE": "trailers",
42
44
}
45
43
46
async with ClientSession(headers=headers, connector=get_connector(connector, proxy)) as session:
44
input = messages[-1]["content"]
45
system_messages = [message["content"] for message in messages if message["role"] == "system"]
47
input_text = messages[-1]["content"]
48
system_messages = " ".join(
49
message["content"] for message in messages if message["role"] == "system"
50
)
46
51
if system_messages:
47
input += " ".join(system_messages)
52
input_text += f" {system_messages}"
53
48
54
data = {
49
"input": input,
55
"input": input_text,
50
56
"inputHistory": [
51
57
message["content"]
52
58
for message in messages[:-1]
@@ -59,8 +65,14 @@ class Koala(AsyncGeneratorProvider):
59
65
],
60
66
"model": model,
61
67
}
68
62
69
async with session.post(f"{cls.url}/api/gpt/", json=data, proxy=proxy) as response:
63
70
await raise_for_status(response)
64
async for chunk in response.content:
65
if chunk.startswith(b"data: "):
66
yield json.loads(chunk[6:])
71
async for chunk in cls._parse_event_stream(response):
72
yield chunk
73
74
@staticmethod
75
async def _parse_event_stream(response: ClientResponse) -> AsyncGenerator[Dict[str, Any], None]:
76
async for chunk in response.content:
77
if chunk.startswith(b"data: "):
78
yield json.loads(chunk[6:])