webscout 7.7__py3-none-any.whl → 7.8__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.

Files changed (121) hide show
  1. webscout/AIutel.py +2 -1
  2. webscout/Bard.py +14 -11
  3. webscout/DWEBS.py +431 -415
  4. webscout/Extra/autocoder/__init__.py +9 -9
  5. webscout/Extra/autocoder/autocoder_utiles.py +332 -194
  6. webscout/Extra/autocoder/rawdog.py +68 -9
  7. webscout/Extra/gguf.py +682 -682
  8. webscout/Provider/AI21.py +1 -1
  9. webscout/Provider/AISEARCH/DeepFind.py +2 -2
  10. webscout/Provider/AISEARCH/ISou.py +2 -2
  11. webscout/Provider/AISEARCH/felo_search.py +6 -6
  12. webscout/Provider/AISEARCH/genspark_search.py +1 -1
  13. webscout/Provider/Aitopia.py +292 -0
  14. webscout/Provider/AllenAI.py +1 -1
  15. webscout/Provider/Andi.py +3 -3
  16. webscout/Provider/C4ai.py +1 -1
  17. webscout/Provider/ChatGPTES.py +3 -5
  18. webscout/Provider/ChatGPTGratis.py +4 -4
  19. webscout/Provider/Chatify.py +2 -2
  20. webscout/Provider/Cloudflare.py +3 -2
  21. webscout/Provider/DARKAI.py +3 -2
  22. webscout/Provider/DeepSeek.py +2 -2
  23. webscout/Provider/Deepinfra.py +1 -1
  24. webscout/Provider/EDITEE.py +1 -1
  25. webscout/Provider/ElectronHub.py +178 -96
  26. webscout/Provider/ExaChat.py +310 -0
  27. webscout/Provider/Free2GPT.py +2 -2
  28. webscout/Provider/Gemini.py +5 -19
  29. webscout/Provider/GithubChat.py +1 -1
  30. webscout/Provider/Glider.py +4 -4
  31. webscout/Provider/Groq.py +3 -3
  32. webscout/Provider/HF_space/qwen_qwen2.py +1 -1
  33. webscout/Provider/HeckAI.py +1 -1
  34. webscout/Provider/HuggingFaceChat.py +1 -1
  35. webscout/Provider/Hunyuan.py +1 -1
  36. webscout/Provider/Jadve.py +3 -3
  37. webscout/Provider/Koboldai.py +3 -3
  38. webscout/Provider/LambdaChat.py +1 -1
  39. webscout/Provider/Llama.py +3 -5
  40. webscout/Provider/Llama3.py +4 -12
  41. webscout/Provider/Marcus.py +3 -3
  42. webscout/Provider/OLLAMA.py +8 -8
  43. webscout/Provider/Openai.py +7 -3
  44. webscout/Provider/PI.py +1 -1
  45. webscout/Provider/Perplexitylabs.py +1 -1
  46. webscout/Provider/Phind.py +1 -1
  47. webscout/Provider/PizzaGPT.py +1 -1
  48. webscout/Provider/QwenLM.py +4 -7
  49. webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +3 -1
  50. webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +3 -3
  51. webscout/Provider/TTI/ImgSys/__init__.py +23 -0
  52. webscout/Provider/TTI/ImgSys/async_imgsys.py +202 -0
  53. webscout/Provider/TTI/ImgSys/sync_imgsys.py +195 -0
  54. webscout/Provider/TTI/__init__.py +3 -1
  55. webscout/Provider/TTI/artbit/async_artbit.py +1 -1
  56. webscout/Provider/TTI/artbit/sync_artbit.py +1 -1
  57. webscout/Provider/TTI/huggingface/async_huggingface.py +1 -1
  58. webscout/Provider/TTI/huggingface/sync_huggingface.py +1 -1
  59. webscout/Provider/TTI/piclumen/__init__.py +22 -22
  60. webscout/Provider/TTI/piclumen/sync_piclumen.py +232 -232
  61. webscout/Provider/TTI/pixelmuse/__init__.py +4 -0
  62. webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +249 -0
  63. webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +182 -0
  64. webscout/Provider/TTI/talkai/sync_talkai.py +1 -1
  65. webscout/Provider/TTS/utils.py +1 -1
  66. webscout/Provider/TeachAnything.py +1 -1
  67. webscout/Provider/TextPollinationsAI.py +4 -4
  68. webscout/Provider/TwoAI.py +1 -2
  69. webscout/Provider/Venice.py +4 -2
  70. webscout/Provider/VercelAI.py +234 -0
  71. webscout/Provider/WebSim.py +3 -2
  72. webscout/Provider/WiseCat.py +10 -12
  73. webscout/Provider/Youchat.py +1 -1
  74. webscout/Provider/__init__.py +10 -0
  75. webscout/Provider/ai4chat.py +1 -1
  76. webscout/Provider/aimathgpt.py +2 -6
  77. webscout/Provider/akashgpt.py +1 -1
  78. webscout/Provider/askmyai.py +4 -4
  79. webscout/Provider/asksteve.py +203 -0
  80. webscout/Provider/bagoodex.py +2 -2
  81. webscout/Provider/cerebras.py +1 -1
  82. webscout/Provider/chatglm.py +4 -4
  83. webscout/Provider/cleeai.py +1 -0
  84. webscout/Provider/copilot.py +427 -415
  85. webscout/Provider/elmo.py +1 -1
  86. webscout/Provider/flowith.py +1 -1
  87. webscout/Provider/freeaichat.py +57 -31
  88. webscout/Provider/gaurish.py +3 -5
  89. webscout/Provider/geminiprorealtime.py +1 -1
  90. webscout/Provider/granite.py +4 -4
  91. webscout/Provider/hermes.py +5 -5
  92. webscout/Provider/julius.py +1 -1
  93. webscout/Provider/koala.py +1 -1
  94. webscout/Provider/lepton.py +1 -1
  95. webscout/Provider/llama3mitril.py +4 -4
  96. webscout/Provider/llamatutor.py +1 -1
  97. webscout/Provider/llmchat.py +3 -3
  98. webscout/Provider/meta.py +1 -1
  99. webscout/Provider/multichat.py +10 -10
  100. webscout/Provider/promptrefine.py +1 -1
  101. webscout/Provider/searchchat.py +293 -0
  102. webscout/Provider/sonus.py +2 -2
  103. webscout/Provider/talkai.py +2 -2
  104. webscout/Provider/turboseek.py +1 -1
  105. webscout/Provider/tutorai.py +1 -1
  106. webscout/Provider/typegpt.py +5 -42
  107. webscout/Provider/uncovr.py +4 -2
  108. webscout/Provider/x0gpt.py +1 -1
  109. webscout/__init__.py +36 -36
  110. webscout/cli.py +293 -332
  111. webscout/tempid.py +11 -11
  112. webscout/utils.py +2 -2
  113. webscout/version.py +1 -1
  114. webscout/webscout_search.py +1282 -1223
  115. webscout/webscout_search_async.py +813 -692
  116. {webscout-7.7.dist-info → webscout-7.8.dist-info}/METADATA +50 -29
  117. {webscout-7.7.dist-info → webscout-7.8.dist-info}/RECORD +121 -110
  118. {webscout-7.7.dist-info → webscout-7.8.dist-info}/LICENSE.md +0 -0
  119. {webscout-7.7.dist-info → webscout-7.8.dist-info}/WHEEL +0 -0
  120. {webscout-7.7.dist-info → webscout-7.8.dist-info}/entry_points.txt +0 -0
  121. {webscout-7.7.dist-info → webscout-7.8.dist-info}/top_level.txt +0 -0
