webscout 2025.10.18__py3-none-any.whl → 2025.10.19.1__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.

@@ -0,0 +1,362 @@
1
+ from curl_cffi.requests import Session
2
+ from curl_cffi import CurlError
3
+ import json
4
+ from typing import Any, Dict, List, Optional, Union, Iterator
5
+
6
+ from webscout.AIutel import Optimizers
7
+ from webscout.AIutel import Conversation
8
+ from webscout.AIutel import AwesomePrompts
9
+ from webscout.AIbase import Provider
10
+ from webscout import exceptions
11
+ from webscout.litagent import LitAgent
12
+
13
+
14
+ class DeepAI(Provider):
15
+ """
16
+ DeepAI Chat Provider
17
+
18
+ A provider for DeepAI's chat functionality, supporting both streaming and non-streaming responses.
19
+ Structured similarly to other providers like DeepInfra and X0GPT.
20
+ """
21
+ required_auth = False
22
+ AVAILABLE_MODELS = [
23
+ "standard",
24
+ "genius",
25
+ "online",
26
+ "supergenius",
27
+ "onlinegenius",
28
+ "deepseek-v3.2",
29
+ "gemini-2.5-flash-lite",
30
+ "qwen3-30b-a3b",
31
+ "gpt-5-nano",
32
+ "gpt-oss-120b",
33
+ "gpt-5-chat-latest",
34
+ "claude-opus-4-1",
35
+ "llama-4-scout",
36
+ "claude-4.5-sonnet",
37
+ "deepseek-v3.1-terminus",
38
+ "llama-3.3-70b-instruct",
39
+ "grok-4",
40
+ "claude-sonnet-4",
41
+ "qwen3-coder",
42
+ "gpt-5",
43
+ "kimi-k2-0905",
44
+ "claude-opus-4",
45
+ "gpt-5-mini",
46
+ "gemini-2.5-pro",
47
+ "grok-code-fast-1",
48
+ "gpt-4.1",
49
+
50
+ ]
51
+
52
+ def __init__(
53
+ self,
54
+ api_key: str = "tryit-53926507126-2c8a2543c7b5638ca6b92b6e53ef2d2b",
55
+ timeout: int = 30,
56
+ proxies: Optional[Dict[str, str]] = None,
57
+ model: str = "standard",
58
+ chat_style: str = "chat",
59
+ enabled_tools: Optional[List[str]] = None,
60
+ is_conversation: bool = True,
61
+ max_tokens: int = 2048,
62
+ intro: Optional[str] = None,
63
+ filepath: Optional[str] = None,
64
+ update_file: bool = True,
65
+ history_offset: int = 10250,
66
+ act: Optional[str] = None,
67
+ system_prompt: str = "You are a helpful assistant.",
68
+ browser: str = "chrome",
69
+ **kwargs
70
+ ):
71
+ """
72
+ Initialize the DeepAI provider.
73
+
74
+ Args:
75
+ api_key: API key for authentication (trial key provided by default)
76
+ timeout: Request timeout in seconds
77
+ proxies: Proxy configuration
78
+ model: Model to use (default: "standard")
79
+ chat_style: Chat style (default: "chat")
80
+ enabled_tools: List of enabled tools (default: ["image_generator"])
81
+ is_conversation: Whether to maintain conversation history
82
+ max_tokens: Maximum tokens for conversation
83
+ intro: Introduction prompt
84
+ filepath: Path to conversation history file
85
+ update_file: Whether to update history file
86
+ history_offset: History offset for truncation
87
+ act: Act prompt from AwesomePrompts
88
+ system_prompt: System prompt for the AI
89
+ browser: Browser type for fingerprinting
90
+ **kwargs: Additional arguments
91
+ """
92
+ if model not in self.AVAILABLE_MODELS:
93
+ raise ValueError(f"Invalid model: {model}. Choose from: {self.AVAILABLE_MODELS}")
94
+
95
+ self.url = "https://api.deepai.org/hacking_is_a_serious_crime"
96
+ self.api_key = api_key
97
+ self.proxies = proxies or {}
98
+ self.model = model
99
+ self.chat_style = chat_style
100
+ self.enabled_tools = enabled_tools or ["image_generator"]
101
+ self.system_prompt = system_prompt
102
+ self.is_conversation = is_conversation
103
+ self.max_tokens_to_sample = max_tokens
104
+ self.timeout = timeout
105
+ self.last_response = {}
106
+
107
+ # LitAgent for fingerprinting
108
+ self.agent = LitAgent()
109
+ self.fingerprint = self.agent.generate_fingerprint(browser)
110
+
111
+ # Setup headers similar to other providers
112
+ self.headers = {
113
+ "User-Agent": self.fingerprint.get("user_agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"),
114
+ "Accept": "*/*",
115
+ "Accept-Language": self.fingerprint.get("accept_language", "en-US,en;q=0.9"),
116
+ "Origin": "https://deepai.org",
117
+ "Referer": "https://deepai.org/",
118
+ "Sec-CH-UA": self.fingerprint.get("sec_ch_ua", '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"'),
119
+ "Sec-CH-UA-Mobile": "?0",
120
+ "Sec-CH-UA-Platform": f'"{self.fingerprint.get("platform", "Windows")}"',
121
+ "api-key": self.api_key
122
+ }
123
+
124
+ # Setup session
125
+ self.session = Session()
126
+ self.session.headers.update(self.headers)
127
+ self.session.proxies = self.proxies
128
+
129
+ # Optimizers
130
+ self.__available_optimizers = (
131
+ method
132
+ for method in dir(Optimizers)
133
+ if callable(getattr(Optimizers, method)) and not method.startswith("__")
134
+ )
135
+
136
+ # Conversation setup similar to other providers
137
+ Conversation.intro = (
138
+ AwesomePrompts().get_act(
139
+ act, raise_not_found=True, default=None, case_insensitive=True
140
+ )
141
+ if act
142
+ else intro or Conversation.intro
143
+ )
144
+ self.conversation = Conversation(
145
+ is_conversation, self.max_tokens_to_sample, filepath, update_file
146
+ )
147
+ self.conversation.history_offset = history_offset
148
+
149
+ def refresh_identity(self, browser: str = None):
150
+ """
151
+ Refreshes the browser identity fingerprint.
152
+
153
+ Args:
154
+ browser: Specific browser to use for the new fingerprint
155
+ """
156
+ browser = browser or self.fingerprint.get("browser_type", "chrome")
157
+ self.fingerprint = self.agent.generate_fingerprint(browser)
158
+
159
+ # Update relevant headers
160
+ self.headers.update({
161
+ "User-Agent": self.fingerprint.get("user_agent"),
162
+ "Accept-Language": self.fingerprint.get("accept_language"),
163
+ "Sec-CH-UA": self.fingerprint.get("sec_ch_ua"),
164
+ "Sec-CH-UA-Platform": f'"{self.fingerprint.get("platform")}"',
165
+ })
166
+
167
+ self.session.headers.update(self.headers)
168
+ return self.fingerprint
169
+
170
+ def ask(
171
+ self,
172
+ prompt: str,
173
+ stream: bool = False,
174
+ raw: bool = False,
175
+ optimizer: Optional[str] = None,
176
+ conversationally: bool = False,
177
+ **kwargs
178
+ ) -> Union[Dict[str, Any], Iterator[Dict[str, Any]]]:
179
+ """
180
+ Send a prompt to DeepAI and get the response.
181
+
182
+ Args:
183
+ prompt: The prompt to send
184
+ stream: Whether to stream the response (fake streaming: yields full response in one chunk)
185
+ raw: Whether to return raw response
186
+ optimizer: Optimizer to use
187
+ conversationally: Whether to apply optimizer to full conversation
188
+ **kwargs: Additional arguments
189
+
190
+ Returns:
191
+ Response dictionary with the AI response or generator for streaming
192
+ """
193
+ # Generate conversation prompt similar to other providers
194
+ conversation_prompt = self.conversation.gen_complete_prompt(prompt)
195
+
196
+ if optimizer:
197
+ if optimizer in self.__available_optimizers:
198
+ conversation_prompt = getattr(Optimizers, optimizer)(
199
+ conversation_prompt if conversationally else prompt
200
+ )
201
+ else:
202
+ raise Exception(f"Optimizer is not one of {list(self.__available_optimizers)}")
203
+
204
+ # Prepare form data
205
+ # Use conversation_prompt as user content in chatHistory
206
+ chat_history = [
207
+ {"role": "system", "content": self.system_prompt},
208
+ {"role": "user", "content": conversation_prompt}
209
+ ]
210
+ data = {
211
+ "chat_style": self.chat_style,
212
+ "chatHistory": json.dumps(chat_history),
213
+ "model": self.model,
214
+ "hacker_is_stinky": "very_stinky",
215
+ "enabled_tools": json.dumps(self.enabled_tools)
216
+ }
217
+
218
+ # Always perform non-streaming request
219
+ try:
220
+ # Make request with curl_cffi
221
+ response = self.session.post(
222
+ self.url,
223
+ data=data,
224
+ timeout=self.timeout,
225
+ impersonate="chrome110"
226
+ )
227
+ response.raise_for_status()
228
+
229
+ # Get response text
230
+ result = response.text.strip()
231
+
232
+ # Update last response and conversation history
233
+ self.last_response = {"text": result}
234
+ self.conversation.update_chat_history(prompt, result)
235
+
236
+ if stream:
237
+ # Fake streaming: yield the full response in one chunk
238
+ if raw:
239
+ yield result
240
+ else:
241
+ yield self.last_response
242
+ else:
243
+ return self.last_response if not raw else result
244
+
245
+ except CurlError as e:
246
+ raise exceptions.FailedToGenerateResponseError(f"DeepAI API request failed (CurlError): {str(e)}")
247
+ except Exception as e:
248
+ raise exceptions.FailedToGenerateResponseError(f"DeepAI API request failed ({type(e).__name__}): {str(e)}")
249
+
250
+ def chat(
251
+ self,
252
+ prompt: str,
253
+ stream: bool = False,
254
+ optimizer: Optional[str] = None,
255
+ conversationally: bool = False,
256
+ raw: bool = False,
257
+ **kwargs
258
+ ) -> Union[str, Iterator[str]]:
259
+ """
260
+ Send a chat message to DeepAI and get the response.
261
+
262
+ Args:
263
+ prompt: The prompt to send
264
+ stream: Whether to stream the response (fake streaming: yields full response in one chunk)
265
+ optimizer: Optimizer to use
266
+ conversationally: Whether to apply optimizer to full conversation
267
+ raw: Whether to return raw response
268
+ **kwargs: Additional arguments
269
+
270
+ Returns:
271
+ The AI response as a string or generator for streaming
272
+ """
273
+ if stream:
274
+ for resp in self.ask(
275
+ prompt=prompt,
276
+ stream=True,
277
+ raw=raw,
278
+ optimizer=optimizer,
279
+ conversationally=conversationally,
280
+ **kwargs
281
+ ):
282
+ if raw:
283
+ yield resp
284
+ else:
285
+ yield self.get_message(resp)
286
+ else:
287
+ response = self.ask(
288
+ prompt=prompt,
289
+ stream=False,
290
+ raw=raw,
291
+ optimizer=optimizer,
292
+ conversationally=conversationally,
293
+ **kwargs
294
+ )
295
+ if raw:
296
+ return response
297
+ else:
298
+ return self.get_message(response)
299
+
300
+ def get_message(self, response: Union[Dict[str, Any], str]) -> str:
301
+ """
302
+ Extract the message from the response.
303
+
304
+ Args:
305
+ response: Response dictionary from ask method or str if raw
306
+
307
+ Returns:
308
+ The message text
309
+ """
310
+ if isinstance(response, dict):
311
+ return response.get("text", "")
312
+ elif isinstance(response, str):
313
+ return response
314
+ else:
315
+ raise ValueError(f"Unexpected response type: {type(response)}")
316
+
317
+ @classmethod
318
+ def get_models(cls) -> List[str]:
319
+ """
320
+ Get available models.
321
+
322
+ Returns:
323
+ List of available model names
324
+ """
325
+ return cls.AVAILABLE_MODELS
326
+
327
+ @classmethod
328
+ def get_chat_styles(cls) -> List[str]:
329
+ """
330
+ Get available chat styles.
331
+
332
+ Returns:
333
+ List of available chat styles
334
+ """
335
+ return ["chat"]
336
+
337
+
338
+ if __name__ == "__main__":
339
+ # Test similar to other providers, using stream=True for consistency
340
+ print("-" * 80)
341
+ print(f"{'Model':<50} {'Status':<10} {'Response'}")
342
+ print("-" * 80)
343
+
344
+ for model in DeepAI.AVAILABLE_MODELS:
345
+ try:
346
+ test_ai = DeepAI(model=model, timeout=60)
347
+ response = test_ai.chat("Say 'Hello' in one word", stream=True)
348
+ response_text = ""
349
+ for chunk in response:
350
+ response_text += chunk
351
+
352
+ if response_text and len(response_text.strip()) > 0:
353
+ status = "✓"
354
+ # Clean and truncate response
355
+ clean_text = response_text.strip().encode('utf-8', errors='ignore').decode('utf-8')
356
+ display_text = clean_text[:50] + "..." if len(clean_text) > 50 else clean_text
357
+ else:
358
+ status = "✗"
359
+ display_text = "Empty or invalid response"
360
+ print(f"{model:<50} {status:<10} {display_text}")
361
+ except Exception as e:
362
+ print(f"{model:<50} {'✗':<10} {str(e)}")
@@ -0,0 +1,298 @@
1
+ """
2
+ DeepAI Chat Provider for webscout
3
+
4
+ This provider implements the DeepAI chat API discovered through reverse engineering.
5
+ The API uses a POST endpoint with multipart/form-data containing chat history and parameters.
6
+
7
+ API Details:
8
+ - Endpoint: https://api.deepai.org/hacking_is_a_serious_crime
9
+ - Method: POST
10
+ - Authentication: api-key header (trial key provided)
11
+ - Content-Type: multipart/form-data
12
+ - Response: Plain text AI response
13
+
14
+ Features:
15
+ - Streaming and non-streaming support
16
+ - Conversation history management
17
+ - Error handling and retries
18
+ - Configurable model and chat style
19
+ """
20
+
21
+ from typing import List, Dict, Optional, Union, Generator, Any
22
+
23
+ # Import requests for HTTP requests
24
+ import requests
25
+
26
+ # Standard library imports
27
+ import json
28
+ import time
29
+ import uuid
30
+
31
+ # Import base classes and utility structures
32
+ from .base import OpenAICompatibleProvider, BaseChat, BaseCompletions
33
+ from .utils import (
34
+ ChatCompletionChunk, ChatCompletion, Choice, ChoiceDelta,
35
+ ChatCompletionMessage, CompletionUsage
36
+ )
37
+
38
+ # Attempt to import LitAgent, fallback if not available
39
+ try:
40
+ from webscout.litagent import LitAgent
41
+ except ImportError:
42
+ LitAgent = None
43
+
44
+ # --- DeepAI Client ---
45
+
46
+ class Completions(BaseCompletions):
47
+ def __init__(self, client: 'DeepAI'):
48
+ self._client = client
49
+
50
+ def create(
51
+ self,
52
+ *,
53
+ model: str,
54
+ messages: List[Dict[str, str]],
55
+ max_tokens: Optional[int] = 2049,
56
+ stream: bool = False,
57
+ temperature: Optional[float] = None,
58
+ top_p: Optional[float] = None,
59
+ tools: Optional[List[Union[Dict[str, Any], Any]]] = None,
60
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
61
+ timeout: Optional[int] = None,
62
+ proxies: Optional[Dict[str, str]] = None,
63
+ **kwargs: Any
64
+ ) -> Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]]:
65
+ """
66
+ Creates a model response for the given chat conversation.
67
+ Mimics openai.chat.completions.create
68
+ """
69
+ payload = {
70
+ "chat_style": self._client.chat_style,
71
+ "chatHistory": json.dumps(messages),
72
+ "model": model,
73
+ "hacker_is_stinky": "very_stinky",
74
+ "enabled_tools": json.dumps(self._client.enabled_tools)
75
+ }
76
+
77
+ # Add optional parameters if provided
78
+ if max_tokens is not None and max_tokens > 0:
79
+ payload["max_tokens"] = max_tokens
80
+
81
+ if temperature is not None:
82
+ payload["temperature"] = temperature
83
+
84
+ if top_p is not None:
85
+ payload["top_p"] = top_p
86
+
87
+ # Add any additional parameters
88
+ payload.update(kwargs)
89
+
90
+ request_id = f"chatcmpl-{uuid.uuid4()}"
91
+ created_time = int(time.time())
92
+
93
+ if stream:
94
+ return self._create_stream(request_id, created_time, model, payload)
95
+ else:
96
+ return self._create_non_stream(request_id, created_time, model, payload)
97
+
98
+ def _create_stream(
99
+ self, request_id: str, created_time: int, model: str, payload: Dict[str, Any]
100
+ ) -> Generator[ChatCompletionChunk, None, None]:
101
+ # DeepAI doesn't actually support streaming, but we'll implement it for compatibility
102
+ # For now, just yield the non-stream response as a single chunk
103
+ try:
104
+ response = self._client.session.post(
105
+ "https://api.deepai.org/hacking_is_a_serious_crime",
106
+ data=payload,
107
+ timeout=self._client.timeout
108
+ )
109
+
110
+ if response.status_code != 200:
111
+ raise IOError(f"DeepAI request failed with status code {response.status_code}: {response.text}")
112
+
113
+ # Get response text
114
+ content = response.text.strip()
115
+
116
+ # Create the delta object
117
+ delta = ChoiceDelta(
118
+ content=content,
119
+ role="assistant",
120
+ tool_calls=None
121
+ )
122
+
123
+ # Create the choice object
124
+ choice = Choice(
125
+ index=0,
126
+ delta=delta,
127
+ finish_reason="stop",
128
+ logprobs=None
129
+ )
130
+
131
+ # Create the chunk object
132
+ chunk = ChatCompletionChunk(
133
+ id=request_id,
134
+ choices=[choice],
135
+ created=created_time,
136
+ model=model,
137
+ system_fingerprint=None
138
+ )
139
+
140
+ # Set usage directly on the chunk object (estimated)
141
+ chunk.usage = {
142
+ "prompt_tokens": len(json.dumps(payload.get("chatHistory", []))),
143
+ "completion_tokens": len(content),
144
+ "total_tokens": len(json.dumps(payload.get("chatHistory", []))) + len(content),
145
+ "estimated_cost": None
146
+ }
147
+
148
+ yield chunk
149
+
150
+ except Exception as e:
151
+ print(f"Error during DeepAI stream request: {e}")
152
+ raise IOError(f"DeepAI request failed: {e}") from e
153
+
154
+ def _create_non_stream(
155
+ self, request_id: str, created_time: int, model: str, payload: Dict[str, Any]
156
+ ) -> ChatCompletion:
157
+ try:
158
+ response = self._client.session.post(
159
+ "https://api.deepai.org/hacking_is_a_serious_crime",
160
+ data=payload,
161
+ timeout=self._client.timeout
162
+ )
163
+
164
+ if response.status_code != 200:
165
+ raise IOError(f"DeepAI request failed with status code {response.status_code}: {response.text}")
166
+
167
+ # Get response text
168
+ content = response.text.strip()
169
+
170
+ # Create the message object
171
+ message = ChatCompletionMessage(
172
+ role="assistant",
173
+ content=content
174
+ )
175
+
176
+ # Create the choice object
177
+ choice = Choice(
178
+ index=0,
179
+ message=message,
180
+ finish_reason="stop"
181
+ )
182
+
183
+ # Create the usage object (estimated)
184
+ usage = CompletionUsage(
185
+ prompt_tokens=len(json.dumps(payload.get("chatHistory", []))),
186
+ completion_tokens=len(content),
187
+ total_tokens=len(json.dumps(payload.get("chatHistory", []))) + len(content)
188
+ )
189
+
190
+ # Create the completion object
191
+ completion = ChatCompletion(
192
+ id=request_id,
193
+ choices=[choice],
194
+ created=created_time,
195
+ model=model,
196
+ usage=usage,
197
+ )
198
+ return completion
199
+
200
+ except Exception as e:
201
+ print(f"Error during DeepAI non-stream request: {e}")
202
+ raise IOError(f"DeepAI request failed: {e}") from e
203
+
204
+ class Chat(BaseChat):
205
+ def __init__(self, client: 'DeepAI'):
206
+ self.completions = Completions(client)
207
+
208
+ class DeepAI(OpenAICompatibleProvider):
209
+ AVAILABLE_MODELS = [
210
+ "standard",
211
+ "genius",
212
+ "online",
213
+ "supergenius",
214
+ "onlinegenius",
215
+ "deepseek-v3.2",
216
+ "gemini-2.5-flash-lite",
217
+ "qwen3-30b-a3b",
218
+ "gpt-5-nano",
219
+ "gpt-oss-120b",
220
+ "gpt-5-chat-latest",
221
+ "claude-opus-4-1",
222
+ "llama-4-scout",
223
+ "claude-4.5-sonnet",
224
+ "deepseek-v3.1-terminus",
225
+ "llama-3.3-70b-instruct",
226
+ "grok-4",
227
+ "claude-sonnet-4",
228
+ "qwen3-coder",
229
+ "gpt-5",
230
+ "kimi-k2-0905",
231
+ "claude-opus-4",
232
+ "gpt-5-mini",
233
+ "gemini-2.5-pro",
234
+ "grok-code-fast-1",
235
+ "gpt-4.1",
236
+
237
+ ]
238
+
239
+ def __init__(
240
+ self,
241
+ api_key: str = "tryit-53926507126-2c8a2543c7b5638ca6b92b6e53ef2d2b",
242
+ timeout: Optional[int] = 30,
243
+ browser: str = "chrome",
244
+ model: str = "standard",
245
+ chat_style: str = "chat",
246
+ enabled_tools: Optional[List[str]] = None,
247
+ **kwargs
248
+ ):
249
+ self.timeout = timeout
250
+ self.api_key = api_key
251
+ self.model = model
252
+ self.chat_style = chat_style
253
+ self.enabled_tools = enabled_tools or ["image_generator"]
254
+
255
+ # Initialize requests Session
256
+ self.session = requests.Session()
257
+
258
+ # Set up headers with API key
259
+ self.headers = {
260
+ "Content-Type": "application/x-www-form-urlencoded",
261
+ "api-key": self.api_key,
262
+ "Accept": "text/plain, */*",
263
+ "Accept-Encoding": "gzip, deflate, br",
264
+ "Accept-Language": "en-US,en;q=0.9",
265
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
266
+ }
267
+
268
+ # Update session headers
269
+ self.session.headers.update(self.headers) # Initialize chat interface
270
+ self.chat = Chat(self)
271
+
272
+ @classmethod
273
+ def get_models(cls, api_key: str = None):
274
+ """Fetch available models from DeepAI API.
275
+
276
+ Args:
277
+ api_key (str, optional): DeepAI API key. If not provided, returns default models.
278
+
279
+ Returns:
280
+ list: List of available model IDs
281
+ """
282
+ return cls.AVAILABLE_MODELS
283
+
284
+ @property
285
+ def models(self):
286
+ class _ModelList:
287
+ def list(inner_self):
288
+ return type(self).AVAILABLE_MODELS
289
+ return _ModelList()
290
+
291
+ if __name__ == "__main__":
292
+ client = DeepAI()
293
+ response = client.chat.completions.create(
294
+ model="standard",
295
+ messages=[{"role": "user", "content": "Hello!"}],
296
+ stream=False
297
+ )
298
+ print(response.choices[0].message.content)
webscout/version.py CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = "2025.10.18"
1
+ __version__ = "2025.10.19.1"
2
2
  __prog__ = "webscout"
