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

XFEstudio/gpt4free

Update pi provider

e74af803
Heiner Lohaus <hlohaus@users.noreply.github.com>
提交于

代码差异

5 个文件 +98 -142
Deleted g4f/Provider/PI.py +0 -111
@@ -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
Added g4f/Provider/Pi.py +93 -0
@@ -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
Modified g4f/Provider/__init__.py +3 -3
@@ -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__
Modified g4f/models.py +2 -3
@@ -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:
Deleted piexample.py +0 -25
@@ -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)