返回提交历史
Modified
g4f/Provider/AItianhuSpace.py
+1
-0
Modified
g4f/Provider/PerplexityAi.py
+12
-12
Modified
g4f/Provider/needs_auth/Bard.py
+3
-4
Modified
g4f/Provider/needs_auth/Theb.py
+137
-80
Added
g4f/Provider/needs_auth/ThebApi.py
+77
-0
Modified
g4f/Provider/needs_auth/__init__.py
+1
-0
XFEstudio/gpt4free
Improve providers
e4caf1d0
代码差异
6 个文件
+231
-96
@@ -11,6 +11,7 @@ from .. import debug
11
11
class AItianhuSpace(BaseProvider):
12
12
url = "https://chat3.aiyunos.top/"
13
13
working = True
14
supports_stream = True
14
15
supports_gpt_35_turbo = True
15
16
_domains = ["aitianhu.com", "aitianhu1.top"]
16
17
@@ -22,24 +22,24 @@ class PerplexityAi(BaseProvider):
22
22
timeout: int = 120,
23
23
browser: WebDriver = None,
24
24
copilot: bool = False,
25
headless: bool = True,
26
25
**kwargs
27
26
) -> CreateResult:
28
driver = browser if browser else get_browser("", headless, proxy)
27
driver = browser if browser else get_browser("", False, proxy)
29
28
30
29
from selenium.webdriver.common.by import By
31
30
from selenium.webdriver.support.ui import WebDriverWait
32
31
from selenium.webdriver.support import expected_conditions as EC
32
from selenium.webdriver.common.keys import Keys
33
33
34
34
prompt = format_prompt(messages)
35
35
36
36
driver.get(f"{cls.url}/")
37
37
wait = WebDriverWait(driver, timeout)
38
38
39
# Page loaded?
39
# Is page loaded?
40
40
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "textarea[placeholder='Ask anything...']")))
41
41
42
# Add WebSocket hook
42
# Register WebSocket hook
43
43
script = """
44
44
window._message = window._last_message = "";
45
45
window._message_finished = false;
@@ -57,8 +57,9 @@ WebSocket.prototype.send = function(...args) {
57
57
content = JSON.parse(content);
58
58
}
59
59
window._message = content["answer"];
60
window._message_finished = data[0] == "query_answered";
61
window._web_results = content["web_results"];
60
if (!window._message_finished) {
61
window._message_finished = data[0] == "query_answered";
62
}
62
63
}
63
64
}
64
65
});
@@ -70,20 +71,19 @@ WebSocket.prototype.send = function(...args) {
70
71
71
72
if copilot:
72
73
try:
73
# Check account
74
# Check for account
74
75
driver.find_element(By.CSS_SELECTOR, "img[alt='User avatar']")
75
76
# Enable copilot
76
77
driver.find_element(By.CSS_SELECTOR, "button[data-testid='copilot-toggle']").click()
77
78
except:
78
raise RuntimeError("For copilot you needs a account")
79
raise RuntimeError("You need a account for copilot")
79
80
80
# Enter question
81
# Submit prompt
81
82
driver.find_element(By.CSS_SELECTOR, "textarea[placeholder='Ask anything...']").send_keys(prompt)
82
# Submit question
83
driver.find_element(By.CSS_SELECTOR, "button.bg-super svg[data-icon='arrow-right']").click()
83
driver.find_element(By.CSS_SELECTOR, "textarea[placeholder='Ask anything...']").send_keys(Keys.ENTER)
84
84
85
85
try:
86
# Yield response
86
# Stream response
87
87
script = """
88
88
if(window._message && window._message != window._last_message) {
89
89
try {
@@ -32,7 +32,7 @@ class Bard(BaseProvider):
32
32
33
33
try:
34
34
driver.get(f"{cls.url}/chat")
35
wait = WebDriverWait(driver, 10)
35
wait = WebDriverWait(driver, 10 if headless else 240)
36
36
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.ql-editor.textarea")))
37
37
except:
38
38
# Reopen browser for login
@@ -61,14 +61,13 @@ XMLHttpRequest.prototype.open = function(method, url) {
61
61
"""
62
62
driver.execute_script(script)
63
63
64
# Input and submit prompt
64
# Submit prompt
65
65
driver.find_element(By.CSS_SELECTOR, "div.ql-editor.ql-blank.textarea").send_keys(prompt)
66
66
driver.find_element(By.CSS_SELECTOR, "button.send-button").click()
67
67
68
68
# Yield response
69
script = "return window._message;"
70
69
while True:
71
chunk = driver.execute_script(script)
70
chunk = driver.execute_script("return window._message;")
72
71
if chunk:
73
72
yield chunk
74
73
return
@@ -1,101 +1,158 @@
1
1
from __future__ import annotations
2
2
3
import json
4
import random
5
import requests
3
import time
6
4
7
from ...typing import Any, CreateResult, Messages
5
from ...typing import CreateResult, Messages
8
6
from ..base_provider import BaseProvider
9
from ..helper import format_prompt
7
from ..helper import WebDriver, format_prompt, get_browser
10
8
9
models = {
10
"theb-ai": "TheB.AI",
11
"theb-ai-free": "TheB.AI Free",
12
"gpt-3.5-turbo": "GPT-3.5 Turbo (New)",
13
"gpt-3.5-turbo-16k": "GPT-3.5-16K",
14
"gpt-4-turbo": "GPT-4 Turbo",
15
"gpt-4": "GPT-4",
16
"gpt-4-32k": "GPT-4 32K",
17
"claude-2": "Claude 2",
18
"claude-instant-1": "Claude Instant 1.2",
19
"palm-2": "PaLM 2",
20
"palm-2-32k": "PaLM 2 32K",
21
"palm-2-codey": "Codey",
22
"palm-2-codey-32k": "Codey 32K",
23
"vicuna-13b-v1.5": "Vicuna v1.5 13B",
24
"llama-2-7b-chat": "Llama 2 7B",
25
"llama-2-13b-chat": "Llama 2 13B",
26
"llama-2-70b-chat": "Llama 2 70B",
27
"code-llama-7b": "Code Llama 7B",
28
"code-llama-13b": "Code Llama 13B",
29
"code-llama-34b": "Code Llama 34B",
30
"qwen-7b-chat": "Qwen 7B"
31
}
11
32
12
33
class Theb(BaseProvider):
13
url = "https://theb.ai"
14
working = True
15
supports_stream = True
16
supports_gpt_35_turbo = True
17
needs_auth = True
34
url = "https://beta.theb.ai"
35
working = True
36
supports_gpt_35_turbo = True
37
supports_gpt_4 = True
38
supports_stream = True
18
39
19
@staticmethod
40
@classmethod
20
41
def create_completion(
42
cls,
21
43
model: str,
22
44
messages: Messages,
23
45
stream: bool,
24
46
proxy: str = None,
47
browser: WebDriver = None,
48
headless: bool = True,
25
49
**kwargs
26
50
) -> CreateResult:
27
auth = kwargs.get("auth", {
28
"bearer_token":"free",
29
"org_id":"theb",
30
})
31
32
bearer_token = auth["bearer_token"]
33
org_id = auth["org_id"]
51
if model in models:
52
model = models[model]
53
prompt = format_prompt(messages)
54
driver = browser if browser else get_browser(None, headless, proxy)
34
55
35
headers = {
36
'authority': 'beta.theb.ai',
37
'accept': 'text/event-stream',
38
'accept-language': 'id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7',
39
'authorization': f'Bearer {bearer_token}',
40
'content-type': 'application/json',
41
'origin': 'https://beta.theb.ai',
42
'referer': 'https://beta.theb.ai/home',
43
'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',
44
'sec-ch-ua-mobile': '?0',
45
'sec-ch-ua-platform': '"Windows"',
46
'sec-fetch-dest': 'empty',
47
'sec-fetch-mode': 'cors',
48
'sec-fetch-site': 'same-origin',
49
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
50
'x-ai-model': 'ee8d4f29cb7047f78cbe84313ed6ace8',
51
}
56
from selenium.webdriver.common.by import By
57
from selenium.webdriver.support.ui import WebDriverWait
58
from selenium.webdriver.support import expected_conditions as EC
59
from selenium.webdriver.common.keys import Keys
52
60
53
req_rand = random.randint(100000000, 9999999999)
61
62
try:
63
driver.get(f"{cls.url}/home")
64
wait = WebDriverWait(driver, 10 if headless else 240)
65
wait.until(EC.visibility_of_element_located((By.TAG_NAME, "body")))
66
time.sleep(0.1)
67
try:
68
driver.find_element(By.CSS_SELECTOR, ".driver-overlay").click()
69
driver.find_element(By.CSS_SELECTOR, ".driver-overlay").click()
70
except:
71
pass
72
if model:
73
# Load model panel
74
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#SelectModel svg")))
75
time.sleep(0.1)
76
driver.find_element(By.CSS_SELECTOR, "#SelectModel svg").click()
77
try:
78
driver.find_element(By.CSS_SELECTOR, ".driver-overlay").click()
79
driver.find_element(By.CSS_SELECTOR, ".driver-overlay").click()
80
except:
81
pass
82
# Select model
83
selector = f"div.flex-col div.items-center span[title='{model}']"
84
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, selector)))
85
span = driver.find_element(By.CSS_SELECTOR, selector)
86
container = span.find_element(By.XPATH, "//div/../..")
87
button = container.find_element(By.CSS_SELECTOR, "button.btn-blue.btn-small.border")
88
button.click()
54
89
55
json_data: dict[str, Any] = {
56
"text" : format_prompt(messages),
57
"category" : "04f58f64a4aa4191a957b47290fee864",
58
"model" : "ee8d4f29cb7047f78cbe84313ed6ace8",
59
"model_params": {
60
"system_prompt" : "You are ChatGPT, a large language model trained by OpenAI, based on the GPT-3.5 architecture.\nKnowledge cutoff: 2021-09\nCurrent date: {{YYYY-MM-DD}}",
61
"temperature" : kwargs.get("temperature", 1),
62
"top_p" : kwargs.get("top_p", 1),
63
"frequency_penalty" : kwargs.get("frequency_penalty", 0),
64
"presence_penalty" : kwargs.get("presence_penalty", 0),
65
"long_term_memory" : "auto"
66
}
90
# Register fetch hook
91
script = """
92
window._fetch = window.fetch;
93
window.fetch = (url, options) => {
94
// Call parent fetch method
95
const result = window._fetch(url, options);
96
if (!url.startsWith("/api/conversation")) {
97
return result;
98
}
99
// Load response reader
100
result.then((response) => {
101
if (!response.body.locked) {
102
window._reader = response.body.getReader();
67
103
}
104
});
105
// Return dummy response
106
return new Promise((resolve, reject) => {
107
resolve(new Response(new ReadableStream()))
108
});
109
}
110
window._last_message = "";
111
"""
112
driver.execute_script(script)
68
113
69
response = requests.post(
70
f"https://beta.theb.ai/api/conversation?org_id={org_id}&req_rand={req_rand}",
71
headers=headers,
72
json=json_data,
73
stream=True,
74
proxies={"https": proxy}
75
)
76
77
response.raise_for_status()
78
content = ""
79
next_content = ""
80
for chunk in response.iter_lines():
81
if b"content" in chunk:
82
next_content = content
83
data = json.loads(chunk.decode().split("data: ")[1])
84
content = data["content"]
85
yield content.replace(next_content, "")
114
# Submit prompt
115
wait.until(EC.visibility_of_element_located((By.ID, "textareaAutosize")))
116
driver.find_element(By.ID, "textareaAutosize").send_keys(prompt)
117
driver.find_element(By.ID, "textareaAutosize").send_keys(Keys.ENTER)
86
118
87
@classmethod
88
@property
89
def params(cls):
90
params = [
91
("model", "str"),
92
("messages", "list[dict[str, str]]"),
93
("auth", "list[dict[str, str]]"),
94
("stream", "bool"),
95
("temperature", "float"),
96
("presence_penalty", "int"),
97
("frequency_penalty", "int"),
98
("top_p", "int")
99
]
100
param = ", ".join([": ".join(p) for p in params])
101
return f"g4f.provider.{cls.__name__} supports: ({param})"
119
# Read response with reader
120
script = """
121
if(window._reader) {
122
chunk = await window._reader.read();
123
if (chunk['done']) {
124
return null;
125
}
126
text = (new TextDecoder()).decode(chunk['value']);
127
message = '';
128
text.split('\\r\\n').forEach((line, index) => {
129
if (line.startsWith('data: ')) {
130
try {
131
line = JSON.parse(line.substring('data: '.length));
132
message = line["args"]["content"];
133
} catch(e) { }
134
}
135
});
136
if (message) {
137
try {
138
return message.substring(window._last_message.length);
139
} finally {
140
window._last_message = message;
141
}
142
}
143
}
144
return '';
145
"""
146
while True:
147
chunk = driver.execute_script(script)
148
if chunk:
149
yield chunk
150
elif chunk != "":
151
break
152
else:
153
time.sleep(0.1)
154
finally:
155
if not browser:
156
driver.close()
157
time.sleep(0.1)
158
driver.quit()
@@ -0,0 +1,77 @@
1
from __future__ import annotations
2
3
import requests
4
5
from ...typing import Any, CreateResult, Messages
6
from ..base_provider import BaseProvider
7
8
models = {
9
"theb-ai": "TheB.AI",
10
"gpt-3.5-turbo": "GPT-3.5",
11
"gpt-3.5-turbo-16k": "GPT-3.5-16K",
12
"gpt-4-turbo": "GPT-4 Turbo",
13
"gpt-4": "GPT-4",
14
"gpt-4-32k": "GPT-4 32K",
15
"claude-2": "Claude 2",
16
"claude-1": "Claude",
17
"claude-1-100k": "Claude 100K",
18
"claude-instant-1": "Claude Instant",
19
"claude-instant-1-100k": "Claude Instant 100K",
20
"palm-2": "PaLM 2",
21
"palm-2-codey": "Codey",
22
"vicuna-13b-v1.5": "Vicuna v1.5 13B",
23
"llama-2-7b-chat": "Llama 2 7B",
24
"llama-2-13b-chat": "Llama 2 13B",
25
"llama-2-70b-chat": "Llama 2 70B",
26
"code-llama-7b": "Code Llama 7B",
27
"code-llama-13b": "Code Llama 13B",
28
"code-llama-34b": "Code Llama 34B",
29
"qwen-7b-chat": "Qwen 7B"
30
}
31
32
class ThebApi(BaseProvider):
33
url = "https://theb.ai"
34
working = True
35
needs_auth = True
36
37
@staticmethod
38
def create_completion(
39
model: str,
40
messages: Messages,
41
stream: bool,
42
auth: str,
43
proxy: str = None,
44
**kwargs
45
) -> CreateResult:
46
if model and model not in models:
47
raise ValueError(f"Model are not supported: {model}")
48
headers = {
49
'accept': 'application/json',
50
'authorization': f'Bearer {auth}',
51
'content-type': 'application/json',
52
}
53
# response = requests.get("https://api.baizhi.ai/v1/models", headers=headers).json()["data"]
54
# models = dict([(m["id"], m["name"]) for m in response])
55
# print(json.dumps(models, indent=4))
56
data: dict[str, Any] = {
57
"model": model if model else "gpt-3.5-turbo",
58
"messages": messages,
59
"stream": False,
60
"model_params": {
61
"system_prompt": kwargs.get("system_message", "You are ChatGPT, a large language model trained by OpenAI, based on the GPT-3.5 architecture."),
62
"temperature": 1,
63
"top_p": 1,
64
**kwargs
65
}
66
}
67
response = requests.post(
68
"https://api.theb.ai/v1/chat/completions",
69
headers=headers,
70
json=data,
71
proxies={"https": proxy}
72
)
73
try:
74
response.raise_for_status()
75
yield response.json()["choices"][0]["message"]["content"]
76
except:
77
raise RuntimeError(f"Response: {next(response.iter_lines()).decode()}")
@@ -1,6 +1,7 @@
1
1
from .Bard import Bard
2
2
from .Raycast import Raycast
3
3
from .Theb import Theb
4
from .ThebApi import ThebApi
4
5
from .HuggingChat import HuggingChat
5
6
from .OpenaiChat import OpenaiChat
6
7
from .OpenAssistant import OpenAssistant