webscout 8.3.7__py3-none-any.whl → 2025.10.13__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 +250 -250
- webscout/AIbase.py +379 -379
- webscout/AIutel.py +60 -60
- webscout/Bard.py +1012 -1012
- webscout/Bing_search.py +417 -417
- webscout/DWEBS.py +529 -529
- webscout/Extra/Act.md +309 -309
- webscout/Extra/GitToolkit/__init__.py +10 -10
- webscout/Extra/GitToolkit/gitapi/README.md +110 -110
- webscout/Extra/GitToolkit/gitapi/__init__.py +11 -11
- webscout/Extra/GitToolkit/gitapi/repository.py +195 -195
- webscout/Extra/GitToolkit/gitapi/user.py +96 -96
- webscout/Extra/GitToolkit/gitapi/utils.py +61 -61
- webscout/Extra/YTToolkit/README.md +375 -375
- webscout/Extra/YTToolkit/YTdownloader.py +956 -956
- webscout/Extra/YTToolkit/__init__.py +2 -2
- webscout/Extra/YTToolkit/transcriber.py +475 -475
- webscout/Extra/YTToolkit/ytapi/README.md +44 -44
- webscout/Extra/YTToolkit/ytapi/__init__.py +6 -6
- webscout/Extra/YTToolkit/ytapi/channel.py +307 -307
- webscout/Extra/YTToolkit/ytapi/errors.py +13 -13
- webscout/Extra/YTToolkit/ytapi/extras.py +118 -118
- webscout/Extra/YTToolkit/ytapi/https.py +88 -88
- webscout/Extra/YTToolkit/ytapi/patterns.py +61 -61
- webscout/Extra/YTToolkit/ytapi/playlist.py +58 -58
- webscout/Extra/YTToolkit/ytapi/pool.py +7 -7
- webscout/Extra/YTToolkit/ytapi/query.py +39 -39
- webscout/Extra/YTToolkit/ytapi/stream.py +62 -62
- webscout/Extra/YTToolkit/ytapi/utils.py +62 -62
- webscout/Extra/YTToolkit/ytapi/video.py +232 -232
- webscout/Extra/autocoder/__init__.py +9 -9
- webscout/Extra/autocoder/autocoder.py +1105 -1105
- webscout/Extra/autocoder/autocoder_utiles.py +332 -332
- webscout/Extra/gguf.md +429 -429
- webscout/Extra/gguf.py +1213 -1213
- webscout/Extra/tempmail/README.md +487 -487
- webscout/Extra/tempmail/__init__.py +27 -27
- webscout/Extra/tempmail/async_utils.py +140 -140
- webscout/Extra/tempmail/base.py +160 -160
- webscout/Extra/tempmail/cli.py +186 -186
- webscout/Extra/tempmail/emailnator.py +84 -84
- webscout/Extra/tempmail/mail_tm.py +360 -360
- webscout/Extra/tempmail/temp_mail_io.py +291 -291
- webscout/Extra/weather.md +281 -281
- webscout/Extra/weather.py +193 -193
- webscout/Litlogger/README.md +10 -10
- webscout/Litlogger/__init__.py +15 -15
- webscout/Litlogger/formats.py +13 -13
- webscout/Litlogger/handlers.py +121 -121
- webscout/Litlogger/levels.py +13 -13
- webscout/Litlogger/logger.py +134 -134
- webscout/Provider/AISEARCH/Perplexity.py +332 -332
- webscout/Provider/AISEARCH/README.md +279 -279
- webscout/Provider/AISEARCH/__init__.py +16 -1
- webscout/Provider/AISEARCH/felo_search.py +206 -206
- webscout/Provider/AISEARCH/genspark_search.py +323 -323
- webscout/Provider/AISEARCH/hika_search.py +185 -185
- webscout/Provider/AISEARCH/iask_search.py +410 -410
- webscout/Provider/AISEARCH/monica_search.py +219 -219
- webscout/Provider/AISEARCH/scira_search.py +316 -316
- webscout/Provider/AISEARCH/stellar_search.py +177 -177
- webscout/Provider/AISEARCH/webpilotai_search.py +255 -255
- webscout/Provider/Aitopia.py +314 -314
- webscout/Provider/Andi.py +1 -1
- webscout/Provider/Apriel.py +306 -0
- webscout/Provider/ChatGPTClone.py +237 -236
- webscout/Provider/ChatSandbox.py +343 -343
- webscout/Provider/Cloudflare.py +324 -324
- webscout/Provider/Cohere.py +208 -208
- webscout/Provider/Deepinfra.py +370 -366
- webscout/Provider/ExaAI.py +260 -260
- webscout/Provider/ExaChat.py +308 -308
- webscout/Provider/Flowith.py +221 -221
- webscout/Provider/GMI.py +293 -0
- webscout/Provider/Gemini.py +164 -164
- webscout/Provider/GeminiProxy.py +167 -167
- webscout/Provider/GithubChat.py +371 -372
- webscout/Provider/Groq.py +800 -800
- webscout/Provider/HeckAI.py +383 -383
- webscout/Provider/Jadve.py +282 -282
- webscout/Provider/K2Think.py +307 -307
- webscout/Provider/Koboldai.py +205 -205
- webscout/Provider/LambdaChat.py +423 -423
- webscout/Provider/Nemotron.py +244 -244
- webscout/Provider/Netwrck.py +248 -248
- webscout/Provider/OLLAMA.py +395 -395
- webscout/Provider/OPENAI/Cloudflare.py +393 -393
- webscout/Provider/OPENAI/FalconH1.py +451 -451
- webscout/Provider/OPENAI/FreeGemini.py +296 -296
- webscout/Provider/OPENAI/K2Think.py +431 -431
- webscout/Provider/OPENAI/NEMOTRON.py +240 -240
- webscout/Provider/OPENAI/PI.py +427 -427
- webscout/Provider/OPENAI/README.md +959 -959
- webscout/Provider/OPENAI/TogetherAI.py +345 -345
- webscout/Provider/OPENAI/TwoAI.py +465 -465
- webscout/Provider/OPENAI/__init__.py +33 -18
- webscout/Provider/OPENAI/base.py +248 -248
- webscout/Provider/OPENAI/chatglm.py +528 -0
- webscout/Provider/OPENAI/chatgpt.py +592 -592
- webscout/Provider/OPENAI/chatgptclone.py +521 -521
- webscout/Provider/OPENAI/chatsandbox.py +202 -202
- webscout/Provider/OPENAI/deepinfra.py +318 -314
- webscout/Provider/OPENAI/e2b.py +1665 -1665
- webscout/Provider/OPENAI/exaai.py +420 -420
- webscout/Provider/OPENAI/exachat.py +452 -452
- webscout/Provider/OPENAI/friendli.py +232 -232
- webscout/Provider/OPENAI/{refact.py → gmi.py} +324 -274
- webscout/Provider/OPENAI/groq.py +364 -364
- webscout/Provider/OPENAI/heckai.py +314 -314
- webscout/Provider/OPENAI/llmchatco.py +337 -337
- webscout/Provider/OPENAI/netwrck.py +355 -355
- webscout/Provider/OPENAI/oivscode.py +290 -290
- webscout/Provider/OPENAI/opkfc.py +518 -518
- webscout/Provider/OPENAI/pydantic_imports.py +1 -1
- webscout/Provider/OPENAI/scirachat.py +535 -535
- webscout/Provider/OPENAI/sonus.py +308 -308
- webscout/Provider/OPENAI/standardinput.py +442 -442
- webscout/Provider/OPENAI/textpollinations.py +340 -340
- webscout/Provider/OPENAI/toolbaz.py +419 -416
- webscout/Provider/OPENAI/typefully.py +362 -362
- webscout/Provider/OPENAI/utils.py +295 -295
- webscout/Provider/OPENAI/venice.py +436 -436
- webscout/Provider/OPENAI/wisecat.py +387 -387
- webscout/Provider/OPENAI/writecream.py +166 -166
- webscout/Provider/OPENAI/x0gpt.py +378 -378
- webscout/Provider/OPENAI/yep.py +389 -389
- webscout/Provider/OpenGPT.py +230 -230
- webscout/Provider/Openai.py +243 -243
- webscout/Provider/PI.py +405 -405
- webscout/Provider/Perplexitylabs.py +430 -430
- webscout/Provider/QwenLM.py +272 -272
- webscout/Provider/STT/__init__.py +16 -1
- webscout/Provider/Sambanova.py +257 -257
- webscout/Provider/StandardInput.py +309 -309
- webscout/Provider/TTI/README.md +82 -82
- webscout/Provider/TTI/__init__.py +33 -18
- webscout/Provider/TTI/aiarta.py +413 -413
- webscout/Provider/TTI/base.py +136 -136
- webscout/Provider/TTI/bing.py +243 -243
- webscout/Provider/TTI/gpt1image.py +149 -149
- webscout/Provider/TTI/imagen.py +196 -196
- webscout/Provider/TTI/infip.py +211 -211
- webscout/Provider/TTI/magicstudio.py +232 -232
- webscout/Provider/TTI/monochat.py +219 -219
- webscout/Provider/TTI/piclumen.py +214 -214
- webscout/Provider/TTI/pixelmuse.py +232 -232
- webscout/Provider/TTI/pollinations.py +232 -232
- webscout/Provider/TTI/together.py +288 -288
- webscout/Provider/TTI/utils.py +12 -12
- webscout/Provider/TTI/venice.py +367 -367
- webscout/Provider/TTS/README.md +192 -192
- webscout/Provider/TTS/__init__.py +33 -18
- webscout/Provider/TTS/parler.py +110 -110
- webscout/Provider/TTS/streamElements.py +333 -333
- webscout/Provider/TTS/utils.py +280 -280
- webscout/Provider/TeachAnything.py +237 -237
- webscout/Provider/TextPollinationsAI.py +310 -310
- webscout/Provider/TogetherAI.py +356 -356
- webscout/Provider/TwoAI.py +312 -312
- webscout/Provider/TypliAI.py +311 -311
- webscout/Provider/UNFINISHED/ChatHub.py +208 -208
- webscout/Provider/UNFINISHED/ChutesAI.py +313 -313
- webscout/Provider/UNFINISHED/GizAI.py +294 -294
- webscout/Provider/UNFINISHED/Marcus.py +198 -198
- webscout/Provider/UNFINISHED/Qodo.py +477 -477
- webscout/Provider/UNFINISHED/VercelAIGateway.py +338 -338
- webscout/Provider/UNFINISHED/XenAI.py +324 -324
- webscout/Provider/UNFINISHED/Youchat.py +330 -330
- webscout/Provider/UNFINISHED/liner.py +334 -0
- webscout/Provider/UNFINISHED/liner_api_request.py +262 -262
- webscout/Provider/UNFINISHED/puterjs.py +634 -634
- webscout/Provider/UNFINISHED/samurai.py +223 -223
- webscout/Provider/UNFINISHED/test_lmarena.py +119 -119
- webscout/Provider/Venice.py +250 -250
- webscout/Provider/VercelAI.py +256 -256
- webscout/Provider/WiseCat.py +231 -231
- webscout/Provider/WrDoChat.py +366 -366
- webscout/Provider/__init__.py +33 -18
- webscout/Provider/ai4chat.py +174 -174
- webscout/Provider/akashgpt.py +331 -331
- webscout/Provider/cerebras.py +446 -446
- webscout/Provider/chatglm.py +394 -301
- webscout/Provider/cleeai.py +211 -211
- webscout/Provider/elmo.py +282 -282
- webscout/Provider/geminiapi.py +208 -208
- webscout/Provider/granite.py +261 -261
- webscout/Provider/hermes.py +263 -263
- webscout/Provider/julius.py +223 -223
- webscout/Provider/learnfastai.py +309 -309
- webscout/Provider/llama3mitril.py +214 -214
- webscout/Provider/llmchat.py +243 -243
- webscout/Provider/llmchatco.py +290 -290
- webscout/Provider/meta.py +801 -801
- webscout/Provider/oivscode.py +309 -309
- webscout/Provider/scira_chat.py +383 -383
- webscout/Provider/searchchat.py +292 -292
- webscout/Provider/sonus.py +258 -258
- webscout/Provider/toolbaz.py +370 -367
- webscout/Provider/turboseek.py +273 -273
- webscout/Provider/typefully.py +207 -207
- webscout/Provider/yep.py +372 -372
- webscout/__init__.py +27 -31
- webscout/__main__.py +5 -5
- webscout/auth/api_key_manager.py +189 -189
- webscout/auth/config.py +175 -175
- webscout/auth/models.py +185 -185
- webscout/auth/routes.py +663 -664
- webscout/auth/simple_logger.py +236 -236
- webscout/cli.py +523 -523
- webscout/conversation.py +438 -438
- webscout/exceptions.py +361 -361
- webscout/litagent/Readme.md +298 -298
- webscout/litagent/__init__.py +28 -28
- webscout/litagent/agent.py +581 -581
- webscout/litagent/constants.py +59 -59
- webscout/litprinter/__init__.py +58 -58
- webscout/models.py +181 -181
- webscout/optimizers.py +419 -419
- webscout/prompt_manager.py +288 -288
- webscout/sanitize.py +1078 -1078
- webscout/scout/README.md +401 -401
- webscout/scout/__init__.py +8 -8
- webscout/scout/core/__init__.py +6 -6
- webscout/scout/core/crawler.py +297 -297
- webscout/scout/core/scout.py +706 -706
- webscout/scout/core/search_result.py +95 -95
- webscout/scout/core/text_analyzer.py +62 -62
- webscout/scout/core/text_utils.py +277 -277
- webscout/scout/core/web_analyzer.py +51 -51
- webscout/scout/element.py +599 -599
- webscout/scout/parsers/__init__.py +69 -69
- webscout/scout/parsers/html5lib_parser.py +172 -172
- webscout/scout/parsers/html_parser.py +236 -236
- webscout/scout/parsers/lxml_parser.py +178 -178
- webscout/scout/utils.py +37 -37
- webscout/search/__init__.py +51 -0
- webscout/search/base.py +195 -0
- webscout/search/duckduckgo_main.py +54 -0
- webscout/search/engines/__init__.py +48 -0
- webscout/search/engines/bing.py +84 -0
- webscout/search/engines/bing_news.py +52 -0
- webscout/search/engines/brave.py +43 -0
- webscout/search/engines/duckduckgo/__init__.py +25 -0
- webscout/search/engines/duckduckgo/answers.py +78 -0
- webscout/search/engines/duckduckgo/base.py +187 -0
- webscout/search/engines/duckduckgo/images.py +97 -0
- webscout/search/engines/duckduckgo/maps.py +168 -0
- webscout/search/engines/duckduckgo/news.py +68 -0
- webscout/search/engines/duckduckgo/suggestions.py +21 -0
- webscout/search/engines/duckduckgo/text.py +211 -0
- webscout/search/engines/duckduckgo/translate.py +47 -0
- webscout/search/engines/duckduckgo/videos.py +63 -0
- webscout/search/engines/duckduckgo/weather.py +74 -0
- webscout/search/engines/mojeek.py +37 -0
- webscout/search/engines/wikipedia.py +56 -0
- webscout/search/engines/yahoo.py +65 -0
- webscout/search/engines/yahoo_news.py +64 -0
- webscout/search/engines/yandex.py +43 -0
- webscout/search/engines/yep/__init__.py +13 -0
- webscout/search/engines/yep/base.py +32 -0
- webscout/search/engines/yep/images.py +99 -0
- webscout/search/engines/yep/suggestions.py +35 -0
- webscout/search/engines/yep/text.py +114 -0
- webscout/search/http_client.py +156 -0
- webscout/search/results.py +137 -0
- webscout/search/yep_main.py +44 -0
- webscout/swiftcli/Readme.md +323 -323
- webscout/swiftcli/__init__.py +95 -95
- webscout/swiftcli/core/__init__.py +7 -7
- webscout/swiftcli/core/cli.py +308 -308
- webscout/swiftcli/core/context.py +104 -104
- webscout/swiftcli/core/group.py +241 -241
- webscout/swiftcli/decorators/__init__.py +28 -28
- webscout/swiftcli/decorators/command.py +221 -221
- webscout/swiftcli/decorators/options.py +220 -220
- webscout/swiftcli/decorators/output.py +302 -302
- webscout/swiftcli/exceptions.py +21 -21
- webscout/swiftcli/plugins/__init__.py +9 -9
- webscout/swiftcli/plugins/base.py +135 -135
- webscout/swiftcli/plugins/manager.py +269 -269
- webscout/swiftcli/utils/__init__.py +59 -59
- webscout/swiftcli/utils/formatting.py +252 -252
- webscout/swiftcli/utils/parsing.py +267 -267
- webscout/update_checker.py +117 -117
- webscout/version.py +1 -1
- webscout/version.py.bak +2 -0
- webscout/zeroart/README.md +89 -89
- webscout/zeroart/__init__.py +134 -134
- webscout/zeroart/base.py +66 -66
- webscout/zeroart/effects.py +100 -100
- webscout/zeroart/fonts.py +1238 -1238
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/METADATA +936 -937
- webscout-2025.10.13.dist-info/RECORD +329 -0
- webscout/Provider/AISEARCH/DeepFind.py +0 -254
- webscout/Provider/OPENAI/Qwen3.py +0 -303
- webscout/Provider/OPENAI/qodo.py +0 -630
- webscout/Provider/OPENAI/xenai.py +0 -514
- webscout/tempid.py +0 -134
- webscout/webscout_search.py +0 -1183
- webscout/webscout_search_async.py +0 -649
- webscout/yep_search.py +0 -346
- webscout-8.3.7.dist-info/RECORD +0 -301
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/WHEEL +0 -0
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/entry_points.txt +0 -0
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/licenses/LICENSE.md +0 -0
- {webscout-8.3.7.dist-info → webscout-2025.10.13.dist-info}/top_level.txt +0 -0
webscout/Provider/__init__.py
CHANGED
|
@@ -1,18 +1,33 @@
|
|
|
1
|
-
# This file marks the directory as a Python package.
|
|
2
|
-
|
|
3
|
-
import os
|
|
4
|
-
import importlib
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
|
|
7
|
-
# Get current directory
|
|
8
|
-
current_dir = Path(__file__).parent
|
|
9
|
-
|
|
10
|
-
#
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
# This file marks the directory as a Python package.
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import importlib
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
# Get current directory
|
|
8
|
+
current_dir = Path(__file__).parent
|
|
9
|
+
|
|
10
|
+
# List to store all exported names
|
|
11
|
+
__all__ = []
|
|
12
|
+
|
|
13
|
+
# Auto-import all .py files (except __init__.py)
|
|
14
|
+
for file_path in current_dir.glob("*.py"):
|
|
15
|
+
if file_path.name != "__init__.py":
|
|
16
|
+
module_name = file_path.stem
|
|
17
|
+
try:
|
|
18
|
+
module = importlib.import_module(f".{module_name}", package=__name__)
|
|
19
|
+
|
|
20
|
+
# Import the main class (assumes class name matches filename)
|
|
21
|
+
class_name = module_name
|
|
22
|
+
if hasattr(module, class_name):
|
|
23
|
+
globals()[class_name] = getattr(module, class_name)
|
|
24
|
+
__all__.append(class_name)
|
|
25
|
+
else:
|
|
26
|
+
# If no matching class, import all public attributes
|
|
27
|
+
for attr_name in dir(module):
|
|
28
|
+
if not attr_name.startswith('_'):
|
|
29
|
+
globals()[attr_name] = getattr(module, attr_name)
|
|
30
|
+
if attr_name not in __all__:
|
|
31
|
+
__all__.append(attr_name)
|
|
32
|
+
except ImportError:
|
|
33
|
+
pass # Skip files that can't be imported
|
webscout/Provider/ai4chat.py
CHANGED
|
@@ -1,174 +1,174 @@
|
|
|
1
|
-
from curl_cffi.requests import Session, RequestsError
|
|
2
|
-
import urllib.parse
|
|
3
|
-
from typing import Union, Any, Dict
|
|
4
|
-
|
|
5
|
-
from webscout.AIutel import Optimizers
|
|
6
|
-
from webscout.AIutel import Conversation
|
|
7
|
-
from webscout.AIutel import AwesomePrompts
|
|
8
|
-
from webscout.AIbase import Provider
|
|
9
|
-
|
|
10
|
-
class AI4Chat(Provider):
|
|
11
|
-
"""
|
|
12
|
-
A class to interact with the AI4Chat Riddle API.
|
|
13
|
-
"""
|
|
14
|
-
required_auth = False
|
|
15
|
-
def __init__(
|
|
16
|
-
self,
|
|
17
|
-
is_conversation: bool = True,
|
|
18
|
-
max_tokens: int = 600,
|
|
19
|
-
timeout: int = 30,
|
|
20
|
-
intro: str = None,
|
|
21
|
-
filepath: str = None,
|
|
22
|
-
update_file: bool = True,
|
|
23
|
-
proxies: dict = {},
|
|
24
|
-
history_offset: int = 10250,
|
|
25
|
-
act: str = None,
|
|
26
|
-
system_prompt: str = "You are a helpful and informative AI assistant.",
|
|
27
|
-
country: str = "Asia",
|
|
28
|
-
user_id: str = "usersmjb2oaz7y"
|
|
29
|
-
) -> None:
|
|
30
|
-
self.session = Session(timeout=timeout, proxies=proxies)
|
|
31
|
-
self.is_conversation = is_conversation
|
|
32
|
-
self.max_tokens_to_sample = max_tokens
|
|
33
|
-
self.api_endpoint = "https://yw85opafq6.execute-api.us-east-1.amazonaws.com/default/boss_mode_15aug"
|
|
34
|
-
self.timeout = timeout
|
|
35
|
-
self.last_response = {}
|
|
36
|
-
self.country = country
|
|
37
|
-
self.user_id = user_id
|
|
38
|
-
self.headers = {
|
|
39
|
-
"Accept": "*/*",
|
|
40
|
-
"Accept-Language": "id-ID,id;q=0.9",
|
|
41
|
-
"Origin": "https://www.ai4chat.co",
|
|
42
|
-
"Priority": "u=1, i",
|
|
43
|
-
"Referer": "https://www.ai4chat.co/",
|
|
44
|
-
"Sec-CH-UA": '"Chromium";v="131", "Not_A Brand";v="24", "Microsoft Edge Simulate";v="131", "Lemur";v="131"',
|
|
45
|
-
"Sec-CH-UA-Mobile": "?1",
|
|
46
|
-
"Sec-CH-UA-Platform": '"Android"',
|
|
47
|
-
"Sec-Fetch-Dest": "empty",
|
|
48
|
-
"Sec-Fetch-Mode": "cors",
|
|
49
|
-
"Sec-Fetch-Site": "cross-site",
|
|
50
|
-
"User-Agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36"
|
|
51
|
-
}
|
|
52
|
-
self.__available_optimizers = tuple(
|
|
53
|
-
method for method in dir(Optimizers)
|
|
54
|
-
if callable(getattr(Optimizers, method)) and not method.startswith("__")
|
|
55
|
-
)
|
|
56
|
-
self.session.headers.update(self.headers)
|
|
57
|
-
Conversation.intro = (
|
|
58
|
-
AwesomePrompts().get_act(
|
|
59
|
-
act, raise_not_found=True, default=None, case_insensitive=True
|
|
60
|
-
)
|
|
61
|
-
if act
|
|
62
|
-
else intro or Conversation.intro
|
|
63
|
-
)
|
|
64
|
-
self.conversation = Conversation(
|
|
65
|
-
is_conversation, self.max_tokens_to_sample, filepath, update_file
|
|
66
|
-
)
|
|
67
|
-
self.conversation.history_offset = history_offset
|
|
68
|
-
self.system_prompt = system_prompt
|
|
69
|
-
|
|
70
|
-
def ask(
|
|
71
|
-
self,
|
|
72
|
-
prompt: str,
|
|
73
|
-
stream: bool = False,
|
|
74
|
-
raw: bool = False,
|
|
75
|
-
optimizer: str = None,
|
|
76
|
-
conversationally: bool = False,
|
|
77
|
-
country: str = None,
|
|
78
|
-
user_id: str = None,
|
|
79
|
-
):
|
|
80
|
-
"""
|
|
81
|
-
Sends a prompt to the AI4Chat API and returns the response.
|
|
82
|
-
If stream=True, yields small chunks of the response (simulated streaming).
|
|
83
|
-
"""
|
|
84
|
-
conversation_prompt = self.conversation.gen_complete_prompt(prompt)
|
|
85
|
-
if optimizer:
|
|
86
|
-
if optimizer in self.__available_optimizers:
|
|
87
|
-
conversation_prompt = getattr(Optimizers, optimizer)(
|
|
88
|
-
conversation_prompt if conversationally else prompt
|
|
89
|
-
)
|
|
90
|
-
else:
|
|
91
|
-
raise Exception(
|
|
92
|
-
f"Optimizer is not one of {self.__available_optimizers}"
|
|
93
|
-
)
|
|
94
|
-
country_param = country or self.country
|
|
95
|
-
user_id_param = user_id or self.user_id
|
|
96
|
-
encoded_text = urllib.parse.quote(conversation_prompt)
|
|
97
|
-
encoded_country = urllib.parse.quote(country_param)
|
|
98
|
-
encoded_user_id = urllib.parse.quote(user_id_param)
|
|
99
|
-
url = f"{self.api_endpoint}?text={encoded_text}&country={encoded_country}&user_id={encoded_user_id}"
|
|
100
|
-
try:
|
|
101
|
-
response = self.session.get(url, headers=self.headers, timeout=self.timeout)
|
|
102
|
-
except RequestsError as e:
|
|
103
|
-
raise Exception(f"Failed to generate response: {e}")
|
|
104
|
-
if not response.ok:
|
|
105
|
-
raise Exception(f"Failed to generate response: {response.status_code} - {response.reason}")
|
|
106
|
-
response_text = response.text
|
|
107
|
-
if response_text.startswith('"'):
|
|
108
|
-
response_text = response_text[1:]
|
|
109
|
-
if response_text.endswith('"'):
|
|
110
|
-
response_text = response_text[:-1]
|
|
111
|
-
response_text = response_text.replace('\\n', '\n').replace('\\n\\n', '\n\n')
|
|
112
|
-
self.last_response.update(dict(text=response_text))
|
|
113
|
-
self.conversation.update_chat_history(prompt, response_text)
|
|
114
|
-
if stream:
|
|
115
|
-
# Simulate streaming by yielding fixed-size character chunks (e.g., 48 chars)
|
|
116
|
-
buffer = response_text
|
|
117
|
-
chunk_size = 48
|
|
118
|
-
while buffer:
|
|
119
|
-
chunk = buffer[:chunk_size]
|
|
120
|
-
buffer = buffer[chunk_size:]
|
|
121
|
-
if chunk.strip():
|
|
122
|
-
yield {"text": chunk}
|
|
123
|
-
else:
|
|
124
|
-
return self.last_response
|
|
125
|
-
|
|
126
|
-
def chat(
|
|
127
|
-
self,
|
|
128
|
-
prompt: str,
|
|
129
|
-
stream: bool = False,
|
|
130
|
-
optimizer: str = None,
|
|
131
|
-
conversationally: bool = False,
|
|
132
|
-
country: str = None,
|
|
133
|
-
user_id: str = None,
|
|
134
|
-
):
|
|
135
|
-
"""
|
|
136
|
-
Generates a response from the AI4Chat API.
|
|
137
|
-
If stream=True, yields each chunk as a string.
|
|
138
|
-
"""
|
|
139
|
-
if stream:
|
|
140
|
-
for chunk in self.ask(
|
|
141
|
-
prompt,
|
|
142
|
-
stream=True,
|
|
143
|
-
optimizer=optimizer,
|
|
144
|
-
conversationally=conversationally,
|
|
145
|
-
country=country,
|
|
146
|
-
user_id=user_id,
|
|
147
|
-
):
|
|
148
|
-
yield self.get_message(chunk)
|
|
149
|
-
else:
|
|
150
|
-
return self.get_message(
|
|
151
|
-
self.ask(
|
|
152
|
-
prompt,
|
|
153
|
-
optimizer=optimizer,
|
|
154
|
-
conversationally=conversationally,
|
|
155
|
-
country=country,
|
|
156
|
-
user_id=user_id,
|
|
157
|
-
)
|
|
158
|
-
)
|
|
159
|
-
|
|
160
|
-
def get_message(self, response: Union[dict, str]) -> str:
|
|
161
|
-
"""
|
|
162
|
-
Retrieves message only from response
|
|
163
|
-
"""
|
|
164
|
-
if isinstance(response, str):
|
|
165
|
-
return response.replace('\\n', '\n').replace('\\n\\n', '\n\n')
|
|
166
|
-
assert isinstance(response, dict), "Response should be either dict or str"
|
|
167
|
-
return response["text"].replace('\\n', '\n').replace('\\n\\n', '\n\n')
|
|
168
|
-
|
|
169
|
-
if __name__ == "__main__":
|
|
170
|
-
from rich import print
|
|
171
|
-
ai = AI4Chat()
|
|
172
|
-
response = ai.chat("Tell me about humans in points", stream=True)
|
|
173
|
-
for c in response:
|
|
174
|
-
print(c, end="")
|
|
1
|
+
from curl_cffi.requests import Session, RequestsError
|
|
2
|
+
import urllib.parse
|
|
3
|
+
from typing import Union, Any, Dict
|
|
4
|
+
|
|
5
|
+
from webscout.AIutel import Optimizers
|
|
6
|
+
from webscout.AIutel import Conversation
|
|
7
|
+
from webscout.AIutel import AwesomePrompts
|
|
8
|
+
from webscout.AIbase import Provider
|
|
9
|
+
|
|
10
|
+
class AI4Chat(Provider):
|
|
11
|
+
"""
|
|
12
|
+
A class to interact with the AI4Chat Riddle API.
|
|
13
|
+
"""
|
|
14
|
+
required_auth = False
|
|
15
|
+
def __init__(
|
|
16
|
+
self,
|
|
17
|
+
is_conversation: bool = True,
|
|
18
|
+
max_tokens: int = 600,
|
|
19
|
+
timeout: int = 30,
|
|
20
|
+
intro: str = None,
|
|
21
|
+
filepath: str = None,
|
|
22
|
+
update_file: bool = True,
|
|
23
|
+
proxies: dict = {},
|
|
24
|
+
history_offset: int = 10250,
|
|
25
|
+
act: str = None,
|
|
26
|
+
system_prompt: str = "You are a helpful and informative AI assistant.",
|
|
27
|
+
country: str = "Asia",
|
|
28
|
+
user_id: str = "usersmjb2oaz7y"
|
|
29
|
+
) -> None:
|
|
30
|
+
self.session = Session(timeout=timeout, proxies=proxies)
|
|
31
|
+
self.is_conversation = is_conversation
|
|
32
|
+
self.max_tokens_to_sample = max_tokens
|
|
33
|
+
self.api_endpoint = "https://yw85opafq6.execute-api.us-east-1.amazonaws.com/default/boss_mode_15aug"
|
|
34
|
+
self.timeout = timeout
|
|
35
|
+
self.last_response = {}
|
|
36
|
+
self.country = country
|
|
37
|
+
self.user_id = user_id
|
|
38
|
+
self.headers = {
|
|
39
|
+
"Accept": "*/*",
|
|
40
|
+
"Accept-Language": "id-ID,id;q=0.9",
|
|
41
|
+
"Origin": "https://www.ai4chat.co",
|
|
42
|
+
"Priority": "u=1, i",
|
|
43
|
+
"Referer": "https://www.ai4chat.co/",
|
|
44
|
+
"Sec-CH-UA": '"Chromium";v="131", "Not_A Brand";v="24", "Microsoft Edge Simulate";v="131", "Lemur";v="131"',
|
|
45
|
+
"Sec-CH-UA-Mobile": "?1",
|
|
46
|
+
"Sec-CH-UA-Platform": '"Android"',
|
|
47
|
+
"Sec-Fetch-Dest": "empty",
|
|
48
|
+
"Sec-Fetch-Mode": "cors",
|
|
49
|
+
"Sec-Fetch-Site": "cross-site",
|
|
50
|
+
"User-Agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36"
|
|
51
|
+
}
|
|
52
|
+
self.__available_optimizers = tuple(
|
|
53
|
+
method for method in dir(Optimizers)
|
|
54
|
+
if callable(getattr(Optimizers, method)) and not method.startswith("__")
|
|
55
|
+
)
|
|
56
|
+
self.session.headers.update(self.headers)
|
|
57
|
+
Conversation.intro = (
|
|
58
|
+
AwesomePrompts().get_act(
|
|
59
|
+
act, raise_not_found=True, default=None, case_insensitive=True
|
|
60
|
+
)
|
|
61
|
+
if act
|
|
62
|
+
else intro or Conversation.intro
|
|
63
|
+
)
|
|
64
|
+
self.conversation = Conversation(
|
|
65
|
+
is_conversation, self.max_tokens_to_sample, filepath, update_file
|
|
66
|
+
)
|
|
67
|
+
self.conversation.history_offset = history_offset
|
|
68
|
+
self.system_prompt = system_prompt
|
|
69
|
+
|
|
70
|
+
def ask(
|
|
71
|
+
self,
|
|
72
|
+
prompt: str,
|
|
73
|
+
stream: bool = False,
|
|
74
|
+
raw: bool = False,
|
|
75
|
+
optimizer: str = None,
|
|
76
|
+
conversationally: bool = False,
|
|
77
|
+
country: str = None,
|
|
78
|
+
user_id: str = None,
|
|
79
|
+
):
|
|
80
|
+
"""
|
|
81
|
+
Sends a prompt to the AI4Chat API and returns the response.
|
|
82
|
+
If stream=True, yields small chunks of the response (simulated streaming).
|
|
83
|
+
"""
|
|
84
|
+
conversation_prompt = self.conversation.gen_complete_prompt(prompt)
|
|
85
|
+
if optimizer:
|
|
86
|
+
if optimizer in self.__available_optimizers:
|
|
87
|
+
conversation_prompt = getattr(Optimizers, optimizer)(
|
|
88
|
+
conversation_prompt if conversationally else prompt
|
|
89
|
+
)
|
|
90
|
+
else:
|
|
91
|
+
raise Exception(
|
|
92
|
+
f"Optimizer is not one of {self.__available_optimizers}"
|
|
93
|
+
)
|
|
94
|
+
country_param = country or self.country
|
|
95
|
+
user_id_param = user_id or self.user_id
|
|
96
|
+
encoded_text = urllib.parse.quote(conversation_prompt)
|
|
97
|
+
encoded_country = urllib.parse.quote(country_param)
|
|
98
|
+
encoded_user_id = urllib.parse.quote(user_id_param)
|
|
99
|
+
url = f"{self.api_endpoint}?text={encoded_text}&country={encoded_country}&user_id={encoded_user_id}"
|
|
100
|
+
try:
|
|
101
|
+
response = self.session.get(url, headers=self.headers, timeout=self.timeout)
|
|
102
|
+
except RequestsError as e:
|
|
103
|
+
raise Exception(f"Failed to generate response: {e}")
|
|
104
|
+
if not response.ok:
|
|
105
|
+
raise Exception(f"Failed to generate response: {response.status_code} - {response.reason}")
|
|
106
|
+
response_text = response.text
|
|
107
|
+
if response_text.startswith('"'):
|
|
108
|
+
response_text = response_text[1:]
|
|
109
|
+
if response_text.endswith('"'):
|
|
110
|
+
response_text = response_text[:-1]
|
|
111
|
+
response_text = response_text.replace('\\n', '\n').replace('\\n\\n', '\n\n')
|
|
112
|
+
self.last_response.update(dict(text=response_text))
|
|
113
|
+
self.conversation.update_chat_history(prompt, response_text)
|
|
114
|
+
if stream:
|
|
115
|
+
# Simulate streaming by yielding fixed-size character chunks (e.g., 48 chars)
|
|
116
|
+
buffer = response_text
|
|
117
|
+
chunk_size = 48
|
|
118
|
+
while buffer:
|
|
119
|
+
chunk = buffer[:chunk_size]
|
|
120
|
+
buffer = buffer[chunk_size:]
|
|
121
|
+
if chunk.strip():
|
|
122
|
+
yield {"text": chunk}
|
|
123
|
+
else:
|
|
124
|
+
return self.last_response
|
|
125
|
+
|
|
126
|
+
def chat(
|
|
127
|
+
self,
|
|
128
|
+
prompt: str,
|
|
129
|
+
stream: bool = False,
|
|
130
|
+
optimizer: str = None,
|
|
131
|
+
conversationally: bool = False,
|
|
132
|
+
country: str = None,
|
|
133
|
+
user_id: str = None,
|
|
134
|
+
):
|
|
135
|
+
"""
|
|
136
|
+
Generates a response from the AI4Chat API.
|
|
137
|
+
If stream=True, yields each chunk as a string.
|
|
138
|
+
"""
|
|
139
|
+
if stream:
|
|
140
|
+
for chunk in self.ask(
|
|
141
|
+
prompt,
|
|
142
|
+
stream=True,
|
|
143
|
+
optimizer=optimizer,
|
|
144
|
+
conversationally=conversationally,
|
|
145
|
+
country=country,
|
|
146
|
+
user_id=user_id,
|
|
147
|
+
):
|
|
148
|
+
yield self.get_message(chunk)
|
|
149
|
+
else:
|
|
150
|
+
return self.get_message(
|
|
151
|
+
self.ask(
|
|
152
|
+
prompt,
|
|
153
|
+
optimizer=optimizer,
|
|
154
|
+
conversationally=conversationally,
|
|
155
|
+
country=country,
|
|
156
|
+
user_id=user_id,
|
|
157
|
+
)
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
def get_message(self, response: Union[dict, str]) -> str:
|
|
161
|
+
"""
|
|
162
|
+
Retrieves message only from response
|
|
163
|
+
"""
|
|
164
|
+
if isinstance(response, str):
|
|
165
|
+
return response.replace('\\n', '\n').replace('\\n\\n', '\n\n')
|
|
166
|
+
assert isinstance(response, dict), "Response should be either dict or str"
|
|
167
|
+
return response["text"].replace('\\n', '\n').replace('\\n\\n', '\n\n')
|
|
168
|
+
|
|
169
|
+
if __name__ == "__main__":
|
|
170
|
+
from rich import print
|
|
171
|
+
ai = AI4Chat()
|
|
172
|
+
response = ai.chat("Tell me about humans in points", stream=True)
|
|
173
|
+
for c in response:
|
|
174
|
+
print(c, end="")
|