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

XFEstudio/gpt4free

Add files via upload

a8ab2ad7
kqlio67 <166700875+kqlio67@users.noreply.github.com>
提交于

代码差异

16 个文件 +785 -152
Added g4f/Provider/AI365VIP.py +67 -0
@@ -0,0 +1,67 @@
1 from __future__ import annotations
2
3 from aiohttp import ClientSession
4
5 from ..typing import AsyncResult, Messages
6 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
7 from .helper import format_prompt
8
9
10 class AI365VIP(AsyncGeneratorProvider, ProviderModelMixin):
11 url = "https://chat.ai365vip.com"
12 api_endpoint = "/api/chat"
13 working = True
14 supports_gpt_35_turbo = True
15 supports_gpt_4 = True
16 default_model = 'gpt-3.5-turbo'
17 models = [
18 'gpt-3.5-turbo',
19 'gpt-4o',
20 'claude-3-haiku-20240307',
21 ]
22 model_aliases = {
23 "claude-3-haiku": "claude-3-haiku-20240307",
24 }
25
26 @classmethod
27 async def create_async_generator(
28 cls,
29 model: str,
30 messages: Messages,
31 proxy: str = None,
32 **kwargs
33 ) -> AsyncResult:
34 headers = {
35 "accept": "*/*",
36 "accept-language": "en-US,en;q=0.9",
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"',
43 "sec-ch-ua-mobile": "?0",
44 "sec-ch-ua-platform": '"Linux"',
45 "sec-fetch-dest": "empty",
46 "sec-fetch-mode": "cors",
47 "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"
49 }
50 async with ClientSession(headers=headers) as session:
51 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 }
63 async with session.post(f"{cls.url}{cls.api_endpoint}", json=data, proxy=proxy) as response:
64 response.raise_for_status()
65 async for chunk in response.content:
66 if chunk:
67 yield chunk.decode()
Modified g4f/Provider/Blackbox.py +25 -12
@@ -2,31 +2,35 @@ from __future__ import annotations
2 2
3 3 import uuid
4 4 import secrets
5 from aiohttp import ClientSession
5 import re
6 from aiohttp import ClientSession, ClientResponse
7 from typing import AsyncGenerator, Optional
6 8
7 9 from ..typing import AsyncResult, Messages, ImageType
8 10 from ..image import to_data_uri
9 from .base_provider import AsyncGeneratorProvider
11 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
10 12
11 class Blackbox(AsyncGeneratorProvider):
13 class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
12 14 url = "https://www.blackbox.ai"
13 15 working = True
16 default_model = 'blackbox'
14 17
15 18 @classmethod
16 19 async def create_async_generator(
17 20 cls,
18 21 model: str,
19 22 messages: Messages,
20 proxy: str = None,
21 image: ImageType = None,
22 image_name: str = None,
23 proxy: Optional[str] = None,
24 image: Optional[ImageType] = None,
25 image_name: Optional[str] = None,
23 26 **kwargs
24 ) -> AsyncResult:
27 ) -> AsyncGenerator[str, None]:
25 28 if image is not None:
26 29 messages[-1]["data"] = {
27 "fileText": image_name,
30 "fileText": image_name,
28 31 "imageBase64": to_data_uri(image)
29 32 }
33
30 34 headers = {
31 35 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
32 36 "Accept": "*/*",
@@ -40,9 +44,11 @@ class Blackbox(AsyncGeneratorProvider):
40 44 "Alt-Used": "www.blackbox.ai",
41 45 "Connection": "keep-alive",
42 46 }
47
43 48 async with ClientSession(headers=headers) as session:
44 49 random_id = secrets.token_hex(16)
45 50 random_user_id = str(uuid.uuid4())
51
46 52 data = {
47 53 "messages": messages,
48 54 "id": random_id,
@@ -55,10 +61,17 @@ class Blackbox(AsyncGeneratorProvider):
55 61 "playgroundMode": False,
56 62 "webSearchMode": False,
57 63 "userSystemPrompt": "",
58 "githubToken": None
64 "githubToken": None,
65 "maxTokens": None
59 66 }
60 async with session.post(f"{cls.url}/api/chat", json=data, proxy=proxy) as response:
67
68 async with session.post(
69 f"{cls.url}/api/chat", json=data, proxy=proxy
70 ) as response: # type: ClientResponse
61 71 response.raise_for_status()
62 async for chunk in response.content:
72 async for chunk in response.content.iter_any():
63 73 if chunk:
64 yield chunk.decode()
74 # Decode the chunk and clean up unwanted prefixes using a regex
75 decoded_chunk = chunk.decode()
76 cleaned_chunk = re.sub(r'\$@\$.+?\$@\$|\$@\$', '', decoded_chunk)
77 yield cleaned_chunk
Added g4f/Provider/Chatgpt4o.py +83 -0
@@ -0,0 +1,83 @@
1 from __future__ import annotations
2
3 import re
4 from ..requests import StreamSession, raise_for_status
5 from ..typing import Messages
6 from .base_provider import AsyncProvider, ProviderModelMixin
7 from .helper import format_prompt
8
9
10 class Chatgpt4o(AsyncProvider, ProviderModelMixin):
11 url = "https://chatgpt4o.one"
12 supports_gpt_4 = True
13 working = True
14 _post_id = None
15 _nonce = None
16 default_model = 'gpt-4o'
17
18
19 @classmethod
20 async def create_async(
21 cls,
22 model: str,
23 messages: Messages,
24 proxy: str = None,
25 timeout: int = 120,
26 cookies: dict = None,
27 **kwargs
28 ) -> str:
29 headers = {
30 'authority': 'chatgpt4o.one',
31 'accept': '*/*',
32 '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',
33 'origin': 'https://chatgpt4o.one',
34 'referer': 'https://chatgpt4o.one',
35 'sec-ch-ua': '"Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99"',
36 'sec-ch-ua-mobile': '?0',
37 'sec-ch-ua-platform': '"macOS"',
38 'sec-fetch-dest': 'empty',
39 'sec-fetch-mode': 'cors',
40 'sec-fetch-site': 'same-origin',
41 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
42 }
43
44 async with StreamSession(
45 headers=headers,
46 cookies=cookies,
47 impersonate="chrome",
48 proxies={"all": proxy},
49 timeout=timeout
50 ) as session:
51
52 if not cls._post_id or not cls._nonce:
53 async with session.get(f"{cls.url}/") as response:
54 await raise_for_status(response)
55 response_text = await response.text()
56
57 post_id_match = re.search(r'data-post-id="([0-9]+)"', response_text)
58 nonce_match = re.search(r'data-nonce="(.*?)"', response_text)
59
60 if not post_id_match:
61 raise RuntimeError("No post ID found")
62 cls._post_id = post_id_match.group(1)
63
64 if not nonce_match:
65 raise RuntimeError("No nonce found")
66 cls._nonce = nonce_match.group(1)
67
68 prompt = format_prompt(messages)
69 data = {
70 "_wpnonce": cls._nonce,
71 "post_id": cls._post_id,
72 "url": cls.url,
73 "action": "wpaicg_chat_shortcode_message",
74 "message": prompt,
75 "bot_id": "0"
76 }
77
78 async with session.post(f"{cls.url}/wp-admin/admin-ajax.php", data=data, cookies=cookies) as response:
79 await raise_for_status(response)
80 response_json = await response.json()
81 if "data" not in response_json:
82 raise RuntimeError("Unexpected response structure: 'data' field missing")
83 return response_json["data"]
Modified g4f/Provider/ChatgptFree.py +1 -1
@@ -10,7 +10,7 @@ from .helper import format_prompt
10 10 class ChatgptFree(AsyncProvider):
11 11 url = "https://chatgptfree.ai"
12 12 supports_gpt_35_turbo = True
13 working = False
13 working = True
14 14 _post_id = None
15 15 _nonce = None
16 16
Added g4f/Provider/DDG.py +117 -0
@@ -0,0 +1,117 @@
1 from __future__ import annotations
2
3 import json
4 import aiohttp
5 import asyncio
6 from typing import Optional
7 import base64
8
9 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
10 from .helper import get_connector
11 from ..typing import AsyncResult, Messages
12 from ..requests.raise_for_status import raise_for_status
13 from ..providers.conversation import BaseConversation
14
15 class DDG(AsyncGeneratorProvider, ProviderModelMixin):
16 url = base64.b64decode("aHR0cHM6Ly9kdWNrZHVja2dvLmNvbS9haWNoYXQ=").decode("utf-8")
17 working = True
18 supports_gpt_35_turbo = True
19 supports_message_history = True
20
21 default_model = "gpt-3.5-turbo-0125"
22 models = ["gpt-3.5-turbo-0125", "claude-3-haiku-20240307", "meta-llama/Llama-3-70b-chat-hf", "mistralai/Mixtral-8x7B-Instruct-v0.1"]
23 model_aliases = {
24 "gpt-3.5-turbo": "gpt-3.5-turbo-0125",
25 "claude-3-haiku": "claude-3-haiku-20240307",
26 "llama-3-70b": "meta-llama/Llama-3-70b-chat-hf",
27 "mixtral-8x7B": "mistralai/Mixtral-8x7B-Instruct-v0.1"
28 }
29
30 # Obfuscated URLs and headers
31 status_url = base64.b64decode("aHR0cHM6Ly9kdWNrZHVja2dvLmNvbS9kdWNrY2hhdC92MS9zdGF0dXM=").decode("utf-8")
32 chat_url = base64.b64decode("aHR0cHM6Ly9kdWNrZHVja2dvLmNvbS9kdWNrY2hhdC92MS9jaGF0").decode("utf-8")
33 referer = base64.b64decode("aHR0cHM6Ly9kdWNrZHVja2dvLmNvbS8=").decode("utf-8")
34 origin = base64.b64decode("aHR0cHM6Ly9kdWNrZHVja2dvLmNvbQ==").decode("utf-8")
35
36 user_agent = 'Mozilla/5.0 (Windows NT 10.0; rv:127.0) Gecko/20100101 Firefox/127.0'
37 headers = {
38 'User-Agent': user_agent,
39 'Accept': 'text/event-stream',
40 'Accept-Language': 'en-US,en;q=0.5',
41 'Accept-Encoding': 'gzip, deflate, br, zstd',
42 'Referer': referer,
43 'Content-Type': 'application/json',
44 'Origin': origin,
45 'Connection': 'keep-alive',
46 'Cookie': 'dcm=3',
47 'Sec-Fetch-Dest': 'empty',
48 'Sec-Fetch-Mode': 'cors',
49 'Sec-Fetch-Site': 'same-origin',
50 'Pragma': 'no-cache',
51 'TE': 'trailers'
52 }
53
54 @classmethod
55 async def get_vqd(cls, session: aiohttp.ClientSession) -> Optional[str]:
56 try:
57 async with session.get(cls.status_url, headers={"x-vqd-accept": "1"}) as response:
58 await raise_for_status(response)
59 return response.headers.get("x-vqd-4")
60 except Exception as e:
61 print(f"Error getting VQD: {e}")
62 return None
63
64 @classmethod
65 async def create_async_generator(
66 cls,
67 model: str,
68 messages: Messages,
69 proxy: str = None,
70 connector: aiohttp.BaseConnector = None,
71 conversation: Conversation = None,
72 return_conversation: bool = False,
73 **kwargs
74 ) -> AsyncResult:
75 async with aiohttp.ClientSession(headers=cls.headers, connector=get_connector(connector, proxy)) as session:
76 vqd_4 = None
77 if conversation is not None and len(messages) > 1:
78 vqd_4 = conversation.vqd_4
79 messages = [*conversation.messages, messages[-2], messages[-1]]
80 else:
81 for _ in range(3): # Try up to 3 times to get a valid VQD
82 vqd_4 = await cls.get_vqd(session)
83 if vqd_4:
84 break
85 await asyncio.sleep(1) # Wait a bit before retrying
86
87 if not vqd_4:
88 raise Exception("Failed to obtain a valid VQD token")
89
90 messages = [messages[-1]] # Only use the last message for new conversations
91
92 payload = {
93 'model': cls.get_model(model),
94 'messages': [{'role': m['role'], 'content': m['content']} for m in messages]
95 }
96
97 async with session.post(cls.chat_url, json=payload, headers={"x-vqd-4": vqd_4}) as response:
98 await raise_for_status(response)
99 if return_conversation:
100 yield Conversation(vqd_4, messages)
101
102 async for line in response.content:
103 if line.startswith(b"data: "):
104 chunk = line[6:]
105 if chunk.startswith(b"[DONE]"):
106 break
107 try:
108 data = json.loads(chunk)
109 if "message" in data and data["message"]:
110 yield data["message"]
111 except json.JSONDecodeError:
112 print(f"Failed to decode JSON: {chunk}")
113
114 class Conversation(BaseConversation):
115 def __init__(self, vqd_4: str, messages: Messages) -> None:
116 self.vqd_4 = vqd_4
117 self.messages = messages
Added g4f/Provider/Feedough.py +78 -0
@@ -0,0 +1,78 @@
1 from __future__ import annotations
2
3 import json
4 import asyncio
5 from aiohttp import ClientSession, TCPConnector
6 from urllib.parse import urlencode
7
8 from ..typing import AsyncResult, Messages
9 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
10 from .helper import format_prompt
11
12
13 class Feedough(AsyncGeneratorProvider, ProviderModelMixin):
14 url = "https://www.feedough.com"
15 api_endpoint = "/wp-admin/admin-ajax.php"
16 working = True
17 default_model = ''
18
19 @classmethod
20 async def create_async_generator(
21 cls,
22 model: str,
23 messages: Messages,
24 proxy: str = None,
25 **kwargs
26 ) -> AsyncResult:
27 headers = {
28 "accept": "*/*",
29 "accept-language": "en-US,en;q=0.9",
30 "content-type": "application/x-www-form-urlencoded;charset=UTF-8",
31 "dnt": "1",
32 "origin": cls.url,
33 "referer": f"{cls.url}/ai-prompt-generator/",
34 "sec-ch-ua": '"Not/A)Brand";v="8", "Chromium";v="126"',
35 "sec-ch-ua-mobile": "?0",
36 "sec-ch-ua-platform": '"Linux"',
37 "sec-fetch-dest": "empty",
38 "sec-fetch-mode": "cors",
39 "sec-fetch-site": "same-origin",
40 "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
41 }
42
43 connector = TCPConnector(ssl=False)
44
45 async with ClientSession(headers=headers, connector=connector) as session:
46 data = {
47 "action": "aixg_generate",
48 "prompt": format_prompt(messages),
49 "aixg_generate_nonce": "110c021031"
50 }
51
52 try:
53 async with session.post(
54 f"{cls.url}{cls.api_endpoint}",
55 data=urlencode(data),
56 proxy=proxy
57 ) as response:
58 response.raise_for_status()
59 response_text = await response.text()
60 try:
61 response_json = json.loads(response_text)
62 if response_json.get("success") and "data" in response_json:
63 message = response_json["data"].get("message", "")
64 yield message
65 except json.JSONDecodeError:
66 yield response_text
67 except Exception as e:
68 print(f"An error occurred: {e}")
69
70 @classmethod
71 async def run(cls, *args, **kwargs):
72 async for item in cls.create_async_generator(*args, **kwargs):
73 yield item
74
75 tasks = asyncio.all_tasks()
76 for task in tasks:
77 if not task.done():
78 await task
Modified g4f/Provider/FreeChatgpt.py +56 -41
@@ -1,17 +1,27 @@
1 1 from __future__ import annotations
2
3 2 import json
4 from aiohttp import ClientSession, ClientTimeout
5
3 from aiohttp import ClientSession
6 4 from ..typing import AsyncResult, Messages
7 5 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
8 from ..requests.raise_for_status import raise_for_status
6 from .helper import format_prompt
7
9 8
10 9 class FreeChatgpt(AsyncGeneratorProvider, ProviderModelMixin):
11 url = "https://free.chatgpt.org.uk"
10 url = "https://chat.chatgpt.org.uk"
11 api_endpoint = "/api/openai/v1/chat/completions"
12 12 working = True
13 supports_message_history = True
14 default_model = "google-gemini-pro"
13 supports_gpt_35_turbo = True
14 default_model = 'gpt-3.5-turbo'
15 models = [
16 'gpt-3.5-turbo',
17 'SparkDesk-v1.1',
18 'deepseek-coder',
19 'deepseek-chat',
20 'Qwen2-7B-Instruct',
21 'glm4-9B-chat',
22 'chatglm3-6B',
23 'Yi-1.5-9B-Chat',
24 ]
15 25
16 26 @classmethod
17 27 async def create_async_generator(
@@ -19,45 +29,50 @@ class FreeChatgpt(AsyncGeneratorProvider, ProviderModelMixin):
19 29 model: str,
20 30 messages: Messages,
21 31 proxy: str = None,
22 timeout: int = 120,
23 32 **kwargs
24 33 ) -> AsyncResult:
25 34 headers = {
26 "Accept": "application/json, text/event-stream",
27 "Content-Type":"application/json",
28 "Accept-Encoding": "gzip, deflate, br",
29 "Accept-Language": "en-US,en;q=0.5",
30 "Host":"free.chatgpt.org.uk",
31 "Referer":f"{cls.url}/",
32 "Origin":f"{cls.url}",
33 "Sec-Fetch-Dest": "empty",
34 "Sec-Fetch-Mode": "cors",
35 "Sec-Fetch-Site": "same-origin",
36 "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
35 "accept": "application/json, text/event-stream",
36 "accept-language": "en-US,en;q=0.9",
37 "content-type": "application/json",
38 "dnt": "1",
39 "origin": cls.url,
40 "referer": f"{cls.url}/",
41 "sec-ch-ua": '"Not/A)Brand";v="8", "Chromium";v="126"',
42 "sec-ch-ua-mobile": "?0",
43 "sec-ch-ua-platform": '"Linux"',
44 "sec-fetch-dest": "empty",
45 "sec-fetch-mode": "cors",
46 "sec-fetch-site": "same-origin",
47 "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
37 48 }
38 async with ClientSession(headers=headers, timeout=ClientTimeout(timeout)) as session:
49 async with ClientSession(headers=headers) as session:
50 prompt = format_prompt(messages)
39 51 data = {
40 "messages": messages,
52 "messages": [
53 {"role": "system", "content": "\nYou are ChatGPT, a large language model trained by OpenAI.\nKnowledge cutoff: 2021-09\nCurrent model: gpt-3.5-turbo\nCurrent time: Thu Jul 04 2024 21:35:59 GMT+0300 (Eastern European Summer Time)\nLatex inline: \\(x^2\\) \nLatex block: $$e=mc^2$$\n\n"},
54 {"role": "user", "content": prompt}
55 ],
41 56 "stream": True,
42 "model": cls.get_model(""),
43 "temperature": kwargs.get("temperature", 0.5),
44 "presence_penalty": kwargs.get("presence_penalty", 0),
45 "frequency_penalty": kwargs.get("frequency_penalty", 0),
46 "top_p": kwargs.get("top_p", 1)
57 "model": model,
58 "temperature": 0.5,
59 "presence_penalty": 0,
60 "frequency_penalty": 0,
61 "top_p": 1
47 62 }
48 async with session.post(f'{cls.url}/api/openai/v1/chat/completions', json=data, proxy=proxy) as response:
49 await raise_for_status(response)
50 started = False
63 async with session.post(f"{cls.url}{cls.api_endpoint}", json=data, proxy=proxy) as response:
64 response.raise_for_status()
65 accumulated_text = ""
51 66 async for line in response.content:
52 if line.startswith(b"data: [DONE]"):
53 break
54 elif line.startswith(b"data: "):
55 line = json.loads(line[6:])
56 if(line["choices"]==[]):
57 continue
58 chunk = line["choices"][0]["delta"].get("content")
59 if chunk:
60 started = True
61 yield chunk
62 if not started:
63 raise RuntimeError("Empty response")
67 if line:
68 line_str = line.decode().strip()
69 if line_str == "data: [DONE]":
70 yield accumulated_text
71 break
72 elif line_str.startswith("data: "):
73 try:
74 chunk = json.loads(line_str[6:])
75 delta_content = chunk.get("choices", [{}])[0].get("delta", {}).get("content", "")
76 accumulated_text += delta_content
77 except json.JSONDecodeError:
78 pass
Modified g4f/Provider/FreeGpt.py +39 -27
@@ -1,55 +1,67 @@
1 1 from __future__ import annotations
2 2
3 import time, hashlib, random
4
5 from ..typing import AsyncResult, Messages
3 import time
4 import hashlib
5 import random
6 from typing import AsyncGenerator, Optional, Dict, Any
7 from ..typing import Messages
6 8 from ..requests import StreamSession, raise_for_status
7 9 from .base_provider import AsyncGeneratorProvider
8 10 from ..errors import RateLimitError
9 11
10 domains = [
12 # Constants
13 DOMAINS = [
11 14 "https://s.aifree.site",
12 15 "https://v.aifree.site/"
13 16 ]
17 RATE_LIMIT_ERROR_MESSAGE = "当前地区当日额度已消耗完"
18
14 19
15 20 class FreeGpt(AsyncGeneratorProvider):
16 url = "https://freegptsnav.aifree.site"
17 working = True
18 supports_message_history = True
19 supports_system_message = True
20 supports_gpt_35_turbo = True
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
21 26
22 27 @classmethod
23 28 async def create_async_generator(
24 29 cls,
25 30 model: str,
26 31 messages: Messages,
27 proxy: str = None,
32 proxy: Optional[str] = None,
28 33 timeout: int = 120,
29 **kwargs
30 ) -> AsyncResult:
34 **kwargs: Any
35 ) -> AsyncGenerator[str, None]:
36 prompt = messages[-1]["content"]
37 timestamp = int(time.time())
38 data = cls._build_request_data(messages, prompt, timestamp)
39
40 domain = random.choice(DOMAINS)
41
31 42 async with StreamSession(
32 43 impersonate="chrome",
33 44 timeout=timeout,
34 proxies={"all": proxy}
45 proxies={"all": proxy} if proxy else None
35 46 ) as session:
36 prompt = messages[-1]["content"]
37 timestamp = int(time.time())
38 data = {
39 "messages": messages,
40 "time": timestamp,
41 "pass": None,
42 "sign": generate_signature(timestamp, prompt)
43 }
44 domain = random.choice(domains)
45 47 async with session.post(f"{domain}/api/generate", json=data) as response:
46 48 await raise_for_status(response)
47 49 async for chunk in response.iter_content():
48 chunk = chunk.decode(errors="ignore")
49 if chunk == "当前地区当日额度已消耗完":
50 chunk_decoded = chunk.decode(errors="ignore")
51 if chunk_decoded == RATE_LIMIT_ERROR_MESSAGE:
50 52 raise RateLimitError("Rate limit reached")
51 yield chunk
52
53 def generate_signature(timestamp: int, message: str, secret: str = ""):
53 yield chunk_decoded
54
55 @staticmethod
56 def _build_request_data(messages: Messages, prompt: str, timestamp: int, secret: str = "") -> Dict[str, Any]:
57 return {
58 "messages": messages,
59 "time": timestamp,
60 "pass": None,
61 "sign": generate_signature(timestamp, prompt, secret)
62 }
63
64
65 def generate_signature(timestamp: int, message: str, secret: str = "") -> str:
54 66 data = f"{timestamp}:{message}:{secret}"
55 67 return hashlib.sha256(data.encode()).hexdigest()
Modified g4f/Provider/GeminiProChat.py +5 -4
@@ -9,13 +9,14 @@ from ..errors import RateLimitError
9 9 from ..requests import raise_for_status
10 10 from ..requests.aiohttp import get_connector
11 11 from ..typing import AsyncResult, Messages
12 from .base_provider import AsyncGeneratorProvider
12 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
13 13
14 14
15 class GeminiProChat(AsyncGeneratorProvider):
15 class GeminiProChat(AsyncGeneratorProvider, ProviderModelMixin):
16 16 url = "https://www.chatgot.one/"
17 17 working = True
18 18 supports_message_history = True
19 default_model = ''
19 20
20 21 @classmethod
21 22 async def create_async_generator(
@@ -32,8 +33,8 @@ class GeminiProChat(AsyncGeneratorProvider):
32 33 "Accept-Language": "en-US,en;q=0.5",
33 34 "Accept-Encoding": "gzip, deflate, br",
34 35 "Content-Type": "text/plain;charset=UTF-8",
35 "Referer": "https://gemini-chatbot-sigma.vercel.app/",
36 "Origin": "https://gemini-chatbot-sigma.vercel.app",
36 "Referer": f"{cls.url}/",
37 "Origin": cls.url,
37 38 "Sec-Fetch-Dest": "empty",
38 39 "Sec-Fetch-Mode": "cors",
39 40 "Sec-Fetch-Site": "same-origin",
Modified g4f/Provider/HuggingChat.py +2 -4
@@ -13,15 +13,13 @@ class HuggingChat(AbstractProvider, ProviderModelMixin):
13 13 supports_stream = True
14 14 default_model = "mistralai/Mixtral-8x7B-Instruct-v0.1"
15 15 models = [
16 "HuggingFaceH4/zephyr-orpo-141b-A35b-v0.1",
17 16 'CohereForAI/c4ai-command-r-plus',
17 'meta-llama/Meta-Llama-3-70B-Instruct',
18 18 'mistralai/Mixtral-8x7B-Instruct-v0.1',
19 'google/gemma-1.1-7b-it',
20 19 'NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO',
20 '01-ai/Yi-1.5-34B-Chat',
21 21 'mistralai/Mistral-7B-Instruct-v0.2',
22 'meta-llama/Meta-Llama-3-70B-Instruct',
23 22 'microsoft/Phi-3-mini-4k-instruct',
24 '01-ai/Yi-1.5-34B-Chat'
25 23 ]
26 24
27 25 model_aliases = {
Modified g4f/Provider/HuggingFace.py +9 -3
@@ -12,10 +12,16 @@ from ..requests.raise_for_status import raise_for_status
12 12 class HuggingFace(AsyncGeneratorProvider, ProviderModelMixin):
13 13 url = "https://huggingface.co/chat"
14 14 working = True
15 needs_auth = True
15 16 supports_message_history = True
16 17 models = [
17 "mistralai/Mixtral-8x7B-Instruct-v0.1",
18 "mistralai/Mistral-7B-Instruct-v0.2"
18 'CohereForAI/c4ai-command-r-plus',
19 'meta-llama/Meta-Llama-3-70B-Instruct',
20 'mistralai/Mixtral-8x7B-Instruct-v0.1',
21 'NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO',
22 '01-ai/Yi-1.5-34B-Chat',
23 'mistralai/Mistral-7B-Instruct-v0.2',
24 'microsoft/Phi-3-mini-4k-instruct',
19 25 ]
20 26 default_model = "mistralai/Mixtral-8x7B-Instruct-v0.1"
21 27
@@ -74,4 +80,4 @@ def format_prompt(messages: Messages) -> str:
74 80 for idx, message in enumerate(messages)
75 81 if message["role"] == "assistant"
76 82 ])
77 return f"{history}<s>[INST] {question} [/INST]"
83 return f"{history}<s>[INST] {question} [/INST]"
Modified g4f/Provider/Koala.py +24 -12
@@ -1,7 +1,8 @@
1 1 from __future__ import annotations
2 2
3 3 import json
4 from aiohttp import ClientSession, BaseConnector
4 from typing import AsyncGenerator, Optional, List, Dict, Union, Any
5 from aiohttp import ClientSession, BaseConnector, ClientResponse
5 6
6 7 from ..typing import AsyncResult, Messages
7 8 from .base_provider import AsyncGeneratorProvider
@@ -19,12 +20,13 @@ class Koala(AsyncGeneratorProvider):
19 20 cls,
20 21 model: str,
21 22 messages: Messages,
22 proxy: str = None,
23 connector: BaseConnector = None,
24 **kwargs
25 ) -> AsyncResult:
23 proxy: Optional[str] = None,
24 connector: Optional[BaseConnector] = None,
25 **kwargs: Any
26 ) -> AsyncGenerator[Dict[str, Union[str, int, float, List[Dict[str, Any]], None]], None]:
26 27 if not model:
27 28 model = "gpt-3.5-turbo"
29
28 30 headers = {
29 31 "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:122.0) Gecko/20100101 Firefox/122.0",
30 32 "Accept": "text/event-stream",
@@ -40,13 +42,17 @@ class Koala(AsyncGeneratorProvider):
40 42 "Sec-Fetch-Site": "same-origin",
41 43 "TE": "trailers",
42 44 }
45
43 46 async with ClientSession(headers=headers, connector=get_connector(connector, proxy)) as session:
44 input = messages[-1]["content"]
45 system_messages = [message["content"] for message in messages if message["role"] == "system"]
47 input_text = messages[-1]["content"]
48 system_messages = " ".join(
49 message["content"] for message in messages if message["role"] == "system"
50 )
46 51 if system_messages:
47 input += " ".join(system_messages)
52 input_text += f" {system_messages}"
53
48 54 data = {
49 "input": input,
55 "input": input_text,
50 56 "inputHistory": [
51 57 message["content"]
52 58 for message in messages[:-1]
@@ -59,8 +65,14 @@ class Koala(AsyncGeneratorProvider):
59 65 ],
60 66 "model": model,
61 67 }
68
62 69 async with session.post(f"{cls.url}/api/gpt/", json=data, proxy=proxy) as response:
63 70 await raise_for_status(response)
64 async for chunk in response.content:
65 if chunk.startswith(b"data: "):
66 yield json.loads(chunk[6:])
71 async for chunk in cls._parse_event_stream(response):
72 yield chunk
73
74 @staticmethod
75 async def _parse_event_stream(response: ClientResponse) -> AsyncGenerator[Dict[str, Any], None]:
76 async for chunk in response.content:
77 if chunk.startswith(b"data: "):
78 yield json.loads(chunk[6:])
Modified g4f/Provider/Liaobots.py +133 -35
Modified g4f/Provider/MetaAI.py +4 -3
Added g4f/Provider/ReplicateHome.py +136 -0
Modified g4f/Provider/__init__.py +6 -10