diff options
Diffstat (limited to 'g4f/Provider/Providers')
26 files changed, 778 insertions, 253 deletions
diff --git a/g4f/Provider/Providers/AItianhu.py b/g4f/Provider/Providers/AItianhu.py new file mode 100644 index 00000000..0bdaa09a --- /dev/null +++ b/g4f/Provider/Providers/AItianhu.py @@ -0,0 +1,38 @@ +import os, requests +from ...typing import sha256, Dict, get_type_hints +import json + +url = "https://www.aitianhu.com/api/chat-process" +model = ['gpt-3.5-turbo'] +supports_stream = False +needs_auth = False +working = True + + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + base = '' + for message in messages: + base += '%s: %s\n' % (message['role'], message['content']) + base += 'assistant:' + + headers = { + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" + } + data = { + "prompt": base, + "options": {}, + "systemMessage": "You are ChatGPT, a large language model trained by OpenAI. Follow the user's instructions carefully. Respond using markdown.", + "temperature": kwargs.get("temperature", 0.8), + "top_p": kwargs.get("top_p", 1) + } + response = requests.post(url, headers=headers, json=data) + if response.status_code == 200: + lines = response.text.strip().split('\n') + res = json.loads(lines[-1]) + yield res['text'] + else: + print(f"Error Occurred::{response.status_code}") + return None + +params = f'g4f.Providers.{os.path.basename(__file__)[:-3]} supports: ' + \ + '(%s)' % ', '.join([f"{name}: {get_type_hints(_create_completion)[name].__name__}" for name in _create_completion.__code__.co_varnames[:_create_completion.__code__.co_argcount]])
\ No newline at end of file diff --git a/g4f/Provider/Providers/Acytoo.py b/g4f/Provider/Providers/Acytoo.py new file mode 100644 index 00000000..4f40eac2 --- /dev/null +++ b/g4f/Provider/Providers/Acytoo.py @@ -0,0 +1,42 @@ +import os, requests +from ...typing import sha256, Dict, get_type_hints +import json + +url = "https://chat.acytoo.com/api/completions" +model = ['gpt-3.5-turbo'] +supports_stream = False +needs_auth = False +working = False + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + base = '' + for message in messages: + base += '%s: %s\n' % (message['role'], message['content']) + base += 'assistant:' + + headers = { + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" + } + data = { + "key": "", + "model": "gpt-3.5-turbo", + "messages": [ + { + "role": "user", + "content": base, + "createdAt": 1688518523500 + } + ], + "temperature": 1, + "password": "" + } + + response = requests.post(url, headers=headers, data=json.dumps(data)) + if response.status_code == 200: + yield response.text + else: + print(f"Error Occurred::{response.status_code}") + return None + +params = f'g4f.Providers.{os.path.basename(__file__)[:-3]} supports: ' + \ + '(%s)' % ', '.join([f"{name}: {get_type_hints(_create_completion)[name].__name__}" for name in _create_completion.__code__.co_varnames[:_create_completion.__code__.co_argcount]])
\ No newline at end of file diff --git a/g4f/Provider/Providers/AiService.py b/g4f/Provider/Providers/AiService.py new file mode 100644 index 00000000..0f9d9c47 --- /dev/null +++ b/g4f/Provider/Providers/AiService.py @@ -0,0 +1,41 @@ +import os,sys +import requests +from ...typing import get_type_hints + +url = "https://aiservice.vercel.app/api/chat/answer" +model = ['gpt-3.5-turbo'] +supports_stream = False +needs_auth = False +working = True + + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + base = '' + for message in messages: + base += '%s: %s\n' % (message['role'], message['content']) + base += 'assistant:' + + headers = { + "accept": "*/*", + "content-type": "text/plain;charset=UTF-8", + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "Referer": "https://aiservice.vercel.app/chat", + } + data = { + "input": base + } + response = requests.post(url, headers=headers, json=data) + if response.status_code == 200: + _json = response.json() + yield _json['data'] + else: + print(f"Error Occurred::{response.status_code}") + return None + + + +params = f'g4f.Providers.{os.path.basename(__file__)[:-3]} supports: ' + \ + '(%s)' % ', '.join( + [f"{name}: {get_type_hints(_create_completion)[name].__name__}" for name in _create_completion.__code__.co_varnames[:_create_completion.__code__.co_argcount]])
\ No newline at end of file diff --git a/g4f/Provider/Providers/Aichat.py b/g4f/Provider/Providers/Aichat.py index e4fde8c3..919486f2 100644 --- a/g4f/Provider/Providers/Aichat.py +++ b/g4f/Provider/Providers/Aichat.py @@ -5,6 +5,7 @@ url = 'https://chat-gpt.org/chat' model = ['gpt-3.5-turbo'] supports_stream = False needs_auth = False +working = True def _create_completion(model: str, messages: list, stream: bool, **kwargs): base = '' diff --git a/g4f/Provider/Providers/Ails.py b/g4f/Provider/Providers/Ails.py index 1a14b2e9..1433c4a3 100644 --- a/g4f/Provider/Providers/Ails.py +++ b/g4f/Provider/Providers/Ails.py @@ -13,6 +13,8 @@ url: str = 'https://ai.ls' model: str = 'gpt-3.5-turbo' supports_stream = True needs_auth = False +working = True + class Utils: def hash(json_data: Dict[str, str]) -> sha256: @@ -35,7 +37,9 @@ class Utils: n = e % 10 r = n + 1 if n % 2 == 0 else n return str(e - n + r) - + def getV(): + crossref = requests.get("https://ai.ls"+ requests.get("https://ai.ls/?chat=1").text.split('crossorigin href="')[1].split('"')[0]).text.split('G4="')[1].split('"')[0] + return crossref def _create_completion(model: str, messages: list, temperature: float = 0.6, stream: bool = False, **kwargs): @@ -45,7 +49,7 @@ def _create_completion(model: str, messages: list, temperature: float = 0.6, str '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', 'authorization': 'Bearer free', 'client-id': str(uuid.uuid4()), - 'client-v': '0.1.217', + 'client-v': Utils.getV(), 'content-type': 'application/json', 'origin': 'https://ai.ls', 'referer': 'https://ai.ls/', @@ -73,7 +77,7 @@ def _create_completion(model: str, messages: list, temperature: float = 0.6, str json_data = json.dumps(separators=(',', ':'), obj={ 'model': 'gpt-3.5-turbo', - 'temperature': 0.6, + 'temperature': temperature, 'stream': True, 'messages': messages} | sig) @@ -88,4 +92,4 @@ def _create_completion(model: str, messages: list, temperature: float = 0.6, str yield token params = f'g4f.Providers.{os.path.basename(__file__)[:-3]} supports: ' + \ - '(%s)' % ', '.join([f"{name}: {get_type_hints(_create_completion)[name].__name__}" for name in _create_completion.__code__.co_varnames[:_create_completion.__code__.co_argcount]])
\ No newline at end of file + '(%s)' % ', '.join([f"{name}: {get_type_hints(_create_completion)[name].__name__}" for name in _create_completion.__code__.co_varnames[:_create_completion.__code__.co_argcount]]) diff --git a/g4f/Provider/Providers/Bard.py b/g4f/Provider/Providers/Bard.py index 4c37c4b7..0d007a10 100644 --- a/g4f/Provider/Providers/Bard.py +++ b/g4f/Provider/Providers/Bard.py @@ -5,6 +5,8 @@ url = 'https://bard.google.com' model = ['Palm2'] supports_stream = False needs_auth = True +working = True + def _create_completion(model: str, messages: list, stream: bool, **kwargs): psid = {cookie.name: cookie.value for cookie in browser_cookie3.chrome( diff --git a/g4f/Provider/Providers/Bing.py b/g4f/Provider/Providers/Bing.py index 2ec2cf05..5e290f91 100644 --- a/g4f/Provider/Providers/Bing.py +++ b/g4f/Provider/Providers/Bing.py @@ -16,6 +16,7 @@ url = 'https://bing.com/chat' model = ['gpt-4'] supports_stream = True needs_auth = False +working = True ssl_context = ssl.create_default_context() ssl_context.load_verify_locations(certifi.where()) diff --git a/g4f/Provider/Providers/BingHuan.py b/g4f/Provider/Providers/BingHuan.py new file mode 100644 index 00000000..64b67e4b --- /dev/null +++ b/g4f/Provider/Providers/BingHuan.py @@ -0,0 +1,28 @@ +import os,sys +import json +import subprocess +from ...typing import sha256, Dict, get_type_hints + +url = 'https://b.ai-huan.xyz' +model = ['gpt-3.5-turbo', 'gpt-4'] +supports_stream = True +needs_auth = False +working = False + + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + path = os.path.dirname(os.path.realpath(__file__)) + config = json.dumps({ + 'messages': messages, + 'model': model}, separators=(',', ':')) + cmd = ['python', f'{path}/helpers/binghuan.py', config] + + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + for line in iter(p.stdout.readline, b''): + yield line.decode('cp1252') + + +params = f'g4f.Providers.{os.path.basename(__file__)[:-3]} supports: ' + \ + '(%s)' % ', '.join( + [f"{name}: {get_type_hints(_create_completion)[name].__name__}" for name in _create_completion.__code__.co_varnames[:_create_completion.__code__.co_argcount]])
\ No newline at end of file diff --git a/g4f/Provider/Providers/ChatgptAi.py b/g4f/Provider/Providers/ChatgptAi.py index 00d4cf6f..1f9ead0e 100644 --- a/g4f/Provider/Providers/ChatgptAi.py +++ b/g4f/Provider/Providers/ChatgptAi.py @@ -6,6 +6,8 @@ url = 'https://chatgpt.ai/gpt-4/' model = ['gpt-4'] supports_stream = False needs_auth = False +working = True + def _create_completion(model: str, messages: list, stream: bool, **kwargs): chat = '' @@ -13,8 +15,7 @@ def _create_completion(model: str, messages: list, stream: bool, **kwargs): chat += '%s: %s\n' % (message['role'], message['content']) chat += 'assistant: ' - response = requests.get('https://chatgpt.ai/gpt-4/') - + response = requests.get('https://chatgpt.ai/') nonce, post_id, _, bot_id = re.findall(r'data-nonce="(.*)"\n data-post-id="(.*)"\n data-url="(.*)"\n data-bot-id="(.*)"\n data-width', response.text)[0] headers = { diff --git a/g4f/Provider/Providers/ChatgptLogin.py b/g4f/Provider/Providers/ChatgptLogin.py index 9551d15d..0fdbab8e 100644 --- a/g4f/Provider/Providers/ChatgptLogin.py +++ b/g4f/Provider/Providers/ChatgptLogin.py @@ -8,7 +8,7 @@ url = 'https://chatgptlogin.ac' model = ['gpt-3.5-turbo'] supports_stream = False needs_auth = False - +working = False def _create_completion(model: str, messages: list, stream: bool, **kwargs): def get_nonce(): @@ -75,7 +75,7 @@ def _create_completion(model: str, messages: list, stream: bool, **kwargs): 'userName': '<div class="mwai-name-text">User:</div>', 'aiName': '<div class="mwai-name-text">AI:</div>', 'model': 'gpt-3.5-turbo', - 'temperature': 0.8, + 'temperature': kwargs.get('temperature', 0.8), 'maxTokens': 1024, 'maxResults': 1, 'apiKey': '', diff --git a/g4f/Provider/Providers/DeepAi.py b/g4f/Provider/Providers/DeepAi.py index 02b08120..27618cbb 100644 --- a/g4f/Provider/Providers/DeepAi.py +++ b/g4f/Provider/Providers/DeepAi.py @@ -1,45 +1,73 @@ -import os import json -import random -import hashlib +import os import requests - +import js2py from ...typing import sha256, Dict, get_type_hints -url = 'https://deepai.org' + +url = "https://api.deepai.org/" model = ['gpt-3.5-turbo'] supports_stream = True needs_auth = False +working = True -def _create_completion(model: str, messages: list, stream: bool, **kwargs): - def md5(text: str) -> str: - return hashlib.md5(text.encode()).hexdigest()[::-1] +token_js = """ +var agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36' +var a, b, c, d, e, h, f, l, g, k, m, n, r, x, C, E, N, F, T, O, P, w, D, G, Q, R, W, I, aa, fa, na, oa, ha, ba, X, ia, ja, ka, J, la, K, L, ca, S, U, M, ma, B, da, V, Y; +h = Math.round(1E11 * Math.random()) + ""; +f = function () { + for (var p = [], q = 0; 64 > q;) p[q] = 0 | 4294967296 * Math.sin(++q % Math.PI); + + return function (t) { + var v, y, H, ea = [v = 1732584193, y = 4023233417, ~v, ~y], + Z = [], + A = unescape(encodeURI(t)) + "\u0080", + z = A.length; + t = --z / 4 + 2 | 15; + for (Z[--t] = 8 * z; ~z;) Z[z >> 2] |= A.charCodeAt(z) << 8 * z--; + for (q = A = 0; q < t; q += 16) { + for (z = ea; 64 > A; z = [H = z[3], v + ((H = z[0] + [v & y | ~v & H, H & v | ~H & y, v ^ y ^ H, y ^ (v | ~H)][z = A >> 4] + p[A] + ~~Z[q | [A, 5 * A + 1, 3 * A + 5, 7 * A][z] & 15]) << (z = [7, 12, 17, 22, 5, 9, 14, 20, 4, 11, 16, 23, 6, 10, 15, 21][4 * z + A++ % 4]) | H >>> -z), v, y]) v = z[1] | 0, y = z[2]; + for (A = 4; A;) ea[--A] += z[A] + } + for (t = ""; 32 > A;) t += (ea[A >> 3] >> 4 * (1 ^ A++) & 15).toString(16); + return t.split("").reverse().join("") + } +}(); +"tryit-" + h + "-" + f(agent + f(agent + f(agent + h + "x"))); +""" - def get_api_key(user_agent: str) -> str: - part1 = str(random.randint(0, 10**11)) - part2 = md5(user_agent + md5(user_agent + md5(user_agent + part1 + "x"))) - - return f"tryit-{part1}-{part2}" +uuid4_js = """ +function uuidv4() { + for (var a = [], b = 0; 36 > b; b++) a[b] = "0123456789abcdef".substr(Math.floor(16 * Math.random()), 1); + a[14] = "4"; + a[19] = "0123456789abcdef".substr(a[19] & 3 | 8, 1); + a[8] = a[13] = a[18] = a[23] = "-"; + return a.join("") +} +uuidv4();""" - user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' +def create_session(): + url = "https://api.deepai.org/save_chat_session" - headers = { - "api-key": get_api_key(user_agent), - "user-agent": user_agent - } + payload = {'uuid': js2py.eval_js(uuid4_js), "title":"", "chat_style": "chat", "messages": '[]'} + headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"} - files = { - "chat_style": (None, "chat"), - "chatHistory": (None, json.dumps(messages)) - } + response = requests.request("POST", url, headers=headers, data=payload) + return response - r = requests.post("https://api.deepai.org/chat_response", headers=headers, files=files, stream=True) +def _create_completion(model: str, messages:list, stream: bool = True, **kwargs): + create_session() + url = "https://api.deepai.org/make_me_a_pizza" - for chunk in r.iter_content(chunk_size=None): - r.raise_for_status() - yield chunk.decode() + payload = {'chas_style': "chat", "chatHistory": json.dumps(messages)} + api_key = js2py.eval_js(token_js) + headers = {"api-key": api_key, "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"} + response = requests.request("POST", url, headers=headers, data=payload, stream=True) + for chunk in response.iter_content(chunk_size=None): + response.raise_for_status() + yield chunk.decode() params = f'g4f.Providers.{os.path.basename(__file__)[:-3]} supports: ' + \ '(%s)' % ', '.join( diff --git a/g4f/Provider/Providers/DfeHub.py b/g4f/Provider/Providers/DfeHub.py new file mode 100644 index 00000000..e3ff8045 --- /dev/null +++ b/g4f/Provider/Providers/DfeHub.py @@ -0,0 +1,56 @@ +import os, requests +from ...typing import sha256, Dict, get_type_hints +import json +import re +import time + +url = "https://chat.dfehub.com/api/chat" +model = ['gpt-3.5-turbo'] +supports_stream = True +needs_auth = False +working = True + + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + headers = { + 'authority': 'chat.dfehub.com', + 'accept': '*/*', + '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', + 'content-type': 'application/json', + 'origin': 'https://chat.dfehub.com', + 'referer': 'https://chat.dfehub.com/', + 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"macOS"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin', + 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', + 'x-requested-with': 'XMLHttpRequest', + } + + json_data = { + 'messages': messages, + 'model': 'gpt-3.5-turbo', + 'temperature': kwargs.get('temperature', 0.5), + 'presence_penalty': kwargs.get('presence_penalty', 0), + 'frequency_penalty': kwargs.get('frequency_penalty', 0), + 'top_p': kwargs.get('top_p', 1), + "stream": True, + } + response = requests.post('https://chat.dfehub.com/api/openai/v1/chat/completions', + headers=headers, json=json_data) + + for chunk in response.iter_lines(): + if b'detail' in chunk: + delay = re.findall(r"\d+\.\d+", chunk.decode()) + delay = float(delay[-1]) + print(f"Provider.DfeHub::Rate Limit Reached::Waiting {delay} seconds") + time.sleep(delay) + yield from _create_completion(model, messages, stream, **kwargs) + if b'content' in chunk: + data = json.loads(chunk.decode().split('data: ')[1]) + yield (data['choices'][0]['delta']['content']) + +params = f'g4f.Providers.{os.path.basename(__file__)[:-3]} supports: ' + \ + '(%s)' % ', '.join([f"{name}: {get_type_hints(_create_completion)[name].__name__}" for name in _create_completion.__code__.co_varnames[:_create_completion.__code__.co_argcount]]) diff --git a/g4f/Provider/Providers/EasyChat.py b/g4f/Provider/Providers/EasyChat.py new file mode 100644 index 00000000..909428fa --- /dev/null +++ b/g4f/Provider/Providers/EasyChat.py @@ -0,0 +1,52 @@ +import os, requests +from ...typing import sha256, Dict, get_type_hints +import json + +url = "https://free.easychat.work" +model = ['gpt-3.5-turbo'] +supports_stream = True +needs_auth = False +working = True + + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + headers = { + 'authority': 'free.easychat.work', + 'accept': 'text/event-stream', + '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', + 'content-type': 'application/json', + 'endpoint': '', + 'origin': 'https://free.easychat.work', + 'plugins': '0', + 'referer': 'https://free.easychat.work/', + 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"macOS"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin', + 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', + 'usesearch': 'false', + 'x-requested-with': 'XMLHttpRequest', + } + + json_data = { + 'messages': messages, + 'stream': True, + 'model': model, + 'temperature': kwargs.get('temperature', 0.5), + 'presence_penalty': kwargs.get('presence_penalty', 0), + 'frequency_penalty': kwargs.get('frequency_penalty', 0), + 'top_p': kwargs.get('top_p', 1), + } + + response = requests.post('https://free.easychat.work/api/openai/v1/chat/completions', + headers=headers, json=json_data) + + for chunk in response.iter_lines(): + if b'content' in chunk: + data = json.loads(chunk.decode().split('data: ')[1]) + yield (data['choices'][0]['delta']['content']) + +params = f'g4f.Providers.{os.path.basename(__file__)[:-3]} supports: ' + \ + '(%s)' % ', '.join([f"{name}: {get_type_hints(_create_completion)[name].__name__}" for name in _create_completion.__code__.co_varnames[:_create_completion.__code__.co_argcount]])
\ No newline at end of file diff --git a/g4f/Provider/Providers/Forefront.py b/g4f/Provider/Providers/Forefront.py index e7e89831..70ea6725 100644 --- a/g4f/Provider/Providers/Forefront.py +++ b/g4f/Provider/Providers/Forefront.py @@ -7,6 +7,8 @@ url = 'https://forefront.com' model = ['gpt-3.5-turbo'] supports_stream = True needs_auth = False +working = False + def _create_completion(model: str, messages: list, stream: bool, **kwargs): json_data = { diff --git a/g4f/Provider/Providers/GetGpt.py b/g4f/Provider/Providers/GetGpt.py index 56a121f6..bafc0ce8 100644 --- a/g4f/Provider/Providers/GetGpt.py +++ b/g4f/Provider/Providers/GetGpt.py @@ -9,6 +9,8 @@ url = 'https://chat.getgpt.world/' model = ['gpt-3.5-turbo'] supports_stream = True needs_auth = False +working = True + def _create_completion(model: str, messages: list, stream: bool, **kwargs): def encrypt(e): diff --git a/g4f/Provider/Providers/H2o.py b/g4f/Provider/Providers/H2o.py index eabf94e2..92043026 100644 --- a/g4f/Provider/Providers/H2o.py +++ b/g4f/Provider/Providers/H2o.py @@ -1,106 +1,94 @@ -from requests import Session -from uuid import uuid4 -from json import loads -import os -import json -import requests -from ...typing import sha256, Dict, get_type_hints - -url = 'https://gpt-gm.h2o.ai' -model = ['falcon-40b', 'falcon-7b', 'llama-13b'] -supports_stream = True -needs_auth = False - -models = { - 'falcon-7b': 'h2oai/h2ogpt-gm-oasst1-en-2048-falcon-7b-v3', - 'falcon-40b': 'h2oai/h2ogpt-gm-oasst1-en-2048-falcon-40b-v1', - 'llama-13b': 'h2oai/h2ogpt-gm-oasst1-en-2048-open-llama-13b' -} - -def _create_completion(model: str, messages: list, stream: bool, **kwargs): - conversation = 'instruction: this is a conversation beween, a user and an AI assistant, respond to the latest message, referring to the conversation if needed\n' - for message in messages: - conversation += '%s: %s\n' % (message['role'], message['content']) - conversation += 'assistant:' - - client = Session() - client.headers = { - 'authority': 'gpt-gm.h2o.ai', - 'origin': 'https://gpt-gm.h2o.ai', - 'referer': 'https://gpt-gm.h2o.ai/', - 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-platform': '"Windows"', - 'sec-fetch-dest': 'document', - 'sec-fetch-mode': 'navigate', - 'sec-fetch-site': 'same-origin', - 'sec-fetch-user': '?1', - 'upgrade-insecure-requests': '1', - 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', - } - - client.get('https://gpt-gm.h2o.ai/') - response = client.post('https://gpt-gm.h2o.ai/settings', data={ - 'ethicsModalAccepted': 'true', - 'shareConversationsWithModelAuthors': 'true', - 'ethicsModalAcceptedAt': '', - 'activeModel': 'h2oai/h2ogpt-gm-oasst1-en-2048-falcon-40b-v1', - 'searchEnabled': 'true', - }) - - headers = { - 'authority': 'gpt-gm.h2o.ai', - 'accept': '*/*', - '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', - 'origin': 'https://gpt-gm.h2o.ai', - 'referer': 'https://gpt-gm.h2o.ai/', - 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-platform': '"Windows"', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'same-origin', - 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', - } - - json_data = { - 'model': models[model] - } - - response = client.post('https://gpt-gm.h2o.ai/conversation', - headers=headers, json=json_data) - conversationId = response.json()['conversationId'] - - - completion = client.post(f'https://gpt-gm.h2o.ai/conversation/{conversationId}', stream=True, json = { - 'inputs': conversation, - 'parameters': { - 'temperature': kwargs.get('temperature', 0.4), - 'truncate': kwargs.get('truncate', 2048), - 'max_new_tokens': kwargs.get('max_new_tokens', 1024), - 'do_sample': kwargs.get('do_sample', True), - 'repetition_penalty': kwargs.get('repetition_penalty', 1.2), - 'return_full_text': kwargs.get('return_full_text', False) - }, - 'stream': True, - 'options': { - 'id': kwargs.get('id', str(uuid4())), - 'response_id': kwargs.get('response_id', str(uuid4())), - 'is_retry': False, - 'use_cache': False, - 'web_search_id': '' - } - }) - - for line in completion.iter_lines(): - if b'data' in line: - line = loads(line.decode('utf-8').replace('data:', '')) - token = line['token']['text'] - - if token == '<|endoftext|>': - break - else: - yield (token) - -params = f'g4f.Providers.{os.path.basename(__file__)[:-3]} supports: ' + \ +from requests import Session
+from uuid import uuid4
+from json import loads
+import os
+import json
+import requests
+from ...typing import sha256, Dict, get_type_hints
+
+url = 'https://gpt-gm.h2o.ai'
+model = ['falcon-40b', 'falcon-7b', 'llama-13b']
+supports_stream = True
+needs_auth = False
+working = True
+
+models = {
+ 'falcon-7b': 'h2oai/h2ogpt-gm-oasst1-en-2048-falcon-7b-v3',
+ 'falcon-40b': 'h2oai/h2ogpt-gm-oasst1-en-2048-falcon-40b-v1',
+ 'llama-13b': 'h2oai/h2ogpt-gm-oasst1-en-2048-open-llama-13b'
+}
+
+def _create_completion(model: str, messages: list, stream: bool, **kwargs):
+
+ conversation = ''
+ for message in messages:
+ conversation += '%s: %s\n' % (message['role'], message['content'])
+
+ conversation += 'assistant: '
+ session = requests.Session()
+
+ response = session.get("https://gpt-gm.h2o.ai/")
+ headers = {
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0",
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
+ "Accept-Language": "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
+ "Content-Type": "application/x-www-form-urlencoded",
+ "Upgrade-Insecure-Requests": "1",
+ "Sec-Fetch-Dest": "document",
+ "Sec-Fetch-Mode": "navigate",
+ "Sec-Fetch-Site": "same-origin",
+ "Sec-Fetch-User": "?1",
+ "Referer": "https://gpt-gm.h2o.ai/r/jGfKSwU"
+ }
+ data = {
+ "ethicsModalAccepted": "true",
+ "shareConversationsWithModelAuthors": "true",
+ "ethicsModalAcceptedAt": "",
+ "activeModel": "h2oai/h2ogpt-gm-oasst1-en-2048-falcon-40b-v1",
+ "searchEnabled": "true"
+ }
+ response = session.post("https://gpt-gm.h2o.ai/settings", headers=headers, data=data)
+
+ headers = {
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0",
+ "Accept": "*/*",
+ "Accept-Language": "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
+ "Content-Type": "application/json",
+ "Sec-Fetch-Dest": "empty",
+ "Sec-Fetch-Mode": "cors",
+ "Sec-Fetch-Site": "same-origin",
+ "Referer": "https://gpt-gm.h2o.ai/"
+ }
+ data = {
+ "model": models[model]
+ }
+
+ conversation_id = session.post("https://gpt-gm.h2o.ai/conversation", headers=headers, json=data)
+ data = {
+ "inputs": conversation,
+ "parameters": {
+ "temperature": kwargs.get('temperature', 0.4),
+ "truncate": kwargs.get('truncate', 2048),
+ "max_new_tokens": kwargs.get('max_new_tokens', 1024),
+ "do_sample": kwargs.get('do_sample', True),
+ "repetition_penalty": kwargs.get('repetition_penalty', 1.2),
+ "return_full_text": kwargs.get('return_full_text', False)
+ },
+ "stream": True,
+ "options": {
+ "id": kwargs.get('id', str(uuid4())),
+ "response_id": kwargs.get('response_id', str(uuid4())),
+ "is_retry": False,
+ "use_cache": False,
+ "web_search_id": ""
+ }
+ }
+
+ response = session.post(f"https://gpt-gm.h2o.ai/conversation/{conversation_id.json()['conversationId']}", headers=headers, json=data)
+ generated_text = response.text.replace("\n", "").split("data:")
+ generated_text = json.loads(generated_text[-1])
+
+ return generated_text["generated_text"]
+
+params = f'g4f.Providers.{os.path.basename(__file__)[:-3]} supports: ' + \
'(%s)' % ', '.join([f"{name}: {get_type_hints(_create_completion)[name].__name__}" for name in _create_completion.__code__.co_varnames[:_create_completion.__code__.co_argcount]])
\ No newline at end of file diff --git a/g4f/Provider/Providers/Liaobots.py b/g4f/Provider/Providers/Liaobots.py index 76b13c31..75746c03 100644 --- a/g4f/Provider/Providers/Liaobots.py +++ b/g4f/Provider/Providers/Liaobots.py @@ -5,6 +5,7 @@ url = 'https://liaobots.com' model = ['gpt-3.5-turbo', 'gpt-4'] supports_stream = True needs_auth = True +working = False models = { 'gpt-4': { diff --git a/g4f/Provider/Providers/Lockchat.py b/g4f/Provider/Providers/Lockchat.py index d97bc67b..dd1edb84 100644 --- a/g4f/Provider/Providers/Lockchat.py +++ b/g4f/Provider/Providers/Lockchat.py @@ -2,15 +2,16 @@ import requests import os import json from ...typing import sha256, Dict, get_type_hints -url = 'http://super.lockchat.app' +url = 'http://supertest.lockchat.app' model = ['gpt-4', 'gpt-3.5-turbo'] supports_stream = True needs_auth = False +working = False def _create_completion(model: str, messages: list, stream: bool, temperature: float = 0.7, **kwargs): payload = { - "temperature": 0.7, + "temperature": temperature, "messages": messages, "model": model, "stream": True, @@ -18,7 +19,7 @@ def _create_completion(model: str, messages: list, stream: bool, temperature: fl headers = { "user-agent": "ChatX/39 CFNetwork/1408.0.4 Darwin/22.5.0", } - response = requests.post("http://super.lockchat.app/v1/chat/completions?auth=FnMNPlwZEnGFqvEc9470Vw==", + response = requests.post("http://supertest.lockchat.app/v1/chat/completions", json=payload, headers=headers, stream=True) for token in response.iter_lines(): if b'The model: `gpt-4` does not exist' in token: diff --git a/g4f/Provider/Providers/Theb.py b/g4f/Provider/Providers/Theb.py index aa43ebc5..a78fb51f 100644 --- a/g4f/Provider/Providers/Theb.py +++ b/g4f/Provider/Providers/Theb.py @@ -9,6 +9,7 @@ url = 'https://theb.ai' model = ['gpt-3.5-turbo'] supports_stream = True needs_auth = False +working = False def _create_completion(model: str, messages: list, stream: bool, **kwargs): @@ -20,7 +21,7 @@ def _create_completion(model: str, messages: list, stream: bool, **kwargs): cmd = ['python3', f'{path}/helpers/theb.py', config] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - + for line in iter(p.stdout.readline, b''): yield line.decode('utf-8') diff --git a/g4f/Provider/Providers/Vercel.py b/g4f/Provider/Providers/Vercel.py index e5df9cf0..03d9be17 100644 --- a/g4f/Provider/Providers/Vercel.py +++ b/g4f/Provider/Providers/Vercel.py @@ -11,6 +11,7 @@ from ...typing import sha256, Dict, get_type_hints url = 'https://play.vercel.ai' supports_stream = True needs_auth = False +working = False models = { 'claude-instant-v1': 'anthropic:claude-instant-v1', @@ -41,122 +42,19 @@ vercel_models = {'anthropic:claude-instant-v1': {'id': 'anthropic:claude-instant 'id': 'huggingface:bigcode/santacoder', 'provider': 'huggingface', 'providerHumanName': 'HuggingFace', 'makerHumanName': 'BigCode', 'instructions': 'The model was trained on GitHub code. As such it is not an instruction model and commands like "Write a function that computes the square root." do not work well. You should phrase commands like they occur in source code such as comments (e.g. # the following function computes the sqrt) or write a function signature and docstring and let the model complete the function body.', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 0.95, 'range': [0.01, 0.99]}, 'topK': {'value': 4, 'range': [1, 500]}, 'repetitionPenalty': {'value': 1.03, 'range': [0.1, 2]}}, 'name': 'santacoder'}, 'cohere:command-medium-nightly': {'id': 'cohere:command-medium-nightly', 'provider': 'cohere', 'providerHumanName': 'Cohere', 'makerHumanName': 'Cohere', 'name': 'command-medium-nightly', 'parameters': {'temperature': {'value': 0.9, 'range': [0, 2]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0, 1]}, 'topK': {'value': 0, 'range': [0, 500]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}, 'cohere:command-xlarge-nightly': {'id': 'cohere:command-xlarge-nightly', 'provider': 'cohere', 'providerHumanName': 'Cohere', 'makerHumanName': 'Cohere', 'name': 'command-xlarge-nightly', 'parameters': {'temperature': {'value': 0.9, 'range': [0, 2]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0, 1]}, 'topK': {'value': 0, 'range': [0, 500]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}, 'openai:gpt-4': {'id': 'openai:gpt-4', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'name': 'gpt-4', 'minBillingTier': 'pro', 'parameters': {'temperature': {'value': 0.7, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}, 'openai:code-cushman-001': {'id': 'openai:code-cushman-001', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}, 'name': 'code-cushman-001'}, 'openai:code-davinci-002': {'id': 'openai:code-davinci-002', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}, 'name': 'code-davinci-002'}, 'openai:gpt-3.5-turbo': {'id': 'openai:gpt-3.5-turbo', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'parameters': {'temperature': {'value': 0.7, 'range': [0, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'topK': {'value': 1, 'range': [1, 500]}, 'presencePenalty': {'value': 1, 'range': [0, 1]}, 'frequencyPenalty': {'value': 1, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}, 'name': 'gpt-3.5-turbo'}, 'openai:text-ada-001': {'id': 'openai:text-ada-001', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'name': 'text-ada-001', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}, 'openai:text-babbage-001': {'id': 'openai:text-babbage-001', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'name': 'text-babbage-001', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}, 'openai:text-curie-001': {'id': 'openai:text-curie-001', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'name': 'text-curie-001', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}, 'openai:text-davinci-002': {'id': 'openai:text-davinci-002', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'name': 'text-davinci-002', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}, 'openai:text-davinci-003': {'id': 'openai:text-davinci-003', 'provider': 'openai', 'providerHumanName': 'OpenAI', 'makerHumanName': 'OpenAI', 'name': 'text-davinci-003', 'parameters': {'temperature': {'value': 0.5, 'range': [0.1, 1]}, 'maximumLength': {'value': 200, 'range': [50, 1024]}, 'topP': {'value': 1, 'range': [0.1, 1]}, 'presencePenalty': {'value': 0, 'range': [0, 1]}, 'frequencyPenalty': {'value': 0, 'range': [0, 1]}, 'stopSequences': {'value': [], 'range': []}}}} -# based on https://github.com/ading2210/vercel-llm-api // modified -class Client: - def __init__(self): - self.session = requests.Session() - self.headers = { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110 Safari/537.36', - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', - 'Accept-Encoding': 'gzip, deflate, br', - 'Accept-Language': 'en-US,en;q=0.5', - 'Te': 'trailers', - 'Upgrade-Insecure-Requests': '1' - } - self.session.headers.update(self.headers) - - def get_token(self): - b64 = self.session.get('https://sdk.vercel.ai/openai.jpeg').text - data = json.loads(base64.b64decode(b64)) - - code = 'const globalThis = {data: `sentinel`}; function token() {return (%s)(%s)}' % ( - data['c'], data['a']) - - token_string = json.dumps(separators=(',', ':'), - obj={'r': execjs.compile(code).call('token'), 't': data['t']}) - - return base64.b64encode(token_string.encode()).decode() - - def get_default_params(self, model_id): - return {key: param['value'] for key, param in vercel_models[model_id]['parameters'].items()} - - def generate(self, model_id: str, prompt: str, params: dict = {}): - if not ':' in model_id: - model_id = models[model_id] - - defaults = self.get_default_params(model_id) - - payload = defaults | params | { - 'prompt': prompt, - 'model': model_id, - } - - headers = self.headers | { - 'Accept-Encoding': 'gzip, deflate, br', - 'Custom-Encoding': self.get_token(), - 'Host': 'sdk.vercel.ai', - 'Origin': 'https://sdk.vercel.ai', - 'Referrer': 'https://sdk.vercel.ai', - 'Sec-Fetch-Dest': 'empty', - 'Sec-Fetch-Mode': 'cors', - 'Sec-Fetch-Site': 'same-origin', - } - - chunks_queue = queue.Queue() - error = None - response = None - - def callback(data): - chunks_queue.put(data.decode()) - - def request_thread(): - nonlocal response, error - for _ in range(3): - try: - response = self.session.post('https://sdk.vercel.ai/api/generate', - json=payload, headers=headers, content_callback=callback) - response.raise_for_status() - - except Exception as e: - if _ == 2: - error = e - - else: - continue - - thread = threading.Thread(target=request_thread, daemon=True) - thread.start() - - text = '' - index = 0 - while True: - try: - chunk = chunks_queue.get(block=True, timeout=0.1) - - except queue.Empty: - if error: - raise error - - elif response: - break - - else: - continue - - text += chunk - lines = text.split('\n') - - if len(lines) - 1 > index: - new = lines[index:-1] - for word in new: - yield json.loads(word) - index = len(lines) - 1 - def _create_completion(model: str, messages: list, stream: bool, **kwargs): - yield 'Vercel is currently not working.' return + # conversation = 'This is a conversation between a human and a language model, respond to the last message accordingly, referring to the past history of messages if needed.\n' - conversation = 'This is a conversation between a human and a language model, respond to the last message accordingly, referring to the past history of messages if needed.\n' - - for message in messages: - conversation += '%s: %s\n' % (message['role'], message['content']) + # for message in messages: + # conversation += '%s: %s\n' % (message['role'], message['content']) - conversation += 'assistant: ' + # conversation += 'assistant: ' - completion = Client().generate(model, conversation) + # completion = Client().generate(model, conversation) - for token in completion: - yield token + # for token in completion: + # yield token params = f'g4f.Providers.{os.path.basename(__file__)[:-3]} supports: ' + \ '(%s)' % ', '.join([f"{name}: {get_type_hints(_create_completion)[name].__name__}" for name in _create_completion.__code__.co_varnames[:_create_completion.__code__.co_argcount]])
\ No newline at end of file diff --git a/g4f/Provider/Providers/Wewordle.py b/g4f/Provider/Providers/Wewordle.py new file mode 100644 index 00000000..116ebb85 --- /dev/null +++ b/g4f/Provider/Providers/Wewordle.py @@ -0,0 +1,73 @@ +import os,sys +import requests +import json +import random +import time +import string +from ...typing import sha256, Dict, get_type_hints + +url = "https://wewordle.org/gptapi/v1/android/turbo" +model = ['gpt-3.5-turbo'] +supports_stream = False +needs_auth = False +working = False + +def _create_completion(model: str, messages: list, stream: bool, **kwargs): + base = '' + for message in messages: + base += '%s: %s\n' % (message['role'], message['content']) + base += 'assistant:' + # randomize user id and app id + _user_id = ''.join(random.choices(f'{string.ascii_lowercase}{string.digits}', k=16)) + _app_id = ''.join(random.choices(f'{string.ascii_lowercase}{string.digits}', k=31)) + # make current date with format utc + _request_date = time.strftime("%Y-%m-%dT%H:%M:%S.000Z", time.gmtime()) + headers = { + 'accept': '*/*', + 'pragma': 'no-cache', + 'Content-Type': 'application/json', + 'Connection':'keep-alive' + # user agent android client + # 'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 10; SM-G975F Build/QP1A.190711.020)', + + } + data = { + "user": _user_id, + "messages": [ + {"role": "user", "content": base} + ], + "subscriber": { + "originalPurchaseDate": None, + "originalApplicationVersion": None, + "allPurchaseDatesMillis": {}, + "entitlements": { + "active": {}, + "all": {} + }, + "allPurchaseDates": {}, + "allExpirationDatesMillis": {}, + "allExpirationDates": {}, + "originalAppUserId": f"$RCAnonymousID:{_app_id}", + "latestExpirationDate": None, + "requestDate": _request_date, + "latestExpirationDateMillis": None, + "nonSubscriptionTransactions": [], + "originalPurchaseDateMillis": None, + "managementURL": None, + "allPurchasedProductIdentifiers": [], + "firstSeen": _request_date, + "activeSubscriptions": [] + } + } + response = requests.post(url, headers=headers, data=json.dumps(data)) + if response.status_code == 200: + _json = response.json() + if 'message' in _json: + yield _json['message']['content'] + else: + print(f"Error Occurred::{response.status_code}") + return None + +params = f'g4f.Providers.{os.path.basename(__file__)[:-3]} supports: ' + \ + '(%s)' % ', '.join( + [f"{name}: {get_type_hints(_create_completion)[name].__name__}" for name in _create_completion.__code__.co_varnames[:_create_completion.__code__.co_argcount]])
\ No newline at end of file diff --git a/g4f/Provider/Providers/You.py b/g4f/Provider/Providers/You.py index 02a2774c..3c321118 100644 --- a/g4f/Provider/Providers/You.py +++ b/g4f/Provider/Providers/You.py @@ -9,6 +9,7 @@ url = 'https://you.com' model = 'gpt-3.5-turbo' supports_stream = True needs_auth = False +working = False def _create_completion(model: str, messages: list, stream: bool, **kwargs): diff --git a/g4f/Provider/Providers/Yqcloud.py b/g4f/Provider/Providers/Yqcloud.py index 488951dd..fae44682 100644 --- a/g4f/Provider/Providers/Yqcloud.py +++ b/g4f/Provider/Providers/Yqcloud.py @@ -9,6 +9,7 @@ model = [ ] supports_stream = True needs_auth = False +working = False def _create_completion(model: str, messages: list, stream: bool, **kwargs): diff --git a/g4f/Provider/Providers/__init__.py b/g4f/Provider/Providers/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/g4f/Provider/Providers/__init__.py diff --git a/g4f/Provider/Providers/helpers/binghuan.py b/g4f/Provider/Providers/helpers/binghuan.py new file mode 100644 index 00000000..203bbe45 --- /dev/null +++ b/g4f/Provider/Providers/helpers/binghuan.py @@ -0,0 +1,221 @@ +# Original Code From : https://gitler.moe/g4f/gpt4free +# https://gitler.moe/g4f/gpt4free/src/branch/main/g4f/Provider/Providers/helpers/bing.py +import sys +import ssl +import uuid +import json +import time +import random +import asyncio +import certifi +# import requests +from curl_cffi import requests +import websockets +import browser_cookie3 + +config = json.loads(sys.argv[1]) + +ssl_context = ssl.create_default_context() +ssl_context.load_verify_locations(certifi.where()) + + + +conversationstyles = { + 'gpt-4': [ #'precise' + "nlu_direct_response_filter", + "deepleo", + "disable_emoji_spoken_text", + "responsible_ai_policy_235", + "enablemm", + "h3precise", + "rcsprtsalwlst", + "dv3sugg", + "autosave", + "clgalileo", + "gencontentv3" + ], + 'balanced': [ + "nlu_direct_response_filter", + "deepleo", + "disable_emoji_spoken_text", + "responsible_ai_policy_235", + "enablemm", + "harmonyv3", + "rcsprtsalwlst", + "dv3sugg", + "autosave" + ], + 'gpt-3.5-turbo': [ #'precise' + "nlu_direct_response_filter", + "deepleo", + "disable_emoji_spoken_text", + "responsible_ai_policy_235", + "enablemm", + "h3imaginative", + "rcsprtsalwlst", + "dv3sugg", + "autosave", + "gencontentv3" + ] +} + +def format(msg: dict) -> str: + return json.dumps(msg) + '\x1e' + +def get_token(): + return + + try: + cookies = {c.name: c.value for c in browser_cookie3.edge(domain_name='bing.com')} + return cookies['_U'] + except: + print('Error: could not find bing _U cookie in edge browser.') + exit(1) + +class AsyncCompletion: + async def create( + prompt : str = None, + optionSets : list = None, + token : str = None): # No auth required anymore + + create = None + for _ in range(5): + try: + create = requests.get('https://b.ai-huan.xyz/turing/conversation/create', + headers = { + 'host': 'b.ai-huan.xyz', + 'accept-encoding': 'gzip, deflate, br', + 'connection': 'keep-alive', + 'authority': 'b.ai-huan.xyz', + 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', + 'accept-language': 'en-US,en;q=0.9', + 'cache-control': 'max-age=0', + 'sec-ch-ua': '"Chromium";v="110", "Not A(Brand";v="24", "Microsoft Edge";v="110"', + 'sec-ch-ua-arch': '"x86"', + 'sec-ch-ua-bitness': '"64"', + 'sec-ch-ua-full-version': '"110.0.1587.69"', + 'sec-ch-ua-full-version-list': '"Chromium";v="110.0.5481.192", "Not A(Brand";v="24.0.0.0", "Microsoft Edge";v="110.0.1587.69"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-model': '""', + 'sec-ch-ua-platform': '"Windows"', + 'sec-ch-ua-platform-version': '"15.0.0"', + 'sec-fetch-dest': 'document', + 'sec-fetch-mode': 'navigate', + 'sec-fetch-site': 'none', + 'sec-fetch-user': '?1', + 'upgrade-insecure-requests': '1', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.69', + 'x-edge-shopping-flag': '1', + 'x-forwarded-for': f'13.{random.randint(104, 107)}.{random.randint(0, 255)}.{random.randint(0, 255)}' + } + ) + + conversationId = create.json()['conversationId'] + clientId = create.json()['clientId'] + conversationSignature = create.json()['conversationSignature'] + + except Exception as e: + time.sleep(0.5) + continue + + if create == None: raise Exception('Failed to create conversation.') + + wss: websockets.WebSocketClientProtocol or None = None + + wss = await websockets.connect('wss://sydney.vcanbb.chat/sydney/ChatHub', max_size = None, ssl = ssl_context, + extra_headers = { + 'accept': 'application/json', + 'accept-language': 'en-US,en;q=0.9', + 'content-type': 'application/json', + 'sec-ch-ua': '"Not_A Brand";v="99", Microsoft Edge";v="110", "Chromium";v="110"', + 'sec-ch-ua-arch': '"x86"', + 'sec-ch-ua-bitness': '"64"', + 'sec-ch-ua-full-version': '"109.0.1518.78"', + 'sec-ch-ua-full-version-list': '"Chromium";v="110.0.5481.192", "Not A(Brand";v="24.0.0.0", "Microsoft Edge";v="110.0.1587.69"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-model': "", + 'sec-ch-ua-platform': '"Windows"', + 'sec-ch-ua-platform-version': '"15.0.0"', + 'sec-fetch-dest': 'empty', + 'sec-fetch-mode': 'cors', + 'sec-fetch-site': 'same-origin', + 'x-ms-client-request-id': str(uuid.uuid4()), + 'x-ms-useragent': 'azsdk-js-api-client-factory/1.0.0-beta.1 core-rest-pipeline/1.10.0 OS/Win32', + 'Referer': 'https://b.ai-huan.xyz/search?q=Bing+AI&showconv=1&FORM=hpcodx', + 'Referrer-Policy': 'origin-when-cross-origin', + 'x-forwarded-for': f'13.{random.randint(104, 107)}.{random.randint(0, 255)}.{random.randint(0, 255)}' + } + ) + + await wss.send(format({'protocol': 'json', 'version': 1})) + await wss.recv() + + struct = { + 'arguments': [ + { + 'source': 'cib', + 'optionsSets': optionSets, + 'isStartOfSession': True, + 'message': { + 'author': 'user', + 'inputMethod': 'Keyboard', + 'text': prompt, + 'messageType': 'Chat' + }, + 'conversationSignature': conversationSignature, + 'participant': { + 'id': clientId + }, + 'conversationId': conversationId + } + ], + 'invocationId': '0', + 'target': 'chat', + 'type': 4 + } + + await wss.send(format(struct)) + + base_string = '' + + final = False + while not final: + objects = str(await wss.recv()).split('\x1e') + for obj in objects: + if obj is None or obj == '': + continue + + response = json.loads(obj) + #print(response, flush=True, end='') + if response.get('type') == 1 and response['arguments'][0].get('messages',): + response_text = response['arguments'][0]['messages'][0]['adaptiveCards'][0]['body'][0].get('text') + + yield (response_text.replace(base_string, '')) + base_string = response_text + + elif response.get('type') == 2: + final = True + + await wss.close() + +# i thing bing realy donset understand multi message (based on prompt template) +def convert(messages): + context = "" + for message in messages: + context += "[%s](#message)\n%s\n\n" % (message['role'], + message['content']) + return context + +async def run(optionSets, messages): + prompt = messages[-1]['content'] + if(len(messages) > 1): + prompt = convert(messages) + async for value in AsyncCompletion.create(prompt=prompt, optionSets=optionSets): + try: + print(value, flush=True, end='') + except UnicodeEncodeError as e: + # emoji encoding problem + print(value.encode('utf-8'), flush=True, end='') + +optionSet = conversationstyles[config['model']] +asyncio.run(run(optionSet, config['messages']))
\ No newline at end of file diff --git a/g4f/Provider/Providers/opchatgpts.py b/g4f/Provider/Providers/opchatgpts.py new file mode 100644 index 00000000..0ff652fb --- /dev/null +++ b/g4f/Provider/Providers/opchatgpts.py @@ -0,0 +1,42 @@ +import os +import requests +from ...typing import sha256, Dict, get_type_hints + +url = 'https://opchatgpts.net' +model = ['gpt-3.5-turbo'] +supports_stream = False +needs_auth = False +working = True + +def _create_completion(model: str, messages: list, stream: bool = False, temperature: float = 0.8, max_tokens: int = 1024, system_prompt: str = "Converse as if you were an AI assistant. Be friendly, creative.", **kwargs): + + data = { + 'env': 'chatbot', + 'session': 'N/A', + 'prompt': "\n", + 'context': system_prompt, + 'messages': messages, + 'newMessage': messages[::-1][0]["content"], + 'userName': '<div class="mwai-name-text">User:</div>', + 'aiName': '<div class="mwai-name-text">AI:</div>', + 'model': 'gpt-3.5-turbo', + 'temperature': temperature, + 'maxTokens': max_tokens, + 'maxResults': 1, + 'apiKey': '', + 'service': 'openai', + 'embeddingsIndex': '', + 'stop': '' + } + + response = requests.post('https://opchatgpts.net/wp-json/ai-chatbot/v1/chat', json=data).json() + + if response["success"]: + + return response["reply"] # `yield (response["reply"])` doesn't work + + raise Exception("Request failed: " + response) + +params = f'g4f.Providers.{os.path.basename(__file__)[:-3]} supports: ' + \ + '(%s)' % ', '.join( + [f"{name}: {get_type_hints(_create_completion)[name].__name__}" for name in _create_completion.__code__.co_varnames[:_create_completion.__code__.co_argcount]]) |