diff --git a/README.md b/README.md index 834322cf..6289fdef 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ # THIS IS A FORK OF THE OFFICIAL GPT4FREE REPOSITORY. This project is for educational purposes only, and must not be used for any other purpose. xtekky%2Fgpt4free | Trendshift -The **ETA** till (v3 for g4f) where I, [@xtekky](https://github.com/xtekky) will pick this project back up and improve it is **`29` days** (written Tue 28 May), join [t.me/g4f_channel](https://t.me/g4f_channel) in the meanwhile to stay updated. - --- Written by [@xtekky](https://github.com/xtekky) & maintained by [@hlohaus](https://github.com/hlohaus) @@ -357,8 +355,7 @@ While we wait for gpt-5, here is a list of new models that are at least better t | [chatgpt4online.org](https://chatgpt4online.org) | `g4f.Provider.Chatgpt4Online` | ✔️ | ❌ | ✔️ | ![Unknown](https://img.shields.io/badge/Unknown-grey) | ❌ | | [chatgpt-free.cc](https://www.chatgpt-free.cc) | `g4f.Provider.ChatgptNext` | ✔️ | ❌ | ✔️ | ![Unknown](https://img.shields.io/badge/Unknown-grey) | ❌ | | [chatgptx.de](https://chatgptx.de) | `g4f.Provider.ChatgptX` | ✔️ | ❌ | ✔️ | ![Unknown](https://img.shields.io/badge/Unknown-grey) | ❌ | -| [f1.cnote.top](https://f1.cnote.top) | `g4f.Provider.Cnote` | ✔️ | ❌ | ✔️ | ![Active](https://img.shields.io/badge/Active-brightgreen) | ❌ | -| [duckduckgo.com](https://duckduckgo.com/duckchat) | `g4f.Provider.DuckDuckGo` | ✔️ | ❌ | ✔️ | ![Active](https://img.shields.io/badge/Active-brightgreen) | ❌ | +| [duckduckgo.com](https://duckduckgo.com/duckchat) | `g4f.Provider.DDG` | ✔️ | ❌ | ✔️ | ![Active](https://img.shields.io/badge/Active-brightgreen) | ❌ | | [feedough.com](https://www.feedough.com) | `g4f.Provider.Feedough` | ✔️ | ❌ | ✔️ | ![Active](https://img.shields.io/badge/Active-brightgreen) | ❌ | | [flowgpt.com](https://flowgpt.com/chat) | `g4f.Provider.FlowGpt` | ✔️ | ❌ | ✔️ | ![Unknown](https://img.shields.io/badge/Unknown-grey) | ❌ | | [freegptsnav.aifree.site](https://freegptsnav.aifree.site) | `g4f.Provider.FreeGpt` | ✔️ | ❌ | ✔️ | ![Active](https://img.shields.io/badge/Active-brightgreen) | ❌ | diff --git a/g4f/Provider/Chatgpt4Online.py b/g4f/Provider/Chatgpt4Online.py index d55be65b..f62ef8af 100644 --- a/g4f/Provider/Chatgpt4Online.py +++ b/g4f/Provider/Chatgpt4Online.py @@ -13,7 +13,12 @@ class Chatgpt4Online(AsyncGeneratorProvider): api_endpoint = "/wp-json/mwai-ui/v1/chats/submit" working = True supports_gpt_4 = True - + + async def get_nonce(): + async with ClientSession() as session: + async with session.post(f"https://chatgpt4online.org/wp-json/mwai/v1/start_session") as response: + return (await response.json())["restNonce"] + @classmethod async def create_async_generator( cls, @@ -37,7 +42,7 @@ async def create_async_generator( "sec-fetch-mode": "cors", "sec-fetch-site": "same-origin", "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", - "x-wp-nonce": "d9505e9877", + "x-wp-nonce": await cls.get_nonce(), } async with ClientSession(headers=headers) as session: @@ -69,3 +74,4 @@ async def create_async_generator( continue yield full_response + diff --git a/g4f/Provider/DDG.py b/g4f/Provider/DDG.py index 91ccde32..6146994b 100644 --- a/g4f/Provider/DDG.py +++ b/g4f/Provider/DDG.py @@ -18,14 +18,13 @@ class DDG(AsyncGeneratorProvider, ProviderModelMixin): supports_gpt_35_turbo = True supports_message_history = True - # default_model = "gpt-3.5-turbo-0125" default_model = "gpt-4o-mini" - models = ["gpt-4o-mini", "claude-3-haiku-20240307", "meta-llama/Llama-3-70b-chat-hf", "mistralai/Mixtral-8x7B-Instruct-v0.1"] + models = ["gpt-4o-mini", "claude-3-haiku-20240307", "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", "mistralai/Mixtral-8x7B-Instruct-v0.1"] model_aliases = { "gpt-4": "gpt-4o-mini", "gpt-4o": "gpt-4o-mini", "claude-3-haiku": "claude-3-haiku-20240307", - "llama-3-70b": "meta-llama/Llama-3-70b-chat-hf", + "llama-3.1-70b": "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo", "mixtral-8x7B": "mistralai/Mixtral-8x7B-Instruct-v0.1" } diff --git a/g4f/Provider/FlowGpt.py b/g4f/Provider/FlowGpt.py index 6c2aa046..d823a7ab 100644 --- a/g4f/Provider/FlowGpt.py +++ b/g4f/Provider/FlowGpt.py @@ -30,7 +30,7 @@ class FlowGpt(AsyncGeneratorProvider, ProviderModelMixin): "pygmalion-13b", "chronos-hermes-13b", "Mixtral-8x7B", - "Dolphin-2.6-8x7B" + "Dolphin-2.6-8x7B", ] model_aliases = { "gemini": "google-gemini", @@ -91,7 +91,7 @@ async def create_async_generator( "generateImage": False, "generateAudio": False } - async with session.post("https://backend-k8s.flowgpt.com/v2/chat-anonymous-encrypted", json=data, proxy=proxy) as response: + async with session.post("https://prod-backend-k8s.flowgpt.com/v3/chat-anonymous", json=data, proxy=proxy) as response: await raise_for_status(response) async for chunk in response.content: if chunk.strip(): diff --git a/g4f/Provider/HuggingChat.py b/g4f/Provider/HuggingChat.py index f7c6b581..c130d183 100644 --- a/g4f/Provider/HuggingChat.py +++ b/g4f/Provider/HuggingChat.py @@ -33,80 +33,78 @@ def create_completion( model: str, messages: Messages, stream: bool, - **kwargs - ) -> CreateResult: + **kwargs) -> CreateResult: if (model in cls.models) : - session = requests.Session() - headers = { - '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', - 'cache-control' : 'no-cache', - 'origin' : 'https://huggingface.co', - 'pragma' : 'no-cache', - 'priority' : 'u=1, i', - 'referer' : 'https://huggingface.co/chat/', - 'sec-ch-ua' : '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"', - 'sec-ch-ua-mobile' : '?0', + session = cf_reqs.Session() + session.headers = { + 'accept': '*/*', + 'accept-language': 'en', + 'cache-control': 'no-cache', + 'origin': 'https://huggingface.co', + 'pragma': 'no-cache', + 'priority': 'u=1, i', + 'referer': 'https://huggingface.co/chat/', + 'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"', + '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/126.0.0.0 Safari/537.36', + '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/127.0.0.0 Safari/537.36', } + print(model) json_data = { - 'searchEnabled' : True, - 'activeModel' : 'CohereForAI/c4ai-command-r-plus', # doesn't matter - 'hideEmojiOnSidebar': False, - 'customPrompts' : {}, - 'assistants' : [], - 'tools' : {}, - 'disableStream' : False, - 'recentlySaved' : False, - 'ethicsModalAccepted' : True, - 'ethicsModalAcceptedAt' : None, - 'shareConversationsWithModelAuthors': False, + 'model': model, } - response = cf_reqs.post('https://huggingface.co/chat/settings', headers=headers, json=json_data) - session.cookies.update(response.cookies) - - response = session.post('https://huggingface.co/chat/conversation', - headers=headers, json={'model': model}) - + response = session.post('https://huggingface.co/chat/conversation', json=json_data) conversationId = response.json()['conversationId'] - response = session.get(f'https://huggingface.co/chat/conversation/{conversationId}/__data.json?x-sveltekit-invalidated=11', - headers=headers, - ) - messageId = extract_id(response.json()) + response = session.get(f'https://huggingface.co/chat/conversation/{conversationId}/__data.json?x-sveltekit-invalidated=01',) + + data: list = (response.json())["nodes"][1]["data"] + keys: list[int] = data[data[0]["messages"]] + message_keys: dict = data[keys[0]] + messageId: str = data[message_keys["id"]] settings = { - "inputs" : format_prompt(messages), - "id" : messageId, - "is_retry" : False, - "is_continue" : False, - "web_search" : False, - - # TODO // add feature to enable/disable tools - "tools": { - "websearch" : True, - "document_parser" : False, - "query_calculator" : False, - "image_generation" : False, - "image_editing" : False, - "fetch_url" : False, - } + "inputs":format_prompt(messages), + "id":messageId, + "is_retry":False, + "is_continue":False, + "web_search":False, + "tools":[] } - payload = { - "data": json.dumps(settings), + headers = { + 'accept': '*/*', + 'accept-language': 'en', + 'cache-control': 'no-cache', + 'origin': 'https://huggingface.co', + 'pragma': 'no-cache', + 'priority': 'u=1, i', + 'referer': f'https://huggingface.co/chat/conversation/{conversationId}', + 'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"', + '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/127.0.0.0 Safari/537.36', + } + + + files = { + 'data': (None, json.dumps(settings, separators=(',', ':'))), } - response = session.post(f"https://huggingface.co/chat/conversation/{conversationId}", - headers=headers, data=payload, stream=True, + response = requests.post(f'https://huggingface.co/chat/conversation/{conversationId}', + cookies=session.cookies, + headers=headers, + files=files, ) first_token = True @@ -125,18 +123,7 @@ def create_completion( else: token = token.replace('\u0000', '') - yield token + yield (token) elif line["type"] == "finalAnswer": - break - -def extract_id(response: dict) -> str: - data = response["nodes"][1]["data"] - uuid_pattern = re.compile( - r"^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$" - ) - for item in data: - if type(item) == str and uuid_pattern.match(item): - return item - - return None + break \ No newline at end of file diff --git a/g4f/Provider/MagickPenAsk.py b/g4f/Provider/MagickPenAsk.py index 54058228..8b7473d8 100644 --- a/g4f/Provider/MagickPenAsk.py +++ b/g4f/Provider/MagickPenAsk.py @@ -36,7 +36,8 @@ async def create_async_generator( "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "same-site", - "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" + "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + 'X-API-Secret': 'WCASR6ZQJYM85DVDX7' } async with ClientSession(headers=headers) as session: data = { diff --git a/g4f/Provider/PerplexityLabs.py b/g4f/Provider/PerplexityLabs.py index 0a298e55..7f4587e1 100644 --- a/g4f/Provider/PerplexityLabs.py +++ b/g4f/Provider/PerplexityLabs.py @@ -11,11 +11,20 @@ WS_URL = "wss://www.perplexity.ai/socket.io/" class PerplexityLabs(AsyncGeneratorProvider, ProviderModelMixin): - url = "https://labs.perplexity.ai" + url = "https://labs.perplexity.ai" working = True default_model = "mixtral-8x7b-instruct" models = [ - "llama-3-sonar-large-32k-online", "llama-3-sonar-small-32k-online", "llama-3-sonar-large-32k-chat", "llama-3-sonar-small-32k-chat", "llama-3-8b-instruct", "llama-3-70b-instruct", "gemma-2-9b-it", "gemma-2-27b-it", "nemotron-4-340b-instruct", "mixtral-8x7b-instruct", + "llama-3.1-sonar-large-128k-online", + "llama-3.1-sonar-small-128k-online", + "llama-3.1-sonar-large-128k-chat", + "llama-3.1-sonar-small-128k-chat", + "llama-3.1-8b-instruct", + "llama-3.1-70b-instruct", + "gemma-2-9b-it", + "gemma-2-27b-it", + "nemotron-4-340b-instruct", + "mixtral-8x7b-instruct" ] @classmethod @@ -54,7 +63,7 @@ async def create_async_generator( data=post_data ) as response: await raise_for_status(response) - assert await response.text() == "OK" + assert await response.text() == "OK" async with session.ws_connect(f"{WS_URL}?EIO=4&transport=websocket&sid={sid}", autoping=False) as ws: await ws.send_str("2probe") assert(await ws.receive_str() == "3probe") diff --git a/g4f/Provider/Rocks.py b/g4f/Provider/Rocks.py new file mode 100644 index 00000000..8465a6c0 --- /dev/null +++ b/g4f/Provider/Rocks.py @@ -0,0 +1,56 @@ +import json +from aiohttp import ClientSession + +from ..typing import Messages, AsyncResult +from .base_provider import AsyncGeneratorProvider + +class Rocks(AsyncGeneratorProvider): + url = "https://api.discord.rocks" + api_endpoint = "/chat/completions" + supports_message_history = False + supports_gpt_35_turbo = True + working = True + + @classmethod + async def create_async_generator( + cls, + model: str, + messages: Messages, + proxy: str = None, + **kwargs + ) -> AsyncResult: + payload = {"messages":messages,"model":model,"max_tokens":4096,"temperature":1,"top_p":1,"stream":True} + + headers = { + "Accept": "application/json", + "Accept-Encoding": "gzip, deflate, br, zstd", + "Accept-Language": "en-US,en;q=0.9", + "Origin": cls.url, + "Referer": f"{cls.url}/en", + "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/126.0.0.0 Safari/537.36", + } + + async with ClientSession() as session: + async with session.post( + f"{cls.url}{cls.api_endpoint}", + json=payload, + proxy=proxy, + headers=headers + ) as response: + response.raise_for_status() + async for line in response.content: + if line.startswith(b"data: "): + try: + line = json.loads(line[6:]) + except: + continue + chunk = line["choices"][0]["delta"].get("content") + if chunk: + yield chunk + elif line.startswith(b"\n"): + pass + else: + raise Exception(f"Unexpected line: {line}") diff --git a/g4f/Provider/__init__.py b/g4f/Provider/__init__.py index 42dd60c3..5f0efcb2 100644 --- a/g4f/Provider/__init__.py +++ b/g4f/Provider/__init__.py @@ -54,6 +54,7 @@ from .Reka import Reka from .Replicate import Replicate from .ReplicateHome import ReplicateHome +from .Rocks import Rocks from .TeachAnything import TeachAnything from .Vercel import Vercel from .WhiteRabbitNeo import WhiteRabbitNeo diff --git a/g4f/models.py b/g4f/models.py index 7c4565f8..2b6867f4 100644 --- a/g4f/models.py +++ b/g4f/models.py @@ -504,6 +504,9 @@ class ModelUtils: 'llama-3-70b-instruct': llama_3_70b_instruct, 'llama-3-70b-chat': llama_3_70b_chat_hf, 'llama-3-70b-instruct': llama_3_70b_instruct, + + 'llama-3.1-70b': llama_3_1_70b_instruct, + 'llama-3.1-405b': llama_3_1_405b_instruct_FP8, 'llama-3.1-70b-instruct': llama_3_1_70b_instruct, 'llama-3.1-405b-instruct': llama_3_1_405b_instruct_FP8,