webscout/version.py.bak CHANGED
@@ -1,2 +1,2 @@
1
- __version__ = "2025.10.17"
1
+ __version__ = "2025.10.19"
2
2
  __prog__ = "webscout"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: webscout
3
- Version: 2025.10.18
3
+ Version: 2025.10.19.1
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-email: OEvortex <helpingai5@gmail.com>
6
6
  License: HelpingAI
@@ -14,8 +14,8 @@ webscout/prompt_manager.py,sha256=ysKFgPhkV3uqrOCilqcS9rG8xhzdU_d2wx0grC9WCCc,98
14
14
  webscout/sanitize.py,sha256=pw2Dzn-Jw9mOD4mpALYAvAf-medA-9AqdzsOmdXQbl0,46577
15
15
  webscout/update_checker.py,sha256=bz0TzRxip9DOIVMFyNz9HsGj4RKB0xZgo57AUVSJINo,3708
16
16
  webscout/utils.py,sha256=o2hU3qaVPk25sog3e4cyVZO3l8xwaZpYRziZPotEzNo,3075
17
- webscout/version.py,sha256=WEk_fzNkSNIF2RkQXtSLmMbXYzM5oZVYXSNn6xYMp8w,51
18
- webscout/version.py.bak,sha256=3D9mFWY4P-ZGCKSuDPkkzHusmyndScdoNbUtry1vdCE,51
17
+ webscout/version.py,sha256=784ARdA7UvryqoKR4H7eKxEhubkQarVxJeBzZNM5p7E,53
18
+ webscout/version.py.bak,sha256=EPFJiKxjDAB_yG3MGuNu572pfkwVhF7xj7XebuVoIxg,51
19
19
  webscout/Extra/Act.md,sha256=_C2VW_Dc-dc7eejpGYKAOZhImHKPiQ7NSwE3bkzr6fg,18952
