webscout 8.2.6__py3-none-any.whl → 8.2.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of webscout might be problematic. Click here for more details.

Files changed (150) hide show
  1. webscout/AIauto.py +1 -1
  2. webscout/AIutel.py +298 -239
  3. webscout/Extra/Act.md +309 -0
  4. webscout/Extra/GitToolkit/gitapi/README.md +110 -0
  5. webscout/Extra/YTToolkit/README.md +375 -0
  6. webscout/Extra/YTToolkit/ytapi/README.md +44 -0
  7. webscout/Extra/YTToolkit/ytapi/extras.py +92 -19
  8. webscout/Extra/autocoder/autocoder.py +309 -114
  9. webscout/Extra/autocoder/autocoder_utiles.py +15 -15
  10. webscout/Extra/gguf.md +430 -0
  11. webscout/Extra/tempmail/README.md +488 -0
  12. webscout/Extra/weather.md +281 -0
  13. webscout/Litlogger/Readme.md +175 -0
  14. webscout/Provider/AISEARCH/DeepFind.py +41 -37
  15. webscout/Provider/AISEARCH/README.md +279 -0
  16. webscout/Provider/AISEARCH/__init__.py +0 -1
  17. webscout/Provider/AISEARCH/genspark_search.py +228 -86
  18. webscout/Provider/AISEARCH/hika_search.py +11 -11
  19. webscout/Provider/AISEARCH/scira_search.py +324 -322
  20. webscout/Provider/AllenAI.py +7 -14
  21. webscout/Provider/Blackboxai.py +518 -74
  22. webscout/Provider/Cloudflare.py +0 -1
  23. webscout/Provider/Deepinfra.py +23 -21
  24. webscout/Provider/Flowith.py +217 -0
  25. webscout/Provider/FreeGemini.py +250 -0
  26. webscout/Provider/GizAI.py +15 -5
  27. webscout/Provider/Glider.py +11 -8
  28. webscout/Provider/HeckAI.py +80 -52
  29. webscout/Provider/Koboldai.py +7 -4
  30. webscout/Provider/LambdaChat.py +2 -2
  31. webscout/Provider/Marcus.py +10 -18
  32. webscout/Provider/OPENAI/BLACKBOXAI.py +735 -0
  33. webscout/Provider/OPENAI/Cloudflare.py +378 -0
  34. webscout/Provider/OPENAI/FreeGemini.py +282 -0
  35. webscout/Provider/OPENAI/NEMOTRON.py +244 -0
  36. webscout/Provider/OPENAI/README.md +1253 -0
  37. webscout/Provider/OPENAI/__init__.py +8 -0
  38. webscout/Provider/OPENAI/ai4chat.py +293 -286
  39. webscout/Provider/OPENAI/api.py +810 -0
  40. webscout/Provider/OPENAI/base.py +217 -14
  41. webscout/Provider/OPENAI/c4ai.py +373 -367
  42. webscout/Provider/OPENAI/chatgpt.py +7 -0
  43. webscout/Provider/OPENAI/chatgptclone.py +7 -0
  44. webscout/Provider/OPENAI/chatsandbox.py +172 -0
  45. webscout/Provider/OPENAI/deepinfra.py +30 -20
  46. webscout/Provider/OPENAI/e2b.py +6 -0
  47. webscout/Provider/OPENAI/exaai.py +7 -0
  48. webscout/Provider/OPENAI/exachat.py +6 -0
  49. webscout/Provider/OPENAI/flowith.py +162 -0
  50. webscout/Provider/OPENAI/freeaichat.py +359 -352
  51. webscout/Provider/OPENAI/glider.py +323 -316
  52. webscout/Provider/OPENAI/groq.py +361 -354
  53. webscout/Provider/OPENAI/heckai.py +30 -64
  54. webscout/Provider/OPENAI/llmchatco.py +8 -0
  55. webscout/Provider/OPENAI/mcpcore.py +7 -0
  56. webscout/Provider/OPENAI/multichat.py +8 -0
  57. webscout/Provider/OPENAI/netwrck.py +356 -350
  58. webscout/Provider/OPENAI/opkfc.py +8 -0
  59. webscout/Provider/OPENAI/scirachat.py +471 -462
  60. webscout/Provider/OPENAI/sonus.py +9 -0
  61. webscout/Provider/OPENAI/standardinput.py +9 -1
  62. webscout/Provider/OPENAI/textpollinations.py +339 -329
  63. webscout/Provider/OPENAI/toolbaz.py +7 -0
  64. webscout/Provider/OPENAI/typefully.py +355 -0
  65. webscout/Provider/OPENAI/typegpt.py +358 -346
  66. webscout/Provider/OPENAI/uncovrAI.py +7 -0
  67. webscout/Provider/OPENAI/utils.py +103 -7
  68. webscout/Provider/OPENAI/venice.py +12 -0
  69. webscout/Provider/OPENAI/wisecat.py +19 -19
  70. webscout/Provider/OPENAI/writecream.py +7 -0
  71. webscout/Provider/OPENAI/x0gpt.py +7 -0
  72. webscout/Provider/OPENAI/yep.py +50 -21
  73. webscout/Provider/OpenGPT.py +1 -1
  74. webscout/Provider/TTI/AiForce/README.md +159 -0
  75. webscout/Provider/TTI/FreeAIPlayground/README.md +99 -0
  76. webscout/Provider/TTI/ImgSys/README.md +174 -0
  77. webscout/Provider/TTI/MagicStudio/README.md +101 -0
  78. webscout/Provider/TTI/Nexra/README.md +155 -0
  79. webscout/Provider/TTI/PollinationsAI/README.md +146 -0
  80. webscout/Provider/TTI/README.md +128 -0
  81. webscout/Provider/TTI/aiarta/README.md +134 -0
  82. webscout/Provider/TTI/artbit/README.md +100 -0
  83. webscout/Provider/TTI/fastflux/README.md +129 -0
  84. webscout/Provider/TTI/huggingface/README.md +114 -0
  85. webscout/Provider/TTI/piclumen/README.md +161 -0
  86. webscout/Provider/TTI/pixelmuse/README.md +79 -0
  87. webscout/Provider/TTI/talkai/README.md +139 -0
  88. webscout/Provider/TTS/README.md +192 -0
  89. webscout/Provider/TTS/__init__.py +2 -1
  90. webscout/Provider/TTS/speechma.py +500 -100
  91. webscout/Provider/TTS/sthir.py +94 -0
  92. webscout/Provider/TeachAnything.py +3 -7
  93. webscout/Provider/TextPollinationsAI.py +4 -2
  94. webscout/Provider/{aimathgpt.py → UNFINISHED/ChatHub.py} +88 -68
  95. webscout/Provider/UNFINISHED/liner_api_request.py +263 -0
  96. webscout/Provider/UNFINISHED/oivscode.py +351 -0
  97. webscout/Provider/UNFINISHED/test_lmarena.py +119 -0
  98. webscout/Provider/Writecream.py +11 -2
  99. webscout/Provider/__init__.py +8 -14
  100. webscout/Provider/ai4chat.py +4 -58
  101. webscout/Provider/asksteve.py +17 -9
  102. webscout/Provider/cerebras.py +3 -1
  103. webscout/Provider/koala.py +170 -268
  104. webscout/Provider/llmchat.py +3 -0
  105. webscout/Provider/lmarena.py +198 -0
  106. webscout/Provider/meta.py +7 -4
  107. webscout/Provider/samurai.py +223 -0
  108. webscout/Provider/scira_chat.py +4 -2
  109. webscout/Provider/typefully.py +23 -151
  110. webscout/__init__.py +4 -2
  111. webscout/cli.py +3 -28
  112. webscout/conversation.py +35 -35
  113. webscout/litagent/Readme.md +276 -0
  114. webscout/scout/README.md +402 -0
  115. webscout/swiftcli/Readme.md +323 -0
  116. webscout/version.py +1 -1
  117. webscout/webscout_search.py +2 -182
  118. webscout/webscout_search_async.py +1 -179
  119. webscout/zeroart/README.md +89 -0
  120. webscout/zeroart/__init__.py +134 -54
  121. webscout/zeroart/base.py +19 -13
  122. webscout/zeroart/effects.py +101 -99
  123. webscout/zeroart/fonts.py +1239 -816
  124. {webscout-8.2.6.dist-info → webscout-8.2.8.dist-info}/METADATA +116 -74
  125. {webscout-8.2.6.dist-info → webscout-8.2.8.dist-info}/RECORD +130 -103
  126. {webscout-8.2.6.dist-info → webscout-8.2.8.dist-info}/WHEEL +1 -1
  127. webscout-8.2.8.dist-info/entry_points.txt +3 -0
  128. webscout-8.2.8.dist-info/top_level.txt +1 -0
  129. webscout/Provider/AISEARCH/ISou.py +0 -256
  130. webscout/Provider/ElectronHub.py +0 -773
  131. webscout/Provider/Free2GPT.py +0 -241
  132. webscout/Provider/GPTWeb.py +0 -249
  133. webscout/Provider/bagoodex.py +0 -145
  134. webscout/Provider/geminiprorealtime.py +0 -160
  135. webscout/scout/core.py +0 -881
  136. webscout-8.2.6.dist-info/entry_points.txt +0 -3
  137. webscout-8.2.6.dist-info/top_level.txt +0 -2
  138. webstoken/__init__.py +0 -30
  139. webstoken/classifier.py +0 -189
  140. webstoken/keywords.py +0 -216
  141. webstoken/language.py +0 -128
  142. webstoken/ner.py +0 -164
  143. webstoken/normalizer.py +0 -35
  144. webstoken/processor.py +0 -77
  145. webstoken/sentiment.py +0 -206
  146. webstoken/stemmer.py +0 -73
  147. webstoken/tagger.py +0 -60
  148. webstoken/tokenizer.py +0 -158
  149. /webscout/Provider/{Youchat.py → UNFINISHED/Youchat.py} +0 -0
  150. {webscout-8.2.6.dist-info → webscout-8.2.8.dist-info}/licenses/LICENSE.md +0 -0
