webscout 8.2.8__py3-none-any.whl → 8.3__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 (197) hide show
  1. webscout/AIauto.py +34 -16
  2. webscout/AIbase.py +96 -37
  3. webscout/AIutel.py +491 -87
  4. webscout/Bard.py +441 -323
  5. webscout/Extra/GitToolkit/__init__.py +10 -10
  6. webscout/Extra/YTToolkit/ytapi/video.py +232 -232
  7. webscout/Litlogger/README.md +10 -0
  8. webscout/Litlogger/__init__.py +7 -59
  9. webscout/Litlogger/formats.py +4 -0
  10. webscout/Litlogger/handlers.py +103 -0
  11. webscout/Litlogger/levels.py +13 -0
  12. webscout/Litlogger/logger.py +92 -0
  13. webscout/Provider/AISEARCH/Perplexity.py +332 -358
  14. webscout/Provider/AISEARCH/felo_search.py +9 -35
  15. webscout/Provider/AISEARCH/genspark_search.py +30 -56
  16. webscout/Provider/AISEARCH/hika_search.py +4 -16
  17. webscout/Provider/AISEARCH/iask_search.py +410 -436
  18. webscout/Provider/AISEARCH/monica_search.py +4 -30
  19. webscout/Provider/AISEARCH/scira_search.py +6 -32
  20. webscout/Provider/AISEARCH/webpilotai_search.py +38 -64
  21. webscout/Provider/Blackboxai.py +155 -35
  22. webscout/Provider/ChatSandbox.py +2 -1
  23. webscout/Provider/Deepinfra.py +339 -339
  24. webscout/Provider/ExaChat.py +358 -358
  25. webscout/Provider/Gemini.py +169 -169
  26. webscout/Provider/GithubChat.py +1 -2
  27. webscout/Provider/Glider.py +3 -3
  28. webscout/Provider/HeckAI.py +172 -82
  29. webscout/Provider/LambdaChat.py +1 -0
  30. webscout/Provider/MCPCore.py +7 -3
  31. webscout/Provider/OPENAI/BLACKBOXAI.py +421 -139
  32. webscout/Provider/OPENAI/Cloudflare.py +38 -21
  33. webscout/Provider/OPENAI/FalconH1.py +457 -0
  34. webscout/Provider/OPENAI/FreeGemini.py +35 -18
  35. webscout/Provider/OPENAI/NEMOTRON.py +34 -34
  36. webscout/Provider/OPENAI/PI.py +427 -0
  37. webscout/Provider/OPENAI/Qwen3.py +304 -0
  38. webscout/Provider/OPENAI/README.md +952 -1253
  39. webscout/Provider/OPENAI/TwoAI.py +374 -0
  40. webscout/Provider/OPENAI/__init__.py +7 -1
  41. webscout/Provider/OPENAI/ai4chat.py +73 -63
  42. webscout/Provider/OPENAI/api.py +869 -644
  43. webscout/Provider/OPENAI/base.py +2 -0
  44. webscout/Provider/OPENAI/c4ai.py +34 -13
  45. webscout/Provider/OPENAI/chatgpt.py +575 -556
  46. webscout/Provider/OPENAI/chatgptclone.py +512 -487
  47. webscout/Provider/OPENAI/chatsandbox.py +11 -6
  48. webscout/Provider/OPENAI/copilot.py +258 -0
  49. webscout/Provider/OPENAI/deepinfra.py +327 -318
  50. webscout/Provider/OPENAI/e2b.py +140 -104
  51. webscout/Provider/OPENAI/exaai.py +420 -411
  52. webscout/Provider/OPENAI/exachat.py +448 -443
  53. webscout/Provider/OPENAI/flowith.py +7 -3
  54. webscout/Provider/OPENAI/freeaichat.py +12 -8
  55. webscout/Provider/OPENAI/glider.py +15 -8
  56. webscout/Provider/OPENAI/groq.py +5 -2
  57. webscout/Provider/OPENAI/heckai.py +311 -307
  58. webscout/Provider/OPENAI/llmchatco.py +9 -7
  59. webscout/Provider/OPENAI/mcpcore.py +18 -9
  60. webscout/Provider/OPENAI/multichat.py +7 -5
  61. webscout/Provider/OPENAI/netwrck.py +16 -11
  62. webscout/Provider/OPENAI/oivscode.py +290 -0
  63. webscout/Provider/OPENAI/opkfc.py +507 -496
  64. webscout/Provider/OPENAI/pydantic_imports.py +172 -0
  65. webscout/Provider/OPENAI/scirachat.py +29 -17
  66. webscout/Provider/OPENAI/sonus.py +308 -303
  67. webscout/Provider/OPENAI/standardinput.py +442 -433
  68. webscout/Provider/OPENAI/textpollinations.py +18 -11
  69. webscout/Provider/OPENAI/toolbaz.py +419 -413
  70. webscout/Provider/OPENAI/typefully.py +17 -10
  71. webscout/Provider/OPENAI/typegpt.py +21 -11
  72. webscout/Provider/OPENAI/uncovrAI.py +477 -462
  73. webscout/Provider/OPENAI/utils.py +90 -79
  74. webscout/Provider/OPENAI/venice.py +435 -425
  75. webscout/Provider/OPENAI/wisecat.py +387 -381
  76. webscout/Provider/OPENAI/writecream.py +166 -163
  77. webscout/Provider/OPENAI/x0gpt.py +26 -37
  78. webscout/Provider/OPENAI/yep.py +384 -356
  79. webscout/Provider/PI.py +2 -1
  80. webscout/Provider/TTI/README.md +55 -101
  81. webscout/Provider/TTI/__init__.py +4 -9
  82. webscout/Provider/TTI/aiarta.py +365 -0
  83. webscout/Provider/TTI/artbit.py +0 -0
  84. webscout/Provider/TTI/base.py +64 -0
  85. webscout/Provider/TTI/fastflux.py +200 -0
  86. webscout/Provider/TTI/magicstudio.py +201 -0
  87. webscout/Provider/TTI/piclumen.py +203 -0
  88. webscout/Provider/TTI/pixelmuse.py +225 -0
  89. webscout/Provider/TTI/pollinations.py +221 -0
  90. webscout/Provider/TTI/utils.py +11 -0
  91. webscout/Provider/TTS/__init__.py +2 -1
  92. webscout/Provider/TTS/base.py +159 -159
  93. webscout/Provider/TTS/openai_fm.py +129 -0
  94. webscout/Provider/TextPollinationsAI.py +308 -308
  95. webscout/Provider/TwoAI.py +239 -44
  96. webscout/Provider/UNFINISHED/Youchat.py +330 -330
  97. webscout/Provider/UNFINISHED/puterjs.py +635 -0
  98. webscout/Provider/UNFINISHED/test_lmarena.py +119 -119
  99. webscout/Provider/Writecream.py +246 -246
  100. webscout/Provider/__init__.py +2 -2
  101. webscout/Provider/ai4chat.py +33 -8
  102. webscout/Provider/granite.py +41 -6
  103. webscout/Provider/koala.py +169 -169
  104. webscout/Provider/oivscode.py +309 -0
  105. webscout/Provider/samurai.py +3 -2
  106. webscout/Provider/scnet.py +1 -0
  107. webscout/Provider/typegpt.py +3 -3
  108. webscout/Provider/uncovr.py +368 -368
  109. webscout/client.py +70 -0
  110. webscout/litprinter/__init__.py +58 -58
  111. webscout/optimizers.py +419 -419
  112. webscout/scout/README.md +3 -1
  113. webscout/scout/core/crawler.py +134 -64
  114. webscout/scout/core/scout.py +148 -109
  115. webscout/scout/element.py +106 -88
  116. webscout/swiftcli/Readme.md +323 -323
  117. webscout/swiftcli/plugins/manager.py +9 -2
  118. webscout/version.py +1 -1
  119. webscout/zeroart/__init__.py +134 -134
  120. webscout/zeroart/effects.py +100 -100
  121. webscout/zeroart/fonts.py +1238 -1238
  122. {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/METADATA +160 -35
  123. webscout-8.3.dist-info/RECORD +290 -0
  124. {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/WHEEL +1 -1
  125. {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/entry_points.txt +1 -0
  126. webscout/Litlogger/Readme.md +0 -175
  127. webscout/Litlogger/core/__init__.py +0 -6
  128. webscout/Litlogger/core/level.py +0 -23
  129. webscout/Litlogger/core/logger.py +0 -165
  130. webscout/Litlogger/handlers/__init__.py +0 -12
  131. webscout/Litlogger/handlers/console.py +0 -33
  132. webscout/Litlogger/handlers/file.py +0 -143
  133. webscout/Litlogger/handlers/network.py +0 -173
  134. webscout/Litlogger/styles/__init__.py +0 -7
  135. webscout/Litlogger/styles/colors.py +0 -249
  136. webscout/Litlogger/styles/formats.py +0 -458
  137. webscout/Litlogger/styles/text.py +0 -87
  138. webscout/Litlogger/utils/__init__.py +0 -6
  139. webscout/Litlogger/utils/detectors.py +0 -153
  140. webscout/Litlogger/utils/formatters.py +0 -200
  141. webscout/Provider/ChatGPTGratis.py +0 -194
  142. webscout/Provider/TTI/AiForce/README.md +0 -159
  143. webscout/Provider/TTI/AiForce/__init__.py +0 -22
  144. webscout/Provider/TTI/AiForce/async_aiforce.py +0 -224
  145. webscout/Provider/TTI/AiForce/sync_aiforce.py +0 -245
  146. webscout/Provider/TTI/FreeAIPlayground/README.md +0 -99
  147. webscout/Provider/TTI/FreeAIPlayground/__init__.py +0 -9
  148. webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +0 -181
  149. webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +0 -180
  150. webscout/Provider/TTI/ImgSys/README.md +0 -174
  151. webscout/Provider/TTI/ImgSys/__init__.py +0 -23
  152. webscout/Provider/TTI/ImgSys/async_imgsys.py +0 -202
  153. webscout/Provider/TTI/ImgSys/sync_imgsys.py +0 -195
  154. webscout/Provider/TTI/MagicStudio/README.md +0 -101
  155. webscout/Provider/TTI/MagicStudio/__init__.py +0 -2
  156. webscout/Provider/TTI/MagicStudio/async_magicstudio.py +0 -111
  157. webscout/Provider/TTI/MagicStudio/sync_magicstudio.py +0 -109
  158. webscout/Provider/TTI/Nexra/README.md +0 -155
  159. webscout/Provider/TTI/Nexra/__init__.py +0 -22
  160. webscout/Provider/TTI/Nexra/async_nexra.py +0 -286
  161. webscout/Provider/TTI/Nexra/sync_nexra.py +0 -258
  162. webscout/Provider/TTI/PollinationsAI/README.md +0 -146
  163. webscout/Provider/TTI/PollinationsAI/__init__.py +0 -23
  164. webscout/Provider/TTI/PollinationsAI/async_pollinations.py +0 -311
  165. webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +0 -265
  166. webscout/Provider/TTI/aiarta/README.md +0 -134
  167. webscout/Provider/TTI/aiarta/__init__.py +0 -2
  168. webscout/Provider/TTI/aiarta/async_aiarta.py +0 -482
  169. webscout/Provider/TTI/aiarta/sync_aiarta.py +0 -440
  170. webscout/Provider/TTI/artbit/README.md +0 -100
  171. webscout/Provider/TTI/artbit/__init__.py +0 -22
  172. webscout/Provider/TTI/artbit/async_artbit.py +0 -155
  173. webscout/Provider/TTI/artbit/sync_artbit.py +0 -148
  174. webscout/Provider/TTI/fastflux/README.md +0 -129
  175. webscout/Provider/TTI/fastflux/__init__.py +0 -22
  176. webscout/Provider/TTI/fastflux/async_fastflux.py +0 -261
  177. webscout/Provider/TTI/fastflux/sync_fastflux.py +0 -252
  178. webscout/Provider/TTI/huggingface/README.md +0 -114
  179. webscout/Provider/TTI/huggingface/__init__.py +0 -22
  180. webscout/Provider/TTI/huggingface/async_huggingface.py +0 -199
  181. webscout/Provider/TTI/huggingface/sync_huggingface.py +0 -195
  182. webscout/Provider/TTI/piclumen/README.md +0 -161
  183. webscout/Provider/TTI/piclumen/__init__.py +0 -23
  184. webscout/Provider/TTI/piclumen/async_piclumen.py +0 -268
  185. webscout/Provider/TTI/piclumen/sync_piclumen.py +0 -233
  186. webscout/Provider/TTI/pixelmuse/README.md +0 -79
  187. webscout/Provider/TTI/pixelmuse/__init__.py +0 -4
  188. webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +0 -249
  189. webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +0 -182
  190. webscout/Provider/TTI/talkai/README.md +0 -139
  191. webscout/Provider/TTI/talkai/__init__.py +0 -4
  192. webscout/Provider/TTI/talkai/async_talkai.py +0 -229
  193. webscout/Provider/TTI/talkai/sync_talkai.py +0 -207
  194. webscout/Provider/UNFINISHED/oivscode.py +0 -351
  195. webscout-8.2.8.dist-info/RECORD +0 -334
  196. {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/licenses/LICENSE.md +0 -0
  197. {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/top_level.txt +0 -0
@@ -1,200 +0,0 @@
1
- import json
2
- import re
3
- import traceback
4
- from datetime import datetime
5
- from typing import Any, Dict, Optional, Union
6
-
7
- class MessageFormatter:
8
- """Utility class for formatting log messages."""
9
-
10
- @staticmethod
11
- def format_exception(exc_info: tuple) -> str:
12
- """
13
- Format exception information into a readable string.
14
-
15
- Args:
16
- exc_info: Tuple of (type, value, traceback)
17
-
18
- Returns:
19
- Formatted exception string
20
- """
21
- return "".join(traceback.format_exception(*exc_info))
22
-
23
- @staticmethod
24
- def format_dict(data: Dict[str, Any], indent: int = 2) -> str:
25
- """
26
- Format dictionary into pretty-printed string.
27
-
28
- Args:
29
- data: Dictionary to format
30
- indent: Number of spaces for indentation
31
-
32
- Returns:
33
- Formatted string representation
34
- """
35
- return json.dumps(data, indent=indent, default=str, ensure_ascii=False)
36
-
37
- @staticmethod
38
- def format_object(obj: Any) -> str:
39
- """
40
- Format any object into a string representation.
41
-
42
- Args:
43
- obj: Object to format
44
-
45
- Returns:
46
- String representation of object
47
- """
48
- if hasattr(obj, "to_dict"):
49
- return MessageFormatter.format_dict(obj.to_dict())
50
- if hasattr(obj, "__dict__"):
51
- return MessageFormatter.format_dict(obj.__dict__)
52
- return str(obj)
53
-
54
- @staticmethod
55
- def truncate(message: str, max_length: int = 1000, suffix: str = "...") -> str:
56
- """
57
- Truncate message to maximum length.
58
-
59
- Args:
60
- message: Message to truncate
61
- max_length: Maximum length
62
- suffix: String to append when truncated
63
-
64
- Returns:
65
- Truncated message
66
- """
67
- if len(message) <= max_length:
68
- return message
69
- return message[:max_length - len(suffix)] + suffix
70
-
71
- @staticmethod
72
- def mask_sensitive(message: str, patterns: Dict[str, str]) -> str:
73
- """
74
- Mask sensitive information in message.
75
-
76
- Args:
77
- message: Message to process
78
- patterns: Dictionary of {pattern: mask}
79
-
80
- Returns:
81
- Message with sensitive info masked
82
- """
83
- result = message
84
- for pattern, mask in patterns.items():
85
- result = re.sub(pattern, mask, result)
86
- return result
87
-
88
- @staticmethod
89
- def format_context(context: Dict[str, Any]) -> str:
90
- """
91
- Format context dictionary into readable string.
92
-
93
- Args:
94
- context: Context dictionary
95
-
96
- Returns:
97
- Formatted context string
98
- """
99
- parts = []
100
- for key, value in sorted(context.items()):
101
- formatted_value = (
102
- MessageFormatter.format_object(value)
103
- if isinstance(value, (dict, list, tuple))
104
- else str(value)
105
- )
106
- parts.append(f"{key}={formatted_value}")
107
- return " ".join(parts)
108
-
109
- @staticmethod
110
- def format_metrics(metrics: Dict[str, Union[int, float]]) -> str:
111
- """
112
- Format performance metrics into readable string.
113
-
114
- Args:
115
- metrics: Dictionary of metric names and values
116
-
117
- Returns:
118
- Formatted metrics string
119
- """
120
- parts = []
121
- for key, value in sorted(metrics.items()):
122
- if isinstance(value, float):
123
- formatted = f"{value:.3f}"
124
- else:
125
- formatted = str(value)
126
- parts.append(f"{key}={formatted}")
127
- return " ".join(parts)
128
-
129
- @staticmethod
130
- def format_timestamp(
131
- timestamp: Optional[datetime] = None,
132
- format: str = "%Y-%m-%d %H:%M:%S.%f"
133
- ) -> str:
134
- """
135
- Format timestamp into string.
136
-
137
- Args:
138
- timestamp: Datetime object (uses current time if None)
139
- format: strftime format string
140
-
141
- Returns:
142
- Formatted timestamp string
143
- """
144
- if timestamp is None:
145
- timestamp = datetime.now()
146
- return timestamp.strftime(format)
147
-
148
- @classmethod
149
- def format_message(
150
- cls,
151
- message: str,
152
- context: Optional[Dict[str, Any]] = None,
153
- metrics: Optional[Dict[str, Union[int, float]]] = None,
154
- max_length: Optional[int] = None,
155
- mask_patterns: Optional[Dict[str, str]] = None,
156
- timestamp_format: Optional[str] = None
157
- ) -> str:
158
- """
159
- Format complete log message with all options.
160
-
161
- Args:
162
- message: Base message
163
- context: Optional context dictionary
164
- metrics: Optional performance metrics
165
- max_length: Optional maximum length
166
- mask_patterns: Optional sensitive data patterns
167
- timestamp_format: Optional timestamp format
168
-
169
- Returns:
170
- Formatted complete message
171
- """
172
- parts = []
173
-
174
- # Add timestamp
175
- if timestamp_format:
176
- parts.append(cls.format_timestamp(format=timestamp_format))
177
-
178
- # Add main message
179
- parts.append(message)
180
-
181
- # Add context if present
182
- if context:
183
- parts.append(cls.format_context(context))
184
-
185
- # Add metrics if present
186
- if metrics:
187
- parts.append(cls.format_metrics(metrics))
188
-
189
- # Join all parts
190
- result = " ".join(parts)
191
-
192
- # Apply masking if needed
193
- if mask_patterns:
194
- result = cls.mask_sensitive(result, mask_patterns)
195
-
196
- # Apply length limit if needed
197
- if max_length:
198
- result = cls.truncate(result, max_length)
199
-
200
- return result
@@ -1,194 +0,0 @@
1
- from typing import Union, Any, Dict, Generator, Optional
2
- import requests
3
- import json
4
-
5
- from webscout.AIutel import Optimizers, Conversation, AwesomePrompts
6
- from webscout.AIbase import Provider
7
- from webscout import exceptions
8
- from webscout.litagent import LitAgent as Lit
9
-
10
-
11
- class ChatGPTGratis(Provider):
12
- """
13
- A class to interact with the chatgptgratis.eu backend API with real-time streaming.
14
- """
15
- AVAILABLE_MODELS = [
16
- "Meta-Llama-3.2-1B-Instruct",
17
- "Meta-Llama-3.2-3B-Instruct",
18
- "Meta-Llama-3.1-8B-Instruct",
19
- "Meta-Llama-3.1-70B-Instruct",
20
- "Meta-Llama-3.1-405B-Instruct",
21
- "gpt4o"
22
- ]
23
-
24
- def __init__(
25
- self,
26
- model: str = "Meta-Llama-3.2-1B-Instruct",
27
- timeout: int = 30,
28
- proxies: Optional[Dict[str, str]] = None,
29
- intro: Optional[str] = None,
30
- filepath: Optional[str] = None,
31
- update_file: bool = True,
32
- history_offset: int = 10250,
33
- act: Optional[str] = None,
34
- ) -> None:
35
- """
36
- Initializes the ChatGPTGratis.
37
- """
38
- if model not in self.AVAILABLE_MODELS:
39
- raise ValueError(f"Invalid model: {model}. Choose from: {self.AVAILABLE_MODELS}")
40
-
41
- self.session = requests.Session()
42
- self.timeout = timeout
43
- self.api_endpoint = "https://chatgptgratis.eu/backend/chat.php"
44
- self.model = model
45
-
46
- # Set up headers similar to a browser request with dynamic User-Agent
47
- self.headers = {
48
- "Accept": "*/*",
49
- "Content-Type": "application/json",
50
- "Origin": "https://chatgptgratis.eu",
51
- "Referer": "https://chatgptgratis.eu/chat.html",
52
- "User-Agent": Lit().random(),
53
- }
54
- self.session.headers.update(self.headers)
55
- self.session.proxies = proxies or {}
56
-
57
- # Set up conversation history and prompts
58
- Conversation.intro = (
59
- AwesomePrompts().get_act(
60
- act, raise_not_found=True, default=None, case_insensitive=True
61
- )
62
- if act
63
- else intro or Conversation.intro
64
- )
65
- self.conversation = Conversation(
66
- True, 8096, filepath, update_file
67
- )
68
- self.conversation.history_offset = history_offset
69
-
70
- def ask(
71
- self,
72
- prompt: str,
73
- stream: bool = False,
74
- raw: bool = False,
75
- optimizer: Optional[str] = None,
76
- conversationally: bool = False,
77
- ) -> Union[Dict[str, Any], Generator[Any, None, None]]:
78
- """
79
- Sends a request to the API and returns the response.
80
- If stream is True, yields response chunks as they are received.
81
- """
82
- conversation_prompt = self.conversation.gen_complete_prompt(prompt)
83
- if optimizer:
84
- available_opts = (
85
- method for method in dir(Optimizers)
86
- if callable(getattr(Optimizers, method)) and not method.startswith("__")
87
- )
88
- if optimizer in available_opts:
89
- conversation_prompt = getattr(Optimizers, optimizer)(
90
- conversation_prompt if conversationally else prompt
91
- )
92
- else:
93
- raise Exception(f"Optimizer is not one of {list(available_opts)}")
94
-
95
- payload = {
96
- "message": conversation_prompt,
97
- "model": self.model,
98
- }
99
-
100
- def for_stream() -> Generator[Dict[str, Any], None, None]:
101
- response = self.session.post(
102
- self.api_endpoint,
103
- json=payload,
104
- stream=True,
105
- timeout=self.timeout
106
- )
107
- if not response.ok:
108
- raise exceptions.FailedToGenerateResponseError(
109
- f"Failed to generate response - ({response.status_code}, {response.reason}) - {response.text}"
110
- )
111
-
112
- full_response = ""
113
- for line in response.iter_lines():
114
- if line:
115
- line_decoded = line.decode('utf-8').strip()
116
- if line_decoded == "data: [DONE]":
117
- break
118
- if line_decoded.startswith("data: "):
119
- try:
120
- json_data = json.loads(line_decoded[6:])
121
- choices = json_data.get("choices", [])
122
- if choices and "delta" in choices[0]:
123
- content = choices[0]["delta"].get("content", "")
124
- else:
125
- content = ""
126
- full_response += content
127
- yield content if raw else {"text": content}
128
- except json.JSONDecodeError:
129
- continue
130
- # Update last response and conversation history.
131
- self.conversation.update_chat_history(prompt, self.get_message({"text": full_response}))
132
-
133
- def for_non_stream() -> Dict[str, Any]:
134
- collected = ""
135
- for chunk in for_stream():
136
- collected += chunk["text"] if isinstance(chunk, dict) else chunk
137
- return {"text": collected}
138
-
139
- return for_stream() if stream else for_non_stream()
140
-
141
- def chat(
142
- self,
143
- prompt: str,
144
- stream: bool = False,
145
- optimizer: Optional[str] = None,
146
- conversationally: bool = False,
147
- ) -> Union[str, Generator[str, None, None]]:
148
- """
149
- Returns the response as a string.
150
- For streaming requests, yields each response chunk as a string.
151
- """
152
- def stream_response() -> Generator[str, None, None]:
153
- for response in self.ask(
154
- prompt, stream=True, optimizer=optimizer, conversationally=conversationally
155
- ):
156
- yield self.get_message(response)
157
-
158
- def non_stream_response() -> str:
159
- return self.get_message(self.ask(
160
- prompt, stream=False, optimizer=optimizer, conversationally=conversationally
161
- ))
162
-
163
- return stream_response() if stream else non_stream_response()
164
-
165
- def get_message(self, response: dict) -> str:
166
- """
167
- Extracts and returns the text message from the response dictionary.
168
- """
169
- assert isinstance(response, dict), "Response must be a dictionary."
170
- return response.get("text", "")
171
-
172
-
173
- if __name__ == "__main__":
174
- print("-" * 80)
175
- print(f"{'Model':<50} {'Status':<10} {'Response'}")
176
- print("-" * 80)
177
-
178
- for model in ChatGPTGratis.AVAILABLE_MODELS:
179
- try:
180
- test_ai = ChatGPTGratis(model=model, timeout=60)
181
- response = test_ai.chat("Say 'Hello' in one word")
182
- response_text = response
183
-
184
- if response_text and len(response_text.strip()) > 0:
185
- status = "✓"
186
- # Clean and truncate response
187
- clean_text = response_text.strip().encode('utf-8', errors='ignore').decode('utf-8')
188
- display_text = clean_text[:50] + "..." if len(clean_text) > 50 else clean_text
189
- else:
190
- status = "✗"
191
- display_text = "Empty or invalid response"
192
- print(f"{model:<50} {status:<10} {display_text}")
193
- except Exception as e:
194
- print(f"{model:<50} {'✗':<10} {str(e)}")
@@ -1,159 +0,0 @@
1
- # AiForce Provider 🔥
2
-
3
- Yo fam! This is the AiForce provider for generating some fire images! Part of the HelpingAI squad! 👑
4
-
5
- ## Features 💪
6
-
7
- - Both sync and async support ⚡
8
- - 12 fire models to choose from 🎨
9
- - Smart retry mechanism 🔄
10
- - Custom image sizes 📐
11
- - Save with custom names 💾
12
- - Fire logging with cyberpunk theme 🌟
13
- - Proxy support for stealth mode 🕵️‍♂️
14
-
15
- ## Quick Start 🚀
16
-
17
- ### Installation 📦
18
-
19
- ```bash
20
- pip install webscout
21
- ```
22
-
23
- ### Basic Usage 💫
24
-
25
- ```python
26
- # Sync way
27
- from webscout import AiForceimager
28
-
29
- provider = AiForceimager()
30
- images = provider.generate("Epic dragon")
31
- paths = provider.save(images)
32
-
33
- # Async way
34
- from webscout import AsyncAiForceimager
35
- import asyncio
36
-
37
- async def generate():
38
- provider = AsyncAiForceimager()
39
- images = await provider.generate("Cool art")
40
- paths = await provider.save(images)
41
-
42
- asyncio.run(generate())
43
- ```
44
-
45
- ## Available Models 🎭
46
-
47
- | Model | Description | Best For |
48
- |-------|-------------|----------|
49
- | `Flux-1.1-Pro` | Latest pro model (Default) | High quality general purpose |
50
- | `stable-diffusion-xl-lightning` | Fast SDXL model | Quick generations |
51
- | `stable-diffusion-xl-base` | Base SDXL model | High quality base |
52
- | `ideogram` | Artistic model | Creative artwork |
53
- | `flux` | Standard model | General purpose |
54
- | `flux-realism` | Photorealistic model | Realistic images |
55
- | `flux-anime` | Anime style | Anime/manga art |
56
- | `flux-3d` | 3D rendering | 3D objects/scenes |
57
- | `flux-disney` | Disney style | Disney-like art |
58
- | `flux-pixel` | Pixel art | Retro/game art |
59
- | `flux-4o` | 4k output | High resolution |
60
- | `any-dark` | Dark theme | Gothic/dark art |
61
-
62
- ## Advanced Examples 🔥
63
-
64
- ### Custom Settings 🛠️
65
-
66
- ```python
67
- provider = AiForceimager(
68
- timeout=120, # Longer timeout
69
- proxies={
70
- 'http': 'http://proxy.example.com:8080'
71
- }
72
- )
73
- ```
74
-
75
- ### Multiple Images with Custom Size 📸
76
-
77
- ```python
78
- images = provider.generate(
79
- prompt="A shiny red sports car",
80
- amount=3, # Generate 3 images
81
- model="flux-realism", # Use realistic model
82
- width=1024, # Custom width
83
- height=768, # Custom height
84
- seed=42 # For reproducible results
85
- )
86
- ```
87
-
88
- ### Custom Save Options 💾
89
-
90
- ```python
91
- paths = provider.save(
92
- images,
93
- name="sports_car", # Custom name
94
- dir="my_images", # Custom directory
95
- filenames_prefix="v1_" # Add prefix
96
- )
97
- ```
98
-
99
- ### Async with Error Handling ⚡
100
-
101
- ```python
102
- async def generate_safely():
103
- provider = AsyncAiForceimager()
104
- try:
105
- images = await provider.generate(
106
- prompt="Epic dragon",
107
- model="flux-3d",
108
- amount=2
109
- )
110
- paths = await provider.save(images, dir="dragons")
111
- print(f"Saved to: {paths}")
112
- except Exception as e:
113
- print(f"Oops! Something went wrong: {e}")
114
-
115
- asyncio.run(generate_safely())
116
- ```
117
-
118
- ## Tips & Tricks 💡
119
-
120
- 1. Use `flux-realism` for photorealistic images
121
- 2. Use `flux-3d` for product renders
122
- 3. Use `flux-anime` for anime style art
123
- 4. Set custom timeouts for large images
124
- 5. Use proxies for better reliability
125
- 6. Add seed for reproducible results
126
-
127
- ## Error Handling 🛡️
128
-
129
- The provider handles common errors:
130
-
131
- - Network issues
132
- - API timeouts
133
- - Invalid inputs
134
- - File saving errors
135
-
136
- Example with retry:
137
-
138
- ```python
139
- provider = AiForceimager()
140
- try:
141
- images = provider.generate(
142
- "Epic scene",
143
- max_retries=5, # More retries
144
- retry_delay=10 # Longer delay
145
- )
146
- except Exception as e:
147
- print(f"Generation failed: {e}")
148
- ```
149
-
150
- ## Contributing 🤝
151
-
152
- Pull up to the squad! We're always looking for improvements:
153
-
154
- 1. Fork it
155
- 2. Create your feature branch
156
- 3. Push your changes
157
- 4. Hit us with that pull request
158
-
159
- Made with 💖 by the HelpingAI Team
@@ -1,22 +0,0 @@
1
- """
2
- AiForce - Your go-to provider for generating fire images! 🔥
3
-
4
- Examples:
5
- >>> # Sync Usage
6
- >>> from webscout import AiForceimager
7
- >>> provider = AiForceimager()
8
- >>> images = provider.generate("Cool art")
9
- >>> paths = provider.save(images)
10
- >>>
11
- >>> # Async Usage
12
- >>> from webscout import AsyncAiForceimager
13
- >>> async def example():
14
- ... provider = AsyncAiForceimager()
15
- ... images = await provider.generate("Epic dragon")
16
- ... paths = await provider.save(images)
17
- """
18
-
19
- from .sync_aiforce import AiForceimager
20
- from .async_aiforce import AsyncAiForceimager
21
-
22
- __all__ = ["AiForceimager", "AsyncAiForceimager"]