@@ -79,7 +79,7 @@ class OLLAMA(Provider):
79
79
  conversationally: bool = False,
80
80
  tools: Optional[List[Dict]] = None,
81
81
  images: Optional[List[str]] = None,
82
- ) -> dict | AsyncGenerator:
82
+ ) -> Union[dict, AsyncGenerator]:
83
83
  """Chat with AI
84
84
 
85
85
  Args:
@@ -91,7 +91,7 @@ class OLLAMA(Provider):
91
91
  tools (List[Dict], optional): List of tools/functions to use. Defaults to None.
92
92
  images (List[str], optional): List of image paths or base64 encoded images. Defaults to None.
93
93
  Returns:
94
- dict|AsyncGenerator : ai content
94
+ Union[dict, AsyncGenerator] : ai content
95
95
  """
96
96
  conversation_prompt = self.conversation.gen_complete_prompt(prompt)
97
97
  if optimizer:
@@ -150,7 +150,7 @@ class OLLAMA(Provider):
150
150
  conversationally: bool = False,
151
151
  tools: Optional[List[Dict]] = None,
152
152
  images: Optional[List[str]] = None,
153
- ) -> dict | AsyncGenerator:
153
+ ) -> Union[dict, AsyncGenerator]:
154
154
  """Async version of ask method"""