20
20
  webscout/Extra/__init__.py,sha256=KvJRsRBRO-fZp2jSCl6KQnPppi93hriA6O_U1O1s31c,177
21
21
  webscout/Extra/gguf.md,sha256=McXGz5sTfzOO9X4mH8yIqu5K3CgjzyXKi4_HQtezdZ4,12435
@@ -70,6 +70,7 @@ webscout/Provider/ChatSandbox.py,sha256=Hl8vOQzij7VyYVoL3DvJO6HGUs6tXZY3xrbCLKrF
70
70
  webscout/Provider/ClaudeOnline.py,sha256=3J5LEjvxzpYgIcycCq1aG_kFjks7ECkJS6l0HQ5bEyQ,12748
71
71
  webscout/Provider/Cloudflare.py,sha256=nrHCZ9SYNNRIxxzR_QRU1fy-jh31WnErxIimF0aDZms,14155
72
72
  webscout/Provider/Cohere.py,sha256=wPULeG_2JZdhN8oTBjs_QNqs6atjkYkjCa01mRmg8Fw,8082
73
+ webscout/Provider/DeepAI.py,sha256=z7TBsidQkxfrGvlBGARcdUDclQnLBq5wC1euzHLiEI8,12661
73
74
  webscout/Provider/Deepinfra.py,sha256=Z3FNMaaVd4KiitDG8LBgGWycNuT6Y1Z06sCFURd0Ynw,15882
