webscout 8.3.7__py3-none-any.whl → 2025.10.13__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of webscout might be problematic. Click here for more details.
- webscout/AIauto.py +250 -250
- webscout/AIbase.py +379 -379
- webscout/AIutel.py +60 -60
- webscout/Bard.py +1012 -1012
- webscout/Bing_search.py +417 -417
- webscout/DWEBS.py +529 -529
- webscout/Extra/Act.md +309 -309
- webscout/Extra/GitToolkit/__init__.py +10 -10
- webscout/Extra/GitToolkit/gitapi/README.md +110 -110
- webscout/Extra/GitToolkit/gitapi/__init__.py +11 -11
- webscout/Extra/GitToolkit/gitapi/repository.py +195 -195
- webscout/Extra/GitToolkit/gitapi/user.py +96 -96
- webscout/Extra/GitToolkit/gitapi/utils.py +61 -61
- webscout/Extra/YTToolkit/README.md +375 -375
- webscout/Extra/YTToolkit/YTdownloader.py +956 -956
- webscout/Extra/YTToolkit/__init__.py +2 -2
- webscout/Extra/YTToolkit/transcriber.py +475 -475
- webscout/Extra/YTToolkit/ytapi/README.md +44 -44
- webscout/Extra/YTToolkit/ytapi/__init__.py +6 -6
- webscout/Extra/YTToolkit/ytapi/channel.py +307 -307
- webscout/Extra/YTToolkit/ytapi/errors.py +13 -13
- webscout/Extra/YTToolkit/ytapi/extras.py +118 -118
- webscout/Extra/YTToolkit/ytapi/https.py +88 -88
- webscout/Extra/YTToolkit/ytapi/patterns.py +61 -61
- webscout/Extra/YTToolkit/ytapi/playlist.py +58 -58
- webscout/Extra/YTToolkit/ytapi/pool.py +7 -7
- webscout/Extra/YTToolkit/ytapi/query.py +39 -39
- webscout/Extra/YTToolkit/ytapi/stream.py +62 -62
- webscout/Extra/YTToolkit/ytapi/utils.py +62 -62
- webscout/Extra/YTToolkit/ytapi/video.py +232 -232
- webscout/Extra/autocoder/__init__.py +9 -9
- webscout/Extra/autocoder/autocoder.py +1105 -1105
- webscout/Extra/autocoder/autocoder_utiles.py +332 -332
- webscout/Extra/gguf.md +429 -429
- webscout/Extra/gguf.py +1213 -1213
- webscout/Extra/tempmail/README.md +487 -487
- webscout/Extra/tempmail/__init__.py +27 -27
- webscout/Extra/tempmail/async_utils.py +140 -140
- webscout/Extra/tempmail/base.py +160 -160
- webscout/Extra/tempmail/cli.py +186 -186
- webscout/Extra/tempmail/emailnator.py +84 -84
- webscout/Extra/tempmail/mail_tm.py +360 -360
- webscout/Extra/tempmail/temp_mail_io.py +291 -291
- webscout/Extra/weather.md +281 -281
- webscout/Extra/weather.py +193 -193
- webscout/Litlogger/README.md +10 -10
- webscout/Litlogger/__init__.py +15 -15
- webscout/Litlogger/formats.py +13 -13
- webscout/Litlogger/handlers.py +121 -121
- webscout/Litlogger/levels.py +13 -13
- webscout/Litlogger/logger.py +134 -134
- webscout/Provider/AISEARCH/Perplexity.py +332 -332
- webscout/Provider/AISEARCH/README.md +279 -279
- webscout/Provider/AISEARCH/__init__.py +16 -1
- webscout/Provider/AISEARCH/felo_search.py +206 -206
- webscout/Provider/AISEARCH/genspark_search.py +323 -323
- webscout/Provider/AISEARCH/hika_search.py +185 -185
- webscout/Provider/AISEARCH/iask_search.py +410 -410
- webscout/Provider/AISEARCH/monica_search.py +219 -219
- webscout/Provider/AISEARCH/scira_search.py +316 -316
- webscout/Provider/AISEARCH/stellar_search.py +177 -177
- webscout/Provider/AISEARCH/webpilotai_search.py +255 -255
- webscout/Provider/Aitopia.py +314 -314
- webscout/Provider/Andi.py +1 -1
- webscout/Provider/Apriel.py +306 -0
- webscout/Provider/ChatGPTClone.py +237 -236
- webscout/Provider/ChatSandbox.py +343 -343
- webscout/Provider/Cloudflare.py +324 -324
- webscout/Provider/Cohere.py +208 -208
- webscout/Provider/Deepinfra.py +370 -366
- webscout/Provider/ExaAI.py +260 -260
- webscout/Provider/ExaChat.py +308 -308
- webscout/Provider/Flowith.py +221 -221
- webscout/Provider/GMI.py +293 -0
- webscout/Provider/Gemini.py +164 -164
- webscout/Provider/GeminiProxy.py +167 -167
- webscout/Provider/GithubChat.py +371 -372
- webscout/Provider/Groq.py +800 -800
- webscout/Provider/HeckAI.py +383 -383
- webscout/Provider/Jadve.py +282 -282
- webscout/Provider/K2Think.py +307 -307
- webscout/Provider/Koboldai.py +205 -205
- webscout/Provider/LambdaChat.py +423 -423
- webscout/Provider/Nemotron.py +244 -244
- webscout/Provider/Netwrck.py +248 -248
- webscout/Provider/OLLAMA.py +395 -395
- webscout/Provider/OPENAI/Cloudflare.py +393 -393
- webscout/Provider/OPENAI/FalconH1.py +451 -451
- webscout/Provider/OPENAI/FreeGemini.py +296 -296
- webscout/Provider/OPENAI/K2Think.py +431 -431
- webscout/Provider/OPENAI/NEMOTRON.py +240 -240
- webscout/Provider/OPENAI/PI.py +427 -427
- webscout/Provider/OPENAI/README.md +959 -959
- webscout/Provider/OPENAI/TogetherAI.py +345 -345
- webscout/Provider/OPENAI/TwoAI.py +465 -465
- webscout/Provider/OPENAI/__init__.py +33 -18
- webscout/Provider/OPENAI/base.py +248 -248
- webscout/Provider/OPENAI/chatglm.py +528 -0
- webscout/Provider/OPENAI/chatgpt.py +592 -592
- webscout/Provider/OPENAI/chatgptclone.py +521 -521
- webscout/Provider/OPENAI/chatsandbox.py +202 -202
- webscout/Provider/OPENAI/deepinfra.py +318 -314
- webscout/Provider/OPENAI/e2b.py +1665 -1665
- webscout/Provider/OPENAI/exaai.py +420 -420
- webscout/Provider/OPENAI/exachat.py +452 -452
- webscout/Provider/OPENAI/friendli.py +232 -232
- webscout/Provider/OPENAI/{refact.py → gmi.py} +324 -274
- webscout/Provider/OPENAI/groq.py +364 -364
- webscout/Provider/OPENAI/heckai.py +314 -314
- webscout/Provider/OPENAI/llmchatco.py +337 -337
- webscout/Provider/OPENAI/netwrck.py +355 -355
- webscout/Provider/OPENAI/oivscode.py +290 -290
- webscout/Provider/OPENAI/opkfc.py +518 -518
- webscout/Provider/OPENAI/pydantic_imports.py +1 -1
- webscout/Provider/OPENAI/scirachat.py +535 -535
- webscout/Provider/OPENAI/sonus.py +308 -308
- webscout/Provider/OPENAI/standardinput.py +442 -442
- webscout/Provider/OPENAI/textpollinations.py +340 -340
- webscout/Provider/OPENAI/toolbaz.py +419 -416
- webscout/Provider/OPENAI/typefully.py +362 -362
- webscout/Provider/OPENAI/utils.py +295 -295
- webscout/Provider/OPENAI/venice.py +436 -436
- webscout/Provider/OPENAI/wisecat.py +387 -387
- webscout/Provider/OPENAI/writecream.py +166 -166
- webscout/Provider/OPENAI/x0gpt.py +378 -378
- webscout/Provider/OPENAI/yep.py +389 -389
- webscout/Provider/OpenGPT.py +230 -230
- webscout/Provider/Openai.py +243 -243
- webscout/Provider/PI.py +405 -405
- webscout/Provider/Perplexitylabs.py +430 -430
- webscout/Provider/QwenLM.py +272 -272
- webscout/Provider/STT/__init__.py +16 -1
- webscout/Provider/Sambanova.py +257 -257
- webscout/Provider/StandardInput.py +309 -309
- webscout/Provider/TTI/README.md +82 -82
- webscout/Provider/TTI/__init__.py +33 -18
- webscout/Provider/TTI/aiarta.py +413 -413
- webscout/Provider/TTI/base.py +136 -136
- webscout/Provider/TTI/bing.py +243 -243
- webscout/Provider/TTI/gpt1image.py +149 -149
- webscout/Provider/TTI/imagen.py +196 -196
- webscout/Provider/TTI/infip.py +211 -211
- webscout/Provider/TTI/magicstudio.py +232 -232
- webscout/Provider/TTI/monochat.py +219 -219
- webscout/Provider/TTI/piclumen.py +214 -214
- webscout/Provider/TTI/pixelmuse.py +232 -232
- webscout/Provider/TTI/pollinations.py +232 -232
- webscout/Provider/TTI/together.py +288 -288
- webscout/Provider/TTI/utils.py +12 -12
- webscout/Provider/TTI/venice.py +367 -367
- webscout/Provider/TTS/README.md +192 -192
- webscout/Provider/TTS/__init__.py +33 -18
- webscout/Provider/TTS/parler.py +110 -110
- webscout/Provider/TTS/streamElements.py +333 -333
- webscout/Provider/TTS/utils.py +280 -280
- webscout/Provider/TeachAnything.py +237 -237
- webscout/Provider/TextPollinationsAI.py +310 -310
- webscout/Provider/TogetherAI.py +356 -356
- webscout/Provider/TwoAI.py +312 -312
- webscout/Provider/TypliAI.py +311 -311
- webscout/Provider/UNFINISHED/ChatHub.py +208 -208
- webscout/Provider/UNFINISHED/ChutesAI.py +313 -313
- webscout/Provider/UNFINISHED/GizAI.py +294 -294
- webscout/Provider/UNFINISHED/Marcus.py +198 -198
- webscout/Provider/UNFINISHED/Qodo.py +477 -477
- webscout/Provider/UNFINISHED/VercelAIGateway.py +338 -338
- webscout/Provider/UNFINISHED/XenAI.py +324 -324
- webscout/Provider/UNFINISHED/Youchat.py +330 -330
- webscout/Provider/UNFINISHED/liner.py +334 -0
- webscout/Provider/UNFINISHED/liner_api_request.py +262 -262
- webscout/Provider/UNFINISHED/puterjs.py +634 -634
- webscout/Provider/UNFINISHED/samurai.py +223 -223
- webscout/Provider/UNFINISHED/test_lmarena.py +119 -119
- webscout/Provider/Venice.py +250 -250
- webscout/Provider/VercelAI.py +256 -256
- webscout/Provider/WiseCat.py +231 -231
- webscout/Provider/WrDoChat.py +366 -366
- webscout/Provider/__init__.py +33 -18
- webscout/Provider/ai4chat.py +174 -174
- webscout/Provider/akashgpt.py +331 -331
- webscout/Provider/cerebras.py +446 -446
- webscout/Provider/chatglm.py +394 -301
- webscout/Provider/cleeai.py +211 -211
- webscout/Provider/elmo.py +282 -282
- webscout/Provider/geminiapi.py +208 -208
- webscout/Provider/granite.py +261 -261
- webscout/Provider/hermes.py +263 -263
- webscout/Provider/julius.py +223 -223
- webscout/Provider/learnfastai.py +309 -309
- webscout/Provider/llama3mitril.py +214 -214
- webscout/Provider/llmchat.py +243 -243
- webscout/Provider/llmchatco.py +290 -290
- webscout/Provider/meta.py +801 -801
- webscout/Provider/oivscode.py +309 -309
- webscout/Provider/scira_chat.py +383 -383
- webscout/Provider/searchchat.py +292 -292
- webscout/Provider/sonus.py +258 -258
- webscout/Provider/toolbaz.py +370 -367
- webscout/Provider/turboseek.py +273 -273
- webscout/Provider/typefully.py +207 -207
- webscout/Provider/yep.py +372 -372
- webscout/__init__.py +27 -31
- webscout/__main__.py +5 -5
- webscout/auth/api_key_manager.py +189 -189
- webscout/auth/config.py +175 -175
- webscout/auth/models.py +185 -185
- webscout/auth/routes.py +663 -664
- webscout/auth/simple_logger.py +236 -236
- webscout/cli.py +523 -523
- webscout/conversation.py +438 -438
- webscout/exceptions.py +361 -361
- webscout/litagent/Readme.md +298 -298
- webscout/litagent/__init__.py +28 -28
- webscout/litagent/agent.py +581 -581
- webscout/litagent/constants.py +59 -59
- webscout/litprinter/__init__.py +58 -58
- webscout/models.py +181 -181
- webscout/optimizers.py +419 -419
- webscout/prompt_manager.py +288 -288
- webscout/sanitize.py +1078 -1078
- webscout/scout/README.md +401 -401
- webscout/scout/__init__.py +8 -8
- webscout/scout/core/__init__.py +6 -6
- webscout/scout/core/crawler.py +297 -297
- webscout/scout/core/scout.py +706 -706
- webscout/scout/core/search_result.py +95 -95
- webscout/scout/core/text_analyzer.py +62 -62
- webscout/scout/core/text_utils.py +277 -277
- webscout/scout/core/web_analyzer.py +51 -51
- webscout/scout/element.py +599 -599
- webscout/scout/parsers/__init__.py +69 -69
- webscout/scout/parsers/html5lib_parser.py +172 -172
- webscout/scout/parsers/html_parser.py +236 -236
- webscout/scout/parsers/lxml_parser.py +178 -178
- webscout/scout/utils.py +37 -37
- webscout/search/__init__.py +51 -0
- webscout/search/base.py +195 -0
- webscout/search/duckduckgo_main.py +54 -0
- webscout/search/engines/__init__.py +48 -0
- webscout/search/engines/bing.py +84 -0
- webscout/search/engines/bing_news.py +52 -0
- webscout/search/engines/brave.py +43 -0
- webscout/search/engines/duckduckgo/__init__.py +25 -0
- webscout/search/engines/duckduckgo/answers.py +78 -0
- webscout/search/engines/duckduckgo/base.py +187 -0
- webscout/search/engines/duckduckgo/images.py +97 -0
- webscout/search/engines/duckduckgo/maps.py +168 -0
- webscout/search/engines/duckduckgo/news.py +68 -0
- webscout/search/engines/duckduckgo/suggestions.py +21 -0
- webscout/search/engines/duckduckgo/text.py +211 -0
- webscout/search/engines/duckduckgo/translate.py +47 -0
- webscout/search/engines/duckduckgo/videos.py +63 -0
- webscout/search/engines/duckduckgo/weather.py +74 -0
- webscout/search/engines/mojeek.py +37 -0
- webscout/search/engines/wikipedia.py +56 -0
- webscout/search/engines/yahoo.py +65 -0
- webscout/search/engines/yahoo_news.py +64 -0
- webscout/search/engines/yandex.py +43 -0
- webscout/search/engines/yep/__init__.py +13 -0
- webscout/search/engines/yep/base.py +32 -0
- webscout/search/engines/yep/images.py +99 -0
- webscout/search/engines/yep/suggestions.py +35 -0
- webscout/search/engines/yep/text.py +114 -0
- webscout/search/http_client.py +156 -0
- webscout/search/results.py +137 -0
- webscout/search/yep_main.py +44 -0
- webscout/swiftcli/Readme.md +323 -323
- webscout/swiftcli/__init__.py +95 -95
- webscout/swiftcli/core/__init__.py +7 -7
- webscout/swiftcli/core/cli.py +308 -308
- webscout/swiftcli/core/context.py +104 -104
- webscout/swiftcli/core/group.py +241 -241
- webscout/swiftcli/decorators/__init__.py +28 -28
- webscout/swiftcli/decorators/command.py +221 -221
- webscout/swiftcli/decorators/options.py +220 -220
- webscout/swiftcli/decorators/output.py +302 -302
- webscout/swiftcli/exceptions.py +21 -21
- webscout/swiftcli/plugins/__init__.py +9 -9
- webscout/swiftcli/plugins/base.py +135 -135
- webscout/swiftcli/plugins/manager.py +269 -269
- webscout/swiftcli/utils/__init__.py +59 -59
- webscout/swiftcli/utils/formatting.py +252 -252
- webscout/swiftcli/utils/parsing.py +267 -267
- webscout/update_checker.py +117 -117
- webscout/version.py +1 -1
- webscout/version.py.bak +2 -0
- webscout/zeroart/README.md +89 -89
- webscout/zeroart/__init__.py +134 -134
- webscout/zeroart/base.py +66 -66
- webscout/zeroart/effects.py +100 -100
- webscout/zeroart/fonts.py +1238 -1238
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/METADATA +936 -937
- webscout-2025.10.13.dist-info/RECORD +329 -0
- webscout/Provider/AISEARCH/DeepFind.py +0 -254
- webscout/Provider/OPENAI/Qwen3.py +0 -303
- webscout/Provider/OPENAI/qodo.py +0 -630
- webscout/Provider/OPENAI/xenai.py +0 -514
- webscout/tempid.py +0 -134
- webscout/webscout_search.py +0 -1183
- webscout/webscout_search_async.py +0 -649
- webscout/yep_search.py +0 -346
- webscout-8.3.7.dist-info/RECORD +0 -301
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/WHEEL +0 -0
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/entry_points.txt +0 -0
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/licenses/LICENSE.md +0 -0
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/top_level.txt +0 -0
|
@@ -1,149 +1,149 @@
|
|
|
1
|
-
import requests
|
|
2
|
-
import random
|
|
3
|
-
import string
|
|
4
|
-
from typing import Optional, List, Dict, Any
|
|
5
|
-
from webscout.Provider.TTI.utils import (
|
|
6
|
-
ImageData,
|
|
7
|
-
ImageResponse
|
|
8
|
-
)
|
|
9
|
-
from webscout.Provider.TTI.base import TTICompatibleProvider, BaseImages
|
|
10
|
-
from io import BytesIO
|
|
11
|
-
import os
|
|
12
|
-
import tempfile
|
|
13
|
-
from webscout.litagent import LitAgent
|
|
14
|
-
import time
|
|
15
|
-
from requests.adapters import HTTPAdapter
|
|
16
|
-
from urllib3.util.retry import Retry
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class Images(BaseImages):
|
|
20
|
-
def __init__(self, client):
|
|
21
|
-
self._client = client
|
|
22
|
-
self.base_url = "https://gpt1image.exomlapi.com"
|
|
23
|
-
# Create a session - it will automatically get proxies from the global monkey patch!
|
|
24
|
-
self.session = requests.Session()
|
|
25
|
-
self._setup_session_with_retries()
|
|
26
|
-
|
|
27
|
-
def _setup_session_with_retries(self):
|
|
28
|
-
"""Setup session with retry strategy and timeout configurations"""
|
|
29
|
-
# Configure retry strategy
|
|
30
|
-
retry_strategy = Retry(
|
|
31
|
-
total=3,
|
|
32
|
-
status_forcelist=[429, 500, 502, 503, 504],
|
|
33
|
-
backoff_factor=1,
|
|
34
|
-
allowed_methods=["HEAD", "GET", "OPTIONS", "POST"],
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
adapter = HTTPAdapter(max_retries=retry_strategy)
|
|
38
|
-
self.session.mount("http://", adapter)
|
|
39
|
-
self.session.mount("https://", adapter)
|
|
40
|
-
|
|
41
|
-
# Set timeouts
|
|
42
|
-
# self.session.timeout = (10, 30) # (connect_timeout, read_timeout)
|
|
43
|
-
# Unlimited timeout: do not set session timeout here
|
|
44
|
-
|
|
45
|
-
def build_headers(self, extra: Optional[Dict[str, str]] = None) -> Dict[str, str]:
|
|
46
|
-
agent = LitAgent()
|
|
47
|
-
fp = agent.generate_fingerprint("chrome")
|
|
48
|
-
headers = {
|
|
49
|
-
"Content-Type": "application/json",
|
|
50
|
-
"accept": fp["accept"],
|
|
51
|
-
"accept-language": fp["accept_language"],
|
|
52
|
-
"origin": self.base_url,
|
|
53
|
-
"referer": f"{self.base_url}/",
|
|
54
|
-
"user-agent": fp["user_agent"],
|
|
55
|
-
"sec-ch-ua": fp["sec_ch_ua"],
|
|
56
|
-
"sec-ch-ua-mobile": "?0",
|
|
57
|
-
"sec-ch-ua-platform": '"Windows"',
|
|
58
|
-
"sec-fetch-dest": "empty",
|
|
59
|
-
"sec-fetch-mode": "cors",
|
|
60
|
-
"sec-fetch-site": "same-origin",
|
|
61
|
-
"x-forwarded-for": fp["x-forwarded-for"],
|
|
62
|
-
"x-real-ip": fp["x-real-ip"],
|
|
63
|
-
"x-request-id": fp["x-request-id"],
|
|
64
|
-
}
|
|
65
|
-
if extra:
|
|
66
|
-
headers.update(extra)
|
|
67
|
-
return headers
|
|
68
|
-
|
|
69
|
-
def create(
|
|
70
|
-
self,
|
|
71
|
-
model: str = None,
|
|
72
|
-
prompt: str = None,
|
|
73
|
-
n: int = 1,
|
|
74
|
-
size: str = "1024x1024",
|
|
75
|
-
response_format: str = "url",
|
|
76
|
-
user: Optional[str] = None,
|
|
77
|
-
style: str = None,
|
|
78
|
-
aspect_ratio: str = None,
|
|
79
|
-
timeout: int = 60,
|
|
80
|
-
image_format: str = "png",
|
|
81
|
-
enhance: bool = True,
|
|
82
|
-
**kwargs,
|
|
83
|
-
) -> ImageResponse:
|
|
84
|
-
if not prompt:
|
|
85
|
-
raise ValueError(
|
|
86
|
-
"Describe the image you want to create (use the 'prompt' property)."
|
|
87
|
-
)
|
|
88
|
-
body = {
|
|
89
|
-
"prompt": prompt,
|
|
90
|
-
"n": n,
|
|
91
|
-
"size": size,
|
|
92
|
-
"is_enhance": enhance,
|
|
93
|
-
"response_format": response_format,
|
|
94
|
-
}
|
|
95
|
-
try:
|
|
96
|
-
# Use direct session.request instead of request_with_proxy_fallback
|
|
97
|
-
resp = self.session.request(
|
|
98
|
-
"post",
|
|
99
|
-
f"{self.base_url}/v1/images/generations",
|
|
100
|
-
json=body,
|
|
101
|
-
headers=self.build_headers(),
|
|
102
|
-
timeout=timeout,
|
|
103
|
-
)
|
|
104
|
-
data = resp.json()
|
|
105
|
-
if not data.get("data") or len(data["data"]) == 0:
|
|
106
|
-
error_info = (
|
|
107
|
-
f", server info: {data.get('error')}" if data.get("error") else ""
|
|
108
|
-
)
|
|
109
|
-
raise RuntimeError(
|
|
110
|
-
f"Failed to process image. No data found{error_info}."
|
|
111
|
-
)
|
|
112
|
-
result = data["data"]
|
|
113
|
-
result_data = []
|
|
114
|
-
for item in result:
|
|
115
|
-
if response_format == "url":
|
|
116
|
-
result_data.append(ImageData(url=item.get("url")))
|
|
117
|
-
else:
|
|
118
|
-
result_data.append(ImageData(b64_json=item.get("b64_json")))
|
|
119
|
-
return ImageResponse(data=result_data)
|
|
120
|
-
except Exception as e:
|
|
121
|
-
raise RuntimeError(f"An error occurred: {str(e)}")
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
class GPT1Image(TTICompatibleProvider):
|
|
125
|
-
AVAILABLE_MODELS = ["gpt1image"]
|
|
126
|
-
|
|
127
|
-
def __init__(self):
|
|
128
|
-
self.images = Images(self)
|
|
129
|
-
|
|
130
|
-
@property
|
|
131
|
-
def models(self):
|
|
132
|
-
class _ModelList:
|
|
133
|
-
def list(inner_self):
|
|
134
|
-
return type(self).AVAILABLE_MODELS
|
|
135
|
-
|
|
136
|
-
return _ModelList()
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
if __name__ == "__main__":
|
|
140
|
-
from rich import print
|
|
141
|
-
|
|
142
|
-
client = GPT1Image()
|
|
143
|
-
response = client.images.create(
|
|
144
|
-
prompt="A futuristic robot in a neon city",
|
|
145
|
-
response_format="url",
|
|
146
|
-
n=1,
|
|
147
|
-
timeout=None,
|
|
148
|
-
)
|
|
149
|
-
print(response)
|
|
1
|
+
import requests
|
|
2
|
+
import random
|
|
3
|
+
import string
|
|
4
|
+
from typing import Optional, List, Dict, Any
|
|
5
|
+
from webscout.Provider.TTI.utils import (
|
|
6
|
+
ImageData,
|
|
7
|
+
ImageResponse
|
|
8
|
+
)
|
|
9
|
+
from webscout.Provider.TTI.base import TTICompatibleProvider, BaseImages
|
|
10
|
+
from io import BytesIO
|
|
11
|
+
import os
|
|
12
|
+
import tempfile
|
|
13
|
+
from webscout.litagent import LitAgent
|
|
14
|
+
import time
|
|
15
|
+
from requests.adapters import HTTPAdapter
|
|
16
|
+
from urllib3.util.retry import Retry
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class Images(BaseImages):
|
|
20
|
+
def __init__(self, client):
|
|
21
|
+
self._client = client
|
|
22
|
+
self.base_url = "https://gpt1image.exomlapi.com"
|
|
23
|
+
# Create a session - it will automatically get proxies from the global monkey patch!
|
|
24
|
+
self.session = requests.Session()
|
|
25
|
+
self._setup_session_with_retries()
|
|
26
|
+
|
|
27
|
+
def _setup_session_with_retries(self):
|
|
28
|
+
"""Setup session with retry strategy and timeout configurations"""
|
|
29
|
+
# Configure retry strategy
|
|
30
|
+
retry_strategy = Retry(
|
|
31
|
+
total=3,
|
|
32
|
+
status_forcelist=[429, 500, 502, 503, 504],
|
|
33
|
+
backoff_factor=1,
|
|
34
|
+
allowed_methods=["HEAD", "GET", "OPTIONS", "POST"],
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
adapter = HTTPAdapter(max_retries=retry_strategy)
|
|
38
|
+
self.session.mount("http://", adapter)
|
|
39
|
+
self.session.mount("https://", adapter)
|
|
40
|
+
|
|
41
|
+
# Set timeouts
|
|
42
|
+
# self.session.timeout = (10, 30) # (connect_timeout, read_timeout)
|
|
43
|
+
# Unlimited timeout: do not set session timeout here
|
|
44
|
+
|
|
45
|
+
def build_headers(self, extra: Optional[Dict[str, str]] = None) -> Dict[str, str]:
|
|
46
|
+
agent = LitAgent()
|
|
47
|
+
fp = agent.generate_fingerprint("chrome")
|
|
48
|
+
headers = {
|
|
49
|
+
"Content-Type": "application/json",
|
|
50
|
+
"accept": fp["accept"],
|
|
51
|
+
"accept-language": fp["accept_language"],
|
|
52
|
+
"origin": self.base_url,
|
|
53
|
+
"referer": f"{self.base_url}/",
|
|
54
|
+
"user-agent": fp["user_agent"],
|
|
55
|
+
"sec-ch-ua": fp["sec_ch_ua"],
|
|
56
|
+
"sec-ch-ua-mobile": "?0",
|
|
57
|
+
"sec-ch-ua-platform": '"Windows"',
|
|
58
|
+
"sec-fetch-dest": "empty",
|
|
59
|
+
"sec-fetch-mode": "cors",
|
|
60
|
+
"sec-fetch-site": "same-origin",
|
|
61
|
+
"x-forwarded-for": fp["x-forwarded-for"],
|
|
62
|
+
"x-real-ip": fp["x-real-ip"],
|
|
63
|
+
"x-request-id": fp["x-request-id"],
|
|
64
|
+
}
|
|
65
|
+
if extra:
|
|
66
|
+
headers.update(extra)
|
|
67
|
+
return headers
|
|
68
|
+
|
|
69
|
+
def create(
|
|
70
|
+
self,
|
|
71
|
+
model: str = None,
|
|
72
|
+
prompt: str = None,
|
|
73
|
+
n: int = 1,
|
|
74
|
+
size: str = "1024x1024",
|
|
75
|
+
response_format: str = "url",
|
|
76
|
+
user: Optional[str] = None,
|
|
77
|
+
style: str = None,
|
|
78
|
+
aspect_ratio: str = None,
|
|
79
|
+
timeout: int = 60,
|
|
80
|
+
image_format: str = "png",
|
|
81
|
+
enhance: bool = True,
|
|
82
|
+
**kwargs,
|
|
83
|
+
) -> ImageResponse:
|
|
84
|
+
if not prompt:
|
|
85
|
+
raise ValueError(
|
|
86
|
+
"Describe the image you want to create (use the 'prompt' property)."
|
|
87
|
+
)
|
|
88
|
+
body = {
|
|
89
|
+
"prompt": prompt,
|
|
90
|
+
"n": n,
|
|
91
|
+
"size": size,
|
|
92
|
+
"is_enhance": enhance,
|
|
93
|
+
"response_format": response_format,
|
|
94
|
+
}
|
|
95
|
+
try:
|
|
96
|
+
# Use direct session.request instead of request_with_proxy_fallback
|
|
97
|
+
resp = self.session.request(
|
|
98
|
+
"post",
|
|
99
|
+
f"{self.base_url}/v1/images/generations",
|
|
100
|
+
json=body,
|
|
101
|
+
headers=self.build_headers(),
|
|
102
|
+
timeout=timeout,
|
|
103
|
+
)
|
|
104
|
+
data = resp.json()
|
|
105
|
+
if not data.get("data") or len(data["data"]) == 0:
|
|
106
|
+
error_info = (
|
|
107
|
+
f", server info: {data.get('error')}" if data.get("error") else ""
|
|
108
|
+
)
|
|
109
|
+
raise RuntimeError(
|
|
110
|
+
f"Failed to process image. No data found{error_info}."
|
|
111
|
+
)
|
|
112
|
+
result = data["data"]
|
|
113
|
+
result_data = []
|
|
114
|
+
for item in result:
|
|
115
|
+
if response_format == "url":
|
|
116
|
+
result_data.append(ImageData(url=item.get("url")))
|
|
117
|
+
else:
|
|
118
|
+
result_data.append(ImageData(b64_json=item.get("b64_json")))
|
|
119
|
+
return ImageResponse(data=result_data)
|
|
120
|
+
except Exception as e:
|
|
121
|
+
raise RuntimeError(f"An error occurred: {str(e)}")
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
class GPT1Image(TTICompatibleProvider):
|
|
125
|
+
AVAILABLE_MODELS = ["gpt1image"]
|
|
126
|
+
|
|
127
|
+
def __init__(self):
|
|
128
|
+
self.images = Images(self)
|
|
129
|
+
|
|
130
|
+
@property
|
|
131
|
+
def models(self):
|
|
132
|
+
class _ModelList:
|
|
133
|
+
def list(inner_self):
|
|
134
|
+
return type(self).AVAILABLE_MODELS
|
|
135
|
+
|
|
136
|
+
return _ModelList()
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
if __name__ == "__main__":
|
|
140
|
+
from rich import print
|
|
141
|
+
|
|
142
|
+
client = GPT1Image()
|
|
143
|
+
response = client.images.create(
|
|
144
|
+
prompt="A futuristic robot in a neon city",
|
|
145
|
+
response_format="url",
|
|
146
|
+
n=1,
|
|
147
|
+
timeout=None,
|
|
148
|
+
)
|
|
149
|
+
print(response)
|