返回提交历史
Deleted
g4f/Provider/PI.py
+0
-111
Added
g4f/Provider/Pi.py
+93
-0
Modified
g4f/Provider/__init__.py
+3
-3
Modified
g4f/models.py
+2
-3
Deleted
piexample.py
+0
-25
XFEstudio/gpt4free
Update pi provider
e74af803
代码差异
5 个文件
+98
-142
@@ -1,111 +0,0 @@
1
from __future__ import annotations
2
3
from ..typing import AsyncResult, Messages
4
from .base_provider import AsyncGeneratorProvider
5
6
import json
7
import cloudscraper
8
9
class PI(AsyncGeneratorProvider):
10
url = "https://chat-gpt.com"
11
working = True
12
13
@classmethod
14
async def create_async_generator(
15
cls,
16
model: str,
17
messages: Messages,
18
proxy: str = None,
19
**kwargs
20
) -> AsyncResult:
21
Conversation = kwargs['conversation']
22
UserPrompt = messages[-1]
23
if UserPrompt['role'] == 'user':
24
UserPrompt = UserPrompt['content']
25
else:
26
UserPrompt = messages[-2]['content']
27
if Conversation == None:
28
Conversation = PI.Start_Conversation()
29
Answer = Ask_PI(UserPrompt,Conversation['sid'],Conversation['cookies'])
30
31
yield Answer[0]['text']
32
33
def Start_Conversation():
34
scraper.headers = {
35
'accept-type': 'application/json'
36
}
37
response = scraper.post('https://pi.ai/api/chat/start', data="{}",headers={'x-api-version': '3'})
38
cookies = response.cookies
39
40
if 'Just a moment' in response.text:
41
return {
42
'error': 'cloudflare detected',
43
'sid': None,
44
'cookies': None,
45
}
46
return {
47
'sid': response.json()['conversations'][0]['sid'],
48
'cookies': cookies
49
}
50
51
def GetConversationTitle(Conversation):
52
response = scraper.post('https://pi.ai/api/chat/start', data="{}",headers={'x-api-version': '3'}, cookies=Conversation['cookies'])
53
if 'Just a moment' in response.text:
54
return {
55
'error': 'cloudflare detected',
56
'title': 'Couldnt get the title',
57
}
58
return {
59
'title': response.json()['conversations'][0]['title']
60
}
61
62
def GetChatHistory(Conversation):
63
params = {
64
'conversation': Conversation['sid'],
65
}
66
response = scraper.get('https://pi.ai/api/chat/history', params=params, cookies=Conversation['cookies'])
67
if 'Just a moment' in response.text:
68
return {
69
'error': 'cloudflare detected',
70
'traceback': 'Couldnt get the chat history'
71
}
72
return response.json()
73
74
session = cloudscraper.session()
75
76
scraper = cloudscraper.create_scraper(
77
browser={
78
'browser': 'chrome',
79
'platform': 'windows',
80
'desktop': True
81
},
82
sess=session
83
)
84
85
scraper.headers = {
86
'Accept': '*/*',
87
'Accept-Encoding': 'deflate,gzip,br',
88
}
89
90
def Ask_PI(message,sid,cookies):
91
json_data = {
92
'text': message,
93
'conversation': sid,
94
'mode': 'BASE',
95
}
96
response = scraper.post('https://pi.ai/api/chat', json=json_data, cookies=cookies)
97
98
if 'Just a moment' in response.text:
99
return [{
100
'error': 'cloudflare detected',
101
'text': 'Couldnt generate the answer because we got detected by cloudflare please try again later'
102
}
103
]
104
result = []
105
for line in response.iter_lines(chunk_size=1024, decode_unicode=True):
106
if line.startswith('data: {"text":'):
107
result.append(json.loads(line.split('data: ')[1].encode('utf-8')))
108
if line.startswith('data: {"title":'):
109
result.append(json.loads(line.split('data: ')[1].encode('utf-8')))
110
111
return result
@@ -0,0 +1,93 @@
1
from __future__ import annotations
2
3
from ..typing import CreateResult, Messages
4
from .base_provider import BaseProvider, format_prompt
5
6
import json
7
from cloudscraper import CloudScraper, session, create_scraper
8
9
class Pi(BaseProvider):
10
url = "https://chat-gpt.com"
11
working = True
12
supports_stream = True
13
14
@classmethod
15
def create_completion(
16
cls,
17
model: str,
18
messages: Messages,
19
stream: bool,
20
proxy: str = None,
21
scraper: CloudScraper = None,
22
conversation: dict = None,
23
**kwargs
24
) -> CreateResult:
25
if not scraper:
26
scraper = cls.get_scraper()
27
if not conversation:
28
conversation = cls.start_conversation(scraper)
29
answer = cls.ask(scraper, messages, conversation)
30
31
last_answer = 0
32
for line in answer:
33
if "text" in line:
34
yield line["text"][last_answer:]
35
last_answer = len(line["text"])
36
37
def get_scraper():
38
scraper = create_scraper(
39
browser={
40
'browser': 'chrome',
41
'platform': 'windows',
42
'desktop': True
43
},
44
sess=session()
45
)
46
scraper.headers = {
47
'Accept': '*/*',
48
'Accept-Encoding': 'deflate,gzip,br',
49
}
50
return scraper
51
52
def start_conversation(scraper: CloudScraper):
53
response = scraper.post('https://pi.ai/api/chat/start', data="{}", headers={
54
'accept': 'application/json',
55
'x-api-version': '3'
56
})
57
if 'Just a moment' in response.text:
58
raise RuntimeError('Error: Cloudflare detected')
59
return Conversation(
60
response.json()['conversations'][0]['sid'],
61
response.cookies
62
)
63
64
def get_chat_history(scraper: CloudScraper, conversation: Conversation):
65
params = {
66
'conversation': conversation.sid,
67
}
68
response = scraper.get('https://pi.ai/api/chat/history', params=params, cookies=conversation.cookies)
69
if 'Just a moment' in response.text:
70
raise RuntimeError('Error: Cloudflare detected')
71
return response.json()
72
73
def ask(scraper: CloudScraper, messages: Messages, conversation: Conversation):
74
json_data = {
75
'text': format_prompt(messages),
76
'conversation': conversation.sid,
77
'mode': 'BASE',
78
}
79
response = scraper.post('https://pi.ai/api/chat', json=json_data, cookies=conversation.cookies, stream=True)
80
81
for line in response.iter_lines(chunk_size=1024, decode_unicode=True):
82
if 'Just a moment' in line:
83
raise RuntimeError('Error: Cloudflare detected')
84
if line.startswith('data: {"text":'):
85
yield json.loads(line.split('data: ')[1])
86
if line.startswith('data: {"title":'):
87
yield json.loads(line.split('data: ')[1])
88
89
class Conversation():
90
def __init__(self, sid: str, cookies):
91
self.sid = sid
92
self.cookies = cookies
93
@@ -44,6 +44,7 @@ from .OnlineGpt import OnlineGpt
44
44
from .Opchatgpts import Opchatgpts
45
45
from .PerplexityAi import PerplexityAi
46
46
from .Phind import Phind
47
from .Pi import Pi
47
48
from .TalkAi import TalkAi
48
49
from .Vercel import Vercel
49
50
from .Ylokh import Ylokh
@@ -65,10 +66,9 @@ __providers__: list[type[BaseProvider]] = [
65
66
__all__: list[str] = [
66
67
provider.__name__ for provider in __providers__
67
68
]
68
__map__: dict[str, BaseProvider] = dict([
69
__map__: dict[str, type[BaseProvider]] = dict([
69
70
(provider.__name__, provider) for provider in __providers__
70
71
])
71
72
72
73
class ProviderUtils:
73
convert: dict[str, BaseProvider] = __map__
74
from .PI import PI
74
convert: dict[str, type[BaseProvider]] = __map__
@@ -11,7 +11,6 @@ from .Provider import (
11
11
ChatgptAi,
12
12
DeepInfra,
13
13
OnlineGpt,
14
ChatgptX,
15
14
ChatBase,
16
15
Liaobots,
17
16
GeekGpt,
@@ -27,7 +26,7 @@ from .Provider import (
27
26
Bing,
28
27
You,
29
28
H2o,
30
PI,
29
Pi,
31
30
)
32
31
33
32
@dataclass(unsafe_hash=True)
@@ -264,7 +263,7 @@ llama70b_v2_chat = Model(
264
263
pi = Model(
265
264
name = 'pi',
266
265
base_provider = 'inflection',
267
best_provider=PI
266
best_provider=Pi
268
267
)
269
268
270
269
class ModelUtils:
@@ -1,25 +0,0 @@
1
from g4f import Provider
2
3
import g4f
4
5
Conversation = Provider.PI.Start_Conversation()
6
7
Chat_History = Provider.PI.GetChatHistory(Conversation)
8
9
response = g4f.ChatCompletion.create(
10
model="pi",
11
provider=g4f.Provider.PI,
12
messages=[
13
{
14
"role": "user",
15
"content": 'Hello who are you?'
16
}
17
],
18
stream=False,
19
conversation=Conversation
20
)
21
22
for message in response:
23
print(message, flush=True, end='')
24
25
Chat_Title = Provider.PI.GetConversationTitle(Conversation)