74
75
  webscout/Provider/ExaAI.py,sha256=HQ0BH1lInjsrpPSfIZkZf52q_gbHmnFnMJtRiZoxTXw,9548
75
76
  webscout/Provider/ExaChat.py,sha256=6ryax7zFeUrFTBa3inMrOGPxY-tfbavDQIgOTZr0-cY,11700
@@ -143,6 +144,7 @@ webscout/Provider/AISEARCH/scira_search.py,sha256=YeSgjsZPgcoTZDmtTmcLlROQhLK9Wo
143
144
  webscout/Provider/AISEARCH/stellar_search.py,sha256=BFEGmcOHZUtFx-Z4tqUIrgZ-qgdzI76FcilvI80pPh4,8634
144
145
  webscout/Provider/AISEARCH/webpilotai_search.py,sha256=C7j-xe2If6FwS-YyXkn8U5-Uw09eG7ZrESiCFJo9eYo,11256
145
146
  webscout/Provider/OPENAI/Cloudflare.py,sha256=RGf1aH08UzkxRq9hF3nmKbkOrDzGXU_KFkdtsE8SVpY,14454
147
+ webscout/Provider/OPENAI/DeepAI.py,sha256=L24hPoM4uDv_7UniF6DtJqasA7HzLc2X2JPqTEmC12Q,9465
146
148
  webscout/Provider/OPENAI/FalconH1.py,sha256=SlMZF-2TzquEsKFTuPGR039OnJ3Z4ro49nuLyNFT0Sk,21880
