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

XFEstudio/gpt4free

Improve providers

e4caf1d0
Heiner Lohaus <hlohaus@users.noreply.github.com>
提交于

代码差异

6 个文件 +231 -96
Modified g4f/Provider/AItianhuSpace.py +1 -0
@@ -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
Modified g4f/Provider/PerplexityAi.py +12 -12
@@ -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 {
Modified g4f/Provider/needs_auth/Bard.py +3 -4
@@ -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
Modified g4f/Provider/needs_auth/Theb.py +137 -80
@@ -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()
Added g4f/Provider/needs_auth/ThebApi.py +77 -0
@@ -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()}")
Modified g4f/Provider/needs_auth/__init__.py +1 -0
@@ -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