webscout 8.3.7__py3-none-any.whl → 2025.10.11__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/Apriel.py +306 -0
- webscout/Provider/ChatGPTClone.py +236 -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 +30 -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 +664 -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/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/webscout_search.py +1183 -1183
- webscout/webscout_search_async.py +649 -649
- webscout/yep_search.py +346 -346
- 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.11.dist-info}/METADATA +937 -937
- webscout-2025.10.11.dist-info/RECORD +300 -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-8.3.7.dist-info/RECORD +0 -301
- {webscout-8.3.7.dist-info → webscout-2025.10.11.dist-info}/WHEEL +0 -0
- {webscout-8.3.7.dist-info → webscout-2025.10.11.dist-info}/entry_points.txt +0 -0
- {webscout-8.3.7.dist-info → webscout-2025.10.11.dist-info}/licenses/LICENSE.md +0 -0
- {webscout-8.3.7.dist-info → webscout-2025.10.11.dist-info}/top_level.txt +0 -0
webscout/Provider/TTI/imagen.py
CHANGED
|
@@ -1,196 +1,196 @@
|
|
|
1
|
-
import requests
|
|
2
|
-
import base64
|
|
3
|
-
from typing import Optional, List, Dict, Any
|
|
4
|
-
from webscout.Provider.TTI.utils import (
|
|
5
|
-
ImageData,
|
|
6
|
-
ImageResponse,
|
|
7
|
-
)
|
|
8
|
-
from webscout.Provider.TTI.base import TTICompatibleProvider, BaseImages
|
|
9
|
-
from webscout.litagent import LitAgent
|
|
10
|
-
import time
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class Images(BaseImages):
|
|
14
|
-
def __init__(self, client):
|
|
15
|
-
self._client = client
|
|
16
|
-
|
|
17
|
-
def create(
|
|
18
|
-
self,
|
|
19
|
-
*,
|
|
20
|
-
model: str,
|
|
21
|
-
prompt: str,
|
|
22
|
-
n: int = 1,
|
|
23
|
-
size: str = "1024x1024",
|
|
24
|
-
response_format: str = "url",
|
|
25
|
-
user: Optional[str] = None,
|
|
26
|
-
style: str = "none",
|
|
27
|
-
aspect_ratio: str = "1:1",
|
|
28
|
-
timeout: int = 60,
|
|
29
|
-
image_format: str = "png",
|
|
30
|
-
seed: Optional[int] = None,
|
|
31
|
-
**kwargs,
|
|
32
|
-
) -> ImageResponse:
|
|
33
|
-
"""
|
|
34
|
-
Create images using the Imagen API.
|
|
35
|
-
|
|
36
|
-
Args:
|
|
37
|
-
model: The model to use (e.g., "imagen_3_5")
|
|
38
|
-
prompt: The text prompt for image generation
|
|
39
|
-
n: Number of images to generate
|
|
40
|
-
size: Image size (e.g., "1024x1024")
|
|
41
|
-
response_format: "url" or "b64_json"
|
|
42
|
-
timeout: Request timeout in seconds
|
|
43
|
-
**kwargs: Additional parameters
|
|
44
|
-
|
|
45
|
-
Returns:
|
|
46
|
-
ImageResponse: The generated images
|
|
47
|
-
"""
|
|
48
|
-
if not prompt:
|
|
49
|
-
raise ValueError("Prompt is required!")
|
|
50
|
-
|
|
51
|
-
result_data = []
|
|
52
|
-
|
|
53
|
-
for _ in range(n):
|
|
54
|
-
# Prepare the request payload
|
|
55
|
-
payload = {
|
|
56
|
-
"prompt": prompt,
|
|
57
|
-
"model": model,
|
|
58
|
-
"size": size,
|
|
59
|
-
"response_format": "url", # Always request URL from API
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
try:
|
|
63
|
-
# Make the API request
|
|
64
|
-
resp = self._client.session.request(
|
|
65
|
-
"post",
|
|
66
|
-
self._client.api_endpoint,
|
|
67
|
-
json=payload,
|
|
68
|
-
timeout=timeout,
|
|
69
|
-
)
|
|
70
|
-
resp.raise_for_status()
|
|
71
|
-
|
|
72
|
-
# Parse the response
|
|
73
|
-
result = resp.json()
|
|
74
|
-
|
|
75
|
-
if not result or "data" not in result:
|
|
76
|
-
raise RuntimeError("Invalid response from Imagen API")
|
|
77
|
-
|
|
78
|
-
# Process each image in the response
|
|
79
|
-
for item in result["data"]:
|
|
80
|
-
if response_format == "url":
|
|
81
|
-
if "url" in item and item["url"]:
|
|
82
|
-
result_data.append(ImageData(url=item["url"]))
|
|
83
|
-
else:
|
|
84
|
-
raise RuntimeError("No URL found in API response")
|
|
85
|
-
|
|
86
|
-
elif response_format == "b64_json":
|
|
87
|
-
if "url" in item and item["url"]:
|
|
88
|
-
# Download the image and convert to base64
|
|
89
|
-
img_resp = self._client.session.request(
|
|
90
|
-
"get",
|
|
91
|
-
item["url"],
|
|
92
|
-
timeout=timeout,
|
|
93
|
-
)
|
|
94
|
-
img_resp.raise_for_status()
|
|
95
|
-
img_bytes = img_resp.content
|
|
96
|
-
b64_string = base64.b64encode(img_bytes).decode("utf-8")
|
|
97
|
-
result_data.append(ImageData(b64_json=b64_string))
|
|
98
|
-
elif "b64_json" in item and item["b64_json"]:
|
|
99
|
-
result_data.append(ImageData(b64_json=item["b64_json"]))
|
|
100
|
-
else:
|
|
101
|
-
raise RuntimeError("No image data found in API response")
|
|
102
|
-
|
|
103
|
-
else:
|
|
104
|
-
raise ValueError("response_format must be 'url' or 'b64_json'")
|
|
105
|
-
|
|
106
|
-
except requests.exceptions.RequestException as e:
|
|
107
|
-
raise RuntimeError(f"Failed to generate image with Imagen API: {e}")
|
|
108
|
-
except Exception as e:
|
|
109
|
-
raise RuntimeError(f"Error processing Imagen API response: {e}")
|
|
110
|
-
|
|
111
|
-
return ImageResponse(created=int(time.time()), data=result_data)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
class ImagenAI(TTICompatibleProvider):
|
|
115
|
-
"""
|
|
116
|
-
Imagen API provider for text-to-image generation.
|
|
117
|
-
|
|
118
|
-
This provider interfaces with the Imagen API at imagen.exomlapi.com
|
|
119
|
-
to generate images from text prompts.
|
|
120
|
-
"""
|
|
121
|
-
|
|
122
|
-
AVAILABLE_MODELS = ["imagen_3_5", "imagen_3"]
|
|
123
|
-
|
|
124
|
-
def __init__(self, api_key: Optional[str] = None):
|
|
125
|
-
"""
|
|
126
|
-
Initialize the Imagen API client.
|
|
127
|
-
|
|
128
|
-
Args:
|
|
129
|
-
api_key: Optional API key for authentication (if required)
|
|
130
|
-
"""
|
|
131
|
-
self.api_endpoint = "https://imagen.exomlapi.com/v1/images/generations"
|
|
132
|
-
self.session = requests.Session()
|
|
133
|
-
self.user_agent = LitAgent().random()
|
|
134
|
-
self.api_key = api_key
|
|
135
|
-
|
|
136
|
-
# Set up headers based on the provided request details
|
|
137
|
-
self.headers = {
|
|
138
|
-
"accept": "*/*",
|
|
139
|
-
"accept-encoding": "gzip, deflate, br, zstd",
|
|
140
|
-
"accept-language": "en-US,en;q=0.9,en-IN;q=0.8",
|
|
141
|
-
"content-type": "application/json",
|
|
142
|
-
"dnt": "1",
|
|
143
|
-
"origin": "https://imagen.exomlapi.com",
|
|
144
|
-
"referer": "https://imagen.exomlapi.com/",
|
|
145
|
-
"sec-ch-ua": '"Chromium";v="136", "Microsoft Edge";v="136", "Not.A/Brand";v="99"',
|
|
146
|
-
"sec-ch-ua-mobile": "?0",
|
|
147
|
-
"sec-ch-ua-platform": '"Windows"',
|
|
148
|
-
"sec-fetch-dest": "empty",
|
|
149
|
-
"sec-fetch-mode": "cors",
|
|
150
|
-
"sec-fetch-site": "same-origin",
|
|
151
|
-
"sec-gpc": "1",
|
|
152
|
-
"user-agent": self.user_agent,
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
# Add API key to headers if provided
|
|
156
|
-
if self.api_key:
|
|
157
|
-
self.headers["authorization"] = f"Bearer {self.api_key}"
|
|
158
|
-
|
|
159
|
-
self.session.headers.update(self.headers)
|
|
160
|
-
self.images = Images(self)
|
|
161
|
-
|
|
162
|
-
@property
|
|
163
|
-
def models(self):
|
|
164
|
-
"""
|
|
165
|
-
Get available models for the Imagen API.
|
|
166
|
-
|
|
167
|
-
Returns:
|
|
168
|
-
Object with list() method that returns available models
|
|
169
|
-
"""
|
|
170
|
-
|
|
171
|
-
class _ModelList:
|
|
172
|
-
def list(inner_self):
|
|
173
|
-
return type(self).AVAILABLE_MODELS
|
|
174
|
-
|
|
175
|
-
return _ModelList()
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
if __name__ == "__main__":
|
|
179
|
-
from rich import print
|
|
180
|
-
|
|
181
|
-
# Example usage
|
|
182
|
-
client = ImagenAI()
|
|
183
|
-
|
|
184
|
-
try:
|
|
185
|
-
response = client.images.create(
|
|
186
|
-
model="imagen_3_5",
|
|
187
|
-
prompt="red car",
|
|
188
|
-
response_format="url",
|
|
189
|
-
n=1,
|
|
190
|
-
size="1024x1024",
|
|
191
|
-
timeout=30,
|
|
192
|
-
)
|
|
193
|
-
print("Generated image successfully:")
|
|
194
|
-
print(response)
|
|
195
|
-
except Exception as e:
|
|
196
|
-
print(f"Error: {e}")
|
|
1
|
+
import requests
|
|
2
|
+
import base64
|
|
3
|
+
from typing import Optional, List, Dict, Any
|
|
4
|
+
from webscout.Provider.TTI.utils import (
|
|
5
|
+
ImageData,
|
|
6
|
+
ImageResponse,
|
|
7
|
+
)
|
|
8
|
+
from webscout.Provider.TTI.base import TTICompatibleProvider, BaseImages
|
|
9
|
+
from webscout.litagent import LitAgent
|
|
10
|
+
import time
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Images(BaseImages):
|
|
14
|
+
def __init__(self, client):
|
|
15
|
+
self._client = client
|
|
16
|
+
|
|
17
|
+
def create(
|
|
18
|
+
self,
|
|
19
|
+
*,
|
|
20
|
+
model: str,
|
|
21
|
+
prompt: str,
|
|
22
|
+
n: int = 1,
|
|
23
|
+
size: str = "1024x1024",
|
|
24
|
+
response_format: str = "url",
|
|
25
|
+
user: Optional[str] = None,
|
|
26
|
+
style: str = "none",
|
|
27
|
+
aspect_ratio: str = "1:1",
|
|
28
|
+
timeout: int = 60,
|
|
29
|
+
image_format: str = "png",
|
|
30
|
+
seed: Optional[int] = None,
|
|
31
|
+
**kwargs,
|
|
32
|
+
) -> ImageResponse:
|
|
33
|
+
"""
|
|
34
|
+
Create images using the Imagen API.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
model: The model to use (e.g., "imagen_3_5")
|
|
38
|
+
prompt: The text prompt for image generation
|
|
39
|
+
n: Number of images to generate
|
|
40
|
+
size: Image size (e.g., "1024x1024")
|
|
41
|
+
response_format: "url" or "b64_json"
|
|
42
|
+
timeout: Request timeout in seconds
|
|
43
|
+
**kwargs: Additional parameters
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
ImageResponse: The generated images
|
|
47
|
+
"""
|
|
48
|
+
if not prompt:
|
|
49
|
+
raise ValueError("Prompt is required!")
|
|
50
|
+
|
|
51
|
+
result_data = []
|
|
52
|
+
|
|
53
|
+
for _ in range(n):
|
|
54
|
+
# Prepare the request payload
|
|
55
|
+
payload = {
|
|
56
|
+
"prompt": prompt,
|
|
57
|
+
"model": model,
|
|
58
|
+
"size": size,
|
|
59
|
+
"response_format": "url", # Always request URL from API
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
try:
|
|
63
|
+
# Make the API request
|
|
64
|
+
resp = self._client.session.request(
|
|
65
|
+
"post",
|
|
66
|
+
self._client.api_endpoint,
|
|
67
|
+
json=payload,
|
|
68
|
+
timeout=timeout,
|
|
69
|
+
)
|
|
70
|
+
resp.raise_for_status()
|
|
71
|
+
|
|
72
|
+
# Parse the response
|
|
73
|
+
result = resp.json()
|
|
74
|
+
|
|
75
|
+
if not result or "data" not in result:
|
|
76
|
+
raise RuntimeError("Invalid response from Imagen API")
|
|
77
|
+
|
|
78
|
+
# Process each image in the response
|
|
79
|
+
for item in result["data"]:
|
|
80
|
+
if response_format == "url":
|
|
81
|
+
if "url" in item and item["url"]:
|
|
82
|
+
result_data.append(ImageData(url=item["url"]))
|
|
83
|
+
else:
|
|
84
|
+
raise RuntimeError("No URL found in API response")
|
|
85
|
+
|
|
86
|
+
elif response_format == "b64_json":
|
|
87
|
+
if "url" in item and item["url"]:
|
|
88
|
+
# Download the image and convert to base64
|
|
89
|
+
img_resp = self._client.session.request(
|
|
90
|
+
"get",
|
|
91
|
+
item["url"],
|
|
92
|
+
timeout=timeout,
|
|
93
|
+
)
|
|
94
|
+
img_resp.raise_for_status()
|
|
95
|
+
img_bytes = img_resp.content
|
|
96
|
+
b64_string = base64.b64encode(img_bytes).decode("utf-8")
|
|
97
|
+
result_data.append(ImageData(b64_json=b64_string))
|
|
98
|
+
elif "b64_json" in item and item["b64_json"]:
|
|
99
|
+
result_data.append(ImageData(b64_json=item["b64_json"]))
|
|
100
|
+
else:
|
|
101
|
+
raise RuntimeError("No image data found in API response")
|
|
102
|
+
|
|
103
|
+
else:
|
|
104
|
+
raise ValueError("response_format must be 'url' or 'b64_json'")
|
|
105
|
+
|
|
106
|
+
except requests.exceptions.RequestException as e:
|
|
107
|
+
raise RuntimeError(f"Failed to generate image with Imagen API: {e}")
|
|
108
|
+
except Exception as e:
|
|
109
|
+
raise RuntimeError(f"Error processing Imagen API response: {e}")
|
|
110
|
+
|
|
111
|
+
return ImageResponse(created=int(time.time()), data=result_data)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class ImagenAI(TTICompatibleProvider):
|
|
115
|
+
"""
|
|
116
|
+
Imagen API provider for text-to-image generation.
|
|
117
|
+
|
|
118
|
+
This provider interfaces with the Imagen API at imagen.exomlapi.com
|
|
119
|
+
to generate images from text prompts.
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
AVAILABLE_MODELS = ["imagen_3_5", "imagen_3"]
|
|
123
|
+
|
|
124
|
+
def __init__(self, api_key: Optional[str] = None):
|
|
125
|
+
"""
|
|
126
|
+
Initialize the Imagen API client.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
api_key: Optional API key for authentication (if required)
|
|
130
|
+
"""
|
|
131
|
+
self.api_endpoint = "https://imagen.exomlapi.com/v1/images/generations"
|
|
132
|
+
self.session = requests.Session()
|
|
133
|
+
self.user_agent = LitAgent().random()
|
|
134
|
+
self.api_key = api_key
|
|
135
|
+
|
|
136
|
+
# Set up headers based on the provided request details
|
|
137
|
+
self.headers = {
|
|
138
|
+
"accept": "*/*",
|
|
139
|
+
"accept-encoding": "gzip, deflate, br, zstd",
|
|
140
|
+
"accept-language": "en-US,en;q=0.9,en-IN;q=0.8",
|
|
141
|
+
"content-type": "application/json",
|
|
142
|
+
"dnt": "1",
|
|
143
|
+
"origin": "https://imagen.exomlapi.com",
|
|
144
|
+
"referer": "https://imagen.exomlapi.com/",
|
|
145
|
+
"sec-ch-ua": '"Chromium";v="136", "Microsoft Edge";v="136", "Not.A/Brand";v="99"',
|
|
146
|
+
"sec-ch-ua-mobile": "?0",
|
|
147
|
+
"sec-ch-ua-platform": '"Windows"',
|
|
148
|
+
"sec-fetch-dest": "empty",
|
|
149
|
+
"sec-fetch-mode": "cors",
|
|
150
|
+
"sec-fetch-site": "same-origin",
|
|
151
|
+
"sec-gpc": "1",
|
|
152
|
+
"user-agent": self.user_agent,
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
# Add API key to headers if provided
|
|
156
|
+
if self.api_key:
|
|
157
|
+
self.headers["authorization"] = f"Bearer {self.api_key}"
|
|
158
|
+
|
|
159
|
+
self.session.headers.update(self.headers)
|
|
160
|
+
self.images = Images(self)
|
|
161
|
+
|
|
162
|
+
@property
|
|
163
|
+
def models(self):
|
|
164
|
+
"""
|
|
165
|
+
Get available models for the Imagen API.
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
Object with list() method that returns available models
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
class _ModelList:
|
|
172
|
+
def list(inner_self):
|
|
173
|
+
return type(self).AVAILABLE_MODELS
|
|
174
|
+
|
|
175
|
+
return _ModelList()
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
if __name__ == "__main__":
|
|
179
|
+
from rich import print
|
|
180
|
+
|
|
181
|
+
# Example usage
|
|
182
|
+
client = ImagenAI()
|
|
183
|
+
|
|
184
|
+
try:
|
|
185
|
+
response = client.images.create(
|
|
186
|
+
model="imagen_3_5",
|
|
187
|
+
prompt="red car",
|
|
188
|
+
response_format="url",
|
|
189
|
+
n=1,
|
|
190
|
+
size="1024x1024",
|
|
191
|
+
timeout=30,
|
|
192
|
+
)
|
|
193
|
+
print("Generated image successfully:")
|
|
194
|
+
print(response)
|
|
195
|
+
except Exception as e:
|
|
196
|
+
print(f"Error: {e}")
|