147
149
  webscout/Provider/OPENAI/FreeGemini.py,sha256=C8ZdV0FxzP4D2g5scW1Fp7zG4BmV-Cjztdp0KeuQqIw,10919
148
150
  webscout/Provider/OPENAI/GeminiProxy.py,sha256=9_6VHFylM3-ct0m5XDvxfZ1tmd70RnyZl5HT-qv1g4E,11266
@@ -330,9 +332,9 @@ webscout/zeroart/__init__.py,sha256=Cy9AUtXnOaFBQjNvCpN19IXJo7Lg15VTaNcTBxOTFek,
330
332
  webscout/zeroart/base.py,sha256=I-xhDEfArBb6q7hiF5oPoyXeu2hzL6orp7uWgS_YtG8,2299
331
333
  webscout/zeroart/effects.py,sha256=XUNZY1-wMPd6GNL3glFXtWaF9wDis_z55qTyCdnzHDo,5063
332
334
  webscout/zeroart/fonts.py,sha256=S7qDhUmDXl1makMreZl_eVW_7-sqVQiGn-kQKl0Hg_A,51006
333
- webscout-2025.10.18.dist-info/licenses/LICENSE.md,sha256=hyfFlVn7pWcrvuvs-piB8k4J8DlXdOsYje9RyPxc6Ik,7543
334
- webscout-2025.10.18.dist-info/METADATA,sha256=Qz4hrs-Q3oHXETc75nh8P7UKYBKttZxLfHgrBCt8gJs,21660
335
- webscout-2025.10.18.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
336
- webscout-2025.10.18.dist-info/entry_points.txt,sha256=4xAgKHWwNhAvJyShLCFs_IU8Reb8zR3wqf8egrsDr8g,118
337
- webscout-2025.10.18.dist-info/top_level.txt,sha256=nYIw7OKBQDr_Z33IzZUKidRD3zQEo8jOJYkMVMeN334,9
338
- webscout-2025.10.18.dist-info/RECORD,,
335
+ webscout-2025.10.19.1.dist-info/licenses/LICENSE.md,sha256=hyfFlVn7pWcrvuvs-piB8k4J8DlXdOsYje9RyPxc6Ik,7543
336
+ webscout-2025.10.19.1.dist-info/METADATA,sha256=-3o4_o8M0fLe3A0Bo0Zwz2Y7xgiAhB2t18fAaIwnf44,21662
337
+ webscout-2025.10.19.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
338
+ webscout-2025.10.19.1.dist-info/entry_points.txt,sha256=4xAgKHWwNhAvJyShLCFs_IU8Reb8zR3wqf8egrsDr8g,118
339
+ webscout-2025.10.19.1.dist-info/top_level.txt,sha256=nYIw7OKBQDr_Z33IzZUKidRD3zQEo8jOJYkMVMeN334,9
340
+ webscout-2025.10.19.1.dist-info/RECORD,,