返回提交历史
Modified
g4f/client/async.py
+44
-23
XFEstudio/gpt4free
Update async.py
8229b62c
代码差异
1 个文件
+44
-23
@@ -14,9 +14,9 @@ from ..image import ImageResponse as ImageProviderResponse
14
14
from ..errors import NoImageResponseError, RateLimitError, MissingAuthError
15
15
from .. import get_model_and_provider, get_last_provider
16
16
from .helper import read_json, find_stop, filter_none
17
17
ä
18
18
async def iter_response(
19
response: AsyncIerator[str],
19
response: AsyncIterator[str],
20
20
stream: bool,
21
21
response_format: dict = None,
22
22
max_tokens: int = None,
@@ -67,6 +67,39 @@ class Client(BaseClient):
67
67
self.chat: Chat = Chat(self, provider)
68
68
self.images: Images = Images(self, image_provider)
69
69
70
async def cast_iter_async(iter):
71
for chunk in iter:
72
yield chunk
73
74
def create_response(
75
messages: Messages,
76
model: str,
77
provider: ProviderType = None,
78
stream: bool = False,
79
response_format: dict = None,
80
max_tokens: int = None,
81
stop: Union[list[str], str] = None,
82
api_key: str = None,
83
**kwargs
84
):
85
if hasattr(provider, "create_async_generator):
86
create = provider.create_async_generator
87
else:
88
create = provider.create_completion
89
response = create(
90
model, messages, stream,
91
**filter_none(
92
proxy=self.client.get_proxy(),
93
max_tokens=max_tokens,
94
stop=stop,
95
api_key=self.client.api_key if api_key is None else api_key
96
),
97
**kwargs
98
)
99
if not hasattr(provider, "create_async_generator")
100
response = cast_iter_async(response)
101
return response
102
70
103
class Completions():
71
104
def __init__(self, client: Client, provider: ProviderType = None):
72
105
self.client: Client = client
@@ -79,9 +112,6 @@ class Completions():
79
112
provider: ProviderType = None,
80
113
stream: bool = False,
81
114
response_format: dict = None,
82
max_tokens: int = None,
83
stop: Union[list[str], str] = None,
84
api_key: str = None,
85
115
ignored : list[str] = None,
86
116
ignore_working: bool = False,
87
117
ignore_stream: bool = False,
@@ -97,16 +127,7 @@ class Completions():
97
127
**kwargs
98
128
)
99
129
stop = [stop] if isinstance(stop, str) else stop
100
response = provider.create_async(
101
model, messages, stream,
102
**filter_none(
103
proxy=self.client.get_proxy(),
104
max_tokens=max_tokens,
105
stop=stop,
106
api_key=self.client.api_key if api_key is None else api_key
107
),
108
**kwargs
109
)
130
response = create_response(messages, model, provider, stream, **kwargs)
110
131
response = iter_response(response, stream, response_format, max_tokens, stop)
111
132
response = iter_append_model_and_provider(response)
112
133
return response if stream else anext(response)
@@ -117,14 +138,14 @@ class Chat():
117
138
def __init__(self, client: Client, provider: ProviderType = None):
118
139
self.completions = Completions(client, provider)
119
140
120
def iter_image_response(response: Iterator) -> Union[ImagesResponse, None]:
121
for chunk in list(response):
141
async def iter_image_response(response: Iterator) -> Union[ImagesResponse, None]:
142
async for chunk in list(response):
122
143
if isinstance(chunk, ImageProviderResponse):
123
144
return ImagesResponse([Image(image) for image in chunk.get_list()])
124
145
125
def create_image(client: Client, provider: ProviderType, prompt: str, model: str = "", **kwargs) -> Iterator:
146
def create_image(client: Client, provider: ProviderType, prompt: str, model: str = "", **kwargs) -> AsyncIterator:
126
147
prompt = f"create a image with: {prompt}"
127
return provider.create_completion(
148
return provider.create_async_generator(
128
149
model,
129
150
[{"role": "user", "content": prompt}],
130
151
True,
@@ -138,7 +159,7 @@ class Images():
138
159
self.provider: ImageProvider = provider
139
160
self.models: ImageModels = ImageModels(client)
140
161
141
def generate(self, prompt, model: str = None, **kwargs) -> ImagesResponse:
162
async def generate(self, prompt, model: str = None, **kwargs) -> ImagesResponse:
142
163
provider = self.models.get(model, self.provider)
143
164
if isinstance(provider, type) and issubclass(provider, BaseProvider):
144
165
response = create_image(self.client, provider, prompt, **kwargs)
@@ -156,11 +177,11 @@ class Images():
156
177
raise NoImageResponseError()
157
178
return image
158
179
159
def create_variation(self, image: ImageType, model: str = None, **kwargs):
180
async def create_variation(self, image: ImageType, model: str = None, **kwargs):
160
181
provider = self.models.get(model, self.provider)
161
182
result = None
162
183
if isinstance(provider, type) and issubclass(provider, BaseProvider):
163
response = provider.create_completion(
184
response = provider.create_async_generator(
164
185
"",
165
186
[{"role": "user", "content": "create a image like this"}],
166
187
True,
@@ -168,7 +189,7 @@ class Images():
168
189
proxy=self.client.get_proxy(),
169
190
**kwargs
170
191
)
171
for chunk in response:
192
async for chunk in response:
172
193
if isinstance(chunk, ImageProviderResponse):
173
194
result = ([chunk.images] if isinstance(chunk.images, str) else chunk.images)
174
195
result = ImagesResponse([Image(image)for image in result])