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.

Files changed (134) hide show
  1. webscout/AIutel.py +2 -1
  2. webscout/Bard.py +12 -29
  3. webscout/DWEBS.py +477 -461
  4. webscout/Extra/__init__.py +2 -0
  5. webscout/Extra/autocoder/__init__.py +9 -9
  6. webscout/Extra/autocoder/{rawdog.py → autocoder.py} +849 -790
  7. webscout/Extra/autocoder/autocoder_utiles.py +332 -194
  8. webscout/Extra/gguf.py +682 -682
  9. webscout/Extra/tempmail/__init__.py +26 -0
  10. webscout/Extra/tempmail/async_utils.py +141 -0
  11. webscout/Extra/tempmail/base.py +156 -0
  12. webscout/Extra/tempmail/cli.py +187 -0
  13. webscout/Extra/tempmail/mail_tm.py +361 -0
  14. webscout/Extra/tempmail/temp_mail_io.py +292 -0
  15. webscout/Provider/AI21.py +1 -1
  16. webscout/Provider/AISEARCH/DeepFind.py +2 -2
  17. webscout/Provider/AISEARCH/ISou.py +2 -2
  18. webscout/Provider/AISEARCH/felo_search.py +6 -6
  19. webscout/Provider/AISEARCH/genspark_search.py +1 -1
  20. webscout/Provider/Aitopia.py +292 -0
  21. webscout/Provider/AllenAI.py +1 -1
  22. webscout/Provider/Andi.py +3 -3
  23. webscout/Provider/C4ai.py +1 -1
  24. webscout/Provider/ChatGPTES.py +3 -5
  25. webscout/Provider/ChatGPTGratis.py +4 -4
  26. webscout/Provider/Chatify.py +2 -2
  27. webscout/Provider/Cloudflare.py +3 -2
  28. webscout/Provider/DeepSeek.py +2 -2
  29. webscout/Provider/Deepinfra.py +288 -286
  30. webscout/Provider/ElectronHub.py +709 -634
  31. webscout/Provider/ExaChat.py +325 -0
  32. webscout/Provider/Free2GPT.py +2 -2
  33. webscout/Provider/Gemini.py +167 -179
  34. webscout/Provider/GithubChat.py +1 -1
  35. webscout/Provider/Glider.py +4 -4
  36. webscout/Provider/Groq.py +41 -27
  37. webscout/Provider/HF_space/qwen_qwen2.py +1 -1
  38. webscout/Provider/HeckAI.py +1 -1
  39. webscout/Provider/HuggingFaceChat.py +1 -1
  40. webscout/Provider/Hunyuan.py +1 -1
  41. webscout/Provider/Jadve.py +3 -3
  42. webscout/Provider/Koboldai.py +3 -3
  43. webscout/Provider/LambdaChat.py +3 -2
  44. webscout/Provider/Llama.py +3 -5
  45. webscout/Provider/Llama3.py +4 -12
  46. webscout/Provider/Marcus.py +3 -3
  47. webscout/Provider/OLLAMA.py +8 -8
  48. webscout/Provider/Openai.py +7 -3
  49. webscout/Provider/PI.py +1 -1
  50. webscout/Provider/Perplexitylabs.py +1 -1
  51. webscout/Provider/Phind.py +1 -1
  52. webscout/Provider/PizzaGPT.py +1 -1
  53. webscout/Provider/QwenLM.py +4 -7
  54. webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +3 -1
  55. webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +3 -3
  56. webscout/Provider/TTI/ImgSys/__init__.py +23 -0
  57. webscout/Provider/TTI/ImgSys/async_imgsys.py +202 -0
  58. webscout/Provider/TTI/ImgSys/sync_imgsys.py +195 -0
  59. webscout/Provider/TTI/__init__.py +3 -1
  60. webscout/Provider/TTI/artbit/async_artbit.py +1 -1
  61. webscout/Provider/TTI/artbit/sync_artbit.py +1 -1
  62. webscout/Provider/TTI/huggingface/async_huggingface.py +1 -1
  63. webscout/Provider/TTI/huggingface/sync_huggingface.py +1 -1
  64. webscout/Provider/TTI/piclumen/__init__.py +22 -22
  65. webscout/Provider/TTI/piclumen/sync_piclumen.py +232 -232
  66. webscout/Provider/TTI/pixelmuse/__init__.py +4 -0
  67. webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +249 -0
  68. webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +182 -0
  69. webscout/Provider/TTI/talkai/sync_talkai.py +1 -1
  70. webscout/Provider/TTS/utils.py +1 -1
  71. webscout/Provider/TeachAnything.py +1 -1
  72. webscout/Provider/TextPollinationsAI.py +232 -230
  73. webscout/Provider/TwoAI.py +1 -2
  74. webscout/Provider/Venice.py +4 -2
  75. webscout/Provider/VercelAI.py +234 -0
  76. webscout/Provider/WebSim.py +3 -2
  77. webscout/Provider/WiseCat.py +10 -12
  78. webscout/Provider/Youchat.py +1 -1
  79. webscout/Provider/__init__.py +10 -4
  80. webscout/Provider/ai4chat.py +1 -1
  81. webscout/Provider/aimathgpt.py +2 -6
  82. webscout/Provider/akashgpt.py +1 -1
  83. webscout/Provider/askmyai.py +4 -4
  84. webscout/Provider/{DARKAI.py → asksteve.py} +56 -77
  85. webscout/Provider/bagoodex.py +2 -2
  86. webscout/Provider/cerebras.py +1 -1
  87. webscout/Provider/chatglm.py +4 -4
  88. webscout/Provider/cleeai.py +1 -0
  89. webscout/Provider/copilot.py +21 -9
  90. webscout/Provider/elmo.py +1 -1
  91. webscout/Provider/flowith.py +1 -1
  92. webscout/Provider/freeaichat.py +64 -31
  93. webscout/Provider/gaurish.py +3 -5
  94. webscout/Provider/geminiprorealtime.py +1 -1
  95. webscout/Provider/granite.py +4 -4
  96. webscout/Provider/hermes.py +5 -5
  97. webscout/Provider/julius.py +1 -1
  98. webscout/Provider/koala.py +1 -1
  99. webscout/Provider/lepton.py +1 -1
  100. webscout/Provider/llama3mitril.py +4 -4
  101. webscout/Provider/llamatutor.py +1 -1
  102. webscout/Provider/llmchat.py +3 -3
  103. webscout/Provider/meta.py +1 -1
  104. webscout/Provider/multichat.py +10 -10
  105. webscout/Provider/promptrefine.py +1 -1
  106. webscout/Provider/searchchat.py +293 -0
  107. webscout/Provider/sonus.py +2 -2
  108. webscout/Provider/talkai.py +2 -2
  109. webscout/Provider/turboseek.py +1 -1
  110. webscout/Provider/tutorai.py +1 -1
  111. webscout/Provider/typegpt.py +5 -42
  112. webscout/Provider/uncovr.py +312 -297
  113. webscout/Provider/x0gpt.py +1 -1
  114. webscout/Provider/yep.py +64 -12
  115. webscout/__init__.py +3 -1
  116. webscout/cli.py +59 -98
  117. webscout/conversation.py +350 -17
  118. webscout/litprinter/__init__.py +59 -667
  119. webscout/optimizers.py +419 -419
  120. webscout/tempid.py +11 -11
  121. webscout/update_checker.py +14 -12
  122. webscout/utils.py +2 -2
  123. webscout/version.py +1 -1
  124. webscout/webscout_search.py +146 -87
  125. webscout/webscout_search_async.py +148 -27
  126. {webscout-7.7.dist-info → webscout-7.9.dist-info}/METADATA +92 -66
  127. webscout-7.9.dist-info/RECORD +248 -0
  128. webscout/Provider/EDITEE.py +0 -192
  129. webscout/litprinter/colors.py +0 -54
  130. webscout-7.7.dist-info/RECORD +0 -234
  131. {webscout-7.7.dist-info → webscout-7.9.dist-info}/LICENSE.md +0 -0
  132. {webscout-7.7.dist-info → webscout-7.9.dist-info}/WHEEL +0 -0
  133. {webscout-7.7.dist-info → webscout-7.9.dist-info}/entry_points.txt +0 -0
  134. {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
- self.proxy: Optional[str] = _expand_proxy_tb_alias(proxy)
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=True,
91
- verify=False,
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 = 2.0) -> None:
129
+ async def _sleep(self, sleeptime: float = 0.75) -> None:
112
130
  """Sleep between API requests."""
