返回提交历史
Modified
g4f/Provider/Bing.py
+13
-9
Added
g4f/Provider/Phind.py
+76
-0
Modified
g4f/Provider/__init__.py
+2
-0
Modified
g4f/requests.py
+17
-4
XFEstudio/gpt4free
Add Phind Provider Add release_curl in url_cffi requets Support create image response in Bing
ff4d9ae5
代码差异
4 个文件
+108
-13
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
import random
4
4
import json
5
5
import os
6
import urllib.parse
6
7
from aiohttp import ClientSession, ClientTimeout
7
8
from ..typing import AsyncGenerator
8
9
from .base_provider import AsyncGeneratorProvider, get_cookies
@@ -245,7 +246,6 @@ async def stream_generate(
245
246
await wss.send_str(create_message(conversation, prompt, context))
246
247
247
248
response_txt = ''
248
result_text = ''
249
249
returned_text = ''
250
250
final = False
251
251
@@ -260,14 +260,18 @@ async def stream_generate(
260
260
if response.get('type') == 1 and response['arguments'][0].get('messages'):
261
261
message = response['arguments'][0]['messages'][0]
262
262
if (message['contentOrigin'] != 'Apology'):
263
response_txt = result_text + \
264
message['adaptiveCards'][0]['body'][0].get('text', '')
265
266
if message.get('messageType'):
267
inline_txt = message['adaptiveCards'][0]['body'][0]['inlines'][0].get('text')
268
response_txt += inline_txt + '\n'
269
result_text += inline_txt + '\n'
270
263
if 'adaptiveCards' in message:
264
card = message['adaptiveCards'][0]['body'][0]
265
if "text" in card:
266
response_txt = card.get('text')
267
if message.get('messageType'):
268
inline_txt = card['inlines'][0].get('text')
269
response_txt += inline_txt + '\n'
270
elif message.get('contentType') == "IMAGE":
271
query = urllib.parse.quote(message.get('text'))
272
url = f"\nhttps://www.bing.com/images/create?q={query}"
273
response_txt += url
274
final = True
271
275
if response_txt.startswith(returned_text):
272
276
new = response_txt[len(returned_text):]
273
277
if new != "\n":
@@ -0,0 +1,76 @@
1
from __future__ import annotations
2
3
import random
4
from datetime import datetime
5
6
from ..typing import AsyncGenerator
7
from ..requests import StreamSession
8
from .base_provider import AsyncGeneratorProvider, format_prompt
9
10
11
class Phind(AsyncGeneratorProvider):
12
url = "https://www.phind.com"
13
working = True
14
supports_gpt_4 = True
15
16
@classmethod
17
async def create_async_generator(
18
cls,
19
model: str,
20
messages: list[dict[str, str]],
21
proxy: str = None,
22
**kwargs
23
) -> AsyncGenerator:
24
chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
25
user_id = ''.join(random.choice(chars) for _ in range(24))
26
data = {
27
"question": format_prompt(messages),
28
"webResults": [],
29
"options": {
30
"date": datetime.now().strftime("%d.%m.%Y"),
31
"language": "en",
32
"detailed": True,
33
"anonUserId": user_id,
34
"answerModel": "GPT-4",
35
"creativeMode": False,
36
"customLinks": []
37
},
38
"context":""
39
}
40
headers = {
41
"Authority": cls.url,
42
"Accept": "application/json, text/plain, */*",
43
"Origin": cls.url,
44
"Referer": f"{cls.url}/"
45
}
46
async with StreamSession(headers=headers, timeout=(5, 180), proxies={"https": proxy}, impersonate="chrome107") as session:
47
async with session.post(f"{cls.url}/api/infer/answer", json=data) as response:
48
response.raise_for_status()
49
new_lines = 0
50
async for line in response.iter_lines():
51
if not line:
52
continue
53
if line.startswith(b"data: "):
54
line = line[6:]
55
if line.startswith(b"<PHIND_METADATA>"):
56
continue
57
if line:
58
if new_lines:
59
yield "".join(["\n" for _ in range(int(new_lines / 2))])
60
new_lines = 0
61
yield line.decode()
62
else:
63
new_lines += 1
64
65
66
@classmethod
67
@property
68
def params(cls):
69
params = [
70
("model", "str"),
71
("messages", "list[dict[str, str]]"),
72
("stream", "bool"),
73
("proxy", "str"),
74
]
75
param = ", ".join([": ".join(p) for p in params])
76
return f"g4f.provider.{cls.__name__} supports: ({param})"
@@ -31,6 +31,7 @@ from .Opchatgpts import Opchatgpts
31
31
from .OpenaiChat import OpenaiChat
32
32
from .OpenAssistant import OpenAssistant
33
33
from .PerplexityAi import PerplexityAi
34
from .Phind import Phind
34
35
from .Raycast import Raycast
35
36
from .Theb import Theb
36
37
from .Vercel import Vercel
@@ -85,6 +86,7 @@ __all__ = [
85
86
'OpenaiChat',
86
87
'OpenAssistant',
87
88
'PerplexityAi',
89
'Phind',
88
90
'Theb',
89
91
'Vercel',
90
92
'Vitalentum',
@@ -97,8 +97,7 @@ class StreamRequest:
97
97
self.enter.set_result(None)
98
98
self.queue.put_nowait(None)
99
99
100
#self.loop.call_soon(self.session.rel, self.curl)
101
return
100
self.loop.call_soon(self.release_curl)
102
101
103
102
async def fetch(self) -> StreamResponse:
104
103
if self.handle:
@@ -146,8 +145,22 @@ class StreamRequest:
146
145
return await self.fetch()
147
146
148
147
async def __aexit__(self, *args):
149
return
150
#self.session.release_curl(self.curl)
148
self.release_curl()
149
150
def release_curl(self):
151
if is_newer_0_5_10:
152
self.session.release_curl(self.curl)
153
return
154
if not self.curl:
155
return
156
self.curl.clean_after_perform()
157
if is_newer_0_5_9:
158
self.session.acurl.remove_handle(self.curl)
159
elif not self.handle.done() and not self.handle.cancelled():
160
self.session.acurl.set_result(self.curl)
161
self.curl.reset()
162
self.session.push_curl(self.curl)
163
self.curl = None
151
164
152
165
class StreamSession(AsyncSession):
153
166
def request(