返回提交历史
Modified
g4f/Provider/Yupp.py
+9
-13
XFEstudio/gpt4free
Refactor Yupp provider to remove direct dependency on cloudscraper and streamline scraper usage
8b43b3cd
代码差异
1 个文件
+9
-13
@@ -5,16 +5,12 @@ import os
5
5
import re
6
6
import time
7
7
import uuid
8
from typing import Type
9
8
from concurrent.futures import ThreadPoolExecutor
10
9
11
10
try:
12
import cloudscraper
13
11
from cloudscraper import CloudScraper
14
has_cloudscraper = True
15
12
except ImportError:
16
cloudscraper = CloudScraper = None
17
has_cloudscraper = False
13
CloudScraper = None
18
14
19
15
from .helper import get_last_user_message
20
16
from .yupp.models import YuppModelManager
@@ -37,7 +33,7 @@ _executor = ThreadPoolExecutor(max_workers=10)
37
33
38
34
39
35
def create_scraper():
40
scraper = cloudscraper.create_scraper(
36
scraper = create_scraper(
41
37
browser={
42
38
'browser': 'chrome',
43
39
'platform': 'windows',
@@ -212,7 +208,7 @@ def format_messages_for_yupp(messages: Messages) -> str:
212
208
class Yupp(AsyncGeneratorProvider, ProviderModelMixin):
213
209
url = "https://yupp.ai"
214
210
login_url = "https://discord.gg/qXA4Wf4Fsm"
215
working = has_cloudscraper
211
working = CloudScraper is not None
216
212
active_by_default = True
217
213
supports_stream = True
218
214
image_cache = True
@@ -237,7 +233,7 @@ class Yupp(AsyncGeneratorProvider, ProviderModelMixin):
237
233
return cls.models
238
234
239
235
@classmethod
240
def sync_prepare_files(cls, media, scraper: cloudscraper.CloudScraper, account: Dict[str, Any]) -> list:
236
def sync_prepare_files(cls, media, scraper: CloudScraper, account: Dict[str, Any]) -> list:
241
237
files = []
242
238
if not media:
243
239
return files
@@ -292,12 +288,12 @@ class Yupp(AsyncGeneratorProvider, ProviderModelMixin):
292
288
return files
293
289
294
290
@classmethod
295
async def prepare_files(cls, media, scraper: cloudscraper.CloudScraper, account: Dict[str, Any]) -> list:
291
async def prepare_files(cls, media, scraper: CloudScraper, account: Dict[str, Any]) -> list:
296
292
loop = asyncio.get_event_loop()
297
293
return await loop.run_in_executor(_executor, cls.sync_prepare_files, media, scraper, account)
298
294
299
295
@classmethod
300
def sync_get_signed_image(cls, scraper: cloudscraper.CloudScraper, image_id: str) -> str:
296
def sync_get_signed_image(cls, scraper: CloudScraper, image_id: str) -> str:
301
297
url = "https://yupp.ai/api/trpc/chat.getSignedImage"
302
298
resp = scraper.get(
303
299
url,
@@ -313,12 +309,12 @@ class Yupp(AsyncGeneratorProvider, ProviderModelMixin):
313
309
return data[0]["result"]["data"]["json"]["signed_url"]
314
310
315
311
@classmethod
316
async def get_signed_image(cls, scraper: cloudscraper.CloudScraper, image_id: str) -> str:
312
async def get_signed_image(cls, scraper: CloudScraper, image_id: str) -> str:
317
313
loop = asyncio.get_event_loop()
318
314
return await loop.run_in_executor(_executor, cls.sync_get_signed_image, scraper, image_id)
319
315
320
316
@classmethod
321
def sync_stream_request(cls, scraper: cloudscraper.CloudScraper, url: str, payload: list, headers: dict,
317
def sync_stream_request(cls, scraper: CloudScraper, url: str, payload: list, headers: dict,
322
318
timeout: int):
323
319
response = scraper.post(url, json=payload, headers=headers, stream=True, timeout=timeout)
324
320
response.raise_for_status()
@@ -477,7 +473,7 @@ class Yupp(AsyncGeneratorProvider, ProviderModelMixin):
477
473
cls,
478
474
response,
479
475
account: Dict[str, Any],
480
scraper: cloudscraper.CloudScraper,
476
scraper: CloudScraper,
481
477
prompt: str,
482
478
model_id: str
483
479
) -> AsyncResult: