webscout 8.2.8__py3-none-any.whl → 8.2.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- webscout/AIauto.py +32 -14
- webscout/AIbase.py +96 -37
- webscout/AIutel.py +491 -87
- webscout/Bard.py +441 -323
- webscout/Extra/GitToolkit/__init__.py +10 -10
- webscout/Extra/YTToolkit/ytapi/video.py +232 -232
- webscout/Litlogger/README.md +10 -0
- webscout/Litlogger/__init__.py +7 -59
- webscout/Litlogger/formats.py +4 -0
- webscout/Litlogger/handlers.py +103 -0
- webscout/Litlogger/levels.py +13 -0
- webscout/Litlogger/logger.py +92 -0
- webscout/Provider/AISEARCH/Perplexity.py +332 -358
- webscout/Provider/AISEARCH/felo_search.py +9 -35
- webscout/Provider/AISEARCH/genspark_search.py +30 -56
- webscout/Provider/AISEARCH/hika_search.py +4 -16
- webscout/Provider/AISEARCH/iask_search.py +410 -436
- webscout/Provider/AISEARCH/monica_search.py +4 -30
- webscout/Provider/AISEARCH/scira_search.py +6 -32
- webscout/Provider/AISEARCH/webpilotai_search.py +38 -64
- webscout/Provider/Blackboxai.py +153 -35
- webscout/Provider/Deepinfra.py +339 -339
- webscout/Provider/ExaChat.py +358 -358
- webscout/Provider/Gemini.py +169 -169
- webscout/Provider/GithubChat.py +1 -2
- webscout/Provider/Glider.py +3 -3
- webscout/Provider/HeckAI.py +171 -81
- webscout/Provider/OPENAI/BLACKBOXAI.py +766 -735
- webscout/Provider/OPENAI/Cloudflare.py +7 -7
- webscout/Provider/OPENAI/FreeGemini.py +6 -5
- webscout/Provider/OPENAI/NEMOTRON.py +8 -20
- webscout/Provider/OPENAI/Qwen3.py +283 -0
- webscout/Provider/OPENAI/README.md +952 -1253
- webscout/Provider/OPENAI/TwoAI.py +357 -0
- webscout/Provider/OPENAI/__init__.py +5 -1
- webscout/Provider/OPENAI/ai4chat.py +40 -40
- webscout/Provider/OPENAI/api.py +808 -649
- webscout/Provider/OPENAI/c4ai.py +3 -3
- webscout/Provider/OPENAI/chatgpt.py +555 -555
- webscout/Provider/OPENAI/chatgptclone.py +493 -487
- webscout/Provider/OPENAI/chatsandbox.py +4 -3
- webscout/Provider/OPENAI/copilot.py +242 -0
- webscout/Provider/OPENAI/deepinfra.py +5 -2
- webscout/Provider/OPENAI/e2b.py +63 -5
- webscout/Provider/OPENAI/exaai.py +416 -410
- webscout/Provider/OPENAI/exachat.py +444 -443
- webscout/Provider/OPENAI/freeaichat.py +2 -2
- webscout/Provider/OPENAI/glider.py +5 -2
- webscout/Provider/OPENAI/groq.py +5 -2
- webscout/Provider/OPENAI/heckai.py +308 -307
- webscout/Provider/OPENAI/mcpcore.py +8 -2
- webscout/Provider/OPENAI/multichat.py +4 -4
- webscout/Provider/OPENAI/netwrck.py +6 -5
- webscout/Provider/OPENAI/oivscode.py +287 -0
- webscout/Provider/OPENAI/opkfc.py +496 -496
- webscout/Provider/OPENAI/pydantic_imports.py +172 -0
- webscout/Provider/OPENAI/scirachat.py +15 -9
- webscout/Provider/OPENAI/sonus.py +304 -303
- webscout/Provider/OPENAI/standardinput.py +433 -433
- webscout/Provider/OPENAI/textpollinations.py +4 -4
- webscout/Provider/OPENAI/toolbaz.py +413 -413
- webscout/Provider/OPENAI/typefully.py +3 -3
- webscout/Provider/OPENAI/typegpt.py +11 -5
- webscout/Provider/OPENAI/uncovrAI.py +463 -462
- webscout/Provider/OPENAI/utils.py +90 -79
- webscout/Provider/OPENAI/venice.py +431 -425
- webscout/Provider/OPENAI/wisecat.py +387 -381
- webscout/Provider/OPENAI/writecream.py +3 -3
- webscout/Provider/OPENAI/x0gpt.py +365 -378
- webscout/Provider/OPENAI/yep.py +39 -13
- webscout/Provider/TTI/README.md +55 -101
- webscout/Provider/TTI/__init__.py +4 -9
- webscout/Provider/TTI/aiarta.py +365 -0
- webscout/Provider/TTI/artbit.py +0 -0
- webscout/Provider/TTI/base.py +64 -0
- webscout/Provider/TTI/fastflux.py +200 -0
- webscout/Provider/TTI/magicstudio.py +201 -0
- webscout/Provider/TTI/piclumen.py +203 -0
- webscout/Provider/TTI/pixelmuse.py +225 -0
- webscout/Provider/TTI/pollinations.py +221 -0
- webscout/Provider/TTI/utils.py +11 -0
- webscout/Provider/TTS/__init__.py +2 -1
- webscout/Provider/TTS/base.py +159 -159
- webscout/Provider/TTS/openai_fm.py +129 -0
- webscout/Provider/TextPollinationsAI.py +308 -308
- webscout/Provider/TwoAI.py +239 -44
- webscout/Provider/UNFINISHED/Youchat.py +330 -330
- webscout/Provider/UNFINISHED/puterjs.py +635 -0
- webscout/Provider/UNFINISHED/test_lmarena.py +119 -119
- webscout/Provider/Writecream.py +246 -246
- webscout/Provider/__init__.py +2 -0
- webscout/Provider/ai4chat.py +33 -8
- webscout/Provider/koala.py +169 -169
- webscout/Provider/oivscode.py +309 -0
- webscout/Provider/samurai.py +3 -2
- webscout/Provider/typegpt.py +3 -3
- webscout/Provider/uncovr.py +368 -368
- webscout/client.py +70 -0
- webscout/litprinter/__init__.py +58 -58
- webscout/optimizers.py +419 -419
- webscout/scout/README.md +3 -1
- webscout/scout/core/crawler.py +134 -64
- webscout/scout/core/scout.py +148 -109
- webscout/scout/element.py +106 -88
- webscout/swiftcli/Readme.md +323 -323
- webscout/swiftcli/plugins/manager.py +9 -2
- webscout/version.py +1 -1
- webscout/zeroart/__init__.py +134 -134
- webscout/zeroart/effects.py +100 -100
- webscout/zeroart/fonts.py +1238 -1238
- {webscout-8.2.8.dist-info → webscout-8.2.9.dist-info}/METADATA +159 -35
- {webscout-8.2.8.dist-info → webscout-8.2.9.dist-info}/RECORD +116 -161
- {webscout-8.2.8.dist-info → webscout-8.2.9.dist-info}/WHEEL +1 -1
- {webscout-8.2.8.dist-info → webscout-8.2.9.dist-info}/entry_points.txt +1 -0
- webscout/Litlogger/Readme.md +0 -175
- webscout/Litlogger/core/__init__.py +0 -6
- webscout/Litlogger/core/level.py +0 -23
- webscout/Litlogger/core/logger.py +0 -165
- webscout/Litlogger/handlers/__init__.py +0 -12
- webscout/Litlogger/handlers/console.py +0 -33
- webscout/Litlogger/handlers/file.py +0 -143
- webscout/Litlogger/handlers/network.py +0 -173
- webscout/Litlogger/styles/__init__.py +0 -7
- webscout/Litlogger/styles/colors.py +0 -249
- webscout/Litlogger/styles/formats.py +0 -458
- webscout/Litlogger/styles/text.py +0 -87
- webscout/Litlogger/utils/__init__.py +0 -6
- webscout/Litlogger/utils/detectors.py +0 -153
- webscout/Litlogger/utils/formatters.py +0 -200
- webscout/Provider/TTI/AiForce/README.md +0 -159
- webscout/Provider/TTI/AiForce/__init__.py +0 -22
- webscout/Provider/TTI/AiForce/async_aiforce.py +0 -224
- webscout/Provider/TTI/AiForce/sync_aiforce.py +0 -245
- webscout/Provider/TTI/FreeAIPlayground/README.md +0 -99
- webscout/Provider/TTI/FreeAIPlayground/__init__.py +0 -9
- webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +0 -181
- webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +0 -180
- webscout/Provider/TTI/ImgSys/README.md +0 -174
- webscout/Provider/TTI/ImgSys/__init__.py +0 -23
- webscout/Provider/TTI/ImgSys/async_imgsys.py +0 -202
- webscout/Provider/TTI/ImgSys/sync_imgsys.py +0 -195
- webscout/Provider/TTI/MagicStudio/README.md +0 -101
- webscout/Provider/TTI/MagicStudio/__init__.py +0 -2
- webscout/Provider/TTI/MagicStudio/async_magicstudio.py +0 -111
- webscout/Provider/TTI/MagicStudio/sync_magicstudio.py +0 -109
- webscout/Provider/TTI/Nexra/README.md +0 -155
- webscout/Provider/TTI/Nexra/__init__.py +0 -22
- webscout/Provider/TTI/Nexra/async_nexra.py +0 -286
- webscout/Provider/TTI/Nexra/sync_nexra.py +0 -258
- webscout/Provider/TTI/PollinationsAI/README.md +0 -146
- webscout/Provider/TTI/PollinationsAI/__init__.py +0 -23
- webscout/Provider/TTI/PollinationsAI/async_pollinations.py +0 -311
- webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +0 -265
- webscout/Provider/TTI/aiarta/README.md +0 -134
- webscout/Provider/TTI/aiarta/__init__.py +0 -2
- webscout/Provider/TTI/aiarta/async_aiarta.py +0 -482
- webscout/Provider/TTI/aiarta/sync_aiarta.py +0 -440
- webscout/Provider/TTI/artbit/README.md +0 -100
- webscout/Provider/TTI/artbit/__init__.py +0 -22
- webscout/Provider/TTI/artbit/async_artbit.py +0 -155
- webscout/Provider/TTI/artbit/sync_artbit.py +0 -148
- webscout/Provider/TTI/fastflux/README.md +0 -129
- webscout/Provider/TTI/fastflux/__init__.py +0 -22
- webscout/Provider/TTI/fastflux/async_fastflux.py +0 -261
- webscout/Provider/TTI/fastflux/sync_fastflux.py +0 -252
- webscout/Provider/TTI/huggingface/README.md +0 -114
- webscout/Provider/TTI/huggingface/__init__.py +0 -22
- webscout/Provider/TTI/huggingface/async_huggingface.py +0 -199
- webscout/Provider/TTI/huggingface/sync_huggingface.py +0 -195
- webscout/Provider/TTI/piclumen/README.md +0 -161
- webscout/Provider/TTI/piclumen/__init__.py +0 -23
- webscout/Provider/TTI/piclumen/async_piclumen.py +0 -268
- webscout/Provider/TTI/piclumen/sync_piclumen.py +0 -233
- webscout/Provider/TTI/pixelmuse/README.md +0 -79
- webscout/Provider/TTI/pixelmuse/__init__.py +0 -4
- webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +0 -249
- webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +0 -182
- webscout/Provider/TTI/talkai/README.md +0 -139
- webscout/Provider/TTI/talkai/__init__.py +0 -4
- webscout/Provider/TTI/talkai/async_talkai.py +0 -229
- webscout/Provider/TTI/talkai/sync_talkai.py +0 -207
- webscout/Provider/UNFINISHED/oivscode.py +0 -351
- {webscout-8.2.8.dist-info → webscout-8.2.9.dist-info}/licenses/LICENSE.md +0 -0
- {webscout-8.2.8.dist-info → webscout-8.2.9.dist-info}/top_level.txt +0 -0
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
from typing import List, Dict, Optional, Any, Union, Literal
|
|
2
|
-
from dataclasses import dataclass, asdict, is_dataclass, field
|
|
3
2
|
from enum import Enum
|
|
4
3
|
import time
|
|
5
4
|
import uuid
|
|
5
|
+
from webscout.Provider.OPENAI.pydantic_imports import (
|
|
6
|
+
BaseModel, Field, field_validator, model_validator, field_serializer, model_serializer,
|
|
7
|
+
StrictStr, StrictInt, StrictFloat, StrictBool
|
|
8
|
+
)
|
|
6
9
|
|
|
7
10
|
# --- OpenAI Response Structure Mimics ---
|
|
8
11
|
# Moved here for reusability across different OpenAI-compatible providers
|
|
@@ -11,108 +14,65 @@ class ToolCallType(str, Enum):
|
|
|
11
14
|
"""Type of tool call."""
|
|
12
15
|
FUNCTION = "function"
|
|
13
16
|
|
|
14
|
-
@dataclass
|
|
15
|
-
class BaseModel:
|
|
16
|
-
"""Base class for all models."""
|
|
17
|
-
def to_dict(self) -> Dict[str, Any]:
|
|
18
|
-
"""Convert the model to a dictionary."""
|
|
19
|
-
def _convert(obj: Any) -> Any:
|
|
20
|
-
if is_dataclass(obj):
|
|
21
|
-
return {k: _convert(v) for k, v in asdict(obj).items() if v is not None}
|
|
22
|
-
elif isinstance(obj, list):
|
|
23
|
-
return [_convert(item) for item in obj]
|
|
24
|
-
elif isinstance(obj, dict):
|
|
25
|
-
return {k: _convert(v) for k, v in obj.items() if v is not None}
|
|
26
|
-
elif isinstance(obj, Enum):
|
|
27
|
-
return obj.value
|
|
28
|
-
return obj
|
|
29
|
-
return _convert(self)
|
|
30
|
-
|
|
31
|
-
def __getitem__(self, key):
|
|
32
|
-
"""Support dictionary-style access."""
|
|
33
|
-
if hasattr(self, key):
|
|
34
|
-
return getattr(self, key)
|
|
35
|
-
raise KeyError(f"{key} not found in {self.__class__.__name__}")
|
|
36
|
-
|
|
37
|
-
def get(self, key, default=None):
|
|
38
|
-
"""Dictionary-style get method with default value."""
|
|
39
|
-
try:
|
|
40
|
-
return self[key]
|
|
41
|
-
except KeyError:
|
|
42
|
-
return default
|
|
43
|
-
|
|
44
|
-
def __contains__(self, key):
|
|
45
|
-
"""Support 'in' operator."""
|
|
46
|
-
return hasattr(self, key)
|
|
47
|
-
|
|
48
|
-
@dataclass
|
|
49
17
|
class FunctionCall(BaseModel):
|
|
50
18
|
"""Function call specification."""
|
|
51
|
-
name:
|
|
52
|
-
arguments:
|
|
19
|
+
name: StrictStr
|
|
20
|
+
arguments: StrictStr
|
|
53
21
|
|
|
54
|
-
@dataclass
|
|
55
22
|
class ToolFunction(BaseModel):
|
|
56
23
|
"""Function specification in a tool."""
|
|
57
|
-
name:
|
|
58
|
-
arguments:
|
|
24
|
+
name: StrictStr
|
|
25
|
+
arguments: StrictStr
|
|
59
26
|
|
|
60
|
-
@dataclass
|
|
61
27
|
class ToolCall(BaseModel):
|
|
62
28
|
"""Tool call specification."""
|
|
63
|
-
id:
|
|
64
|
-
type:
|
|
29
|
+
id: StrictStr
|
|
30
|
+
type: StrictStr
|
|
65
31
|
function: ToolFunction
|
|
66
32
|
|
|
67
|
-
@dataclass
|
|
68
33
|
class CompletionUsage(BaseModel):
|
|
69
34
|
"""Token usage information."""
|
|
70
|
-
prompt_tokens:
|
|
71
|
-
completion_tokens:
|
|
72
|
-
total_tokens:
|
|
35
|
+
prompt_tokens: StrictInt
|
|
36
|
+
completion_tokens: StrictInt
|
|
37
|
+
total_tokens: StrictInt
|
|
73
38
|
prompt_tokens_details: Optional[Dict[str, Any]] = None
|
|
74
39
|
|
|
75
|
-
@dataclass
|
|
76
40
|
class ChoiceDelta(BaseModel):
|
|
77
41
|
"""Delta content in streaming response."""
|
|
78
|
-
content: Optional[
|
|
42
|
+
content: Optional[StrictStr] = None
|
|
79
43
|
function_call: Optional[FunctionCall] = None
|
|
80
|
-
role: Optional[
|
|
44
|
+
role: Optional[StrictStr] = None
|
|
81
45
|
tool_calls: Optional[List[ToolCall]] = None
|
|
82
46
|
|
|
83
|
-
@dataclass
|
|
84
47
|
class ChatCompletionMessage(BaseModel):
|
|
85
48
|
"""Chat message in completion response."""
|
|
86
|
-
role:
|
|
87
|
-
content: Optional[
|
|
49
|
+
role: StrictStr
|
|
50
|
+
content: Optional[StrictStr] = None
|
|
88
51
|
function_call: Optional[FunctionCall] = None
|
|
89
52
|
tool_calls: Optional[List[ToolCall]] = None
|
|
90
53
|
|
|
91
|
-
@dataclass
|
|
92
54
|
class Choice(BaseModel):
|
|
93
55
|
"""Choice in completion response."""
|
|
94
|
-
index:
|
|
56
|
+
index: StrictInt
|
|
95
57
|
message: Optional[ChatCompletionMessage] = None
|
|
96
58
|
delta: Optional[ChoiceDelta] = None
|
|
97
|
-
finish_reason: Optional[
|
|
59
|
+
finish_reason: Optional[StrictStr] = None
|
|
98
60
|
logprobs: Optional[Dict[str, Any]] = None
|
|
99
61
|
|
|
100
|
-
@dataclass
|
|
101
62
|
class ModelData(BaseModel):
|
|
102
63
|
"""OpenAI model info response."""
|
|
103
|
-
id:
|
|
104
|
-
object:
|
|
105
|
-
created:
|
|
106
|
-
owned_by:
|
|
64
|
+
id: StrictStr
|
|
65
|
+
object: StrictStr = "model"
|
|
66
|
+
created: StrictInt = int(time.time())
|
|
67
|
+
owned_by: StrictStr = "webscout"
|
|
107
68
|
permission: Optional[List[Dict[str, Any]]] = None
|
|
108
|
-
root: Optional[
|
|
109
|
-
parent: Optional[
|
|
69
|
+
root: Optional[StrictStr] = None
|
|
70
|
+
parent: Optional[StrictStr] = None
|
|
110
71
|
|
|
111
|
-
@dataclass
|
|
112
72
|
class ModelList(BaseModel):
|
|
113
73
|
"""OpenAI model list response."""
|
|
114
|
-
data: List[ModelData]
|
|
115
|
-
object:
|
|
74
|
+
data: List[ModelData]
|
|
75
|
+
object: StrictStr = "list"
|
|
116
76
|
|
|
117
77
|
|
|
118
78
|
# @dataclass
|
|
@@ -191,26 +151,25 @@ class ModelList(BaseModel):
|
|
|
191
151
|
# data: List[ImageData]
|
|
192
152
|
# created: int = int(time.time())
|
|
193
153
|
|
|
194
|
-
@dataclass
|
|
195
154
|
class ChatCompletion(BaseModel):
|
|
196
155
|
"""Chat completion response."""
|
|
197
|
-
model:
|
|
156
|
+
model: StrictStr
|
|
198
157
|
choices: List[Choice]
|
|
199
|
-
id:
|
|
200
|
-
created:
|
|
201
|
-
object:
|
|
202
|
-
system_fingerprint: Optional[
|
|
158
|
+
id: StrictStr = Field(default_factory=lambda: f"chatcmpl-{str(uuid.uuid4())}")
|
|
159
|
+
created: StrictInt = Field(default_factory=lambda: int(time.time()))
|
|
160
|
+
object: StrictStr = "chat.completion"
|
|
161
|
+
system_fingerprint: Optional[StrictStr] = None
|
|
203
162
|
usage: Optional[CompletionUsage] = None
|
|
204
163
|
|
|
205
|
-
@dataclass
|
|
206
164
|
class ChatCompletionChunk(BaseModel):
|
|
207
165
|
"""Streaming chat completion response chunk."""
|
|
208
|
-
model:
|
|
166
|
+
model: StrictStr
|
|
209
167
|
choices: List[Choice]
|
|
210
|
-
id:
|
|
211
|
-
created:
|
|
212
|
-
object:
|
|
213
|
-
system_fingerprint: Optional[
|
|
168
|
+
id: StrictStr = Field(default_factory=lambda: f"chatcmpl-{str(uuid.uuid4())}")
|
|
169
|
+
created: StrictInt = Field(default_factory=lambda: int(time.time()))
|
|
170
|
+
object: StrictStr = "chat.completion.chunk"
|
|
171
|
+
system_fingerprint: Optional[StrictStr] = None
|
|
172
|
+
usage: Optional[Dict[str, Any]] = None # Add usage field for streaming chunks
|
|
214
173
|
|
|
215
174
|
|
|
216
175
|
# --- Helper Functions ---
|
|
@@ -305,3 +264,55 @@ def get_last_user_message(messages: List[Dict[str, Any]]) -> str:
|
|
|
305
264
|
text_parts.append(part)
|
|
306
265
|
return "".join(text_parts)
|
|
307
266
|
return ""
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
# --- Token Counter ---
|
|
270
|
+
|
|
271
|
+
def count_tokens(text_or_messages: Any) -> int:
|
|
272
|
+
"""
|
|
273
|
+
Count tokens in a string or a list of messages using tiktoken if available, else fallback to webstoken's WordTokenizer.
|
|
274
|
+
|
|
275
|
+
Args:
|
|
276
|
+
text_or_messages: A string or a list of messages (string or any type).
|
|
277
|
+
model: Optional model name for tiktoken encoding.
|
|
278
|
+
|
|
279
|
+
Returns:
|
|
280
|
+
int: Number of tokens.
|
|
281
|
+
"""
|
|
282
|
+
try:
|
|
283
|
+
import tiktoken
|
|
284
|
+
# Use tiktoken if available
|
|
285
|
+
if isinstance(text_or_messages, str):
|
|
286
|
+
enc = tiktoken.encoding_for_model("gpt-4o")
|
|
287
|
+
return len(enc.encode(text_or_messages))
|
|
288
|
+
elif isinstance(text_or_messages, list):
|
|
289
|
+
enc = tiktoken.encoding_for_model("gpt-4o")
|
|
290
|
+
total = 0
|
|
291
|
+
for m in text_or_messages:
|
|
292
|
+
# Remove .get('content', '') and treat m as string or convert to string
|
|
293
|
+
if isinstance(m, str):
|
|
294
|
+
total += len(enc.encode(m))
|
|
295
|
+
else:
|
|
296
|
+
total += len(enc.encode(str(m)))
|
|
297
|
+
return total
|
|
298
|
+
else:
|
|
299
|
+
return 0
|
|
300
|
+
except ImportError:
|
|
301
|
+
# Fallback to webstoken's WordTokenizer
|
|
302
|
+
try:
|
|
303
|
+
from webstoken import WordTokenizer
|
|
304
|
+
except ImportError:
|
|
305
|
+
return 0
|
|
306
|
+
tokenizer = WordTokenizer()
|
|
307
|
+
if isinstance(text_or_messages, str):
|
|
308
|
+
return len(tokenizer.tokenize(text_or_messages))
|
|
309
|
+
elif isinstance(text_or_messages, list):
|
|
310
|
+
total = 0
|
|
311
|
+
for m in text_or_messages:
|
|
312
|
+
if isinstance(m, str):
|
|
313
|
+
total += len(tokenizer.tokenize(m))
|
|
314
|
+
else:
|
|
315
|
+
total += len(tokenizer.tokenize(str(m)))
|
|
316
|
+
return total
|
|
317
|
+
else:
|
|
318
|
+
return 0
|