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

XFEstudio/gpt4free

Added new provider PI (Hacky way to use) (#1291)

* Added new provider PI (Hacky way to use) * Updated models endpoint made it show real info about the model.py * Added cloudscraper to the requirements * Fixed some bugs aka made streaming also return role

b0276f6c
madonchik123 <68397448+madonchik123@users.noreply.github.com>
提交于

代码差异

8 个文件 +170 -12
Added g4f/Provider/PI.py +111 -0
@@ -0,0 +1,111 @@
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
Modified g4f/Provider/__init__.py +2 -1
@@ -70,4 +70,5 @@ __map__: dict[str, BaseProvider] = dict([
70 70 ])
71 71
72 72 class ProviderUtils:
73 convert: dict[str, BaseProvider] = __map__
73 convert: dict[str, BaseProvider] = __map__
74 from .PI import PI
Modified g4f/__init__.py +1 -1
@@ -118,4 +118,4 @@ class Completion:
118 118 return result if stream else ''.join(result)
119 119
120 120 if version_check:
121 check_pypi_version()
121 check_pypi_version()
Modified g4f/api/__init__.py +21 -9
@@ -40,12 +40,15 @@ class Api:
40 40
41 41 @self.app.get("/v1/models")
42 42 async def models():
43 model_list = [{
43 model_list = []
44 for model in g4f.Model.__all__():
45 model_info = (g4f.ModelUtils.convert[model])
46 model_list.append({
44 47 'id': model,
45 48 'object': 'model',
46 49 'created': 0,
47 'owned_by': 'g4f'} for model in g4f.Model.__all__()]
48
50 'owned_by': model_info.base_provider}
51 )
49 52 return Response(content=json.dumps({
50 53 'object': 'list',
51 54 'data': model_list}, indent=4), media_type="application/json")
@@ -80,17 +83,25 @@ class Api:
80 83 model = item_data.get('model')
81 84 stream = True if item_data.get("stream") == "True" else False
82 85 messages = item_data.get('messages')
86 conversation = item_data.get('conversation') if item_data.get('conversation') != None else None
83 87
84 88 try:
85 response = g4f.ChatCompletion.create(
86 model=model,
87 stream=stream,
88 messages=messages,
89 ignored=self.list_ignored_providers)
89 if model == 'pi':
90 response = g4f.ChatCompletion.create(
91 model=model,
92 stream=stream,
93 messages=messages,
94 conversation=conversation,
95 ignored=self.list_ignored_providers)
96 else:
97 response = g4f.ChatCompletion.create(
98 model=model,
99 stream=stream,
100 messages=messages,
101 ignored=self.list_ignored_providers)
90 102 except Exception as e:
91 103 logging.exception(e)
92 104 return Response(content=json.dumps({"error": "An error occurred while generating the response."}, indent=4), media_type="application/json")
93
94 105 completion_id = ''.join(random.choices(string.ascii_letters + string.digits, k=28))
95 106 completion_timestamp = int(time.time())
96 107
@@ -134,6 +145,7 @@ class Api:
134 145 {
135 146 'index': 0,
136 147 'delta': {
148 'role': 'assistant',
137 149 'content': chunk,
138 150 },
139 151 'finish_reason': None,
Modified g4f/api/run.py +1 -1
@@ -3,4 +3,4 @@ import g4f.api
3 3
4 4 if __name__ == "__main__":
5 5 print(f'Starting server... [g4f v-{g4f.version}]')
6 g4f.api.Api(engine = g4f, debug = True).run(ip = "127.0.0.1:1337")
6 g4f.api.Api(engine = g4f, debug = True).run(ip = "0.0.0.0:10000")
Modified g4f/models.py +8 -0
@@ -27,6 +27,7 @@ from .Provider import (
27 27 Bing,
28 28 You,
29 29 H2o,
30 PI,
30 31 )
31 32
32 33 @dataclass(unsafe_hash=True)
@@ -260,6 +261,11 @@ llama70b_v2_chat = Model(
260 261 base_provider = 'replicate',
261 262 best_provider = Vercel)
262 263
264 pi = Model(
265 name = 'pi',
266 base_provider = 'inflection',
267 best_provider=PI
268 )
263 269
264 270 class ModelUtils:
265 271 convert: dict[str, Model] = {
@@ -315,6 +321,8 @@ class ModelUtils:
315 321 'oasst-sft-1-pythia-12b' : oasst_sft_1_pythia_12b,
316 322 'oasst-sft-4-pythia-12b-epoch-3.5' : oasst_sft_4_pythia_12b_epoch_35,
317 323 'command-light-nightly' : command_light_nightly,
324
325 'pi': pi
318 326 }
319 327
320 328 _all_models = list(ModelUtils.convert.keys())
Added piexample.py +25 -0
@@ -0,0 +1,25 @@
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)
Modified requirements.txt +1 -0
@@ -26,3 +26,4 @@ async-property
26 26 undetected-chromedriver
27 27 asyncstdlib
28 28 async_property
29 cloudscraper