webscout 8.2.9__py3-none-any.whl → 2026.1.19__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 +524 -251
- webscout/AIbase.py +247 -319
- webscout/AIutel.py +68 -703
- webscout/Bard.py +1072 -1026
- webscout/Extra/GitToolkit/__init__.py +10 -10
- webscout/Extra/GitToolkit/gitapi/__init__.py +20 -12
- webscout/Extra/GitToolkit/gitapi/gist.py +142 -0
- webscout/Extra/GitToolkit/gitapi/organization.py +91 -0
- webscout/Extra/GitToolkit/gitapi/repository.py +308 -195
- webscout/Extra/GitToolkit/gitapi/search.py +162 -0
- webscout/Extra/GitToolkit/gitapi/trending.py +236 -0
- webscout/Extra/GitToolkit/gitapi/user.py +128 -96
- webscout/Extra/GitToolkit/gitapi/utils.py +82 -62
- webscout/Extra/YTToolkit/README.md +443 -375
- webscout/Extra/YTToolkit/YTdownloader.py +953 -957
- webscout/Extra/YTToolkit/__init__.py +3 -3
- webscout/Extra/YTToolkit/transcriber.py +595 -476
- webscout/Extra/YTToolkit/ytapi/README.md +230 -44
- webscout/Extra/YTToolkit/ytapi/__init__.py +22 -6
- webscout/Extra/YTToolkit/ytapi/captions.py +190 -0
- webscout/Extra/YTToolkit/ytapi/channel.py +302 -307
- webscout/Extra/YTToolkit/ytapi/errors.py +13 -13
- webscout/Extra/YTToolkit/ytapi/extras.py +178 -118
- webscout/Extra/YTToolkit/ytapi/hashtag.py +120 -0
- webscout/Extra/YTToolkit/ytapi/https.py +89 -88
- webscout/Extra/YTToolkit/ytapi/patterns.py +61 -61
- webscout/Extra/YTToolkit/ytapi/playlist.py +59 -59
- webscout/Extra/YTToolkit/ytapi/pool.py +8 -8
- webscout/Extra/YTToolkit/ytapi/query.py +143 -40
- webscout/Extra/YTToolkit/ytapi/shorts.py +122 -0
- webscout/Extra/YTToolkit/ytapi/stream.py +68 -63
- webscout/Extra/YTToolkit/ytapi/suggestions.py +97 -0
- webscout/Extra/YTToolkit/ytapi/utils.py +66 -62
- webscout/Extra/YTToolkit/ytapi/video.py +403 -232
- webscout/Extra/__init__.py +2 -3
- webscout/Extra/gguf.py +1298 -684
- webscout/Extra/tempmail/README.md +487 -487
- webscout/Extra/tempmail/__init__.py +28 -28
- webscout/Extra/tempmail/async_utils.py +143 -141
- webscout/Extra/tempmail/base.py +172 -161
- webscout/Extra/tempmail/cli.py +191 -187
- webscout/Extra/tempmail/emailnator.py +88 -84
- webscout/Extra/tempmail/mail_tm.py +378 -361
- webscout/Extra/tempmail/temp_mail_io.py +304 -292
- webscout/Extra/weather.py +196 -194
- webscout/Extra/weather_ascii.py +17 -15
- webscout/Provider/AISEARCH/PERPLEXED_search.py +175 -0
- webscout/Provider/AISEARCH/Perplexity.py +292 -333
- webscout/Provider/AISEARCH/README.md +106 -279
- webscout/Provider/AISEARCH/__init__.py +16 -9
- webscout/Provider/AISEARCH/brave_search.py +298 -0
- webscout/Provider/AISEARCH/iask_search.py +357 -410
- webscout/Provider/AISEARCH/monica_search.py +200 -220
- webscout/Provider/AISEARCH/webpilotai_search.py +242 -255
- webscout/Provider/Algion.py +413 -0
- webscout/Provider/Andi.py +74 -69
- webscout/Provider/Apriel.py +313 -0
- webscout/Provider/Ayle.py +323 -0
- webscout/Provider/ChatSandbox.py +329 -342
- webscout/Provider/ClaudeOnline.py +365 -0
- webscout/Provider/Cohere.py +232 -208
- webscout/Provider/DeepAI.py +367 -0
- webscout/Provider/Deepinfra.py +467 -340
- webscout/Provider/EssentialAI.py +217 -0
- webscout/Provider/ExaAI.py +274 -261
- webscout/Provider/Gemini.py +175 -169
- webscout/Provider/GithubChat.py +385 -369
- webscout/Provider/Gradient.py +286 -0
- webscout/Provider/Groq.py +556 -801
- webscout/Provider/HadadXYZ.py +323 -0
- webscout/Provider/HeckAI.py +392 -375
- webscout/Provider/HuggingFace.py +387 -0
- webscout/Provider/IBM.py +340 -0
- webscout/Provider/Jadve.py +317 -291
- webscout/Provider/K2Think.py +306 -0
- webscout/Provider/Koboldai.py +221 -384
- webscout/Provider/Netwrck.py +273 -270
- webscout/Provider/Nvidia.py +310 -0
- webscout/Provider/OPENAI/DeepAI.py +489 -0
- webscout/Provider/OPENAI/K2Think.py +423 -0
- webscout/Provider/OPENAI/PI.py +463 -0
- webscout/Provider/OPENAI/README.md +890 -952
- webscout/Provider/OPENAI/TogetherAI.py +405 -0
- webscout/Provider/OPENAI/TwoAI.py +255 -357
- webscout/Provider/OPENAI/__init__.py +148 -40
- webscout/Provider/OPENAI/ai4chat.py +348 -293
- webscout/Provider/OPENAI/akashgpt.py +436 -0
- webscout/Provider/OPENAI/algion.py +303 -0
- webscout/Provider/OPENAI/{exachat.py → ayle.py} +365 -444
- webscout/Provider/OPENAI/base.py +253 -249
- webscout/Provider/OPENAI/cerebras.py +296 -0
- webscout/Provider/OPENAI/chatgpt.py +870 -556
- webscout/Provider/OPENAI/chatsandbox.py +233 -173
- webscout/Provider/OPENAI/deepinfra.py +403 -322
- webscout/Provider/OPENAI/e2b.py +2370 -1414
- webscout/Provider/OPENAI/elmo.py +278 -0
- webscout/Provider/OPENAI/exaai.py +452 -417
- webscout/Provider/OPENAI/freeassist.py +446 -0
- webscout/Provider/OPENAI/gradient.py +448 -0
- webscout/Provider/OPENAI/groq.py +380 -364
- webscout/Provider/OPENAI/hadadxyz.py +292 -0
- webscout/Provider/OPENAI/heckai.py +333 -308
- webscout/Provider/OPENAI/huggingface.py +321 -0
- webscout/Provider/OPENAI/ibm.py +425 -0
- webscout/Provider/OPENAI/llmchat.py +253 -0
- webscout/Provider/OPENAI/llmchatco.py +378 -335
- webscout/Provider/OPENAI/meta.py +541 -0
- webscout/Provider/OPENAI/netwrck.py +374 -357
- webscout/Provider/OPENAI/nvidia.py +317 -0
- webscout/Provider/OPENAI/oivscode.py +348 -287
- webscout/Provider/OPENAI/openrouter.py +328 -0
- webscout/Provider/OPENAI/pydantic_imports.py +1 -172
- webscout/Provider/OPENAI/sambanova.py +397 -0
- webscout/Provider/OPENAI/sonus.py +305 -304
- webscout/Provider/OPENAI/textpollinations.py +370 -339
- webscout/Provider/OPENAI/toolbaz.py +375 -413
- webscout/Provider/OPENAI/typefully.py +419 -355
- webscout/Provider/OPENAI/typliai.py +279 -0
- webscout/Provider/OPENAI/utils.py +314 -318
- webscout/Provider/OPENAI/wisecat.py +359 -387
- webscout/Provider/OPENAI/writecream.py +185 -163
- webscout/Provider/OPENAI/x0gpt.py +462 -365
- webscout/Provider/OPENAI/zenmux.py +380 -0
- webscout/Provider/OpenRouter.py +386 -0
- webscout/Provider/Openai.py +337 -496
- webscout/Provider/PI.py +443 -429
- webscout/Provider/QwenLM.py +346 -254
- webscout/Provider/STT/__init__.py +28 -0
- webscout/Provider/STT/base.py +303 -0
- webscout/Provider/STT/elevenlabs.py +264 -0
- webscout/Provider/Sambanova.py +317 -0
- webscout/Provider/TTI/README.md +69 -82
- webscout/Provider/TTI/__init__.py +37 -7
- webscout/Provider/TTI/base.py +147 -64
- webscout/Provider/TTI/claudeonline.py +393 -0
- webscout/Provider/TTI/magicstudio.py +292 -201
- webscout/Provider/TTI/miragic.py +180 -0
- webscout/Provider/TTI/pollinations.py +331 -221
- webscout/Provider/TTI/together.py +334 -0
- webscout/Provider/TTI/utils.py +14 -11
- webscout/Provider/TTS/README.md +186 -192
- webscout/Provider/TTS/__init__.py +43 -10
- webscout/Provider/TTS/base.py +523 -159
- webscout/Provider/TTS/deepgram.py +286 -156
- webscout/Provider/TTS/elevenlabs.py +189 -111
- webscout/Provider/TTS/freetts.py +218 -0
- webscout/Provider/TTS/murfai.py +288 -113
- webscout/Provider/TTS/openai_fm.py +364 -129
- webscout/Provider/TTS/parler.py +203 -111
- webscout/Provider/TTS/qwen.py +334 -0
- webscout/Provider/TTS/sherpa.py +286 -0
- webscout/Provider/TTS/speechma.py +693 -580
- webscout/Provider/TTS/streamElements.py +275 -333
- webscout/Provider/TTS/utils.py +280 -280
- webscout/Provider/TextPollinationsAI.py +331 -308
- webscout/Provider/TogetherAI.py +450 -0
- webscout/Provider/TwoAI.py +309 -475
- webscout/Provider/TypliAI.py +311 -305
- webscout/Provider/UNFINISHED/ChatHub.py +219 -209
- webscout/Provider/{OPENAI/glider.py → UNFINISHED/ChutesAI.py} +331 -326
- webscout/Provider/{GizAI.py → UNFINISHED/GizAI.py} +300 -295
- webscout/Provider/{Marcus.py → UNFINISHED/Marcus.py} +218 -198
- webscout/Provider/UNFINISHED/Qodo.py +481 -0
- webscout/Provider/{MCPCore.py → UNFINISHED/XenAI.py} +330 -315
- webscout/Provider/UNFINISHED/Youchat.py +347 -330
- webscout/Provider/UNFINISHED/aihumanizer.py +41 -0
- webscout/Provider/UNFINISHED/grammerchecker.py +37 -0
- webscout/Provider/UNFINISHED/liner.py +342 -0
- webscout/Provider/UNFINISHED/liner_api_request.py +246 -263
- webscout/Provider/{samurai.py → UNFINISHED/samurai.py} +231 -224
- webscout/Provider/WiseCat.py +256 -233
- webscout/Provider/WrDoChat.py +390 -370
- webscout/Provider/__init__.py +115 -174
- webscout/Provider/ai4chat.py +181 -174
- webscout/Provider/akashgpt.py +330 -335
- webscout/Provider/cerebras.py +397 -290
- webscout/Provider/cleeai.py +236 -213
- webscout/Provider/elmo.py +291 -283
- webscout/Provider/geminiapi.py +343 -208
- webscout/Provider/julius.py +245 -223
- webscout/Provider/learnfastai.py +333 -325
- webscout/Provider/llama3mitril.py +230 -215
- webscout/Provider/llmchat.py +308 -258
- webscout/Provider/llmchatco.py +321 -306
- webscout/Provider/meta.py +996 -801
- webscout/Provider/oivscode.py +332 -309
- webscout/Provider/searchchat.py +316 -292
- webscout/Provider/sonus.py +264 -258
- webscout/Provider/toolbaz.py +359 -353
- webscout/Provider/turboseek.py +332 -266
- webscout/Provider/typefully.py +262 -202
- webscout/Provider/x0gpt.py +332 -299
- webscout/__init__.py +31 -39
- webscout/__main__.py +5 -5
- webscout/cli.py +585 -524
- webscout/client.py +1497 -70
- webscout/conversation.py +140 -436
- webscout/exceptions.py +383 -362
- webscout/litagent/__init__.py +29 -29
- webscout/litagent/agent.py +492 -455
- webscout/litagent/constants.py +60 -60
- webscout/models.py +505 -181
- webscout/optimizers.py +74 -420
- webscout/prompt_manager.py +376 -288
- webscout/sanitize.py +1514 -0
- webscout/scout/README.md +452 -404
- webscout/scout/__init__.py +8 -8
- webscout/scout/core/__init__.py +7 -7
- webscout/scout/core/crawler.py +330 -210
- webscout/scout/core/scout.py +800 -607
- webscout/scout/core/search_result.py +51 -96
- webscout/scout/core/text_analyzer.py +64 -63
- webscout/scout/core/text_utils.py +412 -277
- webscout/scout/core/web_analyzer.py +54 -52
- webscout/scout/element.py +872 -478
- webscout/scout/parsers/__init__.py +70 -69
- webscout/scout/parsers/html5lib_parser.py +182 -172
- webscout/scout/parsers/html_parser.py +238 -236
- webscout/scout/parsers/lxml_parser.py +203 -178
- webscout/scout/utils.py +38 -37
- webscout/search/__init__.py +47 -0
- webscout/search/base.py +201 -0
- webscout/search/bing_main.py +45 -0
- webscout/search/brave_main.py +92 -0
- webscout/search/duckduckgo_main.py +57 -0
- webscout/search/engines/__init__.py +127 -0
- webscout/search/engines/bing/__init__.py +15 -0
- webscout/search/engines/bing/base.py +35 -0
- webscout/search/engines/bing/images.py +114 -0
- webscout/search/engines/bing/news.py +96 -0
- webscout/search/engines/bing/suggestions.py +36 -0
- webscout/search/engines/bing/text.py +109 -0
- webscout/search/engines/brave/__init__.py +19 -0
- webscout/search/engines/brave/base.py +47 -0
- webscout/search/engines/brave/images.py +213 -0
- webscout/search/engines/brave/news.py +353 -0
- webscout/search/engines/brave/suggestions.py +318 -0
- webscout/search/engines/brave/text.py +167 -0
- webscout/search/engines/brave/videos.py +364 -0
- webscout/search/engines/duckduckgo/__init__.py +25 -0
- webscout/search/engines/duckduckgo/answers.py +80 -0
- webscout/search/engines/duckduckgo/base.py +189 -0
- webscout/search/engines/duckduckgo/images.py +100 -0
- webscout/search/engines/duckduckgo/maps.py +183 -0
- webscout/search/engines/duckduckgo/news.py +70 -0
- webscout/search/engines/duckduckgo/suggestions.py +22 -0
- webscout/search/engines/duckduckgo/text.py +221 -0
- webscout/search/engines/duckduckgo/translate.py +48 -0
- webscout/search/engines/duckduckgo/videos.py +80 -0
- webscout/search/engines/duckduckgo/weather.py +84 -0
- webscout/search/engines/mojeek.py +61 -0
- webscout/search/engines/wikipedia.py +77 -0
- webscout/search/engines/yahoo/__init__.py +41 -0
- webscout/search/engines/yahoo/answers.py +19 -0
- webscout/search/engines/yahoo/base.py +34 -0
- webscout/search/engines/yahoo/images.py +323 -0
- webscout/search/engines/yahoo/maps.py +19 -0
- webscout/search/engines/yahoo/news.py +258 -0
- webscout/search/engines/yahoo/suggestions.py +140 -0
- webscout/search/engines/yahoo/text.py +273 -0
- webscout/search/engines/yahoo/translate.py +19 -0
- webscout/search/engines/yahoo/videos.py +302 -0
- webscout/search/engines/yahoo/weather.py +220 -0
- webscout/search/engines/yandex.py +67 -0
- webscout/search/engines/yep/__init__.py +13 -0
- webscout/search/engines/yep/base.py +34 -0
- webscout/search/engines/yep/images.py +101 -0
- webscout/search/engines/yep/suggestions.py +38 -0
- webscout/search/engines/yep/text.py +99 -0
- webscout/search/http_client.py +172 -0
- webscout/search/results.py +141 -0
- webscout/search/yahoo_main.py +57 -0
- webscout/search/yep_main.py +48 -0
- webscout/server/__init__.py +48 -0
- webscout/server/config.py +78 -0
- webscout/server/exceptions.py +69 -0
- webscout/server/providers.py +286 -0
- webscout/server/request_models.py +131 -0
- webscout/server/request_processing.py +404 -0
- webscout/server/routes.py +642 -0
- webscout/server/server.py +351 -0
- webscout/server/ui_templates.py +1171 -0
- webscout/swiftcli/__init__.py +79 -95
- webscout/swiftcli/core/__init__.py +7 -7
- webscout/swiftcli/core/cli.py +574 -297
- webscout/swiftcli/core/context.py +98 -104
- webscout/swiftcli/core/group.py +268 -241
- webscout/swiftcli/decorators/__init__.py +28 -28
- webscout/swiftcli/decorators/command.py +243 -221
- webscout/swiftcli/decorators/options.py +247 -220
- webscout/swiftcli/decorators/output.py +392 -252
- webscout/swiftcli/exceptions.py +21 -21
- webscout/swiftcli/plugins/__init__.py +9 -9
- webscout/swiftcli/plugins/base.py +134 -135
- webscout/swiftcli/plugins/manager.py +269 -269
- webscout/swiftcli/utils/__init__.py +58 -59
- webscout/swiftcli/utils/formatting.py +251 -252
- webscout/swiftcli/utils/parsing.py +368 -267
- webscout/update_checker.py +280 -136
- webscout/utils.py +28 -14
- webscout/version.py +2 -1
- webscout/version.py.bak +3 -0
- webscout/zeroart/__init__.py +218 -135
- webscout/zeroart/base.py +70 -66
- webscout/zeroart/effects.py +155 -101
- webscout/zeroart/fonts.py +1799 -1239
- webscout-2026.1.19.dist-info/METADATA +638 -0
- webscout-2026.1.19.dist-info/RECORD +312 -0
- {webscout-8.2.9.dist-info → webscout-2026.1.19.dist-info}/WHEEL +1 -1
- {webscout-8.2.9.dist-info → webscout-2026.1.19.dist-info}/entry_points.txt +1 -1
- webscout/DWEBS.py +0 -520
- webscout/Extra/Act.md +0 -309
- webscout/Extra/GitToolkit/gitapi/README.md +0 -110
- webscout/Extra/autocoder/__init__.py +0 -9
- webscout/Extra/autocoder/autocoder.py +0 -1105
- webscout/Extra/autocoder/autocoder_utiles.py +0 -332
- webscout/Extra/gguf.md +0 -430
- webscout/Extra/weather.md +0 -281
- webscout/Litlogger/README.md +0 -10
- webscout/Litlogger/__init__.py +0 -15
- webscout/Litlogger/formats.py +0 -4
- webscout/Litlogger/handlers.py +0 -103
- webscout/Litlogger/levels.py +0 -13
- webscout/Litlogger/logger.py +0 -92
- webscout/Provider/AI21.py +0 -177
- webscout/Provider/AISEARCH/DeepFind.py +0 -254
- webscout/Provider/AISEARCH/felo_search.py +0 -202
- webscout/Provider/AISEARCH/genspark_search.py +0 -324
- webscout/Provider/AISEARCH/hika_search.py +0 -186
- webscout/Provider/AISEARCH/scira_search.py +0 -298
- webscout/Provider/Aitopia.py +0 -316
- webscout/Provider/AllenAI.py +0 -440
- webscout/Provider/Blackboxai.py +0 -791
- webscout/Provider/ChatGPTClone.py +0 -237
- webscout/Provider/ChatGPTGratis.py +0 -194
- webscout/Provider/Cloudflare.py +0 -324
- webscout/Provider/ExaChat.py +0 -358
- webscout/Provider/Flowith.py +0 -217
- webscout/Provider/FreeGemini.py +0 -250
- webscout/Provider/Glider.py +0 -225
- webscout/Provider/HF_space/__init__.py +0 -0
- webscout/Provider/HF_space/qwen_qwen2.py +0 -206
- webscout/Provider/HuggingFaceChat.py +0 -469
- webscout/Provider/Hunyuan.py +0 -283
- webscout/Provider/LambdaChat.py +0 -411
- webscout/Provider/Llama3.py +0 -259
- webscout/Provider/Nemotron.py +0 -218
- webscout/Provider/OLLAMA.py +0 -396
- webscout/Provider/OPENAI/BLACKBOXAI.py +0 -766
- webscout/Provider/OPENAI/Cloudflare.py +0 -378
- webscout/Provider/OPENAI/FreeGemini.py +0 -283
- webscout/Provider/OPENAI/NEMOTRON.py +0 -232
- webscout/Provider/OPENAI/Qwen3.py +0 -283
- webscout/Provider/OPENAI/api.py +0 -969
- webscout/Provider/OPENAI/c4ai.py +0 -373
- webscout/Provider/OPENAI/chatgptclone.py +0 -494
- webscout/Provider/OPENAI/copilot.py +0 -242
- webscout/Provider/OPENAI/flowith.py +0 -162
- webscout/Provider/OPENAI/freeaichat.py +0 -359
- webscout/Provider/OPENAI/mcpcore.py +0 -389
- webscout/Provider/OPENAI/multichat.py +0 -376
- webscout/Provider/OPENAI/opkfc.py +0 -496
- webscout/Provider/OPENAI/scirachat.py +0 -477
- webscout/Provider/OPENAI/standardinput.py +0 -433
- webscout/Provider/OPENAI/typegpt.py +0 -364
- webscout/Provider/OPENAI/uncovrAI.py +0 -463
- webscout/Provider/OPENAI/venice.py +0 -431
- webscout/Provider/OPENAI/yep.py +0 -382
- webscout/Provider/OpenGPT.py +0 -209
- webscout/Provider/Perplexitylabs.py +0 -415
- webscout/Provider/Reka.py +0 -214
- webscout/Provider/StandardInput.py +0 -290
- webscout/Provider/TTI/aiarta.py +0 -365
- webscout/Provider/TTI/artbit.py +0 -0
- webscout/Provider/TTI/fastflux.py +0 -200
- webscout/Provider/TTI/piclumen.py +0 -203
- webscout/Provider/TTI/pixelmuse.py +0 -225
- webscout/Provider/TTS/gesserit.py +0 -128
- webscout/Provider/TTS/sthir.py +0 -94
- webscout/Provider/TeachAnything.py +0 -229
- webscout/Provider/UNFINISHED/puterjs.py +0 -635
- webscout/Provider/UNFINISHED/test_lmarena.py +0 -119
- webscout/Provider/Venice.py +0 -258
- webscout/Provider/VercelAI.py +0 -253
- webscout/Provider/Writecream.py +0 -246
- webscout/Provider/WritingMate.py +0 -269
- webscout/Provider/asksteve.py +0 -220
- webscout/Provider/chatglm.py +0 -215
- webscout/Provider/copilot.py +0 -425
- webscout/Provider/freeaichat.py +0 -285
- webscout/Provider/granite.py +0 -235
- webscout/Provider/hermes.py +0 -266
- webscout/Provider/koala.py +0 -170
- webscout/Provider/lmarena.py +0 -198
- webscout/Provider/multichat.py +0 -364
- webscout/Provider/scira_chat.py +0 -299
- webscout/Provider/scnet.py +0 -243
- webscout/Provider/talkai.py +0 -194
- webscout/Provider/typegpt.py +0 -289
- webscout/Provider/uncovr.py +0 -368
- webscout/Provider/yep.py +0 -389
- webscout/litagent/Readme.md +0 -276
- webscout/litprinter/__init__.py +0 -59
- webscout/swiftcli/Readme.md +0 -323
- webscout/tempid.py +0 -128
- webscout/webscout_search.py +0 -1184
- webscout/webscout_search_async.py +0 -654
- webscout/yep_search.py +0 -347
- webscout/zeroart/README.md +0 -89
- webscout-8.2.9.dist-info/METADATA +0 -1033
- webscout-8.2.9.dist-info/RECORD +0 -289
- {webscout-8.2.9.dist-info → webscout-2026.1.19.dist-info}/licenses/LICENSE.md +0 -0
- {webscout-8.2.9.dist-info → webscout-2026.1.19.dist-info}/top_level.txt +0 -0
webscout/models.py
CHANGED
|
@@ -1,181 +1,505 @@
|
|
|
1
|
-
import importlib
|
|
2
|
-
import pkgutil
|
|
3
|
-
from typing import Dict, List,
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
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
|
-
if
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
#
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
1
|
+
import importlib
|
|
2
|
+
import pkgutil
|
|
3
|
+
from typing import Any, Dict, List, Mapping, Optional, Union
|
|
4
|
+
|
|
5
|
+
from webscout.AIbase import Provider, TTSProvider
|
|
6
|
+
|
|
7
|
+
# Import TTI base class
|
|
8
|
+
BaseImages = None
|
|
9
|
+
try:
|
|
10
|
+
from webscout.Provider.TTI.base import BaseImages as BaseImagesClass
|
|
11
|
+
BaseImages = BaseImagesClass
|
|
12
|
+
TTI_AVAILABLE = True
|
|
13
|
+
except ImportError:
|
|
14
|
+
TTI_AVAILABLE = False
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class _LLMModels:
|
|
18
|
+
"""
|
|
19
|
+
A class for managing LLM provider models in the webscout package.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def list(self) -> Dict[str, List[str]]:
|
|
23
|
+
"""
|
|
24
|
+
Gets all available models from each provider that has an AVAILABLE_MODELS attribute.
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
Dictionary mapping provider names to their available models
|
|
28
|
+
"""
|
|
29
|
+
return self._get_provider_models()
|
|
30
|
+
|
|
31
|
+
def get(self, provider_name: str) -> List[str]:
|
|
32
|
+
"""
|
|
33
|
+
Gets all available models for a specific provider.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
provider_name: The name of the provider
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
List of available models for the provider
|
|
40
|
+
"""
|
|
41
|
+
all_models = self._get_provider_models()
|
|
42
|
+
return all_models.get(provider_name, [])
|
|
43
|
+
|
|
44
|
+
def summary(self) -> Dict[str, Any]:
|
|
45
|
+
"""
|
|
46
|
+
Returns a summary of available providers and models.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
Dictionary with provider and model counts
|
|
50
|
+
"""
|
|
51
|
+
provider_models = self._get_provider_models()
|
|
52
|
+
total_providers = len(provider_models)
|
|
53
|
+
total_models = sum(
|
|
54
|
+
len(models) if isinstance(models, (list, tuple, set)) else 1
|
|
55
|
+
for models in provider_models.values()
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
"providers": total_providers,
|
|
60
|
+
"models": total_models,
|
|
61
|
+
"provider_model_counts": {
|
|
62
|
+
provider: len(models) if isinstance(models, (list, tuple, set)) else 1
|
|
63
|
+
for provider, models in provider_models.items()
|
|
64
|
+
},
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
def providers(self) -> Dict[str, Dict[str, Any]]:
|
|
68
|
+
"""
|
|
69
|
+
Gets detailed information about all LLM providers including models, parameters, and metadata.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
Dictionary mapping provider names to detailed provider information
|
|
73
|
+
"""
|
|
74
|
+
return self._get_provider_details()
|
|
75
|
+
|
|
76
|
+
def provider(self, provider_name: str) -> Dict[str, Any]:
|
|
77
|
+
"""
|
|
78
|
+
Gets detailed information about a specific LLM provider.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
provider_name: The name of the provider
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
Dictionary with detailed provider information
|
|
85
|
+
"""
|
|
86
|
+
all_providers = self._get_provider_details()
|
|
87
|
+
return all_providers.get(provider_name, {})
|
|
88
|
+
|
|
89
|
+
def _get_provider_models(self) -> Dict[str, List[str]]:
|
|
90
|
+
"""
|
|
91
|
+
Internal method to get all available models from each provider.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
Dictionary mapping provider names to their available models
|
|
95
|
+
"""
|
|
96
|
+
provider_models = {}
|
|
97
|
+
provider_package = importlib.import_module("webscout.Provider")
|
|
98
|
+
|
|
99
|
+
for _, module_name, _ in pkgutil.iter_modules(provider_package.__path__):
|
|
100
|
+
try:
|
|
101
|
+
module = importlib.import_module(f"webscout.Provider.{module_name}")
|
|
102
|
+
for attr_name in dir(module):
|
|
103
|
+
attr = getattr(module, attr_name)
|
|
104
|
+
if isinstance(attr, type) and issubclass(attr, Provider) and attr != Provider:
|
|
105
|
+
get_models = getattr(attr, "get_models", None)
|
|
106
|
+
available_models = getattr(attr, "AVAILABLE_MODELS", None)
|
|
107
|
+
if get_models and callable(get_models):
|
|
108
|
+
try:
|
|
109
|
+
models = get_models()
|
|
110
|
+
if isinstance(models, set):
|
|
111
|
+
models = list(models)
|
|
112
|
+
provider_models[attr_name] = models
|
|
113
|
+
except Exception:
|
|
114
|
+
provider_models[attr_name] = []
|
|
115
|
+
elif available_models is not None:
|
|
116
|
+
# Convert any sets to lists to ensure serializability
|
|
117
|
+
models = available_models
|
|
118
|
+
if isinstance(models, set):
|
|
119
|
+
models = list(models)
|
|
120
|
+
provider_models[attr_name] = models
|
|
121
|
+
else:
|
|
122
|
+
provider_models[attr_name] = []
|
|
123
|
+
except Exception:
|
|
124
|
+
pass
|
|
125
|
+
|
|
126
|
+
return provider_models
|
|
127
|
+
|
|
128
|
+
def _get_provider_details(self) -> Dict[str, Dict[str, Any]]:
|
|
129
|
+
"""
|
|
130
|
+
Internal method to get detailed information about all LLM providers.
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
Dictionary mapping provider names to detailed provider information
|
|
134
|
+
"""
|
|
135
|
+
provider_details = {}
|
|
136
|
+
provider_package = importlib.import_module("webscout.Provider")
|
|
137
|
+
|
|
138
|
+
for _, module_name, _ in pkgutil.iter_modules(provider_package.__path__):
|
|
139
|
+
try:
|
|
140
|
+
module = importlib.import_module(f"webscout.Provider.{module_name}")
|
|
141
|
+
for attr_name in dir(module):
|
|
142
|
+
attr = getattr(module, attr_name)
|
|
143
|
+
if isinstance(attr, type) and issubclass(attr, Provider) and attr != Provider:
|
|
144
|
+
# Get available models
|
|
145
|
+
models = []
|
|
146
|
+
get_models = getattr(attr, "get_models", None)
|
|
147
|
+
available_models = getattr(attr, "AVAILABLE_MODELS", None)
|
|
148
|
+
if get_models and callable(get_models):
|
|
149
|
+
try:
|
|
150
|
+
fetched_models = get_models()
|
|
151
|
+
if isinstance(fetched_models, set):
|
|
152
|
+
models = list(fetched_models)
|
|
153
|
+
elif isinstance(fetched_models, (list, tuple)):
|
|
154
|
+
models = list(fetched_models)
|
|
155
|
+
else:
|
|
156
|
+
models = [str(fetched_models)] if fetched_models else []
|
|
157
|
+
except Exception:
|
|
158
|
+
models = []
|
|
159
|
+
elif available_models is not None:
|
|
160
|
+
if isinstance(available_models, set):
|
|
161
|
+
models = list(available_models)
|
|
162
|
+
elif isinstance(available_models, (list, tuple)):
|
|
163
|
+
models = list(available_models)
|
|
164
|
+
else:
|
|
165
|
+
models = [str(available_models)]
|
|
166
|
+
|
|
167
|
+
# Sort models
|
|
168
|
+
models = sorted(models)
|
|
169
|
+
|
|
170
|
+
# Get supported parameters (common OpenAI-compatible parameters)
|
|
171
|
+
supported_params = [
|
|
172
|
+
"model",
|
|
173
|
+
"messages",
|
|
174
|
+
"max_tokens",
|
|
175
|
+
"temperature",
|
|
176
|
+
"top_p",
|
|
177
|
+
"presence_penalty",
|
|
178
|
+
"frequency_penalty",
|
|
179
|
+
"stop",
|
|
180
|
+
"stream",
|
|
181
|
+
"user",
|
|
182
|
+
]
|
|
183
|
+
|
|
184
|
+
# Get additional metadata
|
|
185
|
+
metadata = {}
|
|
186
|
+
if hasattr(attr, "__doc__") and attr.__doc__:
|
|
187
|
+
metadata["description"] = attr.__doc__.strip().split("\n")[0]
|
|
188
|
+
|
|
189
|
+
provider_details[attr_name] = {
|
|
190
|
+
"name": attr_name,
|
|
191
|
+
"class": attr.__name__,
|
|
192
|
+
"module": module_name,
|
|
193
|
+
"models": models,
|
|
194
|
+
"parameters": supported_params,
|
|
195
|
+
"model_count": len(models),
|
|
196
|
+
"metadata": metadata,
|
|
197
|
+
}
|
|
198
|
+
except Exception:
|
|
199
|
+
pass
|
|
200
|
+
|
|
201
|
+
return provider_details
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class _TTSModels:
|
|
205
|
+
"""
|
|
206
|
+
A class for managing TTS provider voices in the webscout package.
|
|
207
|
+
"""
|
|
208
|
+
|
|
209
|
+
def list(self) -> Dict[str, Union[List[str], Dict[str, str]]]:
|
|
210
|
+
"""
|
|
211
|
+
Gets all available voices from each TTS provider that has an all_voices attribute.
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
Dictionary mapping TTS provider names to their available voices
|
|
215
|
+
"""
|
|
216
|
+
return self._get_tts_voices()
|
|
217
|
+
|
|
218
|
+
def get(self, provider_name: str) -> Union[List[str], Dict[str, str]]:
|
|
219
|
+
"""
|
|
220
|
+
Gets all available voices for a specific TTS provider.
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
provider_name: The name of the TTS provider
|
|
224
|
+
|
|
225
|
+
Returns:
|
|
226
|
+
List or Dictionary of available voices for the provider
|
|
227
|
+
"""
|
|
228
|
+
all_voices = self._get_tts_voices()
|
|
229
|
+
return all_voices.get(provider_name, [])
|
|
230
|
+
|
|
231
|
+
def summary(self) -> Dict[str, Any]:
|
|
232
|
+
"""
|
|
233
|
+
Returns a summary of available TTS providers and voices.
|
|
234
|
+
|
|
235
|
+
Returns:
|
|
236
|
+
Dictionary with provider and voice counts
|
|
237
|
+
"""
|
|
238
|
+
provider_voices = self._get_tts_voices()
|
|
239
|
+
total_providers = len(provider_voices)
|
|
240
|
+
|
|
241
|
+
# Count voices, handling both list and dict formats
|
|
242
|
+
total_voices = 0
|
|
243
|
+
provider_voice_counts = {}
|
|
244
|
+
|
|
245
|
+
for provider, voices in provider_voices.items():
|
|
246
|
+
if isinstance(voices, dict):
|
|
247
|
+
count = len(voices)
|
|
248
|
+
elif isinstance(voices, (list, tuple, set)):
|
|
249
|
+
count = len(voices)
|
|
250
|
+
else:
|
|
251
|
+
count = 1
|
|
252
|
+
|
|
253
|
+
total_voices += count
|
|
254
|
+
provider_voice_counts[provider] = count
|
|
255
|
+
|
|
256
|
+
return {
|
|
257
|
+
"providers": total_providers,
|
|
258
|
+
"voices": total_voices,
|
|
259
|
+
"provider_voice_counts": provider_voice_counts,
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
def _get_tts_voices(self) -> Dict[str, Union[List[str], Dict[str, str]]]:
|
|
263
|
+
"""
|
|
264
|
+
Internal method to get all available voices from each TTS provider.
|
|
265
|
+
|
|
266
|
+
Returns:
|
|
267
|
+
Dictionary mapping TTS provider names to their available voices
|
|
268
|
+
"""
|
|
269
|
+
provider_voices = {}
|
|
270
|
+
|
|
271
|
+
try:
|
|
272
|
+
# Import the TTS package specifically
|
|
273
|
+
tts_package = importlib.import_module("webscout.Provider.TTS")
|
|
274
|
+
|
|
275
|
+
# Iterate through TTS modules
|
|
276
|
+
for _, module_name, _ in pkgutil.iter_modules(tts_package.__path__):
|
|
277
|
+
try:
|
|
278
|
+
module = importlib.import_module(f"webscout.Provider.TTS.{module_name}")
|
|
279
|
+
for attr_name in dir(module):
|
|
280
|
+
attr = getattr(module, attr_name)
|
|
281
|
+
if (
|
|
282
|
+
isinstance(attr, type)
|
|
283
|
+
and issubclass(attr, TTSProvider)
|
|
284
|
+
and attr != TTSProvider
|
|
285
|
+
):
|
|
286
|
+
# TTS providers typically use 'all_voices' instead of 'AVAILABLE_MODELS'
|
|
287
|
+
all_voices = getattr(attr, "all_voices", None)
|
|
288
|
+
if all_voices is not None:
|
|
289
|
+
provider_voices[attr_name] = all_voices
|
|
290
|
+
except Exception:
|
|
291
|
+
pass
|
|
292
|
+
except Exception:
|
|
293
|
+
pass
|
|
294
|
+
|
|
295
|
+
return provider_voices
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
class _TTIModels:
|
|
299
|
+
"""
|
|
300
|
+
A class for managing TTI (Text-to-Image) provider models in the webscout package.
|
|
301
|
+
"""
|
|
302
|
+
|
|
303
|
+
def list(self) -> Dict[str, List[str]]:
|
|
304
|
+
"""
|
|
305
|
+
Gets all available models from each TTI provider that has an AVAILABLE_MODELS attribute.
|
|
306
|
+
|
|
307
|
+
Returns:
|
|
308
|
+
Dictionary mapping TTI provider names to their available models
|
|
309
|
+
"""
|
|
310
|
+
return self._get_tti_models()
|
|
311
|
+
|
|
312
|
+
def get(self, provider_name: str) -> List[str]:
|
|
313
|
+
"""
|
|
314
|
+
Gets all available models for a specific TTI provider.
|
|
315
|
+
|
|
316
|
+
Args:
|
|
317
|
+
provider_name: The name of the TTI provider
|
|
318
|
+
|
|
319
|
+
Returns:
|
|
320
|
+
List of available models for the provider
|
|
321
|
+
"""
|
|
322
|
+
all_models = self._get_tti_models()
|
|
323
|
+
return all_models.get(provider_name, [])
|
|
324
|
+
|
|
325
|
+
def providers(self) -> Dict[str, Dict[str, Any]]:
|
|
326
|
+
"""
|
|
327
|
+
Gets detailed information about all TTI providers including models, parameters, and metadata.
|
|
328
|
+
|
|
329
|
+
Returns:
|
|
330
|
+
Dictionary mapping provider names to detailed provider information
|
|
331
|
+
"""
|
|
332
|
+
return self._get_tti_provider_details()
|
|
333
|
+
|
|
334
|
+
def provider(self, provider_name: str) -> Dict[str, Any]:
|
|
335
|
+
"""
|
|
336
|
+
Gets detailed information about a specific TTI provider.
|
|
337
|
+
|
|
338
|
+
Args:
|
|
339
|
+
provider_name: The name of the TTI provider
|
|
340
|
+
|
|
341
|
+
Returns:
|
|
342
|
+
Dictionary with detailed provider information
|
|
343
|
+
"""
|
|
344
|
+
all_providers = self._get_tti_provider_details()
|
|
345
|
+
return all_providers.get(provider_name, {})
|
|
346
|
+
|
|
347
|
+
def summary(self) -> Dict[str, Any]:
|
|
348
|
+
"""
|
|
349
|
+
Returns a summary of available TTI providers and models.
|
|
350
|
+
|
|
351
|
+
Returns:
|
|
352
|
+
Dictionary with provider and model counts
|
|
353
|
+
"""
|
|
354
|
+
provider_models = self._get_tti_models()
|
|
355
|
+
total_providers = len(provider_models)
|
|
356
|
+
total_models = sum(
|
|
357
|
+
len(models) if isinstance(models, (list, tuple, set)) else 1
|
|
358
|
+
for models in provider_models.values()
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
return {
|
|
362
|
+
"providers": total_providers,
|
|
363
|
+
"models": total_models,
|
|
364
|
+
"provider_model_counts": {
|
|
365
|
+
provider: len(models) if isinstance(models, (list, tuple, set)) else 1
|
|
366
|
+
for provider, models in provider_models.items()
|
|
367
|
+
},
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
def _get_tti_models(self) -> Dict[str, List[str]]:
|
|
371
|
+
"""
|
|
372
|
+
Internal method to get all available models from each TTI provider.
|
|
373
|
+
|
|
374
|
+
Returns:
|
|
375
|
+
Dictionary mapping TTI provider names to their available models
|
|
376
|
+
"""
|
|
377
|
+
if not TTI_AVAILABLE:
|
|
378
|
+
return {}
|
|
379
|
+
|
|
380
|
+
provider_models = {}
|
|
381
|
+
tti_package = importlib.import_module("webscout.Provider.TTI")
|
|
382
|
+
|
|
383
|
+
for _, module_name, _ in pkgutil.iter_modules(tti_package.__path__):
|
|
384
|
+
try:
|
|
385
|
+
module = importlib.import_module(f"webscout.Provider.TTI.{module_name}")
|
|
386
|
+
for attr_name in dir(module):
|
|
387
|
+
attr = getattr(module, attr_name)
|
|
388
|
+
if (
|
|
389
|
+
isinstance(attr, type)
|
|
390
|
+
and BaseImages
|
|
391
|
+
and issubclass(attr, BaseImages)
|
|
392
|
+
and attr != BaseImages
|
|
393
|
+
):
|
|
394
|
+
if hasattr(attr, "AVAILABLE_MODELS"):
|
|
395
|
+
# Convert any sets to lists to ensure serializability
|
|
396
|
+
models = getattr(attr, "AVAILABLE_MODELS", [])
|
|
397
|
+
if isinstance(models, set):
|
|
398
|
+
models = list(models)
|
|
399
|
+
provider_models[attr_name] = models
|
|
400
|
+
except Exception:
|
|
401
|
+
pass
|
|
402
|
+
|
|
403
|
+
return provider_models
|
|
404
|
+
|
|
405
|
+
def _get_tti_provider_details(self) -> Dict[str, Dict[str, Any]]:
|
|
406
|
+
"""
|
|
407
|
+
Internal method to get detailed information about all TTI providers.
|
|
408
|
+
|
|
409
|
+
Returns:
|
|
410
|
+
Dictionary mapping provider names to detailed provider information
|
|
411
|
+
"""
|
|
412
|
+
if not TTI_AVAILABLE:
|
|
413
|
+
return {}
|
|
414
|
+
|
|
415
|
+
provider_details = {}
|
|
416
|
+
tti_package = importlib.import_module("webscout.Provider.TTI")
|
|
417
|
+
|
|
418
|
+
for _, module_name, _ in pkgutil.iter_modules(tti_package.__path__):
|
|
419
|
+
try:
|
|
420
|
+
module = importlib.import_module(f"webscout.Provider.TTI.{module_name}")
|
|
421
|
+
for attr_name in dir(module):
|
|
422
|
+
attr = getattr(module, attr_name)
|
|
423
|
+
if (
|
|
424
|
+
isinstance(attr, type)
|
|
425
|
+
and BaseImages
|
|
426
|
+
and issubclass(attr, BaseImages)
|
|
427
|
+
and attr != BaseImages
|
|
428
|
+
):
|
|
429
|
+
# Get available models
|
|
430
|
+
models = []
|
|
431
|
+
get_models = getattr(attr, "get_models", None)
|
|
432
|
+
available_models = getattr(attr, "AVAILABLE_MODELS", None)
|
|
433
|
+
if get_models and callable(get_models):
|
|
434
|
+
try:
|
|
435
|
+
fetched_models = get_models()
|
|
436
|
+
if isinstance(fetched_models, set):
|
|
437
|
+
models = list(fetched_models)
|
|
438
|
+
elif isinstance(fetched_models, (list, tuple)):
|
|
439
|
+
models = list(fetched_models)
|
|
440
|
+
else:
|
|
441
|
+
models = [str(fetched_models)] if fetched_models else []
|
|
442
|
+
except Exception:
|
|
443
|
+
models = []
|
|
444
|
+
elif available_models is not None:
|
|
445
|
+
if isinstance(available_models, set):
|
|
446
|
+
models = list(available_models)
|
|
447
|
+
elif isinstance(available_models, (list, tuple)):
|
|
448
|
+
models = list(available_models)
|
|
449
|
+
else:
|
|
450
|
+
models = [str(available_models)]
|
|
451
|
+
|
|
452
|
+
# Sort models
|
|
453
|
+
models = sorted(models)
|
|
454
|
+
|
|
455
|
+
# Get supported parameters (common TTI parameters)
|
|
456
|
+
supported_params = [
|
|
457
|
+
"prompt",
|
|
458
|
+
"model",
|
|
459
|
+
"n",
|
|
460
|
+
"size",
|
|
461
|
+
"response_format",
|
|
462
|
+
"user",
|
|
463
|
+
"style",
|
|
464
|
+
"aspect_ratio",
|
|
465
|
+
"timeout",
|
|
466
|
+
"image_format",
|
|
467
|
+
"seed",
|
|
468
|
+
]
|
|
469
|
+
|
|
470
|
+
# Get additional metadata
|
|
471
|
+
metadata = {}
|
|
472
|
+
if hasattr(attr, "__doc__") and attr.__doc__:
|
|
473
|
+
metadata["description"] = attr.__doc__.strip().split("\n")[0]
|
|
474
|
+
|
|
475
|
+
provider_details[attr_name] = {
|
|
476
|
+
"name": attr_name,
|
|
477
|
+
"class": attr.__name__,
|
|
478
|
+
"module": module_name,
|
|
479
|
+
"models": models,
|
|
480
|
+
"parameters": supported_params,
|
|
481
|
+
"model_count": len(models),
|
|
482
|
+
"metadata": metadata,
|
|
483
|
+
}
|
|
484
|
+
except Exception:
|
|
485
|
+
pass
|
|
486
|
+
|
|
487
|
+
return provider_details
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
# Create singleton instances
|
|
491
|
+
llm = _LLMModels()
|
|
492
|
+
tts = _TTSModels()
|
|
493
|
+
tti = _TTIModels()
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
# Container class for all model types
|
|
497
|
+
class Models:
|
|
498
|
+
def __init__(self) -> None:
|
|
499
|
+
self.llm: _LLMModels = llm
|
|
500
|
+
self.tts: _TTSModels = tts
|
|
501
|
+
self.tti: _TTIModels = tti
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
# Create a singleton instance
|
|
505
|
+
model = Models()
|