返回提交历史
Modified
g4f/Provider/Ylokh.py
+4
-1
Modified
g4f/Provider/base_provider.py
+40
-41
Modified
testing/test_needs_auth.py
+5
-5
XFEstudio/gpt4free
Improve event loop
3b8dfff9
代码差异
3 个文件
+49
-47
@@ -51,7 +51,9 @@ class Ylokh(AsyncGeneratorProvider):
51
51
if stream:
52
52
async for line in response.content:
53
53
line = line.decode()
54
if line.startswith("data: ") and not line.startswith("data: [DONE]"):
54
if line.startswith("data: "):
55
if line.startswith("data: [DONE]"):
56
break
55
57
line = json.loads(line[6:-1])
56
58
content = line["choices"][0]["delta"].get("content")
57
59
if content:
@@ -71,6 +73,7 @@ class Ylokh(AsyncGeneratorProvider):
71
73
("stream", "bool"),
72
74
("proxy", "str"),
73
75
("temperature", "float"),
76
("top_p", "float"),
74
77
]
75
78
param = ", ".join([": ".join(p) for p in params])
76
79
return f"g4f.provider.{cls.__name__} supports: ({param})"
@@ -35,30 +35,6 @@ class BaseProvider(ABC):
35
35
]
36
36
param = ", ".join([": ".join(p) for p in params])
37
37
return f"g4f.provider.{cls.__name__} supports: ({param})"
38
39
40
_cookies = {}
41
42
def get_cookies(cookie_domain: str) -> dict:
43
if cookie_domain not in _cookies:
44
_cookies[cookie_domain] = {}
45
try:
46
for cookie in browser_cookie3.load(cookie_domain):
47
_cookies[cookie_domain][cookie.name] = cookie.value
48
except:
49
pass
50
return _cookies[cookie_domain]
51
52
53
def format_prompt(messages: list[dict[str, str]], add_special_tokens=False):
54
if add_special_tokens or len(messages) > 1:
55
formatted = "\n".join(
56
["%s: %s" % ((message["role"]).capitalize(), message["content"]) for message in messages]
57
)
58
return f"{formatted}\nAssistant:"
59
else:
60
return messages.pop()["content"]
61
62
38
63
39
64
40
class AsyncProvider(BaseProvider):
@@ -67,8 +43,9 @@ class AsyncProvider(BaseProvider):
67
43
cls,
68
44
model: str,
69
45
messages: list[dict[str, str]],
70
stream: bool = False, **kwargs: Any) -> CreateResult:
71
46
stream: bool = False,
47
**kwargs
48
) -> CreateResult:
72
49
yield asyncio.run(cls.create_async(model, messages, **kwargs))
73
50
74
51
@staticmethod
@@ -90,7 +67,20 @@ class AsyncGeneratorProvider(AsyncProvider):
90
67
stream: bool = True,
91
68
**kwargs
92
69
) -> CreateResult:
93
yield from run_generator(cls.create_async_generator(model, messages, stream=stream, **kwargs))
70
loop = asyncio.new_event_loop()
71
try:
72
asyncio.set_event_loop(loop)
73
generator = cls.create_async_generator(model, messages, stream=stream, **kwargs)
74
gen = generator.__aiter__()
75
while True:
76
try:
77
yield loop.run_until_complete(gen.__anext__())
78
except StopAsyncIteration:
79
break
80
finally:
81
asyncio.set_event_loop(None)
82
loop.close()
83
94
84
95
85
@classmethod
96
86
async def create_async(
@@ -99,27 +89,36 @@ class AsyncGeneratorProvider(AsyncProvider):
99
89
messages: list[dict[str, str]],
100
90
**kwargs
101
91
) -> str:
102
chunks = [chunk async for chunk in cls.create_async_generator(model, messages, stream=False, **kwargs)]
103
if chunks:
104
return "".join(chunks)
92
return "".join([chunk async for chunk in cls.create_async_generator(model, messages, stream=False, **kwargs)])
105
93
106
94
@staticmethod
107
95
@abstractmethod
108
96
def create_async_generator(
109
model: str,
110
messages: list[dict[str, str]],
111
**kwargs
112
) -> AsyncGenerator:
97
model: str,
98
messages: list[dict[str, str]],
99
**kwargs
100
) -> AsyncGenerator:
113
101
raise NotImplementedError()
114
102
115
103
116
def run_generator(generator: AsyncGenerator[Union[Any, str], Any]):
117
loop = asyncio.new_event_loop()
118
gen = generator.__aiter__()
104
_cookies = {}
119
105
120
while True:
106
def get_cookies(cookie_domain: str) -> dict:
107
if cookie_domain not in _cookies:
108
_cookies[cookie_domain] = {}
121
109
try:
122
yield loop.run_until_complete(gen.__anext__())
110
for cookie in browser_cookie3.load(cookie_domain):
111
_cookies[cookie_domain][cookie.name] = cookie.value
112
except:
113
pass
114
return _cookies[cookie_domain]
123
115
124
except StopAsyncIteration:
125
break
116
117
def format_prompt(messages: list[dict[str, str]], add_special_tokens=False):
118
if add_special_tokens or len(messages) > 1:
119
formatted = "\n".join(
120
["%s: %s" % ((message["role"]).capitalize(), message["content"]) for message in messages]
121
)
122
return f"{formatted}\nAssistant:"
123
else:
124
return messages[0]["content"]
@@ -17,7 +17,7 @@ _providers = [
17
17
g4f.Provider.Bard
18
18
]
19
19
20
_instruct = "Hello, tell about you in one sentence."
20
_instruct = "Hello, are you GPT 4?."
21
21
22
22
_example = """
23
23
OpenaiChat: Hello! How can I assist you today? 2.0 secs
@@ -39,14 +39,14 @@ No Stream Total: 10.14 secs
39
39
print("Bing: ", end="")
40
40
for response in log_time_yield(
41
41
g4f.ChatCompletion.create,
42
model=g4f.models.gpt_35_turbo,
42
model=g4f.models.default,
43
43
messages=[{"role": "user", "content": _instruct}],
44
44
provider=g4f.Provider.Bing,
45
45
#cookies=g4f.get_cookies(".huggingface.co"),
46
#stream=True,
46
stream=True,
47
47
auth=True
48
48
):
49
print(response, end="")
49
print(response, end="", flush=True)
50
50
print()
51
51
print()
52
52
@@ -75,7 +75,7 @@ def run_stream():
75
75
model=None,
76
76
messages=[{"role": "user", "content": _instruct}],
77
77
):
78
print(response, end="")
78
print(response, end="", flush=True)
79
79
print()
80
80
print("Stream Total:", log_time(run_stream))
81
81
print()