155
155
  conversation_prompt = self.conversation.gen_complete_prompt(prompt)
156
156
  if optimizer:
@@ -208,7 +208,7 @@ class OLLAMA(Provider):
208
208
  conversationally: bool = False,
209
209
  tools: Optional[List[Dict]] = None,
210
210
  images: Optional[List[str]] = None,
211
- ) -> str | AsyncGenerator:
211
+ ) -> Union[str, AsyncGenerator]:
212
212
  """Generate response `str`
213
213
  Args:
214
214
  prompt (str): Prompt to be send.
@@ -218,7 +218,7 @@ class OLLAMA(Provider):
218
218
  tools (List[Dict], optional): List of tools/functions to use. Defaults to None.
219
219
  images (List[str], optional): List of image paths or base64 encoded images. Defaults to None.
220
220
  Returns:
221
- str: Response generated
221
+ Union[str, AsyncGenerator]: Response generated
222
222
  """
223
223
  def for_stream():
224
224
  for response in self.ask(
@@ -249,7 +249,7 @@ class OLLAMA(Provider):
249
249
  conversationally: bool = False,
250
250
  tools: Optional[List[Dict]] = None,
251
251
  images: Optional[List[str]] = None,
252
- ) -> str | AsyncGenerator:
252
+ ) -> Union[str, AsyncGenerator]:
253
253
  """Async version of chat method"""
254
254
  async def for_stream():
255
255
  async for response in await self.aask(
@@ -289,7 +289,7 @@ class OLLAMA(Provider):
289
289
  prompt: str,
290
290
  stream: bool = False,
291
291
  **kwargs
292
- ) -> dict | AsyncGenerator:
292
+ ) -> Union[dict, AsyncGenerator]:
293
293
  """Generate text using the model"""
294
294
  try:
295
295
  if stream:
@@ -305,7 +305,7 @@ class OLLAMA(Provider):
305
305
  prompt: str,
306
306
  stream: bool = False,
307
307
  **kwargs
308
- ) -> dict | AsyncGenerator:
308
+ ) -> Union[dict, AsyncGenerator]:
309
309
  """Async version of generate method"""
310
310
  try:
311
311
  if stream:
@@ -5,7 +5,7 @@ from ..AIutel import AwesomePrompts, sanitize_stream
5
5
  from ..AIbase import Provider, AsyncProvider
6
6
 
7
7
  from webscout import exceptions
8
- from typing import Any, AsyncGenerator, Dict
8
+ from typing import Any, AsyncGenerator, Dict, List, Optional, Union
9
9
  import requests
10
10
  import httpx
11
11
  #----------------------------------------------------------OpenAI-----------------------------------
@@ -332,7 +332,8 @@ class AsyncOPENAI(AsyncProvider):
332
332
  raw: bool = False,
333
333
  optimizer: str = None,
334
334
  conversationally: bool = False,
335
- ) -> dict | AsyncGenerator:
335
+ tools: Optional[List[Dict[str, Any]]] = None,
336
+ ) -> Union[dict, AsyncGenerator]:
336
337
  """Chat with AI asynchronously.
337
338
 
338
339
  Args:
@@ -341,6 +342,7 @@ class AsyncOPENAI(AsyncProvider):
341
342
  raw (bool, optional): Stream back raw response as received. Defaults to False.
342
343
  optimizer (str, optional): Prompt optimizer name - `[code, shell_command]`. Defaults to None.
343
344
  conversationally (bool, optional): Chat conversationally when using optimizer. Defaults to False.
345
+ tools (Optional[List[Dict[str, Any]]], optional): List of tools to be used. Defaults to None.
344
346
  Returns:
345
347
  dict|AsyncGenerator : ai content.
346
348
  ```json
@@ -444,13 +446,15 @@ class AsyncOPENAI(AsyncProvider):
444
446
  stream: bool = False,
445
447
  optimizer: str = None,
446
448
  conversationally: bool = False,
447
- ) -> str | AsyncGenerator:
449
+ tools: Optional[List[Dict[str, Any]]] = None,
450
+ ) -> Union[str, AsyncGenerator]:
448
451
  """Generate response `str` asynchronously.