@@ -0,0 +1,244 @@
1
+ import time
2
+ import uuid
3
+ import requests
4
+ import json
5
+ import random
6
+ import datetime
7
+ import re
8
+ from typing import List, Dict, Optional, Union, Generator, Any
9
+ from webscout.Provider.OPENAI.base import OpenAICompatibleProvider, BaseChat, BaseCompletions
10
+ from webscout.Provider.OPENAI.utils import (
11
+ ChatCompletionChunk, ChatCompletion, Choice, ChoiceDelta,
12
+ ChatCompletionMessage, CompletionUsage, format_prompt
13
+ )
14
+ try:
15
+ from webscout.litagent import LitAgent
16
+ except ImportError:
17
+ class LitAgent:
18
+ def random(self) -> str:
19
+ return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
20
+ from webscout.AIutel import sanitize_stream
21
+ from webscout import exceptions
22
+
23
+
24
+ class Completions(BaseCompletions):
25
+ def __init__(self, client: 'NEMOTRON'):
26
+ self._client = client
27
+
28
+ def create(
29
+ self,
30
+ *,
31
+ model: str,
32
+ messages: List[Dict[str, str]],
33
+ max_tokens: Optional[int] = None,
34
+ stream: bool = False,
35
+ temperature: Optional[float] = None,
36
+ top_p: Optional[float] = None,
37
+ **kwargs: Any
38
+ ) -> ChatCompletion:
39
+ nemotron_model_name = self._client.convert_model_name(model)
40
+ prompt_content = format_prompt(messages, add_special_tokens=True, include_system=True, do_continue=True)
41
+ payload = {
42
+ "content": prompt_content,
43
+ "imageSrc": "",
44
+ "model": nemotron_model_name,
45
+ "user": self._client._get_user_data(),
46
+ "conversationId": kwargs.get("conversation_id", "")
47
+ }
48
+ request_id = f"chatcmpl-{uuid.uuid4()}"
49
+ created_time = int(time.time())
50
+ # Always use non-stream mode, ignore 'stream' argument
51
+ return self._create_non_stream(request_id, created_time, model, payload)
52
+
53
+ def _create_stream(
54
+ self, request_id: str, created_time: int, model_name: str, payload: Dict[str, Any]
55
+ ) -> Generator[ChatCompletionChunk, None, None]:
56
+ try:
57
+ response_generator = self._client._internal_make_request(payload, stream=True)
58
+ for text_chunk in response_generator:
59
+ if text_chunk:
60
+ delta = ChoiceDelta(content=text_chunk, role="assistant")
61
+ choice = Choice(index=0, delta=delta, finish_reason=None)
62
+ chunk = ChatCompletionChunk(
63
+ id=request_id,
64
+ choices=[choice],
65
+ created=created_time,
66
+ model=model_name,
67
+ )
68
+ yield chunk
69
+ final_delta = ChoiceDelta()
70
+ final_choice = Choice(index=0, delta=final_delta, finish_reason="stop")
71
+ final_chunk = ChatCompletionChunk(
72
+ id=request_id,
73
+ choices=[final_choice],
74
+ created=created_time,
75
+ model=model_name,
76
+ )
77
+ yield final_chunk
78
+ except Exception as e:
79
+ raise IOError(f"NEMOTRON request failed: {e}") from e
80
+
81
+ def _create_non_stream(
82
+ self, request_id: str, created_time: int, model_name: str, payload: Dict[str, Any]
83
+ ) -> ChatCompletion:
84
+ full_response_content = ""
85
+ try:
86
+ response_generator = self._client._internal_make_request(payload, stream=False)
87
+ full_response_content = next(response_generator, "")
88
+ except Exception as e:
89
+ pass
90
+ message = ChatCompletionMessage(role="assistant", content=full_response_content)
91
+ choice = Choice(index=0, message=message, finish_reason="stop")
92
+ prompt_tokens = len(payload.get("content", "")) // 4
93
+ completion_tokens = len(full_response_content) // 4
94
+ usage = CompletionUsage(
95
+ prompt_tokens=prompt_tokens,
96
+ completion_tokens=completion_tokens,
97
+ total_tokens=prompt_tokens + completion_tokens
98
+ )
99
+ completion = ChatCompletion(
100
+ id=request_id,
101
+ choices=[choice],
102
+ created=created_time,
103
+ model=model_name,
104
+ usage=usage,
105
+ )
106
+ return completion
107
+
108
+ class Chat(BaseChat):
109
+ def __init__(self, client: 'NEMOTRON'):
110
+ self.completions = Completions(client)
111
+
112
+ class NEMOTRON(OpenAICompatibleProvider):
113
+ AVAILABLE_MODELS = [
114
+ "NEMOTRON/gpt4o",
115
+ "NEMOTRON/nemotron70b",
116
+ ]
117
+
118
+ # Model mapping for payload
119
+ MODEL_PAYLOAD_MAPPING = {
120
+ "NEMOTRON/gpt4o": "gpt4o",
121
+ "NEMOTRON/nemotron70b": "nemotron70b",
122
+ }
123
+
124
+ API_BASE_URL = "https://nemotron.one/api/chat"
125
+ def __init__(
126
+ self,
127
+ timeout: int = 30,
128
+ proxies: dict = {}
129
+ ):
130
+ self.session = requests.Session()
131
+ self.timeout = timeout
132
+ agent = LitAgent()
133
+ user_agent = agent.random()
134
+ self.base_headers = {
135
+ "authority": "nemotron.one",
136
+ "accept": "*/*",
137
+ "accept-language": "en-US,en;q=0.9",
138
+ "content-type": "application/json",
139
+ "origin": "https://nemotron.one",
140
+ "sec-ch-ua": '"Chromium";v="136", "Not.A/Brand";v="99"',
141
+ "sec-ch-ua-mobile": "?0",
142
+ "sec-ch-ua-platform": '"Windows"',
143
+ "user-agent": user_agent
144
+ }
145
+ self.session.headers.update(self.base_headers)
146
+ if proxies:
147
+ self.session.proxies.update(proxies)
148
+ self.chat = Chat(self)
149
+
150
+ def _generate_random_email(self) -> str:
151
+ random_letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
152
+ random_string = ''.join(random.choice(random_letter) for _ in range(10))
153
+ return f"{random_string}@gmail.com"
154
+
155
+ def _generate_random_id(self) -> str:
156
+ timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S%f")
157
+ random_letter = "abcdefghijklmnopqrstuvwxyz0123456789"
158
+ random_string = ''.join(random.choice(random_letter) for _ in range(8))
159
+ return f"cm{random_string}{timestamp[:10]}"
160
+
161
+ def _get_user_data(self) -> Dict[str, Any]:
162
+ current_time = datetime.datetime.now().isoformat()
163
+ return {
164
+ "name": "user",
165
+ "email": self._generate_random_email(),
166
+ "image": "https://lh3.googleusercontent.com/a/default-user=s96-c",
167
+ "id": self._generate_random_id(),
168
+ "password": None,
169
+ "emailVerified": None,
170
+ "credits": 100000000000,
171
+ "isPro": False,
172
+ "createdAt": current_time,
173
+ "updatedAt": current_time
174
+ }
175
+
176
+ def convert_model_name(self, model_alias: str) -> str:
177
+ """
178
+ Convert model names to ones supported by NEMOTRON API.
179
+
180
+ Args:
181
+ model_alias: Model name to convert
182
+
183
+ Returns:
184
+ NEMOTRON model name for API payload
185
+ """
186
+ # Handle NEMOTRON/ prefix aliases for payload
187
+ if model_alias.startswith("NEMOTRON/"):
188
+ base_model = model_alias.split("/")[1]
189
+ if base_model in ["gpt4o", "nemotron70b"]:
190
+ return base_model
191
+
192
+ # Handle direct model names
193
+ if model_alias in ["gpt4o", "nemotron70b"]:
194
+ return model_alias
195
+
196
+ # Case-insensitive matching
197
+ for m in ["gpt4o", "nemotron70b"]:
198
+ if m.lower() == model_alias.lower():
199
+ return m
200
+
201
+ # Default to gpt4o if no match
202
+ print(f"Warning: Unknown model '{model_alias}'. Using 'gpt4o' instead.")
203
+ return "gpt4o"
204
+
205
+ def _internal_make_request(
206
+ self,
207
+ payload: Dict[str, Any],
208
+ stream: bool = False
209
+ ) -> Generator[str, None, None]:
210
+ request_headers = self.base_headers.copy()
211
+ request_headers["referer"] = f"https://nemotron.one/chat/{payload['model']}"
212
+ try:
213
+ if stream:
214
+ with self.session.post(
215
+ self.API_BASE_URL,
216
+ headers=request_headers,
217
+ json=payload,
218
+ stream=True,
219
+ timeout=self.timeout
220
+ ) as response:
221
+ response.raise_for_status()
222
+ yield from sanitize_stream(
223
+ response.iter_content(chunk_size=1024),
224
+ to_json=False,
225
+ )
226
+ else:
227
+ response = self.session.post(
228
+ self.API_BASE_URL,
229
+ headers=request_headers,
230
+ json=payload,
231
+ timeout=self.timeout
232
+ )
233
+ response.raise_for_status()
234
+ yield response.text
235
+ except requests.exceptions.RequestException as e:
236
+ raise exceptions.ProviderConnectionError(f"NEMOTRON API Connection error: {str(e)}")
237
+ except Exception as e:
238
+ raise RuntimeError(f"NEMOTRON API request unexpected error: {str(e)}")
239
+ @property
240
+ def models(self):
241
+ class _ModelList:
242
+ def list(inner_self):
243
+ return type(self).AVAILABLE_MODELS
244
+ return _ModelList()