webscout 6.2b0__py3-none-any.whl → 6.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of webscout might be problematic. Click here for more details.
- webscout/AIauto.py +191 -176
- webscout/AIbase.py +112 -239
- webscout/AIutel.py +488 -1130
- webscout/Agents/functioncall.py +248 -198
- webscout/Bing_search.py +250 -153
- webscout/DWEBS.py +454 -178
- webscout/Extra/__init__.py +2 -1
- webscout/Extra/autocoder/__init__.py +9 -0
- webscout/Extra/autocoder/autocoder_utiles.py +121 -0
- webscout/Extra/autocoder/rawdog.py +681 -0
- webscout/Extra/autollama.py +246 -195
- webscout/Extra/gguf.py +441 -226
- webscout/Extra/weather.py +172 -67
- webscout/LLM.py +442 -100
- webscout/Litlogger/__init__.py +681 -0
- webscout/Local/formats.py +4 -2
- webscout/Provider/Amigo.py +19 -10
- webscout/Provider/Andi.py +0 -33
- webscout/Provider/Blackboxai.py +4 -204
- webscout/Provider/DARKAI.py +1 -1
- webscout/Provider/EDITEE.py +1 -1
- webscout/Provider/Llama3.py +1 -1
- webscout/Provider/Marcus.py +137 -0
- webscout/Provider/NinjaChat.py +1 -1
- webscout/Provider/PI.py +221 -207
- webscout/Provider/Perplexity.py +598 -598
- webscout/Provider/RoboCoders.py +206 -0
- webscout/Provider/TTI/AiForce/__init__.py +22 -0
- webscout/Provider/TTI/AiForce/async_aiforce.py +257 -0
- webscout/Provider/TTI/AiForce/sync_aiforce.py +242 -0
- webscout/Provider/TTI/Nexra/__init__.py +22 -0
- webscout/Provider/TTI/Nexra/async_nexra.py +286 -0
- webscout/Provider/TTI/Nexra/sync_nexra.py +258 -0
- webscout/Provider/TTI/PollinationsAI/__init__.py +23 -0
- webscout/Provider/TTI/PollinationsAI/async_pollinations.py +330 -0
- webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +285 -0
- webscout/Provider/TTI/__init__.py +3 -4
- webscout/Provider/TTI/artbit/__init__.py +22 -0
- webscout/Provider/TTI/artbit/async_artbit.py +184 -0
- webscout/Provider/TTI/artbit/sync_artbit.py +176 -0
- webscout/Provider/TTI/blackbox/__init__.py +4 -0
- webscout/Provider/TTI/blackbox/async_blackbox.py +212 -0
- webscout/Provider/TTI/{blackboximage.py → blackbox/sync_blackbox.py} +199 -153
- webscout/Provider/TTI/deepinfra/__init__.py +4 -0
- webscout/Provider/TTI/deepinfra/async_deepinfra.py +227 -0
- webscout/Provider/TTI/deepinfra/sync_deepinfra.py +199 -0
- webscout/Provider/TTI/huggingface/__init__.py +22 -0
- webscout/Provider/TTI/huggingface/async_huggingface.py +199 -0
- webscout/Provider/TTI/huggingface/sync_huggingface.py +195 -0
- webscout/Provider/TTI/imgninza/__init__.py +4 -0
- webscout/Provider/TTI/imgninza/async_ninza.py +214 -0
- webscout/Provider/TTI/{imgninza.py → imgninza/sync_ninza.py} +209 -136
- webscout/Provider/TTI/talkai/__init__.py +4 -0
- webscout/Provider/TTI/talkai/async_talkai.py +229 -0
- webscout/Provider/TTI/talkai/sync_talkai.py +207 -0
- webscout/Provider/__init__.py +146 -132
- webscout/Provider/askmyai.py +158 -0
- webscout/Provider/cerebras.py +227 -206
- webscout/Provider/geminiapi.py +208 -198
- webscout/Provider/llama3mitril.py +180 -0
- webscout/Provider/llmchat.py +203 -0
- webscout/Provider/mhystical.py +176 -0
- webscout/Provider/perplexitylabs.py +265 -0
- webscout/Provider/talkai.py +196 -0
- webscout/Provider/twitterclone.py +251 -244
- webscout/Provider/typegpt.py +359 -0
- webscout/__init__.py +28 -23
- webscout/__main__.py +5 -5
- webscout/cli.py +327 -347
- webscout/conversation.py +227 -0
- webscout/exceptions.py +161 -29
- webscout/litagent/__init__.py +172 -0
- webscout/litprinter/__init__.py +831 -0
- webscout/optimizers.py +270 -0
- webscout/prompt_manager.py +279 -0
- webscout/swiftcli/__init__.py +810 -0
- webscout/transcriber.py +479 -551
- webscout/update_checker.py +125 -0
- webscout/version.py +1 -1
- webscout-6.4.dist-info/LICENSE.md +211 -0
- {webscout-6.2b0.dist-info → webscout-6.4.dist-info}/METADATA +34 -55
- webscout-6.4.dist-info/RECORD +154 -0
- webscout/Provider/TTI/AIuncensored.py +0 -103
- webscout/Provider/TTI/Nexra.py +0 -120
- webscout/Provider/TTI/PollinationsAI.py +0 -138
- webscout/Provider/TTI/WebSimAI.py +0 -142
- webscout/Provider/TTI/aiforce.py +0 -160
- webscout/Provider/TTI/artbit.py +0 -141
- webscout/Provider/TTI/deepinfra.py +0 -148
- webscout/Provider/TTI/huggingface.py +0 -155
- webscout/models.py +0 -23
- webscout-6.2b0.dist-info/LICENSE.md +0 -50
- webscout-6.2b0.dist-info/RECORD +0 -118
- /webscout/{g4f.py → gpt4free.py} +0 -0
- {webscout-6.2b0.dist-info → webscout-6.4.dist-info}/WHEEL +0 -0
- {webscout-6.2b0.dist-info → webscout-6.4.dist-info}/entry_points.txt +0 -0
- {webscout-6.2b0.dist-info → webscout-6.4.dist-info}/top_level.txt +0 -0
webscout/AIauto.py
CHANGED
|
@@ -1,176 +1,191 @@
|
|
|
1
|
-
from webscout.AIbase import Provider
|
|
2
|
-
from webscout.g4f import GPT4FREE, TestProviders
|
|
3
|
-
from webscout.exceptions import AllProvidersFailure
|
|
4
|
-
from
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import random
|
|
9
|
-
import inspect
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
self.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
self
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
) ->
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
self.
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
1
|
+
from webscout.AIbase import Provider
|
|
2
|
+
from webscout.g4f import GPT4FREE, TestProviders
|
|
3
|
+
from webscout.exceptions import AllProvidersFailure
|
|
4
|
+
from webscout.Litlogger import Litlogger, LogFormat, ColorScheme
|
|
5
|
+
from typing import Union, Any, Dict, Generator
|
|
6
|
+
import importlib
|
|
7
|
+
import pkgutil
|
|
8
|
+
import random
|
|
9
|
+
import inspect
|
|
10
|
+
|
|
11
|
+
# Initialize LitLogger with cyberpunk theme
|
|
12
|
+
logger = Litlogger(
|
|
13
|
+
name="AIauto",
|
|
14
|
+
format=LogFormat.DETAILED,
|
|
15
|
+
color_scheme=ColorScheme.CYBERPUNK
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
def load_providers():
|
|
19
|
+
provider_map = {}
|
|
20
|
+
api_key_providers = set()
|
|
21
|
+
provider_package = importlib.import_module("webscout.Provider")
|
|
22
|
+
|
|
23
|
+
for _, module_name, _ in pkgutil.iter_modules(provider_package.__path__):
|
|
24
|
+
try:
|
|
25
|
+
module = importlib.import_module(f"webscout.Provider.{module_name}")
|
|
26
|
+
for attr_name in dir(module):
|
|
27
|
+
attr = getattr(module, attr_name)
|
|
28
|
+
if isinstance(attr, type) and issubclass(attr, Provider) and attr != Provider:
|
|
29
|
+
provider_map[attr_name.upper()] = attr
|
|
30
|
+
# Check if the provider needs an API key
|
|
31
|
+
if 'api_key' in inspect.signature(attr.__init__).parameters:
|
|
32
|
+
api_key_providers.add(attr_name.upper())
|
|
33
|
+
logger.debug(f"Provider {attr_name} requires API key")
|
|
34
|
+
logger.success(f"Loaded provider module: {module_name}")
|
|
35
|
+
except Exception as e:
|
|
36
|
+
logger.error(f"Failed to load provider {module_name}: {str(e)}")
|
|
37
|
+
|
|
38
|
+
logger.info(f"Total providers loaded: {len(provider_map)}")
|
|
39
|
+
logger.info(f"API key providers: {len(api_key_providers)}")
|
|
40
|
+
return provider_map, api_key_providers
|
|
41
|
+
|
|
42
|
+
provider_map, api_key_providers = load_providers()
|
|
43
|
+
|
|
44
|
+
class AUTO(Provider):
|
|
45
|
+
def __init__(
|
|
46
|
+
self,
|
|
47
|
+
is_conversation: bool = True,
|
|
48
|
+
max_tokens: int = 600,
|
|
49
|
+
timeout: int = 30,
|
|
50
|
+
intro: str = None,
|
|
51
|
+
filepath: str = None,
|
|
52
|
+
update_file: bool = True,
|
|
53
|
+
proxies: dict = {},
|
|
54
|
+
history_offset: int = 10250,
|
|
55
|
+
act: str = None,
|
|
56
|
+
exclude: list[str] = [],
|
|
57
|
+
):
|
|
58
|
+
self.provider = None
|
|
59
|
+
self.provider_name = None
|
|
60
|
+
self.is_conversation = is_conversation
|
|
61
|
+
self.max_tokens = max_tokens
|
|
62
|
+
self.timeout = timeout
|
|
63
|
+
self.intro = intro
|
|
64
|
+
self.filepath = filepath
|
|
65
|
+
self.update_file = update_file
|
|
66
|
+
self.proxies = proxies
|
|
67
|
+
self.history_offset = history_offset
|
|
68
|
+
self.act = act
|
|
69
|
+
self.exclude = [e.upper() for e in exclude]
|
|
70
|
+
|
|
71
|
+
@property
|
|
72
|
+
def last_response(self) -> dict[str, Any]:
|
|
73
|
+
return self.provider.last_response if self.provider else {}
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def conversation(self) -> object:
|
|
77
|
+
return self.provider.conversation if self.provider else None
|
|
78
|
+
|
|
79
|
+
def ask(
|
|
80
|
+
self,
|
|
81
|
+
prompt: str,
|
|
82
|
+
stream: bool = False,
|
|
83
|
+
raw: bool = False,
|
|
84
|
+
optimizer: str = None,
|
|
85
|
+
conversationally: bool = False,
|
|
86
|
+
run_new_test: bool = False,
|
|
87
|
+
) -> Union[Dict, Generator]:
|
|
88
|
+
ask_kwargs = {
|
|
89
|
+
"prompt": prompt,
|
|
90
|
+
"stream": stream,
|
|
91
|
+
"raw": raw,
|
|
92
|
+
"optimizer": optimizer,
|
|
93
|
+
"conversationally": conversationally,
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
# Filter out API key required providers and excluded providers
|
|
97
|
+
available_providers = [
|
|
98
|
+
(name, cls) for name, cls in provider_map.items()
|
|
99
|
+
if name not in api_key_providers and name not in self.exclude
|
|
100
|
+
]
|
|
101
|
+
|
|
102
|
+
# Shuffle the list of available providers
|
|
103
|
+
random.shuffle(available_providers)
|
|
104
|
+
|
|
105
|
+
# Try webscout-based providers
|
|
106
|
+
for provider_name, provider_class in available_providers:
|
|
107
|
+
try:
|
|
108
|
+
self.provider_name = f"webscout-{provider_name}"
|
|
109
|
+
logger.info(f"Trying provider: {self.provider_name}")
|
|
110
|
+
|
|
111
|
+
self.provider = provider_class(
|
|
112
|
+
is_conversation=self.is_conversation,
|
|
113
|
+
max_tokens=self.max_tokens,
|
|
114
|
+
timeout=self.timeout,
|
|
115
|
+
intro=self.intro,
|
|
116
|
+
filepath=self.filepath,
|
|
117
|
+
update_file=self.update_file,
|
|
118
|
+
proxies=self.proxies,
|
|
119
|
+
history_offset=self.history_offset,
|
|
120
|
+
act=self.act,
|
|
121
|
+
)
|
|
122
|
+
response = self.provider.ask(**ask_kwargs)
|
|
123
|
+
logger.success(f"Successfully used provider: {self.provider_name}")
|
|
124
|
+
return response
|
|
125
|
+
except Exception as e:
|
|
126
|
+
logger.warning(f"Provider {self.provider_name} failed: {str(e)}")
|
|
127
|
+
continue
|
|
128
|
+
|
|
129
|
+
# Try GPT4FREE providers
|
|
130
|
+
gpt4free_providers = TestProviders(timeout=self.timeout).get_results(run=run_new_test)
|
|
131
|
+
random.shuffle(gpt4free_providers)
|
|
132
|
+
|
|
133
|
+
for provider_info in gpt4free_providers:
|
|
134
|
+
if provider_info["name"].upper() in self.exclude:
|
|
135
|
+
continue
|
|
136
|
+
try:
|
|
137
|
+
self.provider_name = f"g4f-{provider_info['name']}"
|
|
138
|
+
logger.info(f"Trying provider: {self.provider_name}")
|
|
139
|
+
|
|
140
|
+
self.provider = GPT4FREE(
|
|
141
|
+
provider=provider_info["name"],
|
|
142
|
+
is_conversation=self.is_conversation,
|
|
143
|
+
max_tokens=self.max_tokens,
|
|
144
|
+
intro=self.intro,
|
|
145
|
+
filepath=self.filepath,
|
|
146
|
+
update_file=self.update_file,
|
|
147
|
+
proxies=self.proxies,
|
|
148
|
+
history_offset=self.history_offset,
|
|
149
|
+
act=self.act,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
response = self.provider.ask(**ask_kwargs)
|
|
153
|
+
logger.success(f"Successfully used provider: {self.provider_name}")
|
|
154
|
+
return response
|
|
155
|
+
except Exception as e:
|
|
156
|
+
logger.warning(f"Provider {self.provider_name} failed: {str(e)}")
|
|
157
|
+
continue
|
|
158
|
+
|
|
159
|
+
# If we get here, all providers failed
|
|
160
|
+
logger.error("All providers failed to process the request")
|
|
161
|
+
raise AllProvidersFailure("All providers failed to process the request")
|
|
162
|
+
|
|
163
|
+
def chat(
|
|
164
|
+
self,
|
|
165
|
+
prompt: str,
|
|
166
|
+
stream: bool = False,
|
|
167
|
+
optimizer: str = None,
|
|
168
|
+
conversationally: bool = False,
|
|
169
|
+
run_new_test: bool = False,
|
|
170
|
+
) -> Union[str, Generator[str, None, None]]:
|
|
171
|
+
response = self.ask(
|
|
172
|
+
prompt,
|
|
173
|
+
stream,
|
|
174
|
+
optimizer=optimizer,
|
|
175
|
+
conversationally=conversationally,
|
|
176
|
+
run_new_test=run_new_test,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
if stream:
|
|
180
|
+
return (self.get_message(chunk) for chunk in response)
|
|
181
|
+
else:
|
|
182
|
+
return self.get_message(response)
|
|
183
|
+
|
|
184
|
+
def get_message(self, response: dict) -> str:
|
|
185
|
+
assert self.provider is not None, "Chat with AI first"
|
|
186
|
+
return self.provider.get_message(response)
|
|
187
|
+
if __name__ == "__main__":
|
|
188
|
+
auto = AUTO()
|
|
189
|
+
|
|
190
|
+
response = auto.chat("Hello, how are you?")
|
|
191
|
+
print(response)
|