449
452
  Args:
450
453
  prompt (str): Prompt to be send.
451
454
  stream (bool, optional): Flag for streaming response. Defaults to False.
452
455
  optimizer (str, optional): Prompt optimizer name - `[code, shell_command]`. Defaults to None.
453
456
  conversationally (bool, optional): Chat conversationally when using optimizer. Defaults to False.
457
+ tools (Optional[List[Dict[str, Any]]], optional): List of tools to be used. Defaults to None.
454
458
  Returns:
455
459
  str|AsyncGenerator: Response generated
456
460
  """
webscout/Provider/PI.py CHANGED
@@ -9,7 +9,7 @@ from webscout.AIutel import Conversation
9
9
  from webscout.AIutel import AwesomePrompts
10
10
  from webscout.AIbase import Provider
11
11
  from typing import Dict, Union, Any, Optional
12
- from webscout import LitAgent
12
+ from webscout.litagent import LitAgent
13
13
 
14
14
  class PiAI(Provider):
15
15
  """
@@ -13,7 +13,7 @@ from webscout.AIutel import Conversation
13
13
  from webscout.AIutel import AwesomePrompts, sanitize_stream
14
14
  from webscout.AIbase import Provider
15
15
  from webscout import exceptions
16
- from webscout import LitAgent
16
+ from webscout.litagent import LitAgent
17
17
 
18
18
  class PerplexityLabs(Provider):
19
19
  """
@@ -8,7 +8,7 @@ from webscout.AIutel import AwesomePrompts, sanitize_stream
8
8
  from webscout.AIbase import Provider
9
9
 
10
10
  from webscout import exceptions
11
- from typing import Any, AsyncGenerator, Dict
11
+ from typing import Union, Any, AsyncGenerator, Dict
12
12
 
13
13
 
14
14
  #------------------------------------------------------phind-------------------------------------------------------------
@@ -5,7 +5,7 @@ from typing import Any, Dict, Optional, Union, Generator
5
5
  from webscout.AIutel import Optimizers, Conversation, AwesomePrompts
6
6
  from webscout.AIbase import Provider
7
7
  from webscout import exceptions
8
- from webscout import LitAgent as Lit
8
+ from webscout.litagent import LitAgent as Lit
9
9
 
10
10
  class PIZZAGPT(Provider):
11
11
  """
@@ -1,13 +1,10 @@
1
- import requests
2
1
  import json
3
- from typing import Any, Dict, Generator, Optional
4
- import uuid
5
- import re
2
+ from typing import Union, Any, Dict, Generator, Optional
6
3
 
7
4
  import cloudscraper
8
5
 
9
6
  from webscout.AIutel import Optimizers, Conversation, AwesomePrompts
10
- from webscout.AIbase import Provider, AsyncProvider
7
+ from webscout.AIbase import Provider
11
8
  from webscout import exceptions
12
9
 
13
10
  class QwenLM(Provider):
@@ -126,7 +123,7 @@ class QwenLM(Provider):
126
123
  raw: bool = False,
127
124
  optimizer: Optional[str] = None,
128
125
  conversationally: bool = False,
129
- ) -> Dict[str, Any] | Generator[Dict[str, Any], None, None]:
126
+ ) -> Union[Dict[str, Any], Generator[Any, None, None]]:
130
127
  """Chat with AI."""
131
128
 
132
129
  conversation_prompt = self.conversation.gen_complete_prompt(prompt)
@@ -229,7 +226,7 @@ class QwenLM(Provider):
229
226
  stream: bool = False,
230
227
  optimizer: Optional[str] = None,
231
228
  conversationally: bool = False,
232
- ) -> str | Generator[str, None, None]:
229
+ ) -> Union[str, Generator[str, None, None]]:
233
230
  """Generate response string from chat."""
234
231
 
235
232
  def for_stream() -> Generator[str, None, None]:
@@ -21,7 +21,9 @@ class AsyncFreeAIImager(AsyncImageProvider):
21
21
  "Flux Pro Ultra Raw",
22
22
  "Flux Schnell",
23
23
  "Flux Realism",
24
- "grok-2-aurora"
24
+ "grok-2-aurora",
25
+ "Flux Dev",
26
+
25
27
  ]
26
28
 
