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

XFEstudio/gpt4free

Add Phind Provider Add release_curl in url_cffi requets Support create image response in Bing

ff4d9ae5
Heiner Lohaus <heiner@lohaus.eu>
提交于

代码差异

4 个文件 +108 -13
Modified g4f/Provider/Bing.py +13 -9
@@ -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":
Added g4f/Provider/Phind.py +76 -0
@@ -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})"
Modified g4f/Provider/__init__.py +2 -0
@@ -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',
Modified g4f/requests.py +17 -4
@@ -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(