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

XFEstudio/gpt4free

fix for 500 Internal Server Error #2199 [Request] Blackbox provider now support Gemini and LLaMa 3.1 models #2198 with some stuff from #2196

bda2d679
zukixa <56563509+zukixa@users.noreply.github.com>
提交于

代码差异

21 个文件 +366 -297
Modified g4f/Provider/AI365VIP.py +21 -17
@@ -35,31 +35,35 @@ class AI365VIP(AsyncGeneratorProvider, ProviderModelMixin):
35 35 "accept": "*/*",
36 36 "accept-language": "en-US,en;q=0.9",
37 37 "content-type": "application/json",
38 "dnt": "1",
39 "origin": "https://chat.ai365vip.com",
40 "priority": "u=1, i",
41 "referer": "https://chat.ai365vip.com/en",
42 "sec-ch-ua": '"Not/A)Brand";v="8", "Chromium";v="126"',
38 "origin": cls.url,
39 "referer": f"{cls.url}/en",
40 "sec-ch-ua": '"Chromium";v="127", "Not)A;Brand";v="99"',
41 "sec-ch-ua-arch": '"x86"',
42 "sec-ch-ua-bitness": '"64"',
43 "sec-ch-ua-full-version": '"127.0.6533.119"',
44 "sec-ch-ua-full-version-list": '"Chromium";v="127.0.6533.119", "Not)A;Brand";v="99.0.0.0"',
43 45 "sec-ch-ua-mobile": "?0",
46 "sec-ch-ua-model": '""',
44 47 "sec-ch-ua-platform": '"Linux"',
48 "sec-ch-ua-platform-version": '"4.19.276"',
45 49 "sec-fetch-dest": "empty",
46 50 "sec-fetch-mode": "cors",
47 51 "sec-fetch-site": "same-origin",
48 "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
52 "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",
49 53 }
50 54 async with ClientSession(headers=headers) as session:
51 55 data = {
52 "model": {
53 "id": model,
54 "name": {
55 "gpt-3.5-turbo": "GPT-3.5",
56 "claude-3-haiku-20240307": "claude-3-haiku",
57 "gpt-4o": "GPT-4O"
58 }.get(model, model),
59 },
60 "messages": [{"role": "user", "content": format_prompt(messages)}],
61 "prompt": "You are a helpful assistant.",
62 }
56 "model": {
57 "id": model,
58 "name": "GPT-3.5",
59 "maxLength": 3000,
60 "tokenLimit": 2048
61 },
62 "messages": [{"role": "user", "content": format_prompt(messages)}],
63 "key": "",
64 "prompt": "You are a helpful assistant.",
65 "temperature": 1
66 }
63 67 async with session.post(f"{cls.url}{cls.api_endpoint}", json=data, proxy=proxy) as response:
64 68 response.raise_for_status()
65 69 async for chunk in response.content:
Added g4f/Provider/AiChatOnline.py +64 -0
@@ -0,0 +1,64 @@
1 from __future__ import annotations
2
3 import json
4 from aiohttp import ClientSession
5
6 from ..typing import AsyncResult, Messages
7 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
8 from .helper import get_random_string, format_prompt
9
10 class AiChatOnline(AsyncGeneratorProvider, ProviderModelMixin):
11 site_url = "https://aichatonline.org"
12 url = "https://aichatonlineorg.erweima.ai"
13 api_endpoint = "/aichatonline/api/chat/gpt"
14 working = True
15 supports_gpt_35_turbo = True
16 supports_gpt_4 = True
17 default_model = 'gpt-4o-mini'
18 supports_message_history = False
19
20 @classmethod
21 async def grab_token(
22 cls,
23 session: ClientSession,
24 proxy: str
25 ):
26 async with session.get(f'https://aichatonlineorg.erweima.ai/api/v1/user/getUniqueId?canvas=-{get_random_string()}', proxy=proxy) as response:
27 response.raise_for_status()
28 return (await response.json())['data']
29
30 @classmethod
31 async def create_async_generator(
32 cls,
33 model: str,
34 messages: Messages,
35 proxy: str = None,
36 **kwargs
37 ) -> AsyncResult:
38 headers = {
39 "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/119.0",
40 "Accept-Language": "de,en-US;q=0.7,en;q=0.3",
41 "Accept-Encoding": "gzip, deflate, br",
42 "Referer": f"{cls.url}/chatgpt/chat/",
43 "Content-Type": "application/json",
44 "Origin": cls.url,
45 "Alt-Used": "aichatonline.org",
46 "Connection": "keep-alive",
47 "Sec-Fetch-Dest": "empty",
48 "Sec-Fetch-Mode": "cors",
49 "Sec-Fetch-Site": "same-origin",
50 "TE": "trailers"
51 }
52 async with ClientSession(headers=headers) as session:
53 data = {
54 "conversationId": get_random_string(),
55 "prompt": format_prompt(messages),
56 }
57 headers['UniqueId'] = await cls.grab_token(session, proxy)
58 async with session.post(f"{cls.url}{cls.api_endpoint}", headers=headers, json=data, proxy=proxy) as response:
59 response.raise_for_status()
60 async for chunk in response.content:
61 try:
62 yield json.loads(chunk)['data']['message']
63 except:
64 continue
Modified g4f/Provider/Blackbox.py +17 -3
@@ -14,7 +14,13 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
14 14 url = "https://www.blackbox.ai"
15 15 working = True
16 16 default_model = 'blackbox'
17
17 models = [
18 default_model,
19 "gemini-1.5-flash",
20 "llama-3.1-8b",
21 'llama-3.1-70b',
22 'llama-3.1-405b',
23 ]
18 24 @classmethod
19 25 async def create_async_generator(
20 26 cls,
@@ -28,7 +34,8 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
28 34 if image is not None:
29 35 messages[-1]["data"] = {
30 36 "fileText": image_name,
31 "imageBase64": to_data_uri(image)
37 "imageBase64": to_data_uri(image),
38 "title": str(uuid.uuid4())
32 39 }
33 40
34 41 headers = {
@@ -48,7 +55,13 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
48 55 async with ClientSession(headers=headers) as session:
49 56 random_id = secrets.token_hex(16)
50 57 random_user_id = str(uuid.uuid4())
51
58 model_id_map = {
59 "blackbox": {},
60 "gemini-1.5-flash": {'mode': True, 'id': 'Gemini'},
61 "llama-3.1-8b": {'mode': True, 'id': "llama-3.1-8b"},
62 'llama-3.1-70b': {'mode': True, 'id': "llama-3.1-70b"},
63 'llama-3.1-405b': {'mode': True, 'id': "llama-3.1-405b"}
64 }
52 65 data = {
53 66 "messages": messages,
54 67 "id": random_id,
@@ -62,6 +75,7 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
62 75 "webSearchMode": False,
63 76 "userSystemPrompt": "",
64 77 "githubToken": None,
78 "trendingAgentModel": model_id_map[model], # if you actually test this on the site, just ask each model "yo", weird behavior imo
65 79 "maxTokens": None
66 80 }
67 81
Modified g4f/Provider/Chatgpt4Online.py +3 -4
@@ -14,8 +14,8 @@ class Chatgpt4Online(AsyncGeneratorProvider):
14 14 working = True
15 15 supports_gpt_4 = True
16 16
17 async def get_nonce():
18 async with ClientSession() as session:
17 async def get_nonce(headers: dict) -> str:
18 async with ClientSession(headers=headers) as session:
19 19 async with session.post(f"https://chatgpt4online.org/wp-json/mwai/v1/start_session") as response:
20 20 return (await response.json())["restNonce"]
21 21
@@ -42,9 +42,8 @@ class Chatgpt4Online(AsyncGeneratorProvider):
42 42 "sec-fetch-mode": "cors",
43 43 "sec-fetch-site": "same-origin",
44 44 "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
45 "x-wp-nonce": await cls.get_nonce(),
46 45 }
47
46 headers['x-wp-nonce'] = await cls.get_nonce(headers)
48 47 async with ClientSession(headers=headers) as session:
49 48 prompt = format_prompt(messages)
50 49 data = {
Modified g4f/Provider/ChatgptFree.py +37 -22
@@ -2,21 +2,25 @@ from __future__ import annotations
2 2
3 3 import re
4 4 import json
5
5 import asyncio
6 6 from ..requests import StreamSession, raise_for_status
7 from ..typing import Messages
8 from .base_provider import AsyncProvider
7 from ..typing import Messages, AsyncGenerator
8 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
9 9 from .helper import format_prompt
10 10
11 class ChatgptFree(AsyncProvider):
11 class ChatgptFree(AsyncGeneratorProvider, ProviderModelMixin):
12 12 url = "https://chatgptfree.ai"
13 supports_gpt_35_turbo = True
13 supports_gpt_4 = True
14 14 working = True
15 15 _post_id = None
16 16 _nonce = None
17 default_model = 'gpt-4o-mini-2024-07-18'
18 model_aliases = {
19 "gpt-4o-mini": "gpt-4o-mini-2024-07-18",
20 }
17 21
18 22 @classmethod
19 async def create_async(
23 async def create_async_generator(
20 24 cls,
21 25 model: str,
22 26 messages: Messages,
@@ -24,7 +28,7 @@ class ChatgptFree(AsyncProvider):
24 28 timeout: int = 120,
25 29 cookies: dict = None,
26 30 **kwargs
27 ) -> str:
31 ) -> AsyncGenerator[str, None]:
28 32 headers = {
29 33 'authority': 'chatgptfree.ai',
30 34 'accept': '*/*',
@@ -39,7 +43,6 @@ class ChatgptFree(AsyncProvider):
39 43 'sec-fetch-site': 'same-origin',
40 44 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
41 45 }
42
43 46 async with StreamSession(
44 47 headers=headers,
45 48 cookies=cookies,
@@ -50,19 +53,11 @@ class ChatgptFree(AsyncProvider):
50 53
51 54 if not cls._nonce:
52 55 async with session.get(f"{cls.url}/") as response:
53
54 56 await raise_for_status(response)
55 57 response = await response.text()
56
57 result = re.search(r'data-post-id="([0-9]+)"', response)
58 if not result:
59 raise RuntimeError("No post id found")
60 cls._post_id = result.group(1)
61
62 58 result = re.search(r'data-nonce="(.*?)"', response)
63 59 if result:
64 60 cls._nonce = result.group(1)
65
66 61 else:
67 62 raise RuntimeError("No nonce found")
68 63
@@ -75,10 +70,30 @@ class ChatgptFree(AsyncProvider):
75 70 "message": prompt,
76 71 "bot_id": "0"
77 72 }
78 async with session.get(f"{cls.url}/wp-admin/admin-ajax.php", params=data, cookies=cookies) as response:
73
74 async with session.post(f"{cls.url}/wp-admin/admin-ajax.php", data=data, cookies=cookies) as response:
79 75 await raise_for_status(response)
80 full_answer = ""
81 for line in ((await response.text()).splitlines())[:-1]:
82 if line.startswith("data:") and "[DONE]" not in line:
83 full_answer += json.loads(line[5:])['choices'][0]['delta'].get('content', "")
84 return full_answer
76 buffer = ""
77 async for line in response.iter_lines():
78 line = line.decode('utf-8').strip()
79 if line.startswith('data: '):
80 data = line[6:]
81 if data == '[DONE]':
82 break
83 try:
84 json_data = json.loads(data)
85 content = json_data['choices'][0]['delta'].get('content', '')
86 if content:
87 yield content
88 except json.JSONDecodeError:
89 continue
90 elif line:
91 buffer += line
92
93 if buffer:
94 try:
95 json_response = json.loads(buffer)
96 if 'data' in json_response:
97 yield json_response['data']
98 except json.JSONDecodeError:
99 print(f"Failed to decode final JSON. Buffer content: {buffer}")
Modified g4f/Provider/DDG.py +1 -1
@@ -25,7 +25,7 @@ class DDG(AsyncGeneratorProvider, ProviderModelMixin):
25 25 "gpt-4o": "gpt-4o-mini",
26 26 "claude-3-haiku": "claude-3-haiku-20240307",
27 27 "llama-3.1-70b": "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",
28 "mixtral-8x7B": "mistralai/Mixtral-8x7B-Instruct-v0.1"
28 "mixtral-8x7b": "mistralai/Mixtral-8x7B-Instruct-v0.1"
29 29 }
30 30
31 31 # Obfuscated URLs and headers
Modified g4f/Provider/DeepInfra.py +1 -5
@@ -11,11 +11,7 @@ class DeepInfra(Openai):
11 11 needs_auth = True
12 12 supports_stream = True
13 13 supports_message_history = True
14 default_model = "meta-llama/Meta-Llama-3-70B-Instruct"
15 default_vision_model = "llava-hf/llava-1.5-7b-hf"
16 model_aliases = {
17 'dbrx-instruct': 'databricks/dbrx-instruct',
18 }
14 default_model = "meta-llama/Meta-Llama-3.1-70B-Instruct"
19 15
20 16 @classmethod
21 17 def get_models(cls):
Modified g4f/Provider/FreeChatgpt.py +20 -0
@@ -16,13 +16,31 @@ class FreeChatgpt(AsyncGeneratorProvider, ProviderModelMixin):
16 16 'gpt-3.5-turbo',
17 17 'SparkDesk-v1.1',
18 18 'deepseek-coder',
19 '@cf/qwen/qwen1.5-14b-chat-awq',
19 20 'deepseek-chat',
20 21 'Qwen2-7B-Instruct',
21 22 'glm4-9B-chat',
22 23 'chatglm3-6B',
23 24 'Yi-1.5-9B-Chat',
24 25 ]
26 model_aliases = {
27 "qwen-1.5-14b": "@cf/qwen/qwen1.5-14b-chat-awq",
28 "sparkdesk-v1.1": "SparkDesk-v1.1",
29 "qwen2-7b": "Qwen2-7B-Instruct",
30 "glm4-9b": "glm4-9B-chat",
31 "chatglm3-6b": "chatglm3-6B",
32 "yi-1.5-9b": "Yi-1.5-9B-Chat",
33 }
25 34
35 @classmethod
36 def get_model(cls, model: str) -> str:
37 if model in cls.models:
38 return model
39 elif model.lower() in cls.model_aliases:
40 return cls.model_aliases[model.lower()]
41 else:
42 return cls.default_model
43
26 44 @classmethod
27 45 async def create_async_generator(
28 46 cls,
@@ -46,6 +64,7 @@ class FreeChatgpt(AsyncGeneratorProvider, ProviderModelMixin):
46 64 "sec-fetch-site": "same-origin",
47 65 "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
48 66 }
67 model = cls.get_model(model)
49 68 async with ClientSession(headers=headers) as session:
50 69 prompt = format_prompt(messages)
51 70 data = {
@@ -74,5 +93,6 @@ class FreeChatgpt(AsyncGeneratorProvider, ProviderModelMixin):
74 93 chunk = json.loads(line_str[6:])
75 94 delta_content = chunk.get("choices", [{}])[0].get("delta", {}).get("content", "")
76 95 accumulated_text += delta_content
96 yield delta_content
77 97 except json.JSONDecodeError:
78 98 pass
Modified g4f/Provider/FreeGpt.py +10 -8
@@ -6,23 +6,25 @@ import random
6 6 from typing import AsyncGenerator, Optional, Dict, Any
7 7 from ..typing import Messages
8 8 from ..requests import StreamSession, raise_for_status
9 from .base_provider import AsyncGeneratorProvider
9 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
10 10 from ..errors import RateLimitError
11 11
12 12 # Constants
13 13 DOMAINS = [
14 14 "https://s.aifree.site",
15 "https://v.aifree.site/"
15 "https://v.aifree.site/",
16 "https://al.aifree.site/",
17 "https://u4.aifree.site/"
16 18 ]
17 19 RATE_LIMIT_ERROR_MESSAGE = "当前地区当日额度已消耗完"
18 20
19 21
20 class FreeGpt(AsyncGeneratorProvider):
21 url: str = "https://freegptsnav.aifree.site"
22 working: bool = True
23 supports_message_history: bool = True
24 supports_system_message: bool = True
25 supports_gpt_35_turbo: bool = True
22 class FreeGpt(AsyncGeneratorProvider, ProviderModelMixin):
23 url = "https://freegptsnav.aifree.site"
24 working = True
25 supports_message_history = True
26 supports_system_message = True
27 default_model = 'llama-3.1-70b'
26 28
27 29 @classmethod
28 30 async def create_async_generator(
Modified g4f/Provider/FreeNetfly.py +2 -2
@@ -54,8 +54,8 @@ class FreeNetfly(AsyncGeneratorProvider, ProviderModelMixin):
54 54 "top_p": 1
55 55 }
56 56
57 max_retries = 3
58 retry_delay = 1
57 max_retries = 5
58 retry_delay = 2
59 59
60 60 for attempt in range(max_retries):
61 61 try:
Modified g4f/Provider/HuggingChat.py +39 -30
@@ -2,16 +2,16 @@ from __future__ import annotations
2 2
3 3 import json, requests, re
4 4
5 from curl_cffi import requests as cf_reqs
6 from ..typing import CreateResult, Messages
5 from curl_cffi import requests as cf_reqs
6 from ..typing import CreateResult, Messages
7 7 from .base_provider import ProviderModelMixin, AbstractProvider
8 from .helper import format_prompt
8 from .helper import format_prompt
9 9
10 10 class HuggingChat(AbstractProvider, ProviderModelMixin):
11 url = "https://huggingface.co/chat"
12 working = True
11 url = "https://huggingface.co/chat"
12 working = True
13 13 supports_stream = True
14 default_model = "mistralai/Mixtral-8x7B-Instruct-v0.1"
14 default_model = "meta-llama/Meta-Llama-3.1-70B-Instruct"
15 15 models = [
16 16 'meta-llama/Meta-Llama-3.1-70B-Instruct',
17 17 'meta-llama/Meta-Llama-3.1-405B-Instruct-FP8',
@@ -19,24 +19,41 @@ class HuggingChat(AbstractProvider, ProviderModelMixin):
19 19 'mistralai/Mixtral-8x7B-Instruct-v0.1',
20 20 'NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO',
21 21 '01-ai/Yi-1.5-34B-Chat',
22 'mistralai/Mistral-7B-Instruct-v0.2',
22 'mistralai/Mistral-7B-Instruct-v0.3',
23 23 'microsoft/Phi-3-mini-4k-instruct',
24 24 ]
25
25
26 26 model_aliases = {
27 "mistralai/Mistral-7B-Instruct-v0.1": "mistralai/Mistral-7B-Instruct-v0.2"
27 "llama-3.1-70b": "meta-llama/Meta-Llama-3.1-70B-Instruct",
28 "llama-3.1-405b": "meta-llama/Meta-Llama-3.1-405B-Instruct-FP8",
29 "command-r-plus": "CohereForAI/c4ai-command-r-plus",
30 "mixtral-8x7b": "mistralai/Mixtral-8x7B-Instruct-v0.1",
31 "mixtral-8x7b": "NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO",
32 "yi-1.5-34b": "01-ai/Yi-1.5-34B-Chat",
33 "mistral-7b": "mistralai/Mistral-7B-Instruct-v0.3",
34 "phi-3-mini-4k": "microsoft/Phi-3-mini-4k-instruct",
28 35 }
29 36
37 @classmethod
38 def get_model(cls, model: str) -> str:
39 if model in cls.models:
40 return model
41 elif model in cls.model_aliases:
42 return cls.model_aliases[model]
43 else:
44 return cls.default_model
45
30 46 @classmethod
31 47 def create_completion(
32 48 cls,
33 49 model: str,
34 50 messages: Messages,
35 51 stream: bool,
36 **kwargs) -> CreateResult:
37
38 if (model in cls.models) :
39
52 **kwargs
53 ) -> CreateResult:
54 model = cls.get_model(model)
55
56 if model in cls.models:
40 57 session = cf_reqs.Session()
41 58 session.headers = {
42 59 'accept': '*/*',
@@ -54,29 +71,24 @@ class HuggingChat(AbstractProvider, ProviderModelMixin):
54 71 'sec-fetch-site': 'same-origin',
55 72 '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',
56 73 }
57
58 print(model)
59 74 json_data = {
60 75 'model': model,
61 76 }
62
63 77 response = session.post('https://huggingface.co/chat/conversation', json=json_data)
64 78 conversationId = response.json()['conversationId']
65
66 79 response = session.get(f'https://huggingface.co/chat/conversation/{conversationId}/__data.json?x-sveltekit-invalidated=01',)
67
68 80 data: list = (response.json())["nodes"][1]["data"]
69 81 keys: list[int] = data[data[0]["messages"]]
70 82 message_keys: dict = data[keys[0]]
71 83 messageId: str = data[message_keys["id"]]
72 84
73 85 settings = {
74 "inputs":format_prompt(messages),
75 "id":messageId,
76 "is_retry":False,
77 "is_continue":False,
78 "web_search":False,
79 "tools":[]
86 "inputs": format_prompt(messages),
87 "id": messageId,
88 "is_retry": False,
89 "is_continue": False,
90 "web_search": False,
91 "tools": []
80 92 }
81 93
82 94 headers = {
@@ -96,9 +108,8 @@ class HuggingChat(AbstractProvider, ProviderModelMixin):
96 108 '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',
97 109 }
98 110
99
100 111 files = {
101 'data': (None, json.dumps(settings, separators=(',', ':'))),
112 'data': (None, json.dumps(settings, separators=(',', ':'))),
102 113 }
103 114
104 115 response = requests.post(f'https://huggingface.co/chat/conversation/{conversationId}',
@@ -106,7 +117,6 @@ class HuggingChat(AbstractProvider, ProviderModelMixin):
106 117 headers=headers,
107 118 files=files,
108 119 )
109
110 120 first_token = True
111 121 for line in response.iter_lines():
112 122 line = json.loads(line)
@@ -119,11 +129,10 @@ class HuggingChat(AbstractProvider, ProviderModelMixin):
119 129 if first_token:
120 130 token = token.lstrip().replace('\u0000', '')
121 131 first_token = False
122
123 132 else:
124 133 token = token.replace('\u0000', '')
125 134
126 yield (token)
127
135 yield token
136
128 137 elif line["type"] == "finalAnswer":
129 138 break
Modified g4f/Provider/HuggingFace.py +42 -9
@@ -1,20 +1,17 @@
1 1 from __future__ import annotations
2
3 2 import json
4 3 from aiohttp import ClientSession, BaseConnector
5
6 4 from ..typing import AsyncResult, Messages
7 5 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
8 6 from .helper import get_connector
9 7 from ..errors import RateLimitError, ModelNotFoundError
10 8 from ..requests.raise_for_status import raise_for_status
11
12 9 class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin):
13 10 url = "https://huggingface.co/chat"
14 11 working = True
15 12 needs_auth = True
16 13 supports_message_history = True
17 default_model = "mistralai/Mixtral-8x7B-Instruct-v0.1"
14 default_model = "meta-llama/Meta-Llama-3.1-70B-Instruct"
18 15 models = [
19 16 'meta-llama/Meta-Llama-3.1-70B-Instruct',
20 17 'meta-llama/Meta-Llama-3.1-405B-Instruct-FP8',
@@ -22,10 +19,30 @@ class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin):
22 19 'mistralai/Mixtral-8x7B-Instruct-v0.1',
23 20 'NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO',
24 21 '01-ai/Yi-1.5-34B-Chat',
25 'mistralai/Mistral-7B-Instruct-v0.2',
22 'mistralai/Mistral-7B-Instruct-v0.3',
26 23 'microsoft/Phi-3-mini-4k-instruct',
27 24 ]
28 25
26 model_aliases = {
27 "llama-3.1-70b": "meta-llama/Meta-Llama-3.1-70B-Instruct",
28 "llama-3.1-405b": "meta-llama/Meta-Llama-3.1-405B-Instruct-FP8",
29 "command-r-plus": "CohereForAI/c4ai-command-r-plus",
30 "mixtral-8x7b": "mistralai/Mixtral-8x7B-Instruct-v0.1",
31 "mixtral-8x7b": "NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO",
32 "yi-1.5-34b": "01-ai/Yi-1.5-34B-Chat",
33 "mistral-7b": "mistralai/Mistral-7B-Instruct-v0.3",
34 "phi-3-mini-4k": "microsoft/Phi-3-mini-4k-instruct",
35 }
36
37 @classmethod
38 def get_model(cls, model: str) -> str:
39 if model in cls.models:
40 return model
41 elif model in cls.model_aliases:
42 return cls.model_aliases[model]
43 else:
44 return cls.default_model
45
29 46 @classmethod
30 47 async def create_async_generator(
31 48 cls,
@@ -40,10 +57,26 @@ class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin):
40 57 temperature: float = 0.7,
41 58 **kwargs
42 59 ) -> AsyncResult:
43 model = cls.get_model(model) if not model else model
44 headers = {}
60 model = cls.get_model(model)
61 headers = {
62 'accept': '*/*',
63 'accept-language': 'en',
64 'cache-control': 'no-cache',
65 'origin': 'https://huggingface.co',
66 'pragma': 'no-cache',
67 'priority': 'u=1, i',
68 'referer': 'https://huggingface.co/chat/',
69 'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
70 'sec-ch-ua-mobile': '?0',
71 'sec-ch-ua-platform': '"macOS"',
72 'sec-fetch-dest': 'empty',
73 'sec-fetch-mode': 'cors',
74 'sec-fetch-site': 'same-origin',
75 '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',
76 }
45 77 if api_key is not None:
46 78 headers["Authorization"] = f"Bearer {api_key}"
79
47 80 params = {
48 81 "return_full_text": False,
49 82 "max_new_tokens": max_new_tokens,
@@ -51,6 +84,7 @@ class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin):
51 84 **kwargs
52 85 }
53 86 payload = {"inputs": format_prompt(messages), "parameters": params, "stream": stream}
87
54 88 async with ClientSession(
55 89 headers=headers,
56 90 connector=get_connector(connector, proxy)
@@ -72,7 +106,6 @@ class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin):
72 106 yield chunk
73 107 else:
74 108 yield (await response.json())[0]["generated_text"].strip()
75
76 109 def format_prompt(messages: Messages) -> str:
77 110 system_messages = [message["content"] for message in messages if message["role"] == "system"]
78 111 question = " ".join([messages[-1]["content"], *system_messages])
@@ -81,4 +114,4 @@ def format_prompt(messages: Messages) -> str:
81 114 for idx, message in enumerate(messages)
82 115 if message["role"] == "assistant"
83 116 ])
84 return f"{history}<s>[INST] {question} [/INST]"
117 return f"{history}<s>[INST] {question} [/INST]"
Modified g4f/Provider/Koala.py +1 -1
Modified g4f/Provider/Liaobots.py +67 -97
Modified g4f/Provider/MagickPenAsk.py +5 -5
Modified g4f/Provider/MagickPenChat.py +3 -4
Modified g4f/Provider/Pizzagpt.py +30 -28
Modified g4f/Provider/You.py +1 -1
Modified g4f/Provider/__init__.py +1 -0
Deleted g4f/Provider/deprecated/AiChatOnline.py +0 -59
Modified g4f/Provider/deprecated/__init__.py +1 -1