113
- delay = sleeptime if not self.sleep_timestamp else sleeptime if time() - self.sleep_timestamp >= 30 else sleeptime * 2
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
- ) -> bytes:
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(method, url, params=params, content=content, data=data)
129
-
130
- # Add additional delay if we get a 429 or similar status
131
- if resp.status_code in (429, 403, 503):
132
- await asyncio.sleep(5.0) # Additional delay for rate limit responses
133
- resp = await self.client.request(method, url, params=params, content=content, data=data)
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.content
142
- elif resp.status_code in (202, 301, 403, 429, 503):
143
- raise RatelimitE(f"{url} {resp.status_code} Ratelimit - Please wait a few minutes before retrying")
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
- async def achat(self, keywords: str, model: str = "gpt-4o-mini") -> str:
147
- """Initiates async chat session with webscout AI.
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", "claude-3-haiku", "llama-3-70b", "mixtral-8x7b", "o3-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
- result = await self._loop.run_in_executor(self._executor, super().chat, keywords, model)
158
- return result
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.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.7
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
- <img src="https://img.shields.io/badge/WebScout-API-blue?style=for-the-badge&logo=WebScout" alt="WebScout API Badge">
92
- <a href="#"><img src="https://img.shields.io/pypi/pyversions/webscout" alt="Python Version"></a>
93
- <a href="https://pepy.tech/project/webscout"><img src="https://static.pepy.tech/badge/webscout" alt="Downloads"></a>
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 -k Text | CLI function to get weather information for a location using Webscout. |
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
- ## 🔍 GoogleS (formerly DWEBS)
218
+ ## 🔍 GoogleSearch (formerly DWEBS)
221
219
 
222
220
  ```python
223
- from webscout import GoogleS
224
- from rich import print
225
- searcher = GoogleS()
226
- results = searcher.search("HelpingAI-9B", max_results=20, extract_text=False, max_text_length=200)
227
- for result in results:
228
- print(result)
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`, `DARKAI`, `KOALA`, `Meta`, `AskMyAI`, `PiAI`, `Julius`, `YouChat`, `YEPCHAT`, `Cloudflare`, `TurboSeek`, `Editee`, `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`
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
-