webscout 7.7__py3-none-any.whl → 7.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.
Potentially problematic release.
This version of webscout might be problematic. Click here for more details.
- webscout/AIutel.py +2 -1
- webscout/Bard.py +12 -29
- webscout/DWEBS.py +477 -461
- webscout/Extra/__init__.py +2 -0
- webscout/Extra/autocoder/__init__.py +9 -9
- webscout/Extra/autocoder/{rawdog.py → autocoder.py} +849 -790
- webscout/Extra/autocoder/autocoder_utiles.py +332 -194
- webscout/Extra/gguf.py +682 -682
- webscout/Extra/tempmail/__init__.py +26 -0
- webscout/Extra/tempmail/async_utils.py +141 -0
- webscout/Extra/tempmail/base.py +156 -0
- webscout/Extra/tempmail/cli.py +187 -0
- webscout/Extra/tempmail/mail_tm.py +361 -0
- webscout/Extra/tempmail/temp_mail_io.py +292 -0
- webscout/Provider/AI21.py +1 -1
- webscout/Provider/AISEARCH/DeepFind.py +2 -2
- webscout/Provider/AISEARCH/ISou.py +2 -2
- webscout/Provider/AISEARCH/felo_search.py +6 -6
- webscout/Provider/AISEARCH/genspark_search.py +1 -1
- webscout/Provider/Aitopia.py +292 -0
- webscout/Provider/AllenAI.py +1 -1
- webscout/Provider/Andi.py +3 -3
- webscout/Provider/C4ai.py +1 -1
- webscout/Provider/ChatGPTES.py +3 -5
- webscout/Provider/ChatGPTGratis.py +4 -4
- webscout/Provider/Chatify.py +2 -2
- webscout/Provider/Cloudflare.py +3 -2
- webscout/Provider/DeepSeek.py +2 -2
- webscout/Provider/Deepinfra.py +288 -286
- webscout/Provider/ElectronHub.py +709 -634
- webscout/Provider/ExaChat.py +325 -0
- webscout/Provider/Free2GPT.py +2 -2
- webscout/Provider/Gemini.py +167 -179
- webscout/Provider/GithubChat.py +1 -1
- webscout/Provider/Glider.py +4 -4
- webscout/Provider/Groq.py +41 -27
- webscout/Provider/HF_space/qwen_qwen2.py +1 -1
- webscout/Provider/HeckAI.py +1 -1
- webscout/Provider/HuggingFaceChat.py +1 -1
- webscout/Provider/Hunyuan.py +1 -1
- webscout/Provider/Jadve.py +3 -3
- webscout/Provider/Koboldai.py +3 -3
- webscout/Provider/LambdaChat.py +3 -2
- webscout/Provider/Llama.py +3 -5
- webscout/Provider/Llama3.py +4 -12
- webscout/Provider/Marcus.py +3 -3
- webscout/Provider/OLLAMA.py +8 -8
- webscout/Provider/Openai.py +7 -3
- webscout/Provider/PI.py +1 -1
- webscout/Provider/Perplexitylabs.py +1 -1
- webscout/Provider/Phind.py +1 -1
- webscout/Provider/PizzaGPT.py +1 -1
- webscout/Provider/QwenLM.py +4 -7
- webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +3 -1
- webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +3 -3
- webscout/Provider/TTI/ImgSys/__init__.py +23 -0
- webscout/Provider/TTI/ImgSys/async_imgsys.py +202 -0
- webscout/Provider/TTI/ImgSys/sync_imgsys.py +195 -0
- webscout/Provider/TTI/__init__.py +3 -1
- webscout/Provider/TTI/artbit/async_artbit.py +1 -1
- webscout/Provider/TTI/artbit/sync_artbit.py +1 -1
- webscout/Provider/TTI/huggingface/async_huggingface.py +1 -1
- webscout/Provider/TTI/huggingface/sync_huggingface.py +1 -1
- webscout/Provider/TTI/piclumen/__init__.py +22 -22
- webscout/Provider/TTI/piclumen/sync_piclumen.py +232 -232
- webscout/Provider/TTI/pixelmuse/__init__.py +4 -0
- webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +249 -0
- webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +182 -0
- webscout/Provider/TTI/talkai/sync_talkai.py +1 -1
- webscout/Provider/TTS/utils.py +1 -1
- webscout/Provider/TeachAnything.py +1 -1
- webscout/Provider/TextPollinationsAI.py +232 -230
- webscout/Provider/TwoAI.py +1 -2
- webscout/Provider/Venice.py +4 -2
- webscout/Provider/VercelAI.py +234 -0
- webscout/Provider/WebSim.py +3 -2
- webscout/Provider/WiseCat.py +10 -12
- webscout/Provider/Youchat.py +1 -1
- webscout/Provider/__init__.py +10 -4
- webscout/Provider/ai4chat.py +1 -1
- webscout/Provider/aimathgpt.py +2 -6
- webscout/Provider/akashgpt.py +1 -1
- webscout/Provider/askmyai.py +4 -4
- webscout/Provider/{DARKAI.py → asksteve.py} +56 -77
- webscout/Provider/bagoodex.py +2 -2
- webscout/Provider/cerebras.py +1 -1
- webscout/Provider/chatglm.py +4 -4
- webscout/Provider/cleeai.py +1 -0
- webscout/Provider/copilot.py +21 -9
- webscout/Provider/elmo.py +1 -1
- webscout/Provider/flowith.py +1 -1
- webscout/Provider/freeaichat.py +64 -31
- webscout/Provider/gaurish.py +3 -5
- webscout/Provider/geminiprorealtime.py +1 -1
- webscout/Provider/granite.py +4 -4
- webscout/Provider/hermes.py +5 -5
- webscout/Provider/julius.py +1 -1
- webscout/Provider/koala.py +1 -1
- webscout/Provider/lepton.py +1 -1
- webscout/Provider/llama3mitril.py +4 -4
- webscout/Provider/llamatutor.py +1 -1
- webscout/Provider/llmchat.py +3 -3
- webscout/Provider/meta.py +1 -1
- webscout/Provider/multichat.py +10 -10
- webscout/Provider/promptrefine.py +1 -1
- webscout/Provider/searchchat.py +293 -0
- webscout/Provider/sonus.py +2 -2
- webscout/Provider/talkai.py +2 -2
- webscout/Provider/turboseek.py +1 -1
- webscout/Provider/tutorai.py +1 -1
- webscout/Provider/typegpt.py +5 -42
- webscout/Provider/uncovr.py +312 -297
- webscout/Provider/x0gpt.py +1 -1
- webscout/Provider/yep.py +64 -12
- webscout/__init__.py +3 -1
- webscout/cli.py +59 -98
- webscout/conversation.py +350 -17
- webscout/litprinter/__init__.py +59 -667
- webscout/optimizers.py +419 -419
- webscout/tempid.py +11 -11
- webscout/update_checker.py +14 -12
- webscout/utils.py +2 -2
- webscout/version.py +1 -1
- webscout/webscout_search.py +146 -87
- webscout/webscout_search_async.py +148 -27
- {webscout-7.7.dist-info → webscout-7.9.dist-info}/METADATA +92 -66
- webscout-7.9.dist-info/RECORD +248 -0
- webscout/Provider/EDITEE.py +0 -192
- webscout/litprinter/colors.py +0 -54
- webscout-7.7.dist-info/RECORD +0 -234
- {webscout-7.7.dist-info → webscout-7.9.dist-info}/LICENSE.md +0 -0
- {webscout-7.7.dist-info → webscout-7.9.dist-info}/WHEEL +0 -0
- {webscout-7.7.dist-info → webscout-7.9.dist-info}/entry_points.txt +0 -0
- {webscout-7.7.dist-info → webscout-7.9.dist-info}/top_level.txt +0 -0
|
@@ -9,14 +9,14 @@ from itertools import cycle
|
|
|
9
9
|
from random import choice, shuffle
|
|
10
10
|
from time import time
|
|
11
11
|
from types import TracebackType
|
|
12
|
-
from typing import Any, Dict, List, Optional, Type, Union, cast
|
|
12
|
+
from typing import Any, Dict, List, Optional, Type, Union, cast, AsyncIterator
|
|
13
13
|
|
|
14
14
|
import httpx
|
|
15
15
|
from lxml.etree import _Element
|
|
16
16
|
from lxml.html import HTMLParser as LHTMLParser
|
|
17
17
|
from lxml.html import document_fromstring
|
|
18
18
|
|
|
19
|
-
from .exceptions import RatelimitE, TimeoutE, WebscoutE
|
|
19
|
+
from .exceptions import ConversationLimitException, RatelimitE, TimeoutE, WebscoutE
|
|
20
20
|
from .utils import (
|
|
21
21
|
_expand_proxy_tb_alias,
|
|
22
22
|
_extract_vqd,
|
|
@@ -35,15 +35,23 @@ class AsyncWEBS:
|
|
|
35
35
|
"chrome_100", "chrome_101", "chrome_104", "chrome_105", "chrome_106", "chrome_107",
|
|
36
36
|
"chrome_108", "chrome_109", "chrome_114", "chrome_116", "chrome_117", "chrome_118",
|
|
37
37
|
"chrome_119", "chrome_120", "chrome_123", "chrome_124", "chrome_126", "chrome_127",
|
|
38
|
-
"chrome_128", "chrome_129", "chrome_130", "chrome_131",
|
|
38
|
+
"chrome_128", "chrome_129", "chrome_130", "chrome_131", "chrome_133",
|
|
39
39
|
"safari_ios_16.5", "safari_ios_17.2", "safari_ios_17.4.1", "safari_ios_18.1.1",
|
|
40
40
|
"safari_15.3", "safari_15.5", "safari_15.6.1", "safari_16", "safari_16.5",
|
|
41
41
|
"safari_17.0", "safari_17.2.1", "safari_17.4.1", "safari_17.5",
|
|
42
42
|
"safari_18", "safari_18.2",
|
|
43
43
|
"safari_ipad_18",
|
|
44
44
|
"edge_101", "edge_122", "edge_127", "edge_131",
|
|
45
|
-
"firefox_109", "firefox_117", "firefox_128", "firefox_133",
|
|
45
|
+
"firefox_109", "firefox_117", "firefox_128", "firefox_133", "firefox_135",
|
|
46
46
|
)
|
|
47
|
+
_impersonates_os = ("android", "ios", "linux", "macos", "windows")
|
|
48
|
+
_chat_models = {
|
|
49
|
+
"gpt-4o-mini": "gpt-4o-mini",
|
|
50
|
+
"llama-3.3-70b": "meta-llama/Llama-3.3-70B-Instruct-Turbo",
|
|
51
|
+
"claude-3-haiku": "claude-3-haiku-20240307",
|
|
52
|
+
"o3-mini": "o3-mini",
|
|
53
|
+
"mistral-small-3": "mistralai/Mistral-Small-24B-Instruct-2501",
|
|
54
|
+
}
|
|
47
55
|
|
|
48
56
|
def __init__(
|
|
49
57
|
self,
|
|
@@ -51,6 +59,7 @@ class AsyncWEBS:
|
|
|
51
59
|
proxy: Optional[str] = None,
|
|
52
60
|
proxies: Union[Dict[str, str], str, None] = None, # deprecated
|
|
53
61
|
timeout: Optional[int] = 10,
|
|
62
|
+
verify: bool = True,
|
|
54
63
|
) -> None:
|
|
55
64
|
"""Initialize the AsyncWEBS object.
|
|
56
65
|
|
|
@@ -59,8 +68,10 @@ class AsyncWEBS:
|
|
|
59
68
|
proxy (str, optional): proxy for the HTTP client, supports http/https/socks5 protocols.
|
|
60
69
|
example: "http://user:pass@example.com:3128". Defaults to None.
|
|
61
70
|
timeout (int, optional): Timeout value for the HTTP client. Defaults to 10.
|
|
71
|
+
verify (bool): SSL verification when making the request. Defaults to True.
|
|
62
72
|
"""
|
|
63
|
-
|
|
73
|
+
ddgs_proxy: Optional[str] = os.environ.get("DDGS_PROXY")
|
|
74
|
+
self.proxy: Optional[str] = ddgs_proxy if ddgs_proxy else _expand_proxy_tb_alias(proxy)
|
|
64
75
|
assert self.proxy is None or isinstance(self.proxy, str), "proxy must be a str"
|
|
65
76
|
if not proxy and proxies:
|
|
66
77
|
warnings.warn("'proxies' is deprecated, use 'proxy' instead.", stacklevel=1)
|
|
@@ -87,11 +98,18 @@ class AsyncWEBS:
|
|
|
87
98
|
headers=self.headers,
|
|
88
99
|
proxies=self.proxy,
|
|
89
100
|
timeout=timeout,
|
|
90
|
-
follow_redirects=
|
|
91
|
-
verify=
|
|
101
|
+
follow_redirects=False,
|
|
102
|
+
verify=verify,
|
|
92
103
|
)
|
|
93
104
|
self.sleep_timestamp = 0.0
|
|
94
105
|
|
|
106
|
+
self._exception_event = asyncio.Event()
|
|
107
|
+
self._chat_messages: List[Dict[str, str]] = []
|
|
108
|
+
self._chat_tokens_count = 0
|
|
109
|
+
self._chat_vqd: str = ""
|
|
110
|
+
self._chat_vqd_hash: str = ""
|
|
111
|
+
self._chat_xfe: str = ""
|
|
112
|
+
|
|
95
113
|
async def __aenter__(self) -> AsyncWEBS:
|
|
96
114
|
return self
|
|
97
115
|
|
|
@@ -108,9 +126,9 @@ class AsyncWEBS:
|
|
|
108
126
|
"""Get HTML parser."""
|
|
109
127
|
return LHTMLParser(remove_blank_text=True, remove_comments=True, remove_pis=True, collect_ids=False)
|
|
110
128
|
|
|
111
|
-
async def _sleep(self, sleeptime: float =
|
|
129
|
+
async def _sleep(self, sleeptime: float = 0.75) -> None:
|
|
112
130
|
"""Sleep between API requests."""
|
|
113
|
-
delay =
|
|
131
|
+
delay = 0.0 if not self.sleep_timestamp else 0.0 if time() - self.sleep_timestamp >= 20 else sleeptime
|
|
114
132
|
self.sleep_timestamp = time()
|
|
115
133
|
await asyncio.sleep(delay)
|
|
116
134
|
|
|
@@ -121,41 +139,144 @@ class AsyncWEBS:
|
|
|
121
139
|
params: Optional[Dict[str, str]] = None,
|
|
122
140
|
content: Optional[bytes] = None,
|
|
123
141
|
data: Optional[Dict[str, str]] = None,
|
|
124
|
-
|
|
142
|
+
headers: Optional[Dict[str, str]] = None,
|
|
143
|
+
cookies: Optional[Dict[str, str]] = None,
|
|
144
|
+
json: Any = None,
|
|
145
|
+
timeout: Optional[float] = None,
|
|
146
|
+
) -> Any:
|
|
125
147
|
"""Make HTTP request with proper rate limiting."""
|
|
126
148
|
await self._sleep()
|
|
127
149
|
try:
|
|
128
|
-
resp = await self.client.request(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
150
|
+
resp = await self.client.request(
|
|
151
|
+
method,
|
|
152
|
+
url,
|
|
153
|
+
params=params,
|
|
154
|
+
content=content,
|
|
155
|
+
data=data,
|
|
156
|
+
headers=headers,
|
|
157
|
+
cookies=cookies,
|
|
158
|
+
json=json,
|
|
159
|
+
timeout=timeout or self.timeout,
|
|
160
|
+
)
|
|
135
161
|
except Exception as ex:
|
|
136
162
|
if "time" in str(ex).lower():
|
|
137
163
|
raise TimeoutE(f"{url} {type(ex).__name__}: {ex}") from ex
|
|
138
164
|
raise WebscoutE(f"{url} {type(ex).__name__}: {ex}") from ex
|
|
139
165
|
|
|
140
166
|
if resp.status_code == 200:
|
|
141
|
-
return resp
|
|
142
|
-
elif resp.status_code in (202, 301, 403, 429,
|
|
143
|
-
raise RatelimitE(f"{url} {resp.status_code} Ratelimit
|
|
144
|
-
raise WebscoutE(f"{url} return None. {params=} {content=} {data=}")
|
|
167
|
+
return resp
|
|
168
|
+
elif resp.status_code in (202, 301, 403, 400, 429, 418):
|
|
169
|
+
raise RatelimitE(f"{resp.url} {resp.status_code} Ratelimit")
|
|
170
|
+
raise WebscoutE(f"{resp.url} return None. {params=} {content=} {data=}")
|
|
171
|
+
|
|
172
|
+
async def _get_vqd(self, keywords: str) -> str:
|
|
173
|
+
"""Get vqd value for a search query."""
|
|
174
|
+
resp_content = (await self._get_url("GET", "https://duckduckgo.com", params={"q": keywords})).content
|
|
175
|
+
return _extract_vqd(resp_content, keywords)
|
|
176
|
+
|
|
177
|
+
async def achat_yield(self, keywords: str, model: str = "gpt-4o-mini", timeout: int = 30) -> AsyncIterator[str]:
|
|
178
|
+
"""Initiates an async chat session with webscout AI.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
keywords (str): The initial message or question to send to the AI.
|
|
182
|
+
model (str): The model to use: "gpt-4o-mini", "llama-3.3-70b", "claude-3-haiku",
|
|
183
|
+
"o3-mini", "mistral-small-3". Defaults to "gpt-4o-mini".
|
|
184
|
+
timeout (int): Timeout value for the HTTP client. Defaults to 30.
|
|
185
|
+
|
|
186
|
+
Yields:
|
|
187
|
+
str: Chunks of the response from the AI.
|
|
188
|
+
"""
|
|
189
|
+
# x-fe-version
|
|
190
|
+
if not self._chat_xfe:
|
|
191
|
+
resp_content = (await self._get_url(
|
|
192
|
+
method="GET",
|
|
193
|
+
url="https://duckduckgo.com/?q=DuckDuckGo+AI+Chat&ia=chat&duckai=1",
|
|
194
|
+
)).content
|
|
195
|
+
try:
|
|
196
|
+
xfe1 = resp_content.split(b'__DDG_BE_VERSION__="', maxsplit=1)[1].split(b'"', maxsplit=1)[0].decode()
|
|
197
|
+
xfe2 = resp_content.split(b'__DDG_FE_CHAT_HASH__="', maxsplit=1)[1].split(b'"', maxsplit=1)[0].decode()
|
|
198
|
+
self._chat_xfe = f"{xfe1}-{xfe2}"
|
|
199
|
+
except Exception as ex:
|
|
200
|
+
raise WebscoutE(
|
|
201
|
+
f"achat_yield() Error to get _chat_xfe: {type(ex).__name__}: {ex}"
|
|
202
|
+
) from ex
|
|
203
|
+
# vqd
|
|
204
|
+
if not self._chat_vqd:
|
|
205
|
+
resp = await self._get_url(
|
|
206
|
+
method="GET", url="https://duckduckgo.com/duckchat/v1/status", headers={"x-vqd-accept": "1"}
|
|
207
|
+
)
|
|
208
|
+
self._chat_vqd = resp.headers.get("x-vqd-4", "")
|
|
209
|
+
self._chat_vqd_hash = resp.headers.get("x-vqd-hash-1", "")
|
|
210
|
+
|
|
211
|
+
self._chat_messages.append({"role": "user", "content": keywords})
|
|
212
|
+
self._chat_tokens_count += max(len(keywords) // 4, 1) # approximate number of tokens
|
|
213
|
+
if model not in self._chat_models:
|
|
214
|
+
warnings.warn(f"{model=} is unavailable. Using 'gpt-4o-mini'", stacklevel=1)
|
|
215
|
+
model = "gpt-4o-mini"
|
|
216
|
+
json_data = {
|
|
217
|
+
"model": self._chat_models[model],
|
|
218
|
+
"messages": self._chat_messages,
|
|
219
|
+
}
|
|
220
|
+
resp = await self._get_url(
|
|
221
|
+
method="POST",
|
|
222
|
+
url="https://duckduckgo.com/duckchat/v1/chat",
|
|
223
|
+
headers={
|
|
224
|
+
"x-fe-version": self._chat_xfe,
|
|
225
|
+
"x-vqd-4": self._chat_vqd,
|
|
226
|
+
"x-vqd-hash-1": "",
|
|
227
|
+
},
|
|
228
|
+
json=json_data,
|
|
229
|
+
timeout=timeout,
|
|
230
|
+
)
|
|
231
|
+
self._chat_vqd = resp.headers.get("x-vqd-4", "")
|
|
232
|
+
self._chat_vqd_hash = resp.headers.get("x-vqd-hash-1", "")
|
|
233
|
+
chunks = []
|
|
234
|
+
try:
|
|
235
|
+
async for chunk in resp.aiter_bytes():
|
|
236
|
+
lines = chunk.split(b"data:")
|
|
237
|
+
for line in lines:
|
|
238
|
+
if line := line.strip():
|
|
239
|
+
if line == b"[DONE]":
|
|
240
|
+
break
|
|
241
|
+
if line == b"[DONE][LIMIT_CONVERSATION]":
|
|
242
|
+
raise ConversationLimitException("ERR_CONVERSATION_LIMIT")
|
|
243
|
+
x = json_loads(line)
|
|
244
|
+
if isinstance(x, dict):
|
|
245
|
+
if x.get("action") == "error":
|
|
246
|
+
err_message = x.get("type", "")
|
|
247
|
+
if x.get("status") == 429:
|
|
248
|
+
raise (
|
|
249
|
+
ConversationLimitException(err_message)
|
|
250
|
+
if err_message == "ERR_CONVERSATION_LIMIT"
|
|
251
|
+
else RatelimitE(err_message)
|
|
252
|
+
)
|
|
253
|
+
raise WebscoutE(err_message)
|
|
254
|
+
elif message := x.get("message"):
|
|
255
|
+
chunks.append(message)
|
|
256
|
+
yield message
|
|
257
|
+
except Exception as ex:
|
|
258
|
+
raise WebscoutE(f"achat_yield() {type(ex).__name__}: {ex}") from ex
|
|
145
259
|
|
|
146
|
-
|
|
147
|
-
"""
|
|
260
|
+
result = "".join(chunks)
|
|
261
|
+
self._chat_messages.append({"role": "assistant", "content": result})
|
|
262
|
+
self._chat_tokens_count += len(result)
|
|
263
|
+
|
|
264
|
+
async def achat(self, keywords: str, model: str = "gpt-4o-mini", timeout: int = 30) -> str:
|
|
265
|
+
"""Initiates an async chat session with webscout AI.
|
|
148
266
|
|
|
149
267
|
Args:
|
|
150
268
|
keywords (str): The initial message or question to send to the AI.
|
|
151
|
-
model (str): The model to use: "gpt-4o-mini", "
|
|
152
|
-
Defaults to "gpt-4o-mini".
|
|
269
|
+
model (str): The model to use: "gpt-4o-mini", "llama-3.3-70b", "claude-3-haiku",
|
|
270
|
+
"o3-mini", "mistral-small-3". Defaults to "gpt-4o-mini".
|
|
271
|
+
timeout (int): Timeout value for the HTTP client. Defaults to 30.
|
|
153
272
|
|
|
154
273
|
Returns:
|
|
155
274
|
str: The response from the AI.
|
|
156
275
|
"""
|
|
157
|
-
|
|
158
|
-
|
|
276
|
+
chunks = []
|
|
277
|
+
async for chunk in self.achat_yield(keywords, model, timeout):
|
|
278
|
+
chunks.append(chunk)
|
|
279
|
+
return "".join(chunks)
|
|
159
280
|
|
|
160
281
|
async def atext(
|
|
161
282
|
self,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: webscout
|
|
3
|
-
Version: 7.
|
|
3
|
+
Version: 7.9
|
|
4
4
|
Summary: Search for anything using Google, DuckDuckGo, phind.com, Contains AI models, can transcribe yt videos, temporary email and phone number generation, has TTS support, webai (terminal gpt and open interpreter) and offline LLMs and more
|
|
5
5
|
Author: OEvortex
|
|
6
6
|
Author-email: helpingai5@gmail.com
|
|
@@ -13,7 +13,6 @@ Classifier: Intended Audience :: Developers
|
|
|
13
13
|
Classifier: License :: Other/Proprietary License
|
|
14
14
|
Classifier: Operating System :: OS Independent
|
|
15
15
|
Classifier: Programming Language :: Python :: 3
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.9
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.10
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.11
|
|
@@ -22,7 +21,7 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
22
21
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
23
22
|
Classifier: Topic :: Internet :: WWW/HTTP :: Indexing/Search
|
|
24
23
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
25
|
-
Requires-Python: >=3.
|
|
24
|
+
Requires-Python: >=3.9
|
|
26
25
|
Description-Content-Type: text/markdown
|
|
27
26
|
License-File: LICENSE.md
|
|
28
27
|
Requires-Dist: setuptools
|
|
@@ -43,14 +42,12 @@ Requires-Dist: lxml>=5.2.2
|
|
|
43
42
|
Requires-Dist: termcolor
|
|
44
43
|
Requires-Dist: orjson
|
|
45
44
|
Requires-Dist: PyYAML
|
|
46
|
-
Requires-Dist: tls-client
|
|
47
45
|
Requires-Dist: ollama
|
|
48
46
|
Requires-Dist: pillow
|
|
49
47
|
Requires-Dist: bson
|
|
50
48
|
Requires-Dist: cloudscraper
|
|
51
49
|
Requires-Dist: html5lib
|
|
52
50
|
Requires-Dist: aiofiles
|
|
53
|
-
Requires-Dist: emoji
|
|
54
51
|
Requires-Dist: openai
|
|
55
52
|
Requires-Dist: prompt-toolkit
|
|
56
53
|
Requires-Dist: primp
|
|
@@ -62,38 +59,40 @@ Provides-Extra: dev
|
|
|
62
59
|
Requires-Dist: ruff>=0.1.6; extra == "dev"
|
|
63
60
|
Requires-Dist: pytest>=7.4.2; extra == "dev"
|
|
64
61
|
|
|
65
|
-
<div align="center">
|
|
66
|
-
<!-- Replace `#` with your actual links -->
|
|
67
|
-
<a href="https://t.me/PyscoutAI"><img alt="Telegram" src="https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white"></a>
|
|
68
|
-
<a href="https://www.instagram.com/oevortex/"><img alt="Instagram" src="https://img.shields.io/badge/Instagram-E4405F?style=for-the-badge&logo=instagram&logoColor=white"></a>
|
|
69
|
-
<a href="https://www.linkedin.com/in/oe-vortex-29a407265/"><img alt="LinkedIn" src="https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white"></a>
|
|
70
|
-
<a href="https://buymeacoffee.com/oevortex"><img alt="Buy Me A Coffee" src="https://img.shields.io/badge/Buy%20Me%20A%20Coffee-FFDD00?style=for-the-badge&logo=buymeacoffee&logoColor=black"></a>
|
|
71
|
-
</div>
|
|
72
|
-
|
|
73
|
-
<div align="center">
|
|
74
|
-
<!-- Replace `#` with your actual links -->
|
|
75
|
-
<a href="https://youtube.com/@OEvortex">▶️ Vortex's YouTube Channel</a>
|
|
76
|
-
</div>
|
|
77
|
-
<div align="center">
|
|
78
|
-
<a href="https://youtube.com/@devsdocode">▶️ Devs Do Code's YouTube Channel</a>
|
|
79
|
-
</div>
|
|
80
|
-
<div align="center">
|
|
81
|
-
<a href="https://t.me/ANONYMOUS_56788">📢 Anonymous Coder's Telegram</a>
|
|
82
|
-
</div>
|
|
83
|
-
|
|
84
|
-
<p align="center">
|
|
85
|
-
<strong>Webscout</strong> is the all-in-one search and AI toolkit you need.
|
|
86
|
-
<br>
|
|
87
|
-
Discover insights with Yep.com, DuckDuckGo, and Phind; access cutting-edge AI models; transcribe YouTube videos; generate temporary emails and phone numbers; perform text-to-speech conversions; and much more!
|
|
88
|
-
</p>
|
|
89
62
|
|
|
90
63
|
<div align="center">
|
|
91
|
-
<
|
|
92
|
-
|
|
93
|
-
|
|
64
|
+
<a href="https://github.com/OEvortex/Webscout">
|
|
65
|
+
<!-- Consider adding a dedicated Webscout logo here if you have one -->
|
|
66
|
+
<img src="https://img.shields.io/badge/WebScout-Ultimate%20Toolkit-blue?style=for-the-badge&logo=python&logoColor=white" alt="WebScout Logo">
|
|
67
|
+
</a>
|
|
68
|
+
<br/>
|
|
69
|
+
<h1>Webscout</h1>
|
|
70
|
+
<p><strong>Your All-in-One Python Toolkit for Web Search, AI Interaction, Digital Utilities, and More.</strong></p>
|
|
71
|
+
<p>
|
|
72
|
+
Access diverse search engines, cutting-edge AI models, temporary communication tools, media utilities, developer helpers, and powerful CLI interfaces – all through one unified library.
|
|
73
|
+
</p>
|
|
74
|
+
|
|
75
|
+
<!-- Badges -->
|
|
76
|
+
<p>
|
|
77
|
+
<a href="https://pypi.org/project/webscout/"><img src="https://img.shields.io/pypi/v/webscout.svg?style=flat-square&logo=pypi&label=PyPI" alt="PyPI Version"></a>
|
|
78
|
+
<a href="https://pepy.tech/project/webscout"><img src="https://static.pepy.tech/badge/webscout/month?style=flat-square" alt="Monthly Downloads"></a>
|
|
79
|
+
<a href="https://pepy.tech/project/webscout"><img src="https://static.pepy.tech/badge/webscout?style=flat-square" alt="Total Downloads"></a>
|
|
80
|
+
<a href="#"><img src="https://img.shields.io/pypi/pyversions/webscout?style=flat-square&logo=python" alt="Python Version"></a>
|
|
81
|
+
<!-- Add License Badge if applicable: <a href="LICENSE"><img src="https://img.shields.io/pypi/l/webscout?style=flat-square" alt="License"></a> -->
|
|
82
|
+
<!-- Add Build Status Badge if applicable -->
|
|
83
|
+
</p>
|
|
84
|
+
|
|
85
|
+
<!-- Social/Support Links -->
|
|
86
|
+
<div>
|
|
87
|
+
<a href="https://t.me/PyscoutAI"><img alt="Telegram Group" src="https://img.shields.io/badge/Telegram%20Group-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white"></a>
|
|
88
|
+
<a href="https://t.me/ANONYMOUS_56788"><img alt="Developer Telegram" src="https://img.shields.io/badge/Developer%20Contact-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white"></a>
|
|
89
|
+
<a href="https://youtube.com/@OEvortex"><img alt="YouTube" src="https://img.shields.io/badge/YouTube-FF0000?style=for-the-badge&logo=youtube&logoColor=white"></a>
|
|
90
|
+
<a href="https://www.linkedin.com/in/oe-vortex-29a407265/"><img alt="LinkedIn" src="https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white"></a>
|
|
91
|
+
<a href="https://www.instagram.com/oevortex/"><img alt="Instagram" src="https://img.shields.io/badge/Instagram-E4405F?style=for-the-badge&logo=instagram&logoColor=white"></a>
|
|
92
|
+
<a href="https://buymeacoffee.com/oevortex"><img alt="Buy Me A Coffee" src="https://img.shields.io/badge/Buy%20Me%20A%20Coffee-FFDD00?style=for-the-badge&logo=buymeacoffee&logoColor=black"></a>
|
|
93
|
+
</div>
|
|
94
94
|
</div>
|
|
95
95
|
|
|
96
|
-
---
|
|
97
96
|
|
|
98
97
|
## 🚀 Features
|
|
99
98
|
|
|
@@ -101,7 +100,7 @@ Requires-Dist: pytest>=7.4.2; extra == "dev"
|
|
|
101
100
|
* **AI Powerhouse:** Access and interact with various AI models, including OpenAI, Cohere, and more.
|
|
102
101
|
* **[YouTube Toolkit](webscout/Extra/YTToolkit):** Advanced YouTube video and transcript management with multi-language support, versatile downloading, and intelligent data extraction
|
|
103
102
|
* **[GitAPI](webscout/Extra/GitToolkit/gitapi):** Powerful GitHub data extraction toolkit for seamless repository and user information retrieval, featuring commit tracking, issue management, and comprehensive user analytics - all without authentication requirements for public data
|
|
104
|
-
* **Tempmail & Temp Number:** Generate temporary email addresses and phone numbers for enhanced privacy.
|
|
103
|
+
* **[Tempmail](webscout/Extra/tempmail/README.md) & Temp Number:** Generate temporary email addresses and phone numbers for enhanced privacy.
|
|
105
104
|
* **[Text-to-Speech (TTS)](webscout/Provider/TTS/README.md):** Convert text into natural-sounding speech using multiple AI-powered providers like ElevenLabs, StreamElements, and Voicepods.
|
|
106
105
|
* **GGUF Conversion & Quantization:** Convert and quantize Hugging Face models to GGUF format.
|
|
107
106
|
* **[SwiftCLI](webscout/swiftcli/Readme.md):** A powerful and elegant CLI framework that makes it easy to create beautiful command-line interfaces.
|
|
@@ -129,6 +128,7 @@ python -m webscout --help
|
|
|
129
128
|
| Command | Description |
|
|
130
129
|
|-------------------------------------------|-------------------------------------------------------------------------------------------------------|
|
|
131
130
|
| python -m webscout answers -k Text | CLI function to perform an answers search using Webscout. |
|
|
131
|
+
| python -m webscout chat | Interactive AI chat using DuckDuckGo's AI. |
|
|
132
132
|
| python -m webscout images -k Text | CLI function to perform an images search using Webscout. |
|
|
133
133
|
| python -m webscout maps -k Text | CLI function to perform a maps search using Webscout. |
|
|
134
134
|
| python -m webscout news -k Text | CLI function to perform a news search using Webscout. |
|
|
@@ -137,9 +137,7 @@ python -m webscout --help
|
|
|
137
137
|
| python -m webscout translate -k Text | CLI function to perform translate using Webscout. |
|
|
138
138
|
| python -m webscout version | A command-line interface command that prints and returns the version of the program. |
|
|
139
139
|
| python -m webscout videos -k Text | CLI function to perform a videos search using DuckDuckGo API. |
|
|
140
|
-
| python -m webscout weather -
|
|
141
|
-
|
|
142
|
-
|
|
140
|
+
| python -m webscout weather -l qazigund | CLI function to get weather information for a location using Webscout. |
|
|
143
141
|
|
|
144
142
|
## ✉️ TempMail and VNEngine
|
|
145
143
|
|
|
@@ -158,13 +156,13 @@ async def main():
|
|
|
158
156
|
if numbers:
|
|
159
157
|
number = numbers[0]['full_number']
|
|
160
158
|
inbox = vn.get_number_inbox(country, number)
|
|
161
|
-
|
|
159
|
+
|
|
162
160
|
# Serialize inbox data to JSON string
|
|
163
161
|
json_data = json.dumps(inbox, ensure_ascii=False, indent=4)
|
|
164
|
-
|
|
162
|
+
|
|
165
163
|
# Print with UTF-8 encoding
|
|
166
164
|
print(json_data)
|
|
167
|
-
|
|
165
|
+
|
|
168
166
|
async with TempMail() as client:
|
|
169
167
|
domains = await client.get_domains()
|
|
170
168
|
print("Available Domains:", domains)
|
|
@@ -217,15 +215,53 @@ suggestions = yep.suggestions("hist")
|
|
|
217
215
|
print(suggestions)
|
|
218
216
|
```
|
|
219
217
|
|
|
220
|
-
## 🔍
|
|
218
|
+
## 🔍 GoogleSearch (formerly DWEBS)
|
|
221
219
|
|
|
222
220
|
```python
|
|
223
|
-
from webscout import
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
221
|
+
from webscout import GoogleSearch
|
|
222
|
+
|
|
223
|
+
# Initialize GoogleSearch
|
|
224
|
+
google = GoogleSearch(
|
|
225
|
+
timeout=10, # Optional: Set custom timeout
|
|
226
|
+
proxies=None, # Optional: Use proxies
|
|
227
|
+
verify=True # Optional: SSL verification
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
# Text Search
|
|
231
|
+
text_results = google.text(
|
|
232
|
+
keywords="artificial intelligence",
|
|
233
|
+
region="us", # Optional: Region for results
|
|
234
|
+
safesearch="moderate", # Optional: "on", "moderate", "off"
|
|
235
|
+
max_results=10 # Optional: Limit number of results
|
|
236
|
+
)
|
|
237
|
+
for result in text_results:
|
|
238
|
+
print(f"Title: {result.title}")
|
|
239
|
+
print(f"URL: {result.url}")
|
|
240
|
+
print(f"Description: {result.description}")
|
|
241
|
+
print("---")
|
|
242
|
+
|
|
243
|
+
# News Search
|
|
244
|
+
news_results = google.news(
|
|
245
|
+
keywords="technology trends",
|
|
246
|
+
region="us",
|
|
247
|
+
safesearch="moderate",
|
|
248
|
+
max_results=5
|
|
249
|
+
)
|
|
250
|
+
for result in news_results:
|
|
251
|
+
print(f"Title: {result.title}")
|
|
252
|
+
print(f"URL: {result.url}")
|
|
253
|
+
print(f"Description: {result.description}")
|
|
254
|
+
print("---")
|
|
255
|
+
|
|
256
|
+
# Get search suggestions
|
|
257
|
+
suggestions = google.suggestions("how to")
|
|
258
|
+
print(suggestions)
|
|
259
|
+
|
|
260
|
+
# Legacy usage is still supported
|
|
261
|
+
from webscout import search
|
|
262
|
+
results = search("Python programming", num_results=5)
|
|
263
|
+
for url in results:
|
|
264
|
+
print(url)
|
|
229
265
|
```
|
|
230
266
|
|
|
231
267
|
## 🦆 WEBS and AsyncWEBS
|
|
@@ -302,7 +338,7 @@ await main()
|
|
|
302
338
|
```python
|
|
303
339
|
from webscout import WEBS
|
|
304
340
|
|
|
305
|
-
# Text search for 'live free or die' using DuckDuckGo.com
|
|
341
|
+
# Text search for 'live free or die' using DuckDuckGo.com
|
|
306
342
|
with WEBS() as WEBS:
|
|
307
343
|
for r in WEBS.text('live free or die', region='wt-wt', safesearch='off', timelimit='y', max_results=10):
|
|
308
344
|
print(r)
|
|
@@ -316,7 +352,7 @@ with WEBS() as WEBS:
|
|
|
316
352
|
```python
|
|
317
353
|
from webscout import WEBS
|
|
318
354
|
|
|
319
|
-
# Instant answers for the query "sun" using DuckDuckGo.com
|
|
355
|
+
# Instant answers for the query "sun" using DuckDuckGo.com
|
|
320
356
|
with WEBS() as WEBS:
|
|
321
357
|
for r in WEBS.answers("sun"):
|
|
322
358
|
print(r)
|
|
@@ -327,7 +363,7 @@ with WEBS() as WEBS:
|
|
|
327
363
|
```python
|
|
328
364
|
from webscout import WEBS
|
|
329
365
|
|
|
330
|
-
# Image search for the keyword 'butterfly' using DuckDuckGo.com
|
|
366
|
+
# Image search for the keyword 'butterfly' using DuckDuckGo.com
|
|
331
367
|
with WEBS() as WEBS:
|
|
332
368
|
keywords = 'butterfly'
|
|
333
369
|
WEBS_images_gen = WEBS.images(
|
|
@@ -349,7 +385,7 @@ with WEBS() as WEBS:
|
|
|
349
385
|
```python
|
|
350
386
|
from webscout import WEBS
|
|
351
387
|
|
|
352
|
-
# Video search for the keyword 'tesla' using DuckDuckGo.com
|
|
388
|
+
# Video search for the keyword 'tesla' using DuckDuckGo.com
|
|
353
389
|
with WEBS() as WEBS:
|
|
354
390
|
keywords = 'tesla'
|
|
355
391
|
WEBS_videos_gen = WEBS.videos(
|
|
@@ -458,7 +494,6 @@ with WEBS() as webs:
|
|
|
458
494
|
|
|
459
495
|
```
|
|
460
496
|
|
|
461
|
-
|
|
462
497
|
#### 📜 List Available LLM Models
|
|
463
498
|
|
|
464
499
|
Retrieve a comprehensive list of all supported LLMs.
|
|
@@ -551,9 +586,6 @@ else:
|
|
|
551
586
|
print(f"Available voices for {provider_name}: {available_voices}")
|
|
552
587
|
```
|
|
553
588
|
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
589
|
### 💬 `Duckchat` - Chat with LLM
|
|
558
590
|
|
|
559
591
|
```python
|
|
@@ -684,7 +716,7 @@ print(response["message"]) # Access the text message
|
|
|
684
716
|
print("Sources:", response["sources"]) # Access sources (if any)
|
|
685
717
|
|
|
686
718
|
# Image generation
|
|
687
|
-
response = meta_ai.ask("Create an image of a cat wearing a hat.")
|
|
719
|
+
response = meta_ai.ask("Create an image of a cat wearing a hat.")
|
|
688
720
|
print(response["message"]) # Print the text message from the response
|
|
689
721
|
for media in response["media"]:
|
|
690
722
|
print(media["url"]) # Access image URLs
|
|
@@ -869,7 +901,7 @@ a = AndiSearch()
|
|
|
869
901
|
print(a.chat("HelpingAI-9B"))
|
|
870
902
|
```
|
|
871
903
|
|
|
872
|
-
### `LLAMA`, `C4ai`, `Venice`, `Copilot`, `HuggingFaceChat`, `TwoAI`, `HeckAI`, `AllenAI`, `PerplexityLabs`, `AkashGPT`, `DeepSeek`, `WiseCat`, `IBMGranite`, `QwenLM`, `ChatGPTGratis`, `TextPollinationsAI`, `GliderAI`, `Cohere`, `REKA`, `GROQ`, `AsyncGROQ`, `OPENAI`, `AsyncOPENAI`, `KOBOLDAI`, `AsyncKOBOLDAI`, `BLACKBOXAI`, `PhindSearch`, `GEMINI`, `DeepInfra`, `AI4Chat`, `Phindv2`, `OLLAMA`, `AndiSearch`, `PIZZAGPT`, `Sambanova`, `
|
|
904
|
+
### `LLAMA`, `C4ai`, `Venice`, `Copilot`, `HuggingFaceChat`, `TwoAI`, `HeckAI`, `AllenAI`, `PerplexityLabs`, `AkashGPT`, `DeepSeek`, `WiseCat`, `IBMGranite`, `QwenLM`, `ChatGPTGratis`, `TextPollinationsAI`, `GliderAI`, `Cohere`, `REKA`, `GROQ`, `AsyncGROQ`, `OPENAI`, `AsyncOPENAI`, `KOBOLDAI`, `AsyncKOBOLDAI`, `BLACKBOXAI`, `PhindSearch`, `GEMINI`, `DeepInfra`, `AI4Chat`, `Phindv2`, `OLLAMA`, `AndiSearch`, `PIZZAGPT`, `Sambanova`, `KOALA`, `Meta`, `AskMyAI`, `PiAI`, `Julius`, `YouChat`, `YEPCHAT`, `Cloudflare`, `TurboSeek`, `TeachAnything`, `AI21`, `Chatify`, `X0GPT`, `Cerebras`, `Lepton`, `GEMINIAPI`, `Cleeai`, `Elmo`, `Free2GPT`, `GPTWeb`, `Netwrck`, `LlamaTutor`, `PromptRefine`, `TutorAI`, `ChatGPTES`, `Bagoodex`, `AIMathGPT`, `GaurishCerebras`, `GeminiPro`, `LLMChat`, `Talkai`, `Llama3Mitril`, `Marcus`, `TypeGPT`, `Netwrck`, `MultiChatAI`, `JadveOpenAI`, `ChatGLM`, `NousHermes`, `FreeAIChat`, `ElectronHub`, `GithubChat`, `Flowith`, `SonusAI`, `UncovrAI`, `LabyrinthAI`, `WebSim`, `LambdaChat`, `ChatGPTClone`, `VercelAI`, `ExaChat`, `AskSteve`, `Aitopia`, `SearchChatAI`
|
|
873
905
|
|
|
874
906
|
Code is similar to other providers.
|
|
875
907
|
|
|
@@ -903,9 +935,9 @@ Webscout provides tools to convert and quantize Hugging Face models into the GGU
|
|
|
903
935
|
from webscout.Extra.gguf import ModelConverter
|
|
904
936
|
"""
|
|
905
937
|
Valid quantization methods:
|
|
906
|
-
"q2_k", "q3_k_l", "q3_k_m", "q3_k_s",
|
|
907
|
-
"q4_0", "q4_1", "q4_k_m", "q4_k_s",
|
|
908
|
-
"q5_0", "q5_1", "q5_k_m", "q5_k_s",
|
|
938
|
+
"q2_k", "q3_k_l", "q3_k_m", "q3_k_s",
|
|
939
|
+
"q4_0", "q4_1", "q4_k_m", "q4_k_s",
|
|
940
|
+
"q5_0", "q5_1", "q5_k_m", "q5_k_s",
|
|
909
941
|
"q6_k", "q8_0"
|
|
910
942
|
"""
|
|
911
943
|
# Create a converter instance
|
|
@@ -918,7 +950,6 @@ converter = ModelConverter(
|
|
|
918
950
|
converter.convert()
|
|
919
951
|
```
|
|
920
952
|
|
|
921
|
-
|
|
922
953
|
**Command Line Usage:**
|
|
923
954
|
|
|
924
955
|
* **GGUF Conversion:**
|
|
@@ -927,7 +958,6 @@ converter.convert()
|
|
|
927
958
|
python -m webscout.Extra.gguf convert -m "prithivMLmods/QWQ-500M" -q "q2_k"
|
|
928
959
|
```
|
|
929
960
|
|
|
930
|
-
|
|
931
961
|
**Note:**
|
|
932
962
|
|
|
933
963
|
* Replace `"your_username"` and `"your_hf_token"` with your actual Hugging Face credentials.
|
|
@@ -945,9 +975,6 @@ converter.convert()
|
|
|
945
975
|
<!-- Replace `#` with your actual links -->
|
|
946
976
|
<a href="https://youtube.com/@OEvortex">▶️ Vortex's YouTube Channel</a>
|
|
947
977
|
</div>
|
|
948
|
-
<div align="center">
|
|
949
|
-
<a href="https://youtube.com/@devsdocode">▶️ Devs Do Code's YouTube Channel</a>
|
|
950
|
-
</div>
|
|
951
978
|
<div align="center">
|
|
952
979
|
<a href="https://t.me/ANONYMOUS_56788">📢 Anonymous Coder's Telegram</a>
|
|
953
980
|
</div>
|
|
@@ -966,4 +993,3 @@ Contributions are welcome! If you'd like to contribute to Webscout, please follo
|
|
|
966
993
|
|
|
967
994
|
* All the amazing developers who have contributed to the project!
|
|
968
995
|
* The open-source community for their support and inspiration.
|
|
969
|
-
|