27
29
  def __init__(
@@ -1,6 +1,6 @@
1
1
  import requests
2
2
  import os
3
- from typing import List
3
+ from typing import Union, List
4
4
  from string import punctuation
5
5
  from random import choice
6
6
  from random import randint
@@ -21,7 +21,8 @@ class FreeAIImager(ImageProvider):
21
21
  "Flux Pro Ultra Raw",
22
22
  "Flux Schnell",
23
23
  "Flux Realism",
24
- "grok-2-aurora"
24
+ "grok-2-aurora",
25
+ "Flux Dev",
25
26
  ]
26
27
 
27
28
  def __init__(
@@ -29,7 +30,6 @@ class FreeAIImager(ImageProvider):
29
30
  model: str = "dall-e-3", # Updated default model
30
31
  timeout: int = 60,
31
32
  proxies: dict = {},
32
- logging: bool = True
33
33
  ):
34
34
  """Initialize your FreeAIPlayground provider with custom settings! ⚙️
35
35
 
@@ -0,0 +1,23 @@
1
+ """ImgSys Provider Package - Generate images from multiple providers! 🎨
2
+
3
+ Examples:
4
+ >>> # Synchronous usage
5
+ >>> from webscout import ImgSys
6
+ >>> provider = ImgSys()
7
+ >>> images = provider.generate("A cool cyberpunk city")
8
+ >>> provider.save(images, dir="my_images")
9
+ >>>
10
+ >>> # Asynchronous usage
11
+ >>> import asyncio
12
+ >>> from webscout import AsyncImgSys
13
+ >>> async def main():
14
+ ... provider = AsyncImgSys()
15
+ ... images = await provider.generate("A cool cyberpunk city")
16
+ ... await provider.save(images, dir="my_images")
17
+ >>> asyncio.run(main())
18
+ """
19
+
20
+ from .sync_imgsys import ImgSys
21
+ from .async_imgsys import AsyncImgSys
22
+
23
+ __all__ = ["ImgSys", "AsyncImgSys"]
@@ -0,0 +1,202 @@
1
+ """ImgSys Asynchronous Provider - Generate images from multiple providers! 🔥
2
+
3
+ Examples:
4
+ >>> import asyncio
5
+ >>> from webscout import AsyncImgSys
6
+ >>>
7
+ >>> async def main():
8
+ ... provider = AsyncImgSys()
9
+ ... # Generate images
10
+ ... images = await provider.generate("A cool cyberpunk city at night")
11
+ ... await provider.save(images, dir="my_images")
12
+ >>> asyncio.run(main())
13
+ """
14
+
15
+ import aiohttp
16
+ import os
17
+ import time
18
+ import asyncio
19
+ from typing import List, Optional, Union
20
+ from aiohttp import ClientError
21
+ from pathlib import Path
22
+
23
+ from webscout.AIbase import ImageProvider
24
+ from webscout.litagent import LitAgent
25
+
26
+ # Get a fresh user agent! 🔄
27
+ agent = LitAgent()
28
+
29
+ class AsyncImgSys(ImageProvider):
30
+ """Your homie for generating fire images using imgsys.org! 🎨
31
+
32
+ This provider generates images from multiple providers, with built-in retry logic
33
+ and error handling to make sure you get your images no cap! 💯
34
+
35
+ Examples:
36
+ >>> import asyncio
37
+ >>> from webscout import AsyncImgSys
38
+ >>> async def main():
39
+ ... provider = AsyncImgSys()
40
+ ... # Generate images
41
+ ... images = await provider.generate("A futuristic city")
42
+ ... await provider.save(images, "city.jpg")
43
+ >>> asyncio.run(main())
44
+ """
45
+
46
+ def __init__(
47
+ self,
48
+ timeout: int = 60,
49
+ proxies: Optional[dict] = None
50
+ ):
51
+ """Initialize your AsyncImgSys provider with custom settings
52
+
53
+ Examples:
54
+ >>> provider = AsyncImgSys(timeout=30)
55
+ >>> provider = AsyncImgSys(proxies={"http": "http://proxy:8080"})
56
+
57
+ Args:
58
+ timeout (int): HTTP request timeout in seconds (default: 60)
59
+ proxies (dict, optional): Proxy configuration for requests
60
+ """
61
+ self.request_id_endpoint = "https://imgsys.org/api/initiate"
62
+ self.image_response_endpoint = "https://imgsys.org/api/get"
63
+ self.image_provider_endpoint = "https://imgsys.org/api/submit"
64
+
65
+ self.headers = {
66
+ "Accept": "application/json",
67
+ "Content-Type": "application/json",
68
+ "User-Agent": agent.random(),
69
+ }
70
+ self.timeout = aiohttp.ClientTimeout(total=timeout)
71
+ self.proxies = proxies
72
+ self.prompt: str = "AI-generated image - webscout"
73
+ self.image_extension: str = "jpeg"
74
+
75
+ async def generate(
76
+ self,
77
+ prompt: str,
78
+ max_retries: int = 3,
79
+ retry_delay: int = 5,
80
+ ) -> List[bytes]:
81
+ """Generate some fire images from your prompt! 🎨
82
+
83
+ Args:
84
+ prompt (str): Your image description
85
+ max_retries (int): Max retry attempts if something fails (default: 3)
86
+ retry_delay (int): Seconds to wait between retries (default: 5)
87
+
88
+ Returns:
89
+ List[bytes]: Your generated images as bytes
90
+
91
+ Raises:
92
+ ValueError: If the inputs ain't valid
93
+ ClientError: If the API calls fail after retries
94
+ """
95
+ # Input validation
96
+ if not prompt:
97
+ raise ValueError("Yo fam, the prompt can't be empty! 🤔")
98
+
99
+ self.prompt = prompt
100
+ response = []
101
+
102
+ async with aiohttp.ClientSession(headers=self.headers, timeout=self.timeout) as session:
103
+ # Get request ID
104
+ data = {"prompt": prompt}
105
+ async with session.post(self.request_id_endpoint, json=data) as resp:
106
+ resp.raise_for_status()
107
+ request_id = (await resp.json())["requestId"]
108
+
109
+ # Poll for results
110
+ for attempt in range(max_retries):
111
+ try:
112
+ # Get image URLs
113
+ async with session.get(
114
+ f"{self.image_response_endpoint}?requestId={request_id}"
115
+ ) as resp:
116
+ resp.raise_for_status()
117
+ image_data = await resp.json()
118
+
119
+ if "results" in image_data and len(image_data["results"]) >= 2:
120
+ # Get provider names
121
+ async with session.post(
122
+ self.image_provider_endpoint,
123
+ json={"requestId": request_id, "preference": 0}
124
+ ) as resp:
125
+ resp.raise_for_status()
126
+ provider_data = await resp.json()
127
+
128
+ # Download images
129
+ for i, url in enumerate(image_data["results"][:2]):
130
+ async with session.get(url) as resp:
131
+ resp.raise_for_status()
132
+ response.append(await resp.read())
133
+
134
+ break
135
+ else:
136
+ if attempt == max_retries - 1:
137
+ raise ClientError("Failed to get image results after max retries")
138
+ await asyncio.sleep(retry_delay)
139
+
140
+ except ClientError as e:
141
+ if attempt == max_retries - 1:
142
+ raise
143
+ await asyncio.sleep(retry_delay)
144
+
145
+ return response
146
+
147
+ async def save(
148
+ self,
149
+ response: List[bytes],
150
+ name: Optional[str] = None,
151
+ dir: Optional[Union[str, Path]] = None,
152
+ filenames_prefix: str = "",
153
+ ) -> List[str]:
154
+ """Save your fire generated images! 💾
155
+
156
+ Examples:
157
+ >>> import asyncio
158
+ >>> from webscout import AsyncImgSys
159
+ >>> async def main():
160
+ ... provider = AsyncImgSys()
161
+ ... images = await provider.generate("Cool art")
162
+ ... # Save with default settings
163
+ ... paths = await provider.save(images)
164
+ ... # Save with custom name and directory
165
+ ... paths = await provider.save(
166
+ ... images,
167
+ ... name="my_art",
168
+ ... dir="my_images",
169
+ ... filenames_prefix="test_"
170
+ ... )
171
+ >>> asyncio.run(main())
172
+
173
+ Args:
174
+ response (List[bytes]): Your generated images
175
+ name (Optional[str]): Custom name for your images
176
+ dir (Optional[Union[str, Path]]): Where to save the images (default: current directory)
177
+ filenames_prefix (str): Prefix for your image files
178
+
179
+ Returns:
180
+ List[str]: Paths to your saved images
181
+ """
182
+ save_dir = dir if dir else os.getcwd()
183
+ if not os.path.exists(save_dir):
184
+ os.makedirs(save_dir)
185
+
186
+ saved_paths = []
187
+ timestamp = int(time.time())
188
+
189
+ for i, image_bytes in enumerate(response):
190
+ if name:
191
+ filename = f"{filenames_prefix}{name}_{i}.{self.image_extension}"
192
+ else:
193
+ filename = f"{filenames_prefix}imgsys_{timestamp}_{i}.{self.image_extension}"
194
+
195
+ filepath = os.path.join(save_dir, filename)
196
+
197
+ async with aiohttp.AsyncFile(filepath, "wb") as f:
198
+ await f.write(image_bytes)
199
+
200
+ saved_paths.append(filepath)
201
+
202
+ return saved_paths
@@ -0,0 +1,195 @@
1
+ """ImgSys Synchronous Provider - Generate images from multiple providers! 🔥
2
+
3
+ Examples:
4
+ >>> from webscout import ImgSys
5
+ >>> provider = ImgSys()
6
+ >>>
7
+ >>> # Generate images
8
+ >>> images = provider.generate("A cool cyberpunk city at night")
9
+ >>> provider.save(images, dir="my_images")
10
+ """
11
+
12
+ import requests
13
+ import os
14
+ import time
15
+ from typing import List, Optional, Union
16
+ from requests.exceptions import RequestException
17
+ from pathlib import Path
18
+
19
+ from webscout.AIbase import ImageProvider
20
+ from webscout.litagent import LitAgent
21
+
22
+ # Get a fresh user agent! 🔄
23
+ agent = LitAgent()
24
+
25
+ class ImgSys(ImageProvider):
26
+ """Your homie for generating fire images using imgsys.org! 🎨
27
+
28
+ This provider generates images from multiple providers, with built-in retry logic
29
+ and error handling to make sure you get your images no cap! 💯
30
+
31
+ Examples:
32
+ >>> provider = ImgSys()
33
+ >>> # Generate images
34
+ >>> images = provider.generate("A futuristic city")
35
+ >>> provider.save(images, "city.jpg")
36
+ """
37
+
38
+ def __init__(
39
+ self,
40
+ timeout: int = 60,
41
+ proxies: Optional[dict] = None
42
+ ):
43
+ """Initialize your ImgSys provider with custom settings
44
+
45
+ Examples:
46
+ >>> provider = ImgSys(timeout=30)
47
+ >>> provider = ImgSys(proxies={"http": "http://proxy:8080"})
48
+
49
+ Args:
50
+ timeout (int): HTTP request timeout in seconds (default: 60)
51
+ proxies (dict, optional): Proxy configuration for requests
52
+ """
53
+ self.request_id_endpoint = "https://imgsys.org/api/initiate"
54
+ self.image_response_endpoint = "https://imgsys.org/api/get"
55
+ self.image_provider_endpoint = "https://imgsys.org/api/submit"
56
+
57
+ self.headers = {
58
+ "Accept": "application/json",
59
+ "Content-Type": "application/json",
60
+ "User-Agent": agent.random(),
61
+ }
62
+ self.session = requests.Session()
63
+ self.session.headers.update(self.headers)
64
+ if proxies:
65
+ self.session.proxies.update(proxies)
66
+
67
+ self.timeout = timeout
68
+ self.prompt: str = "AI-generated image - webscout"
69
+ self.image_extension: str = "jpeg"
70
+
71
+ def generate(
72
+ self,
73
+ prompt: str,
74
+ max_retries: int = 3,
75
+ retry_delay: int = 5,
76
+ ) -> List[bytes]:
77
+ """Generate some fire images from your prompt! 🎨
78
+
79
+ Args:
80
+ prompt (str): Your image description
81
+ max_retries (int): Max retry attempts if something fails (default: 3)
82
+ retry_delay (int): Seconds to wait between retries (default: 5)
83
+
84
+ Returns:
85
+ List[bytes]: Your generated images as bytes
86
+
87
+ Raises:
88
+ ValueError: If the inputs ain't valid
89
+ RequestException: If the API calls fail after retries
90
+ """
91
+ # Input validation
92
+ if not prompt:
93
+ raise ValueError("Yo fam, the prompt can't be empty! 🤔")
94
+
95
+ self.prompt = prompt
96
+ response = []
97
+
98
+ # Get request ID
99
+ data = {"prompt": prompt}
100
+ resp = self.session.post(self.request_id_endpoint, json=data, timeout=self.timeout)
101
+ resp.raise_for_status()
102
+ request_id = resp.json()["requestId"]
103
+
104
+ # Poll for results
105
+ for attempt in range(max_retries):
106
+ try:
107
+ # Get image URLs
108
+ resp = self.session.get(
109
+ f"{self.image_response_endpoint}?requestId={request_id}",
110
+ timeout=self.timeout
111
+ )
112
+ resp.raise_for_status()
113
+ image_data = resp.json()
114
+
115
+ if "results" in image_data and len(image_data["results"]) >= 2:
116
+ # Get provider names
117
+ provider_resp = self.session.post(
118
+ self.image_provider_endpoint,
119
+ json={"requestId": request_id, "preference": 0},
120
+ timeout=self.timeout
121
+ )
122
+ provider_resp.raise_for_status()
123
+ provider_data = provider_resp.json()
124
+
125
+ # Download images
126
+ for i, url in enumerate(image_data["results"][:2]):
127
+ img_resp = self.session.get(url, timeout=self.timeout)
128
+ img_resp.raise_for_status()
129
+ response.append(img_resp.content)
130
+
131
+ break
132
+ else:
133
+ if attempt == max_retries - 1:
134
+ raise RequestException("Failed to get image results after max retries")
135
+ time.sleep(retry_delay)
136
+
137
+ except RequestException as e:
138
+ if attempt == max_retries - 1:
139
+ raise
140
+ time.sleep(retry_delay)
141
+
142
+ return response
143
+
144
+ def save(
145
+ self,
146
+ response: List[bytes],
147
+ name: Optional[str] = None,
148
+ dir: Optional[Union[str, Path]] = None,
149
+ filenames_prefix: str = "",
150
+ ) -> List[str]:
151
+ """Save your fire generated images! 💾
152
+
153
+ Examples:
154
+ >>> provider = ImgSys()
155
+ >>> images = provider.generate("Cool art")
156
+ >>> # Save with default settings
157
+ >>> paths = provider.save(images)
158
+ >>> # Save with custom name and directory
159
+ >>> paths = provider.save(
160
+ ... images,
161
+ ... name="my_art",
162
+ ... dir="my_images",
163
+ ... filenames_prefix="test_"
164
+ ... )
165
+
166
+ Args:
167
+ response (List[bytes]): Your generated images
168
+ name (Optional[str]): Custom name for your images
169
+ dir (Optional[Union[str, Path]]): Where to save the images (default: current directory)
170
+ filenames_prefix (str): Prefix for your image files
171
+
172
+ Returns:
173
+ List[str]: Paths to your saved images
174
+ """
175
+ save_dir = dir if dir else os.getcwd()
176
+ if not os.path.exists(save_dir):
177
+ os.makedirs(save_dir)
178
+
179
+ saved_paths = []
180
+ timestamp = int(time.time())
181
+
182
+ for i, image_bytes in enumerate(response):
183
+ if name:
184
+ filename = f"{filenames_prefix}{name}_{i}.{self.image_extension}"
185
+ else:
186
+ filename = f"{filenames_prefix}imgsys_{timestamp}_{i}.{self.image_extension}"
187
+
188
+ filepath = os.path.join(save_dir, filename)
189
+
190
+ with open(filepath, "wb") as f:
191
+ f.write(image_bytes)
192
+
193
+ saved_paths.append(filepath)
194
+
195
+ return saved_paths
@@ -7,4 +7,6 @@ from .artbit import *
7
7
  from .talkai import *
8
8
  from .piclumen import *
9
9
  from .MagicStudio import *
10
- from .fastflux import *
10
+ from .fastflux import *
11
+ from .pixelmuse import *
12
+ from .ImgSys import *
@@ -31,7 +31,7 @@ import aiohttp
31
31
  import aiofiles
32
32
  import asyncio
33
33
  import os
34
- from typing import List
34
+ from typing import Union, List
35
35
  from webscout.AIbase import AsyncImageProvider
36
36
  from webscout.litagent import LitAgent
37
37
 
@@ -25,7 +25,7 @@ Examples:
25
25
  import cloudscraper
26
26
  import os
27
27
  import requests
28
- from typing import List
28
+ from typing import Union, List
29
29
  from webscout.AIbase import ImageProvider
30
30
  from webscout.litagent import LitAgent
31
31