webscout 8.2.8__py3-none-any.whl → 8.2.9__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.
- webscout/AIauto.py +32 -14
- webscout/AIbase.py +96 -37
- webscout/AIutel.py +491 -87
- webscout/Bard.py +441 -323
- webscout/Extra/GitToolkit/__init__.py +10 -10
- webscout/Extra/YTToolkit/ytapi/video.py +232 -232
- webscout/Litlogger/README.md +10 -0
- webscout/Litlogger/__init__.py +7 -59
- webscout/Litlogger/formats.py +4 -0
- webscout/Litlogger/handlers.py +103 -0
- webscout/Litlogger/levels.py +13 -0
- webscout/Litlogger/logger.py +92 -0
- webscout/Provider/AISEARCH/Perplexity.py +332 -358
- webscout/Provider/AISEARCH/felo_search.py +9 -35
- webscout/Provider/AISEARCH/genspark_search.py +30 -56
- webscout/Provider/AISEARCH/hika_search.py +4 -16
- webscout/Provider/AISEARCH/iask_search.py +410 -436
- webscout/Provider/AISEARCH/monica_search.py +4 -30
- webscout/Provider/AISEARCH/scira_search.py +6 -32
- webscout/Provider/AISEARCH/webpilotai_search.py +38 -64
- webscout/Provider/Blackboxai.py +153 -35
- webscout/Provider/Deepinfra.py +339 -339
- webscout/Provider/ExaChat.py +358 -358
- webscout/Provider/Gemini.py +169 -169
- webscout/Provider/GithubChat.py +1 -2
- webscout/Provider/Glider.py +3 -3
- webscout/Provider/HeckAI.py +171 -81
- webscout/Provider/OPENAI/BLACKBOXAI.py +766 -735
- webscout/Provider/OPENAI/Cloudflare.py +7 -7
- webscout/Provider/OPENAI/FreeGemini.py +6 -5
- webscout/Provider/OPENAI/NEMOTRON.py +8 -20
- webscout/Provider/OPENAI/Qwen3.py +283 -0
- webscout/Provider/OPENAI/README.md +952 -1253
- webscout/Provider/OPENAI/TwoAI.py +357 -0
- webscout/Provider/OPENAI/__init__.py +5 -1
- webscout/Provider/OPENAI/ai4chat.py +40 -40
- webscout/Provider/OPENAI/api.py +808 -649
- webscout/Provider/OPENAI/c4ai.py +3 -3
- webscout/Provider/OPENAI/chatgpt.py +555 -555
- webscout/Provider/OPENAI/chatgptclone.py +493 -487
- webscout/Provider/OPENAI/chatsandbox.py +4 -3
- webscout/Provider/OPENAI/copilot.py +242 -0
- webscout/Provider/OPENAI/deepinfra.py +5 -2
- webscout/Provider/OPENAI/e2b.py +63 -5
- webscout/Provider/OPENAI/exaai.py +416 -410
- webscout/Provider/OPENAI/exachat.py +444 -443
- webscout/Provider/OPENAI/freeaichat.py +2 -2
- webscout/Provider/OPENAI/glider.py +5 -2
- webscout/Provider/OPENAI/groq.py +5 -2
- webscout/Provider/OPENAI/heckai.py +308 -307
- webscout/Provider/OPENAI/mcpcore.py +8 -2
- webscout/Provider/OPENAI/multichat.py +4 -4
- webscout/Provider/OPENAI/netwrck.py +6 -5
- webscout/Provider/OPENAI/oivscode.py +287 -0
- webscout/Provider/OPENAI/opkfc.py +496 -496
- webscout/Provider/OPENAI/pydantic_imports.py +172 -0
- webscout/Provider/OPENAI/scirachat.py +15 -9
- webscout/Provider/OPENAI/sonus.py +304 -303
- webscout/Provider/OPENAI/standardinput.py +433 -433
- webscout/Provider/OPENAI/textpollinations.py +4 -4
- webscout/Provider/OPENAI/toolbaz.py +413 -413
- webscout/Provider/OPENAI/typefully.py +3 -3
- webscout/Provider/OPENAI/typegpt.py +11 -5
- webscout/Provider/OPENAI/uncovrAI.py +463 -462
- webscout/Provider/OPENAI/utils.py +90 -79
- webscout/Provider/OPENAI/venice.py +431 -425
- webscout/Provider/OPENAI/wisecat.py +387 -381
- webscout/Provider/OPENAI/writecream.py +3 -3
- webscout/Provider/OPENAI/x0gpt.py +365 -378
- webscout/Provider/OPENAI/yep.py +39 -13
- webscout/Provider/TTI/README.md +55 -101
- webscout/Provider/TTI/__init__.py +4 -9
- webscout/Provider/TTI/aiarta.py +365 -0
- webscout/Provider/TTI/artbit.py +0 -0
- webscout/Provider/TTI/base.py +64 -0
- webscout/Provider/TTI/fastflux.py +200 -0
- webscout/Provider/TTI/magicstudio.py +201 -0
- webscout/Provider/TTI/piclumen.py +203 -0
- webscout/Provider/TTI/pixelmuse.py +225 -0
- webscout/Provider/TTI/pollinations.py +221 -0
- webscout/Provider/TTI/utils.py +11 -0
- webscout/Provider/TTS/__init__.py +2 -1
- webscout/Provider/TTS/base.py +159 -159
- webscout/Provider/TTS/openai_fm.py +129 -0
- webscout/Provider/TextPollinationsAI.py +308 -308
- webscout/Provider/TwoAI.py +239 -44
- webscout/Provider/UNFINISHED/Youchat.py +330 -330
- webscout/Provider/UNFINISHED/puterjs.py +635 -0
- webscout/Provider/UNFINISHED/test_lmarena.py +119 -119
- webscout/Provider/Writecream.py +246 -246
- webscout/Provider/__init__.py +2 -0
- webscout/Provider/ai4chat.py +33 -8
- webscout/Provider/koala.py +169 -169
- webscout/Provider/oivscode.py +309 -0
- webscout/Provider/samurai.py +3 -2
- webscout/Provider/typegpt.py +3 -3
- webscout/Provider/uncovr.py +368 -368
- webscout/client.py +70 -0
- webscout/litprinter/__init__.py +58 -58
- webscout/optimizers.py +419 -419
- webscout/scout/README.md +3 -1
- webscout/scout/core/crawler.py +134 -64
- webscout/scout/core/scout.py +148 -109
- webscout/scout/element.py +106 -88
- webscout/swiftcli/Readme.md +323 -323
- webscout/swiftcli/plugins/manager.py +9 -2
- webscout/version.py +1 -1
- webscout/zeroart/__init__.py +134 -134
- webscout/zeroart/effects.py +100 -100
- webscout/zeroart/fonts.py +1238 -1238
- {webscout-8.2.8.dist-info → webscout-8.2.9.dist-info}/METADATA +159 -35
- {webscout-8.2.8.dist-info → webscout-8.2.9.dist-info}/RECORD +116 -161
- {webscout-8.2.8.dist-info → webscout-8.2.9.dist-info}/WHEEL +1 -1
- {webscout-8.2.8.dist-info → webscout-8.2.9.dist-info}/entry_points.txt +1 -0
- webscout/Litlogger/Readme.md +0 -175
- webscout/Litlogger/core/__init__.py +0 -6
- webscout/Litlogger/core/level.py +0 -23
- webscout/Litlogger/core/logger.py +0 -165
- webscout/Litlogger/handlers/__init__.py +0 -12
- webscout/Litlogger/handlers/console.py +0 -33
- webscout/Litlogger/handlers/file.py +0 -143
- webscout/Litlogger/handlers/network.py +0 -173
- webscout/Litlogger/styles/__init__.py +0 -7
- webscout/Litlogger/styles/colors.py +0 -249
- webscout/Litlogger/styles/formats.py +0 -458
- webscout/Litlogger/styles/text.py +0 -87
- webscout/Litlogger/utils/__init__.py +0 -6
- webscout/Litlogger/utils/detectors.py +0 -153
- webscout/Litlogger/utils/formatters.py +0 -200
- webscout/Provider/TTI/AiForce/README.md +0 -159
- webscout/Provider/TTI/AiForce/__init__.py +0 -22
- webscout/Provider/TTI/AiForce/async_aiforce.py +0 -224
- webscout/Provider/TTI/AiForce/sync_aiforce.py +0 -245
- webscout/Provider/TTI/FreeAIPlayground/README.md +0 -99
- webscout/Provider/TTI/FreeAIPlayground/__init__.py +0 -9
- webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +0 -181
- webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +0 -180
- webscout/Provider/TTI/ImgSys/README.md +0 -174
- webscout/Provider/TTI/ImgSys/__init__.py +0 -23
- webscout/Provider/TTI/ImgSys/async_imgsys.py +0 -202
- webscout/Provider/TTI/ImgSys/sync_imgsys.py +0 -195
- webscout/Provider/TTI/MagicStudio/README.md +0 -101
- webscout/Provider/TTI/MagicStudio/__init__.py +0 -2
- webscout/Provider/TTI/MagicStudio/async_magicstudio.py +0 -111
- webscout/Provider/TTI/MagicStudio/sync_magicstudio.py +0 -109
- webscout/Provider/TTI/Nexra/README.md +0 -155
- webscout/Provider/TTI/Nexra/__init__.py +0 -22
- webscout/Provider/TTI/Nexra/async_nexra.py +0 -286
- webscout/Provider/TTI/Nexra/sync_nexra.py +0 -258
- webscout/Provider/TTI/PollinationsAI/README.md +0 -146
- webscout/Provider/TTI/PollinationsAI/__init__.py +0 -23
- webscout/Provider/TTI/PollinationsAI/async_pollinations.py +0 -311
- webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +0 -265
- webscout/Provider/TTI/aiarta/README.md +0 -134
- webscout/Provider/TTI/aiarta/__init__.py +0 -2
- webscout/Provider/TTI/aiarta/async_aiarta.py +0 -482
- webscout/Provider/TTI/aiarta/sync_aiarta.py +0 -440
- webscout/Provider/TTI/artbit/README.md +0 -100
- webscout/Provider/TTI/artbit/__init__.py +0 -22
- webscout/Provider/TTI/artbit/async_artbit.py +0 -155
- webscout/Provider/TTI/artbit/sync_artbit.py +0 -148
- webscout/Provider/TTI/fastflux/README.md +0 -129
- webscout/Provider/TTI/fastflux/__init__.py +0 -22
- webscout/Provider/TTI/fastflux/async_fastflux.py +0 -261
- webscout/Provider/TTI/fastflux/sync_fastflux.py +0 -252
- webscout/Provider/TTI/huggingface/README.md +0 -114
- webscout/Provider/TTI/huggingface/__init__.py +0 -22
- webscout/Provider/TTI/huggingface/async_huggingface.py +0 -199
- webscout/Provider/TTI/huggingface/sync_huggingface.py +0 -195
- webscout/Provider/TTI/piclumen/README.md +0 -161
- webscout/Provider/TTI/piclumen/__init__.py +0 -23
- webscout/Provider/TTI/piclumen/async_piclumen.py +0 -268
- webscout/Provider/TTI/piclumen/sync_piclumen.py +0 -233
- webscout/Provider/TTI/pixelmuse/README.md +0 -79
- webscout/Provider/TTI/pixelmuse/__init__.py +0 -4
- webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +0 -249
- webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +0 -182
- webscout/Provider/TTI/talkai/README.md +0 -139
- webscout/Provider/TTI/talkai/__init__.py +0 -4
- webscout/Provider/TTI/talkai/async_talkai.py +0 -229
- webscout/Provider/TTI/talkai/sync_talkai.py +0 -207
- webscout/Provider/UNFINISHED/oivscode.py +0 -351
- {webscout-8.2.8.dist-info → webscout-8.2.9.dist-info}/licenses/LICENSE.md +0 -0
- {webscout-8.2.8.dist-info → webscout-8.2.9.dist-info}/top_level.txt +0 -0
webscout/AIauto.py
CHANGED
|
@@ -14,13 +14,16 @@ import inspect
|
|
|
14
14
|
|
|
15
15
|
def load_providers():
|
|
16
16
|
"""
|
|
17
|
-
Dynamically loads all Provider classes from the webscout.Provider package.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
Dynamically loads all Provider classes from the `webscout.Provider` package.
|
|
18
|
+
|
|
19
|
+
This function iterates through the modules in the `webscout.Provider` package,
|
|
20
|
+
imports each module, and inspects its attributes to identify classes that
|
|
21
|
+
inherit from the `Provider` base class. It also identifies providers that
|
|
22
|
+
require special authentication parameters like 'api_key', 'cookie_file', or
|
|
23
|
+
'cookie_path'.
|
|
24
|
+
|
|
22
25
|
Returns:
|
|
23
|
-
tuple: A tuple containing:
|
|
26
|
+
tuple: A tuple containing two elements:
|
|
24
27
|
- provider_map (dict): A dictionary mapping uppercase provider names to their classes.
|
|
25
28
|
- api_key_providers (set): A set of uppercase provider names requiring special authentication.
|
|
26
29
|
"""
|
|
@@ -50,7 +53,10 @@ provider_map, api_key_providers = load_providers()
|
|
|
50
53
|
|
|
51
54
|
class AUTO(Provider):
|
|
52
55
|
"""
|
|
53
|
-
An automatic provider that
|
|
56
|
+
An automatic provider that intelligently selects and utilizes an available
|
|
57
|
+
LLM provider from the webscout library.
|
|
58
|
+
|
|
59
|
+
It cycles through available free providers
|
|
54
60
|
until one successfully processes the request. Excludes providers
|
|
55
61
|
requiring API keys or cookies by default.
|
|
56
62
|
"""
|
|
@@ -69,7 +75,10 @@ class AUTO(Provider):
|
|
|
69
75
|
print_provider_info: bool = False,
|
|
70
76
|
):
|
|
71
77
|
"""
|
|
72
|
-
Initializes the AUTO provider.
|
|
78
|
+
Initializes the AUTO provider, setting up the parameters for provider selection and request handling.
|
|
79
|
+
|
|
80
|
+
This constructor initializes the AUTO provider with various configuration options,
|
|
81
|
+
including conversation settings, request limits, and provider exclusions.
|
|
73
82
|
|
|
74
83
|
Args:
|
|
75
84
|
is_conversation (bool): Flag for conversational mode. Defaults to True.
|
|
@@ -102,14 +111,20 @@ class AUTO(Provider):
|
|
|
102
111
|
@property
|
|
103
112
|
def last_response(self) -> dict[str, Any]:
|
|
104
113
|
"""
|
|
105
|
-
|
|
114
|
+
Retrieves the last response dictionary from the successfully used provider.
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
dict[str, Any]: The last response dictionary, or an empty dictionary if no provider has been used yet.
|
|
106
118
|
"""
|
|
107
119
|
return self.provider.last_response if self.provider else {}
|
|
108
120
|
|
|
109
121
|
@property
|
|
110
122
|
def conversation(self) -> object:
|
|
111
123
|
"""
|
|
112
|
-
|
|
124
|
+
Retrieves the conversation object from the successfully used provider.
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
object: The conversation object, or None if no provider has been used yet.
|
|
113
128
|
"""
|
|
114
129
|
return self.provider.conversation if self.provider else None
|
|
115
130
|
|
|
@@ -122,8 +137,11 @@ class AUTO(Provider):
|
|
|
122
137
|
conversationally: bool = False,
|
|
123
138
|
) -> Union[Dict, Generator]:
|
|
124
139
|
"""
|
|
125
|
-
Sends the prompt to providers,
|
|
126
|
-
|
|
140
|
+
Sends the prompt to available providers, attempting to get a response from each until one succeeds.
|
|
141
|
+
|
|
142
|
+
This method iterates through a shuffled list of available providers (excluding those requiring API keys or
|
|
143
|
+
specified in the exclusion list) and attempts to send the prompt to each provider until a successful response
|
|
144
|
+
is received.
|
|
127
145
|
|
|
128
146
|
Args:
|
|
129
147
|
prompt (str): The user's prompt.
|
|
@@ -187,7 +205,7 @@ class AUTO(Provider):
|
|
|
187
205
|
conversationally: bool = False,
|
|
188
206
|
) -> Union[str, Generator[str, None, None]]:
|
|
189
207
|
"""
|
|
190
|
-
Provides a simplified chat interface, returning the message string
|
|
208
|
+
Provides a simplified chat interface, returning the message string or a generator of message strings.
|
|
191
209
|
|
|
192
210
|
Args:
|
|
193
211
|
prompt (str): The user's prompt.
|
|
@@ -218,7 +236,7 @@ class AUTO(Provider):
|
|
|
218
236
|
Extracts the message text from the provider's response dictionary.
|
|
219
237
|
|
|
220
238
|
Args:
|
|
221
|
-
response (dict): The response dictionary from the ask method.
|
|
239
|
+
response (dict): The response dictionary obtained from the `ask` method.
|
|
222
240
|
|
|
223
241
|
Returns:
|
|
224
242
|
str: The extracted message string.
|
webscout/AIbase.py
CHANGED
|
@@ -1,13 +1,37 @@
|
|
|
1
1
|
from abc import ABC, abstractmethod
|
|
2
2
|
from pathlib import Path
|
|
3
|
-
from typing import AsyncGenerator, List, Union, Generator, Optional
|
|
3
|
+
from typing import AsyncGenerator, Dict, List, Union, Generator, Optional
|
|
4
4
|
from typing_extensions import TypeAlias
|
|
5
5
|
|
|
6
6
|
# Type aliases for better readability
|
|
7
7
|
Response: TypeAlias = dict[str, Union[str, bool, None]]
|
|
8
|
-
ImageData: TypeAlias = Union[bytes, str, Generator[bytes, None, None]]
|
|
9
8
|
AsyncImageData: TypeAlias = Union[bytes, str, AsyncGenerator[bytes, None]]
|
|
10
9
|
|
|
10
|
+
class SearchResponse:
|
|
11
|
+
"""A wrapper class for search API responses.
|
|
12
|
+
|
|
13
|
+
This class automatically converts response objects to their text representation
|
|
14
|
+
when printed or converted to string.
|
|
15
|
+
|
|
16
|
+
Attributes:
|
|
17
|
+
text (str): The text content of the response
|
|
18
|
+
|
|
19
|
+
Example:
|
|
20
|
+
>>> response = SearchResponse("Hello, world!")
|
|
21
|
+
>>> print(response)
|
|
22
|
+
Hello, world!
|
|
23
|
+
>>> str(response)
|
|
24
|
+
'Hello, world!'
|
|
25
|
+
"""
|
|
26
|
+
def __init__(self, text: str):
|
|
27
|
+
self.text = text
|
|
28
|
+
|
|
29
|
+
def __str__(self):
|
|
30
|
+
return self.text
|
|
31
|
+
|
|
32
|
+
def __repr__(self):
|
|
33
|
+
return self.text
|
|
34
|
+
|
|
11
35
|
class AIProviderError(Exception):
|
|
12
36
|
pass
|
|
13
37
|
|
|
@@ -213,48 +237,83 @@ class AsyncTTSProvider(ABC):
|
|
|
213
237
|
async with aiofiles.open(audio_file, 'rb') as f:
|
|
214
238
|
while chunk := await f.read(chunk_size):
|
|
215
239
|
yield chunk
|
|
216
|
-
|
|
217
|
-
class
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
name: Optional[str] = None,
|
|
228
|
-
dir: Optional[Union[str, Path]] = None
|
|
229
|
-
) -> List[str]:
|
|
230
|
-
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
231
|
-
|
|
232
|
-
class AsyncImageProvider(ABC):
|
|
233
|
-
|
|
240
|
+
|
|
241
|
+
class AISearch(ABC):
|
|
242
|
+
"""Abstract base class for AI-powered search providers.
|
|
243
|
+
|
|
244
|
+
This class defines the interface for AI search providers that can perform
|
|
245
|
+
web searches and return AI-generated responses based on search results.
|
|
246
|
+
|
|
247
|
+
All search providers should inherit from this class and implement the
|
|
248
|
+
required methods.
|
|
249
|
+
"""
|
|
250
|
+
|
|
234
251
|
@abstractmethod
|
|
235
|
-
|
|
252
|
+
def search(
|
|
236
253
|
self,
|
|
237
254
|
prompt: str,
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
255
|
+
stream: bool = False,
|
|
256
|
+
raw: bool = False,
|
|
257
|
+
) -> Union[SearchResponse, Generator[Union[Dict[str, str], SearchResponse], None, None]]:
|
|
258
|
+
"""Search using the provider's API and get AI-generated responses.
|
|
259
|
+
|
|
260
|
+
This method sends a search query to the provider and returns the AI-generated response.
|
|
261
|
+
It supports both streaming and non-streaming modes, as well as raw response format.
|
|
262
|
+
|
|
263
|
+
Args:
|
|
264
|
+
prompt (str): The search query or prompt to send to the API.
|
|
265
|
+
stream (bool, optional): If True, yields response chunks as they arrive.
|
|
266
|
+
If False, returns complete response. Defaults to False.
|
|
267
|
+
raw (bool, optional): If True, returns raw response dictionaries.
|
|
268
|
+
If False, returns SearchResponse objects that convert to text automatically.
|
|
269
|
+
Defaults to False.
|
|
270
|
+
|
|
271
|
+
Returns:
|
|
272
|
+
Union[SearchResponse, Generator[Union[Dict[str, str], SearchResponse], None, None]]:
|
|
273
|
+
- If stream=False: Returns complete response as SearchResponse object
|
|
274
|
+
- If stream=True: Yields response chunks as either Dict or SearchResponse objects
|
|
275
|
+
|
|
276
|
+
Raises:
|
|
277
|
+
APIConnectionError: If the API request fails
|
|
278
|
+
"""
|
|
249
279
|
raise NotImplementedError("Method needs to be implemented in subclass")
|
|
250
280
|
|
|
251
|
-
class
|
|
252
|
-
|
|
281
|
+
class AsyncAISearch(ABC):
|
|
282
|
+
"""Abstract base class for asynchronous AI-powered search providers.
|
|
283
|
+
|
|
284
|
+
This class defines the interface for asynchronous AI search providers that can perform
|
|
285
|
+
web searches and return AI-generated responses based on search results.
|
|
286
|
+
|
|
287
|
+
All asynchronous search providers should inherit from this class and implement the
|
|
288
|
+
required methods.
|
|
289
|
+
"""
|
|
290
|
+
|
|
253
291
|
@abstractmethod
|
|
254
|
-
def search(
|
|
292
|
+
async def search(
|
|
255
293
|
self,
|
|
256
294
|
prompt: str,
|
|
257
295
|
stream: bool = False,
|
|
258
296
|
raw: bool = False,
|
|
259
|
-
) ->
|
|
260
|
-
|
|
297
|
+
) -> Union[SearchResponse, AsyncGenerator[Union[Dict[str, str], SearchResponse], None]]:
|
|
298
|
+
"""Search using the provider's API and get AI-generated responses asynchronously.
|
|
299
|
+
|
|
300
|
+
This method sends a search query to the provider and returns the AI-generated response.
|
|
301
|
+
It supports both streaming and non-streaming modes, as well as raw response format.
|
|
302
|
+
|
|
303
|
+
Args:
|
|
304
|
+
prompt (str): The search query or prompt to send to the API.
|
|
305
|
+
stream (bool, optional): If True, yields response chunks as they arrive.
|
|
306
|
+
If False, returns complete response. Defaults to False.
|
|
307
|
+
raw (bool, optional): If True, returns raw response dictionaries.
|
|
308
|
+
If False, returns SearchResponse objects that convert to text automatically.
|
|
309
|
+
Defaults to False.
|
|
310
|
+
|
|
311
|
+
Returns:
|
|
312
|
+
Union[SearchResponse, AsyncGenerator[Union[Dict[str, str], SearchResponse], None]]:
|
|
313
|
+
- If stream=False: Returns complete response as SearchResponse object
|
|
314
|
+
- If stream=True: Yields response chunks as either Dict or SearchResponse objects
|
|
315
|
+
|
|
316
|
+
Raises:
|
|
317
|
+
APIConnectionError: If the API request fails
|
|
318
|
+
"""
|
|
319
|
+
raise NotImplementedError("Method needs to be implemented in subclass")
|