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

XFEstudio/gpt4free

Add Proxy Support and Create Provider to Readme Add proxy support to many providers

c6b33e52
Heiner Lohaus <heiner@lohaus.eu>
提交于

代码差异

9 个文件 +103 -80
Modified README.md +21 -10
@@ -224,19 +224,15 @@ from g4f.Provider import (
224 224 Bing,
225 225 ChatBase,
226 226 ChatgptAi,
227 ChatgptLogin,
228 CodeLinkAva,
229 227 DeepAi,
230 228 H2o,
231 229 HuggingChat,
232 Opchatgpts,
233 230 OpenAssistant,
234 231 OpenaiChat,
235 232 Raycast,
236 233 Theb,
237 234 Vercel,
238 235 Vitalentum,
239 Wewordle,
240 236 Ylokh,
241 237 You,
242 238 Yqcloud,
@@ -284,19 +280,18 @@ _providers = [
284 280 g4f.Provider.Aichat,
285 281 g4f.Provider.ChatBase,
286 282 g4f.Provider.Bing,
287 g4f.Provider.CodeLinkAva,
288 283 g4f.Provider.DeepAi,
289 284 g4f.Provider.GptGo,
290 g4f.Provider.Wewordle,
291 285 g4f.Provider.You,
292 286 g4f.Provider.Yqcloud,
293 287 ]
294 288
295 async def run_provider(provider: g4f.Provider.AsyncProvider):
289 async def run_provider(provider: g4f.Provider.BaseProvider):
296 290 try:
297 response = await provider.create_async(
298 model=g4f.models.default.name,
291 response = await g4f.ChatCompletion.create_async(
292 model=g4f.models.default,
299 293 messages=[{"role": "user", "content": "Hello"}],
294 provider=provider,
300 295 )
301 296 print(f"{provider.__name__}:", response)
302 297 except Exception as e:
@@ -311,6 +306,22 @@ async def run_all():
311 306 asyncio.run(run_all())
312 307 ```
313 308
309 ##### Proxy Support:
310
311 All providers support specifying a proxy in the create function.
312
313 ```py
314 import g4f
315
316 response = await g4f.ChatCompletion.create(
317 model=g4f.models.default,
318 messages=[{"role": "user", "content": "Hello"}],
319 proxy="http://host:port",
320 # or socks5://user:pass@host:port
321 )
322 print(f"Result:", response)
323 ```
324
314 325 ### interference openai-proxy api (use with openai python package)
315 326
316 327 #### run interference from pypi package:
@@ -528,7 +539,7 @@ Call in your terminal the "create_provider" script:
528 539 $ python etc/tool/create_provider.py
529 540 ```
530 541 1. Enter your name for the new provider.
531 2. Copy&Paste cURL command from your browser developer tools.
542 2. Copy&Paste a cURL command from your browser developer tools.
532 543 3. Let the AI ​​create the provider for you.
533 544 4. Customize the provider according to your needs.
534 545
Modified etc/tool/create_provider.py +25 -29
@@ -12,23 +12,13 @@ def read_code(text):
12 12 if match:
13 13 return match.group("code")
14 14
15 def read_result(result):
16 lines = []
17 for line in result.split("\n"):
18 if (line.startswith("```")):
19 break
20 if (line):
21 lines.append(line)
22 explanation = "\n".join(lines) if lines else ""
23 return explanation, read_code(result)
24
25 15 def input_command():
26 16 print("Enter/Paste the cURL command. Ctrl-D or Ctrl-Z ( windows ) to save it.")
27 17 contents = []
28 18 while True:
29 19 try:
30 20 line = input()
31 except:
21 except EOFError:
32 22 break
33 23 contents.append(line)
34 24 return "\n".join(contents)
@@ -41,12 +31,12 @@ from __future__ import annotations
41 31
42 32 from aiohttp import ClientSession
43 33
44 from ..typing import AsyncGenerator
34 from ..typing import AsyncResult, Messages
45 35 from .base_provider import AsyncGeneratorProvider
46 from .helper import format_prompt
36 from .helper import format_prompt
47 37
48 38
49 class ChatgptDuo(AsyncGeneratorProvider):
39 class ChatGpt(AsyncGeneratorProvider):
50 40 url = "https://chat-gpt.com"
51 41 supports_gpt_35_turbo = True
52 42 working = True
@@ -55,9 +45,10 @@ class ChatgptDuo(AsyncGeneratorProvider):
55 45 async def create_async_generator(
56 46 cls,
57 47 model: str,
58 messages: list[dict[str, str]],
48 messages: Messages,
49 proxy: str = None,
59 50 **kwargs
60 ) -> AsyncGenerator:
51 ) -> AsyncResult:
61 52 headers = {
62 53 "authority": "chat-gpt.com",
63 54 "accept": "application/json",
@@ -65,16 +56,16 @@ class ChatgptDuo(AsyncGeneratorProvider):
65 56 "referer": f"{cls.url}/chat",
66 57 }
67 58 async with ClientSession(headers=headers) as session:
68 prompt = format_prompt(messages),
59 prompt = format_prompt(messages)
69 60 data = {
70 61 "prompt": prompt,
71 "purpose": "ask",
62 "purpose": "",
72 63 }
73 async with session.post(cls.url + "/api/chat", json=data) as response:
64 async with session.post(f"{cls.url}/api/chat", json=data, proxy=proxy) as response:
74 65 response.raise_for_status()
75 async for stream in response.content:
76 if stream:
77 yield stream.decode()
66 async for chunk in response.content:
67 if chunk:
68 yield chunk.decode()
78 69 """
79 70
80 71 if not path.isfile(provider_path):
@@ -95,18 +86,23 @@ Replace "hello" with `format_prompt(messages)`.
95 86 And replace "gpt-3.5-turbo" with `model`.
96 87 """
97 88
98 print("Create code...")
99 response = g4f.ChatCompletion.create(
89 response = []
90 for chunk in g4f.ChatCompletion.create(
100 91 model=g4f.models.gpt_35_long,
101 92 messages=[{"role": "user", "content": prompt}],
102 auth=True,
103 timeout=120,
104 )
105 print(response)
106 explanation, code = read_result(response)
93 timeout=300,
94 stream=True
95 ):
96 response.append(chunk)
97 print(chunk, end="", flush=True)
98 print()
99 response = "".join(response)
100
101 code = read_code(response)
107 102 if code:
108 103 with open(provider_path, "w") as file:
109 104 file.write(code)
105 print("Saved at:", provider_path)
110 106 with open(f"g4f/Provider/__init__.py", "a") as file:
111 107 file.write(f"\nfrom .{name} import {name}")
112 108 else:
Modified g4f/Provider/FreeGpt.py +3 -3
@@ -2,7 +2,7 @@ from __future__ import annotations
2 2
3 3 import time, hashlib, random
4 4
5 from ..typing import AsyncGenerator
5 from ..typing import AsyncResult, Messages
6 6 from ..requests import StreamSession
7 7 from .base_provider import AsyncGeneratorProvider
8 8
@@ -20,11 +20,11 @@ class FreeGpt(AsyncGeneratorProvider):
20 20 async def create_async_generator(
21 21 cls,
22 22 model: str,
23 messages: list[dict[str, str]],
23 messages: Messages,
24 24 proxy: str = None,
25 25 timeout: int = 120,
26 26 **kwargs
27 ) -> AsyncGenerator:
27 ) -> AsyncResult:
28 28 async with StreamSession(
29 29 impersonate="chrome107",
30 30 timeout=timeout,
Modified g4f/Provider/needs_auth/Bard.py +6 -8
@@ -6,7 +6,9 @@ import re
6 6
7 7 from aiohttp import ClientSession
8 8
9 from ..base_provider import AsyncProvider, format_prompt, get_cookies
9 from ...typing import Messages
10 from ..base_provider import AsyncProvider
11 from ..helper import format_prompt, get_cookies
10 12
11 13
12 14 class Bard(AsyncProvider):
@@ -19,25 +21,22 @@ class Bard(AsyncProvider):
19 21 async def create_async(
20 22 cls,
21 23 model: str,
22 messages: list[dict[str, str]],
24 messages: Messages,
23 25 proxy: str = None,
24 26 cookies: dict = None,
25 27 **kwargs
26 28 ) -> str:
27 29 prompt = format_prompt(messages)
28 if proxy and "://" not in proxy:
29 proxy = f"http://{proxy}"
30 30 if not cookies:
31 31 cookies = get_cookies(".google.com")
32 32
33 33 headers = {
34 34 'authority': 'bard.google.com',
35 'origin': 'https://bard.google.com',
36 'referer': 'https://bard.google.com/',
35 'origin': cls.url,
36 'referer': f'{cls.url}/',
37 37 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
38 38 'x-same-domain': '1',
39 39 }
40
41 40 async with ClientSession(
42 41 cookies=cookies,
43 42 headers=headers
@@ -67,7 +66,6 @@ class Bard(AsyncProvider):
67 66 'lamda',
68 67 'BardFrontendService'
69 68 ])
70
71 69 async with session.post(
72 70 f'{cls.url}/_/BardChatUi/data/{intents}/StreamGenerate',
73 71 data=data,
Modified g4f/Provider/needs_auth/HuggingChat.py +5 -4
@@ -4,8 +4,9 @@ import json, uuid
4 4
5 5 from aiohttp import ClientSession
6 6
7 from ...typing import AsyncGenerator
8 from ..base_provider import AsyncGeneratorProvider, format_prompt, get_cookies
7 from ...typing import AsyncResult, Messages
8 from ..base_provider import AsyncGeneratorProvider
9 from ..helper import format_prompt, get_cookies
9 10
10 11
11 12 class HuggingChat(AsyncGeneratorProvider):
@@ -18,12 +19,12 @@ class HuggingChat(AsyncGeneratorProvider):
18 19 async def create_async_generator(
19 20 cls,
20 21 model: str,
21 messages: list[dict[str, str]],
22 messages: Messages,
22 23 stream: bool = True,
23 24 proxy: str = None,
24 25 cookies: dict = None,
25 26 **kwargs
26 ) -> AsyncGenerator:
27 ) -> AsyncResult:
27 28 model = model if model else cls.model
28 29 if proxy and "://" not in proxy:
29 30 proxy = f"http://{proxy}"
Modified g4f/Provider/needs_auth/OpenAssistant.py +6 -5
@@ -4,8 +4,9 @@ import json
4 4
5 5 from aiohttp import ClientSession
6 6
7 from ...typing import Any, AsyncGenerator
8 from ..base_provider import AsyncGeneratorProvider, format_prompt, get_cookies
7 from ...typing import AsyncResult, Messages
8 from ..base_provider import AsyncGeneratorProvider
9 from ..helper import format_prompt, get_cookies
9 10
10 11
11 12 class OpenAssistant(AsyncGeneratorProvider):
@@ -18,11 +19,11 @@ class OpenAssistant(AsyncGeneratorProvider):
18 19 async def create_async_generator(
19 20 cls,
20 21 model: str,
21 messages: list[dict[str, str]],
22 messages: Messages,
22 23 proxy: str = None,
23 24 cookies: dict = None,
24 **kwargs: Any
25 ) -> AsyncGenerator:
25 **kwargs
26 ) -> AsyncResult:
26 27 if not cookies:
27 28 cookies = get_cookies("open-assistant.io")
28 29
Modified g4f/Provider/needs_auth/OpenaiChat.py +11 -6
@@ -4,7 +4,7 @@ import uuid, json, time
4 4
5 5 from ..base_provider import AsyncGeneratorProvider
6 6 from ..helper import get_browser, get_cookies, format_prompt
7 from ...typing import AsyncGenerator
7 from ...typing import AsyncResult, Messages
8 8 from ...requests import StreamSession
9 9
10 10 class OpenaiChat(AsyncGeneratorProvider):
@@ -18,13 +18,13 @@ class OpenaiChat(AsyncGeneratorProvider):
18 18 async def create_async_generator(
19 19 cls,
20 20 model: str,
21 messages: list[dict[str, str]],
21 messages: Messages,
22 22 proxy: str = None,
23 timeout: int = 120,
23 24 access_token: str = None,
24 25 cookies: dict = None,
25 timeout: int = 30,
26 **kwargs: dict
27 ) -> AsyncGenerator:
26 **kwargs
27 ) -> AsyncResult:
28 28 proxies = {"https": proxy}
29 29 if not access_token:
30 30 access_token = await cls.get_access_token(cookies, proxies)
@@ -32,7 +32,12 @@ class OpenaiChat(AsyncGeneratorProvider):
32 32 "Accept": "text/event-stream",
33 33 "Authorization": f"Bearer {access_token}",
34 34 }
35 async with StreamSession(proxies=proxies, headers=headers, impersonate="chrome107", timeout=timeout) as session:
35 async with StreamSession(
36 proxies=proxies,
37 headers=headers,
38 impersonate="chrome107",
39 timeout=timeout
40 ) as session:
36 41 messages = [
37 42 {
38 43 "id": str(uuid.uuid4()),
Modified g4f/Provider/needs_auth/Raycast.py +11 -4
@@ -4,7 +4,7 @@ import json
4 4
5 5 import requests
6 6
7 from ...typing import Any, CreateResult
7 from ...typing import CreateResult, Messages
8 8 from ..base_provider import BaseProvider
9 9
10 10
@@ -19,9 +19,10 @@ class Raycast(BaseProvider):
19 19 @staticmethod
20 20 def create_completion(
21 21 model: str,
22 messages: list[dict[str, str]],
22 messages: Messages,
23 23 stream: bool,
24 **kwargs: Any,
24 proxy: str = None,
25 **kwargs,
25 26 ) -> CreateResult:
26 27 auth = kwargs.get('auth')
27 28 headers = {
@@ -47,7 +48,13 @@ class Raycast(BaseProvider):
47 48 "system_instruction": "markdown",
48 49 "temperature": 0.5
49 50 }
50 response = requests.post("https://backend.raycast.com/api/v1/ai/chat_completions", headers=headers, json=data, stream=True)
51 response = requests.post(
52 "https://backend.raycast.com/api/v1/ai/chat_completions",
53 headers=headers,
54 json=data,
55 stream=True,
56 proxies={"https": proxy}
57 )
51 58 for token in response.iter_lines():
52 59 if b'data: ' not in token:
53 60 continue
Modified g4f/Provider/needs_auth/Theb.py +15 -11
@@ -2,11 +2,11 @@ from __future__ import annotations
2 2
3 3 import json
4 4 import random
5
6 5 import requests
7 6
8 from ...typing import Any, CreateResult
7 from ...typing import Any, CreateResult, Messages
9 8 from ..base_provider import BaseProvider
9 from ..helper import format_prompt
10 10
11 11
12 12 class Theb(BaseProvider):
@@ -19,12 +19,11 @@ class Theb(BaseProvider):
19 19 @staticmethod
20 20 def create_completion(
21 21 model: str,
22 messages: list[dict[str, str]],
23 stream: bool, **kwargs: Any) -> CreateResult:
24
25 conversation = "\n".join(f"{message['role']}: {message['content']}" for message in messages)
26 conversation += "\nassistant: "
27
22 messages: Messages,
23 stream: bool,
24 proxy: str = None,
25 **kwargs
26 ) -> CreateResult:
28 27 auth = kwargs.get("auth", {
29 28 "bearer_token":"free",
30 29 "org_id":"theb",
@@ -54,7 +53,7 @@ class Theb(BaseProvider):
54 53 req_rand = random.randint(100000000, 9999999999)
55 54
56 55 json_data: dict[str, Any] = {
57 "text" : conversation,
56 "text" : format_prompt(messages),
58 57 "category" : "04f58f64a4aa4191a957b47290fee864",
59 58 "model" : "ee8d4f29cb7047f78cbe84313ed6ace8",
60 59 "model_params": {
@@ -67,8 +66,13 @@ class Theb(BaseProvider):
67 66 }
68 67 }
69 68
70 response = requests.post(f"https://beta.theb.ai/api/conversation?org_id={org_id}&req_rand={req_rand}",
71 headers=headers, json=json_data, stream=True)
69 response = requests.post(
70 f"https://beta.theb.ai/api/conversation?org_id={org_id}&req_rand={req_rand}",
71 headers=headers,
72 json=json_data,
73 stream=True,
74 proxies={"https": proxy}
75 )
72 76
73 77 response.raise_for_status()
74 78 content = ""