返回提交历史
Modified
README.md
+21
-10
Modified
etc/tool/create_provider.py
+25
-29
Modified
g4f/Provider/FreeGpt.py
+3
-3
Modified
g4f/Provider/needs_auth/Bard.py
+6
-8
Modified
g4f/Provider/needs_auth/HuggingChat.py
+5
-4
Modified
g4f/Provider/needs_auth/OpenAssistant.py
+6
-5
Modified
g4f/Provider/needs_auth/OpenaiChat.py
+11
-6
Modified
g4f/Provider/needs_auth/Raycast.py
+11
-4
Modified
g4f/Provider/needs_auth/Theb.py
+15
-11
XFEstudio/gpt4free
Add Proxy Support and Create Provider to Readme Add proxy support to many providers
c6b33e52
代码差异
9 个文件
+103
-80
@@ -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
@@ -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:
@@ -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,
@@ -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,
@@ -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}"
@@ -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
@@ -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()),
@@ -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
@@ -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 = ""