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/litagent/constants.py
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
"""Constants used by the LitAgent module."""
|
|
2
|
-
|
|
3
|
-
# Browser versions we support
|
|
4
|
-
BROWSERS = {
|
|
5
|
-
"chrome": (48, 120),
|
|
6
|
-
"firefox": (48, 121),
|
|
7
|
-
"safari": (605, 617),
|
|
8
|
-
"edge": (79, 120),
|
|
9
|
-
"opera": (48, 104),
|
|
10
|
-
"brave": (100, 120),
|
|
11
|
-
"vivaldi": (5, 6)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
# OS versions
|
|
15
|
-
OS_VERSIONS = {
|
|
16
|
-
"windows": ["10.0", "11.0"],
|
|
17
|
-
"mac": ["10_15_7", "11_0", "12_0", "13_0", "14_0"],
|
|
18
|
-
"linux": ["x86_64", "i686"],
|
|
19
|
-
"android": ["10", "11", "12", "13", "14"],
|
|
20
|
-
"ios": ["14_0", "15_0", "16_0", "17_0"],
|
|
21
|
-
"chrome_os": ["13.0", "14.0", "15.0"]
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
# Device types
|
|
25
|
-
DEVICES = {
|
|
26
|
-
"mobile": [
|
|
27
|
-
"iPhone", "iPad", "Samsung Galaxy", "Google Pixel",
|
|
28
|
-
"OnePlus", "Xiaomi", "Huawei", "OPPO", "Vivo"
|
|
29
|
-
],
|
|
30
|
-
"desktop": ["Windows PC", "MacBook", "iMac", "Linux Desktop"],
|
|
31
|
-
"tablet": ["iPad", "Samsung Galaxy Tab", "Microsoft Surface", "Huawei MatePad", "Lenovo Tab"],
|
|
32
|
-
"console": ["PlayStation 5", "Xbox Series X", "Nintendo Switch", "PlayStation 4", "Xbox One"],
|
|
33
|
-
"tv": ["Samsung Smart TV", "LG WebOS", "Android TV", "Apple TV", "Sony Bravia"],
|
|
34
|
-
"wearable": ["Apple Watch", "Samsung Galaxy Watch", "Fitbit", "Garmin"]
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
# Browser fingerprinting components
|
|
38
|
-
FINGERPRINTS = {
|
|
39
|
-
"accept_language": [
|
|
40
|
-
"en-US,en;q=0.9",
|
|
41
|
-
"en-GB,en;q=0.8,en-US;q=0.6",
|
|
42
|
-
"es-ES,es;q=0.9,en;q=0.8",
|
|
43
|
-
"fr-FR,fr;q=0.9,en;q=0.8",
|
|
44
|
-
"de-DE,de;q=0.9,en;q=0.8"
|
|
45
|
-
],
|
|
46
|
-
"accept": [
|
|
47
|
-
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
|
|
48
|
-
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
49
|
-
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
|
|
50
|
-
],
|
|
51
|
-
"sec_ch_ua": {
|
|
52
|
-
"chrome": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"{}\", \"Google Chrome\";v=\"{}\"",
|
|
53
|
-
"edge": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"{}\", \"Microsoft Edge\";v=\"{}\"",
|
|
54
|
-
"firefox": "\"Firefox\";v=\"{}\", \"Not;A=Brand\";v=\"8\"",
|
|
55
|
-
"safari": "\"Safari\";v=\"{}\", \"Not;A=Brand\";v=\"99\""
|
|
56
|
-
},
|
|
57
|
-
"platforms": [
|
|
58
|
-
"Windows", "macOS", "Linux", "Android", "iOS"
|
|
59
|
-
]
|
|
1
|
+
"""Constants used by the LitAgent module."""
|
|
2
|
+
|
|
3
|
+
# Browser versions we support
|
|
4
|
+
BROWSERS = {
|
|
5
|
+
"chrome": (48, 120),
|
|
6
|
+
"firefox": (48, 121),
|
|
7
|
+
"safari": (605, 617),
|
|
8
|
+
"edge": (79, 120),
|
|
9
|
+
"opera": (48, 104),
|
|
10
|
+
"brave": (100, 120),
|
|
11
|
+
"vivaldi": (5, 6)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
# OS versions
|
|
15
|
+
OS_VERSIONS = {
|
|
16
|
+
"windows": ["10.0", "11.0"],
|
|
17
|
+
"mac": ["10_15_7", "11_0", "12_0", "13_0", "14_0"],
|
|
18
|
+
"linux": ["x86_64", "i686"],
|
|
19
|
+
"android": ["10", "11", "12", "13", "14"],
|
|
20
|
+
"ios": ["14_0", "15_0", "16_0", "17_0"],
|
|
21
|
+
"chrome_os": ["13.0", "14.0", "15.0"]
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
# Device types
|
|
25
|
+
DEVICES = {
|
|
26
|
+
"mobile": [
|
|
27
|
+
"iPhone", "iPad", "Samsung Galaxy", "Google Pixel",
|
|
28
|
+
"OnePlus", "Xiaomi", "Huawei", "OPPO", "Vivo"
|
|
29
|
+
],
|
|
30
|
+
"desktop": ["Windows PC", "MacBook", "iMac", "Linux Desktop"],
|
|
31
|
+
"tablet": ["iPad", "Samsung Galaxy Tab", "Microsoft Surface", "Huawei MatePad", "Lenovo Tab"],
|
|
32
|
+
"console": ["PlayStation 5", "Xbox Series X", "Nintendo Switch", "PlayStation 4", "Xbox One"],
|
|
33
|
+
"tv": ["Samsung Smart TV", "LG WebOS", "Android TV", "Apple TV", "Sony Bravia"],
|
|
34
|
+
"wearable": ["Apple Watch", "Samsung Galaxy Watch", "Fitbit", "Garmin"]
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# Browser fingerprinting components
|
|
38
|
+
FINGERPRINTS = {
|
|
39
|
+
"accept_language": [
|
|
40
|
+
"en-US,en;q=0.9",
|
|
41
|
+
"en-GB,en;q=0.8,en-US;q=0.6",
|
|
42
|
+
"es-ES,es;q=0.9,en;q=0.8",
|
|
43
|
+
"fr-FR,fr;q=0.9,en;q=0.8",
|
|
44
|
+
"de-DE,de;q=0.9,en;q=0.8"
|
|
45
|
+
],
|
|
46
|
+
"accept": [
|
|
47
|
+
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
|
|
48
|
+
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
49
|
+
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
|
|
50
|
+
],
|
|
51
|
+
"sec_ch_ua": {
|
|
52
|
+
"chrome": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"{}\", \"Google Chrome\";v=\"{}\"",
|
|
53
|
+
"edge": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"{}\", \"Microsoft Edge\";v=\"{}\"",
|
|
54
|
+
"firefox": "\"Firefox\";v=\"{}\", \"Not;A=Brand\";v=\"8\"",
|
|
55
|
+
"safari": "\"Safari\";v=\"{}\", \"Not;A=Brand\";v=\"99\""
|
|
56
|
+
},
|
|
57
|
+
"platforms": [
|
|
58
|
+
"Windows", "macOS", "Linux", "Android", "iOS"
|
|
59
|
+
]
|
|
60
60
|
}
|
webscout/litprinter/__init__.py
CHANGED
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
"""
|
|
2
|
-
>>> from litprinter import litprint
|
|
3
|
-
>>> from litprinter import lit
|
|
4
|
-
>>> from litprinter import install, uninstall
|
|
5
|
-
>>>
|
|
6
|
-
>>> litprint("Hello, world!")
|
|
7
|
-
LIT -> [__main__.py:1] in () >>> Hello, world!
|
|
8
|
-
>>>
|
|
9
|
-
>>> def my_function():
|
|
10
|
-
... lit(1, 2, 3)
|
|
11
|
-
>>> my_function()
|
|
12
|
-
LIT -> [__main__.py:4] in my_function() >>> 1, 2, 3
|
|
13
|
-
>>> install()
|
|
14
|
-
>>> ic("This is now the builtins.ic()")
|
|
15
|
-
LIT -> [__main__.py:7] in () >>> This is now the builtins.ic()
|
|
16
|
-
>>> uninstall()
|
|
17
|
-
|
|
18
|
-
This module provides enhanced print and logging functionalities for Python,
|
|
19
|
-
allowing developers to debug their code with style and precision. It
|
|
20
|
-
includes the litprint and lit functions for debugging, log for logging, and
|
|
21
|
-
install/uninstall functions for integration into the builtins module.
|
|
22
|
-
It also handles colorizing output and provides different styles and customizable
|
|
23
|
-
options.
|
|
24
|
-
|
|
25
|
-
LITPRINTER is inspired by the icecream package and provides similar functionality
|
|
26
|
-
with additional features:
|
|
27
|
-
- Variable inspection with expression display
|
|
28
|
-
- Return value handling for inline usage
|
|
29
|
-
- Support for custom formatters for specific data types
|
|
30
|
-
- Execution context tracking
|
|
31
|
-
- Rich-like colorized output with multiple themes (JARVIS, RICH, MODERN, NEON, CYBERPUNK)
|
|
32
|
-
- Better JSON formatting with indent=2 by default
|
|
33
|
-
- Advanced pretty printing for complex data structures with smart truncation
|
|
34
|
-
- Clickable file paths in supported terminals and editors (VSCode compatible)
|
|
35
|
-
- Enhanced visual formatting with better spacing and separators
|
|
36
|
-
- Special formatters for common types (Exception, bytes, set, frozenset, etc.)
|
|
37
|
-
- Smart object introspection for custom classes
|
|
38
|
-
- Logging capabilities with timestamp and log levels
|
|
39
|
-
"""
|
|
40
|
-
|
|
41
|
-
# Try to import from the standalone litprinter package first
|
|
42
|
-
# If it's not installed
|
|
43
|
-
try:
|
|
44
|
-
import litprinter
|
|
45
|
-
# If standalone package is found, re-export all its components
|
|
46
|
-
from litprinter import litprint, lit, log, ic, install, uninstall
|
|
47
|
-
from litprinter import LITPrintDebugger, argumentToString
|
|
48
|
-
from litprinter import JARVIS, RICH, MODERN, NEON, CYBERPUNK, create_custom_style
|
|
49
|
-
from litprinter import traceback
|
|
50
|
-
# For compatibility with icecream
|
|
51
|
-
enable = litprinter.enable
|
|
52
|
-
disable = litprinter.disable
|
|
53
|
-
|
|
54
|
-
except ImportError:
|
|
55
|
-
# Raise a more informative error when litprinter is not installed
|
|
56
|
-
raise ImportError(
|
|
57
|
-
"The 'litprinter' package is required but not installed. "
|
|
58
|
-
"Please install it using: pip install litprinter"
|
|
1
|
+
"""
|
|
2
|
+
>>> from litprinter import litprint
|
|
3
|
+
>>> from litprinter import lit
|
|
4
|
+
>>> from litprinter import install, uninstall
|
|
5
|
+
>>>
|
|
6
|
+
>>> litprint("Hello, world!")
|
|
7
|
+
LIT -> [__main__.py:1] in () >>> Hello, world!
|
|
8
|
+
>>>
|
|
9
|
+
>>> def my_function():
|
|
10
|
+
... lit(1, 2, 3)
|
|
11
|
+
>>> my_function()
|
|
12
|
+
LIT -> [__main__.py:4] in my_function() >>> 1, 2, 3
|
|
13
|
+
>>> install()
|
|
14
|
+
>>> ic("This is now the builtins.ic()")
|
|
15
|
+
LIT -> [__main__.py:7] in () >>> This is now the builtins.ic()
|
|
16
|
+
>>> uninstall()
|
|
17
|
+
|
|
18
|
+
This module provides enhanced print and logging functionalities for Python,
|
|
19
|
+
allowing developers to debug their code with style and precision. It
|
|
20
|
+
includes the litprint and lit functions for debugging, log for logging, and
|
|
21
|
+
install/uninstall functions for integration into the builtins module.
|
|
22
|
+
It also handles colorizing output and provides different styles and customizable
|
|
23
|
+
options.
|
|
24
|
+
|
|
25
|
+
LITPRINTER is inspired by the icecream package and provides similar functionality
|
|
26
|
+
with additional features:
|
|
27
|
+
- Variable inspection with expression display
|
|
28
|
+
- Return value handling for inline usage
|
|
29
|
+
- Support for custom formatters for specific data types
|
|
30
|
+
- Execution context tracking
|
|
31
|
+
- Rich-like colorized output with multiple themes (JARVIS, RICH, MODERN, NEON, CYBERPUNK)
|
|
32
|
+
- Better JSON formatting with indent=2 by default
|
|
33
|
+
- Advanced pretty printing for complex data structures with smart truncation
|
|
34
|
+
- Clickable file paths in supported terminals and editors (VSCode compatible)
|
|
35
|
+
- Enhanced visual formatting with better spacing and separators
|
|
36
|
+
- Special formatters for common types (Exception, bytes, set, frozenset, etc.)
|
|
37
|
+
- Smart object introspection for custom classes
|
|
38
|
+
- Logging capabilities with timestamp and log levels
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
# Try to import from the standalone litprinter package first
|
|
42
|
+
# If it's not installed
|
|
43
|
+
try:
|
|
44
|
+
import litprinter
|
|
45
|
+
# If standalone package is found, re-export all its components
|
|
46
|
+
from litprinter import litprint, lit, log, ic, install, uninstall
|
|
47
|
+
from litprinter import LITPrintDebugger, argumentToString
|
|
48
|
+
from litprinter import JARVIS, RICH, MODERN, NEON, CYBERPUNK, create_custom_style
|
|
49
|
+
from litprinter import traceback
|
|
50
|
+
# For compatibility with icecream
|
|
51
|
+
enable = litprinter.enable
|
|
52
|
+
disable = litprinter.disable
|
|
53
|
+
|
|
54
|
+
except ImportError:
|
|
55
|
+
# Raise a more informative error when litprinter is not installed
|
|
56
|
+
raise ImportError(
|
|
57
|
+
"The 'litprinter' package is required but not installed. "
|
|
58
|
+
"Please install it using: pip install litprinter"
|
|
59
59
|
) from None
|
webscout/models.py
CHANGED
|
@@ -1,181 +1,181 @@
|
|
|
1
|
-
import importlib
|
|
2
|
-
import pkgutil
|
|
3
|
-
from typing import Dict, List, Any, Union
|
|
4
|
-
from webscout.AIbase import Provider, TTSProvider
|
|
5
|
-
|
|
6
|
-
class _LLMModels:
|
|
7
|
-
"""
|
|
8
|
-
A class for managing LLM provider models in the webscout package.
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
def list(self) -> Dict[str, List[str]]:
|
|
12
|
-
"""
|
|
13
|
-
Gets all available models from each provider that has an AVAILABLE_MODELS attribute.
|
|
14
|
-
|
|
15
|
-
Returns:
|
|
16
|
-
Dictionary mapping provider names to their available models
|
|
17
|
-
"""
|
|
18
|
-
return self._get_provider_models()
|
|
19
|
-
|
|
20
|
-
def get(self, provider_name: str) -> List[str]:
|
|
21
|
-
"""
|
|
22
|
-
Gets all available models for a specific provider.
|
|
23
|
-
|
|
24
|
-
Args:
|
|
25
|
-
provider_name: The name of the provider
|
|
26
|
-
|
|
27
|
-
Returns:
|
|
28
|
-
List of available models for the provider
|
|
29
|
-
"""
|
|
30
|
-
all_models = self._get_provider_models()
|
|
31
|
-
return all_models.get(provider_name, [])
|
|
32
|
-
|
|
33
|
-
def summary(self) -> Dict[str, int]:
|
|
34
|
-
"""
|
|
35
|
-
Returns a summary of available providers and models.
|
|
36
|
-
|
|
37
|
-
Returns:
|
|
38
|
-
Dictionary with provider and model counts
|
|
39
|
-
"""
|
|
40
|
-
provider_models = self._get_provider_models()
|
|
41
|
-
total_providers = len(provider_models)
|
|
42
|
-
total_models = sum(len(models) if isinstance(models, (list, tuple, set))
|
|
43
|
-
else 1 for models in provider_models.values())
|
|
44
|
-
|
|
45
|
-
return {
|
|
46
|
-
"providers": total_providers,
|
|
47
|
-
"models": total_models,
|
|
48
|
-
"provider_model_counts": {
|
|
49
|
-
provider: len(models) if isinstance(models, (list, tuple, set)) else 1
|
|
50
|
-
for provider, models in provider_models.items()
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
def _get_provider_models(self) -> Dict[str, List[str]]:
|
|
55
|
-
"""
|
|
56
|
-
Internal method to get all available models from each provider.
|
|
57
|
-
|
|
58
|
-
Returns:
|
|
59
|
-
Dictionary mapping provider names to their available models
|
|
60
|
-
"""
|
|
61
|
-
provider_models = {}
|
|
62
|
-
provider_package = importlib.import_module("webscout.Provider")
|
|
63
|
-
|
|
64
|
-
for _, module_name, _ in pkgutil.iter_modules(provider_package.__path__):
|
|
65
|
-
try:
|
|
66
|
-
module = importlib.import_module(f"webscout.Provider.{module_name}")
|
|
67
|
-
for attr_name in dir(module):
|
|
68
|
-
attr = getattr(module, attr_name)
|
|
69
|
-
if isinstance(attr, type) and issubclass(attr, Provider) and attr != Provider:
|
|
70
|
-
if hasattr(attr, 'AVAILABLE_MODELS'):
|
|
71
|
-
# Convert any sets to lists to ensure serializability
|
|
72
|
-
models = attr.AVAILABLE_MODELS
|
|
73
|
-
if isinstance(models, set):
|
|
74
|
-
models = list(models)
|
|
75
|
-
provider_models[attr_name] = models
|
|
76
|
-
except Exception:
|
|
77
|
-
pass
|
|
78
|
-
|
|
79
|
-
return provider_models
|
|
80
|
-
|
|
81
|
-
class _TTSModels:
|
|
82
|
-
"""
|
|
83
|
-
A class for managing TTS provider voices in the webscout package.
|
|
84
|
-
"""
|
|
85
|
-
|
|
86
|
-
def list(self) -> Dict[str, List[str]]:
|
|
87
|
-
"""
|
|
88
|
-
Gets all available voices from each TTS provider that has an all_voices attribute.
|
|
89
|
-
|
|
90
|
-
Returns:
|
|
91
|
-
Dictionary mapping TTS provider names to their available voices
|
|
92
|
-
"""
|
|
93
|
-
return self._get_tts_voices()
|
|
94
|
-
|
|
95
|
-
def get(self, provider_name: str) -> Union[List[str], Dict[str, str]]:
|
|
96
|
-
"""
|
|
97
|
-
Gets all available voices for a specific TTS provider.
|
|
98
|
-
|
|
99
|
-
Args:
|
|
100
|
-
provider_name: The name of the TTS provider
|
|
101
|
-
|
|
102
|
-
Returns:
|
|
103
|
-
List or Dictionary of available voices for the provider
|
|
104
|
-
"""
|
|
105
|
-
all_voices = self._get_tts_voices()
|
|
106
|
-
return all_voices.get(provider_name, [])
|
|
107
|
-
|
|
108
|
-
def summary(self) -> Dict[str, Any]:
|
|
109
|
-
"""
|
|
110
|
-
Returns a summary of available TTS providers and voices.
|
|
111
|
-
|
|
112
|
-
Returns:
|
|
113
|
-
Dictionary with provider and voice counts
|
|
114
|
-
"""
|
|
115
|
-
provider_voices = self._get_tts_voices()
|
|
116
|
-
total_providers = len(provider_voices)
|
|
117
|
-
|
|
118
|
-
# Count voices, handling both list and dict formats
|
|
119
|
-
total_voices = 0
|
|
120
|
-
provider_voice_counts = {}
|
|
121
|
-
|
|
122
|
-
for provider, voices in provider_voices.items():
|
|
123
|
-
if isinstance(voices, dict):
|
|
124
|
-
count = len(voices)
|
|
125
|
-
elif isinstance(voices, (list, tuple, set)):
|
|
126
|
-
count = len(voices)
|
|
127
|
-
else:
|
|
128
|
-
count = 1
|
|
129
|
-
|
|
130
|
-
total_voices += count
|
|
131
|
-
provider_voice_counts[provider] = count
|
|
132
|
-
|
|
133
|
-
return {
|
|
134
|
-
"providers": total_providers,
|
|
135
|
-
"voices": total_voices,
|
|
136
|
-
"provider_voice_counts": provider_voice_counts
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
def _get_tts_voices(self) -> Dict[str, Union[List[str], Dict[str, str]]]:
|
|
140
|
-
"""
|
|
141
|
-
Internal method to get all available voices from each TTS provider.
|
|
142
|
-
|
|
143
|
-
Returns:
|
|
144
|
-
Dictionary mapping TTS provider names to their available voices
|
|
145
|
-
"""
|
|
146
|
-
provider_voices = {}
|
|
147
|
-
|
|
148
|
-
try:
|
|
149
|
-
# Import the TTS package specifically
|
|
150
|
-
tts_package = importlib.import_module("webscout.Provider.TTS")
|
|
151
|
-
|
|
152
|
-
# Iterate through TTS modules
|
|
153
|
-
for _, module_name, _ in pkgutil.iter_modules(tts_package.__path__):
|
|
154
|
-
try:
|
|
155
|
-
module = importlib.import_module(f"webscout.Provider.TTS.{module_name}")
|
|
156
|
-
for attr_name in dir(module):
|
|
157
|
-
attr = getattr(module, attr_name)
|
|
158
|
-
if isinstance(attr, type) and issubclass(attr, TTSProvider) and attr != TTSProvider:
|
|
159
|
-
# TTS providers typically use 'all_voices' instead of 'AVAILABLE_MODELS'
|
|
160
|
-
if hasattr(attr, 'all_voices'):
|
|
161
|
-
voices = attr.all_voices
|
|
162
|
-
provider_voices[attr_name] = voices
|
|
163
|
-
except Exception as e:
|
|
164
|
-
pass
|
|
165
|
-
except Exception as e:
|
|
166
|
-
pass
|
|
167
|
-
|
|
168
|
-
return provider_voices
|
|
169
|
-
|
|
170
|
-
# Create singleton instances
|
|
171
|
-
llm = _LLMModels()
|
|
172
|
-
tts = _TTSModels()
|
|
173
|
-
|
|
174
|
-
# Container class for all model types
|
|
175
|
-
class Models:
|
|
176
|
-
def __init__(self):
|
|
177
|
-
self.llm = llm
|
|
178
|
-
self.tts = tts
|
|
179
|
-
|
|
180
|
-
# Create a singleton instance
|
|
181
|
-
model = Models()
|
|
1
|
+
import importlib
|
|
2
|
+
import pkgutil
|
|
3
|
+
from typing import Dict, List, Any, Union
|
|
4
|
+
from webscout.AIbase import Provider, TTSProvider
|
|
5
|
+
|
|
6
|
+
class _LLMModels:
|
|
7
|
+
"""
|
|
8
|
+
A class for managing LLM provider models in the webscout package.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def list(self) -> Dict[str, List[str]]:
|
|
12
|
+
"""
|
|
13
|
+
Gets all available models from each provider that has an AVAILABLE_MODELS attribute.
|
|
14
|
+
|
|
15
|
+
Returns:
|
|
16
|
+
Dictionary mapping provider names to their available models
|
|
17
|
+
"""
|
|
18
|
+
return self._get_provider_models()
|
|
19
|
+
|
|
20
|
+
def get(self, provider_name: str) -> List[str]:
|
|
21
|
+
"""
|
|
22
|
+
Gets all available models for a specific provider.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
provider_name: The name of the provider
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
List of available models for the provider
|
|
29
|
+
"""
|
|
30
|
+
all_models = self._get_provider_models()
|
|
31
|
+
return all_models.get(provider_name, [])
|
|
32
|
+
|
|
33
|
+
def summary(self) -> Dict[str, int]:
|
|
34
|
+
"""
|
|
35
|
+
Returns a summary of available providers and models.
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
Dictionary with provider and model counts
|
|
39
|
+
"""
|
|
40
|
+
provider_models = self._get_provider_models()
|
|
41
|
+
total_providers = len(provider_models)
|
|
42
|
+
total_models = sum(len(models) if isinstance(models, (list, tuple, set))
|
|
43
|
+
else 1 for models in provider_models.values())
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
"providers": total_providers,
|
|
47
|
+
"models": total_models,
|
|
48
|
+
"provider_model_counts": {
|
|
49
|
+
provider: len(models) if isinstance(models, (list, tuple, set)) else 1
|
|
50
|
+
for provider, models in provider_models.items()
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
def _get_provider_models(self) -> Dict[str, List[str]]:
|
|
55
|
+
"""
|
|
56
|
+
Internal method to get all available models from each provider.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
Dictionary mapping provider names to their available models
|
|
60
|
+
"""
|
|
61
|
+
provider_models = {}
|
|
62
|
+
provider_package = importlib.import_module("webscout.Provider")
|
|
63
|
+
|
|
64
|
+
for _, module_name, _ in pkgutil.iter_modules(provider_package.__path__):
|
|
65
|
+
try:
|
|
66
|
+
module = importlib.import_module(f"webscout.Provider.{module_name}")
|
|
67
|
+
for attr_name in dir(module):
|
|
68
|
+
attr = getattr(module, attr_name)
|
|
69
|
+
if isinstance(attr, type) and issubclass(attr, Provider) and attr != Provider:
|
|
70
|
+
if hasattr(attr, 'AVAILABLE_MODELS'):
|
|
71
|
+
# Convert any sets to lists to ensure serializability
|
|
72
|
+
models = attr.AVAILABLE_MODELS
|
|
73
|
+
if isinstance(models, set):
|
|
74
|
+
models = list(models)
|
|
75
|
+
provider_models[attr_name] = models
|
|
76
|
+
except Exception:
|
|
77
|
+
pass
|
|
78
|
+
|
|
79
|
+
return provider_models
|
|
80
|
+
|
|
81
|
+
class _TTSModels:
|
|
82
|
+
"""
|
|
83
|
+
A class for managing TTS provider voices in the webscout package.
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
def list(self) -> Dict[str, List[str]]:
|
|
87
|
+
"""
|
|
88
|
+
Gets all available voices from each TTS provider that has an all_voices attribute.
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
Dictionary mapping TTS provider names to their available voices
|
|
92
|
+
"""
|
|
93
|
+
return self._get_tts_voices()
|
|
94
|
+
|
|
95
|
+
def get(self, provider_name: str) -> Union[List[str], Dict[str, str]]:
|
|
96
|
+
"""
|
|
97
|
+
Gets all available voices for a specific TTS provider.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
provider_name: The name of the TTS provider
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
List or Dictionary of available voices for the provider
|
|
104
|
+
"""
|
|
105
|
+
all_voices = self._get_tts_voices()
|
|
106
|
+
return all_voices.get(provider_name, [])
|
|
107
|
+
|
|
108
|
+
def summary(self) -> Dict[str, Any]:
|
|
109
|
+
"""
|
|
110
|
+
Returns a summary of available TTS providers and voices.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
Dictionary with provider and voice counts
|
|
114
|
+
"""
|
|
115
|
+
provider_voices = self._get_tts_voices()
|
|
116
|
+
total_providers = len(provider_voices)
|
|
117
|
+
|
|
118
|
+
# Count voices, handling both list and dict formats
|
|
119
|
+
total_voices = 0
|
|
120
|
+
provider_voice_counts = {}
|
|
121
|
+
|
|
122
|
+
for provider, voices in provider_voices.items():
|
|
123
|
+
if isinstance(voices, dict):
|
|
124
|
+
count = len(voices)
|
|
125
|
+
elif isinstance(voices, (list, tuple, set)):
|
|
126
|
+
count = len(voices)
|
|
127
|
+
else:
|
|
128
|
+
count = 1
|
|
129
|
+
|
|
130
|
+
total_voices += count
|
|
131
|
+
provider_voice_counts[provider] = count
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
"providers": total_providers,
|
|
135
|
+
"voices": total_voices,
|
|
136
|
+
"provider_voice_counts": provider_voice_counts
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
def _get_tts_voices(self) -> Dict[str, Union[List[str], Dict[str, str]]]:
|
|
140
|
+
"""
|
|
141
|
+
Internal method to get all available voices from each TTS provider.
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
Dictionary mapping TTS provider names to their available voices
|
|
145
|
+
"""
|
|
146
|
+
provider_voices = {}
|
|
147
|
+
|
|
148
|
+
try:
|
|
149
|
+
# Import the TTS package specifically
|
|
150
|
+
tts_package = importlib.import_module("webscout.Provider.TTS")
|
|
151
|
+
|
|
152
|
+
# Iterate through TTS modules
|
|
153
|
+
for _, module_name, _ in pkgutil.iter_modules(tts_package.__path__):
|
|
154
|
+
try:
|
|
155
|
+
module = importlib.import_module(f"webscout.Provider.TTS.{module_name}")
|
|
156
|
+
for attr_name in dir(module):
|
|
157
|
+
attr = getattr(module, attr_name)
|
|
158
|
+
if isinstance(attr, type) and issubclass(attr, TTSProvider) and attr != TTSProvider:
|
|
159
|
+
# TTS providers typically use 'all_voices' instead of 'AVAILABLE_MODELS'
|
|
160
|
+
if hasattr(attr, 'all_voices'):
|
|
161
|
+
voices = attr.all_voices
|
|
162
|
+
provider_voices[attr_name] = voices
|
|
163
|
+
except Exception as e:
|
|
164
|
+
pass
|
|
165
|
+
except Exception as e:
|
|
166
|
+
pass
|
|
167
|
+
|
|
168
|
+
return provider_voices
|
|
169
|
+
|
|
170
|
+
# Create singleton instances
|
|
171
|
+
llm = _LLMModels()
|
|
172
|
+
tts = _TTSModels()
|
|
173
|
+
|
|
174
|
+
# Container class for all model types
|
|
175
|
+
class Models:
|
|
176
|
+
def __init__(self):
|
|
177
|
+
self.llm = llm
|
|
178
|
+
self.tts = tts
|
|
179
|
+
|
|
180
|
+
# Create a singleton instance
|
|
181
|
+
model = Models()
|