webscout 8.2.2__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 -143
- webscout/AIbase.py +247 -123
- webscout/AIutel.py +68 -132
- webscout/Bard.py +1072 -535
- webscout/Extra/GitToolkit/__init__.py +2 -2
- 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 -0
- 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 -0
- 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 -45
- 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 +189 -18
- webscout/Extra/__init__.py +2 -3
- webscout/Extra/gguf.py +1298 -682
- webscout/Extra/tempmail/README.md +488 -0
- 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 +237 -304
- webscout/Provider/AISEARCH/README.md +106 -0
- webscout/Provider/AISEARCH/__init__.py +16 -10
- webscout/Provider/AISEARCH/brave_search.py +298 -0
- webscout/Provider/AISEARCH/iask_search.py +130 -209
- webscout/Provider/AISEARCH/monica_search.py +200 -246
- webscout/Provider/AISEARCH/webpilotai_search.py +242 -281
- 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 -0
- webscout/Provider/ClaudeOnline.py +365 -0
- webscout/Provider/Cohere.py +232 -208
- webscout/Provider/DeepAI.py +367 -0
- webscout/Provider/Deepinfra.py +343 -173
- webscout/Provider/EssentialAI.py +217 -0
- webscout/Provider/ExaAI.py +274 -261
- webscout/Provider/Gemini.py +60 -54
- webscout/Provider/GithubChat.py +385 -367
- webscout/Provider/Gradient.py +286 -0
- webscout/Provider/Groq.py +556 -670
- webscout/Provider/HadadXYZ.py +323 -0
- webscout/Provider/HeckAI.py +392 -233
- webscout/Provider/HuggingFace.py +387 -0
- webscout/Provider/IBM.py +340 -0
- webscout/Provider/Jadve.py +317 -266
- webscout/Provider/K2Think.py +306 -0
- webscout/Provider/Koboldai.py +221 -381
- webscout/Provider/Netwrck.py +273 -228
- 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 -0
- webscout/Provider/OPENAI/TogetherAI.py +405 -0
- webscout/Provider/OPENAI/TwoAI.py +255 -0
- webscout/Provider/OPENAI/__init__.py +148 -25
- webscout/Provider/OPENAI/ai4chat.py +348 -0
- webscout/Provider/OPENAI/akashgpt.py +436 -0
- webscout/Provider/OPENAI/algion.py +303 -0
- webscout/Provider/OPENAI/ayle.py +365 -0
- webscout/Provider/OPENAI/base.py +253 -46
- webscout/Provider/OPENAI/cerebras.py +296 -0
- webscout/Provider/OPENAI/chatgpt.py +514 -193
- webscout/Provider/OPENAI/chatsandbox.py +233 -0
- webscout/Provider/OPENAI/deepinfra.py +403 -272
- webscout/Provider/OPENAI/e2b.py +2370 -1350
- webscout/Provider/OPENAI/elmo.py +278 -0
- webscout/Provider/OPENAI/exaai.py +186 -138
- webscout/Provider/OPENAI/freeassist.py +446 -0
- webscout/Provider/OPENAI/gradient.py +448 -0
- webscout/Provider/OPENAI/groq.py +380 -0
- webscout/Provider/OPENAI/hadadxyz.py +292 -0
- webscout/Provider/OPENAI/heckai.py +100 -104
- 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 -327
- webscout/Provider/OPENAI/meta.py +541 -0
- webscout/Provider/OPENAI/netwrck.py +110 -84
- webscout/Provider/OPENAI/nvidia.py +317 -0
- webscout/Provider/OPENAI/oivscode.py +348 -0
- webscout/Provider/OPENAI/openrouter.py +328 -0
- webscout/Provider/OPENAI/pydantic_imports.py +1 -0
- webscout/Provider/OPENAI/sambanova.py +397 -0
- webscout/Provider/OPENAI/sonus.py +126 -115
- webscout/Provider/OPENAI/textpollinations.py +218 -133
- webscout/Provider/OPENAI/toolbaz.py +136 -166
- webscout/Provider/OPENAI/typefully.py +419 -0
- webscout/Provider/OPENAI/typliai.py +279 -0
- webscout/Provider/OPENAI/utils.py +314 -211
- webscout/Provider/OPENAI/wisecat.py +103 -125
- webscout/Provider/OPENAI/writecream.py +185 -156
- webscout/Provider/OPENAI/x0gpt.py +227 -136
- webscout/Provider/OPENAI/zenmux.py +380 -0
- webscout/Provider/OpenRouter.py +386 -0
- webscout/Provider/Openai.py +337 -496
- webscout/Provider/PI.py +443 -344
- 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 -0
- webscout/Provider/TTI/__init__.py +37 -12
- webscout/Provider/TTI/base.py +147 -0
- webscout/Provider/TTI/claudeonline.py +393 -0
- webscout/Provider/TTI/magicstudio.py +292 -0
- webscout/Provider/TTI/miragic.py +180 -0
- webscout/Provider/TTI/pollinations.py +331 -0
- webscout/Provider/TTI/together.py +334 -0
- webscout/Provider/TTI/utils.py +14 -0
- webscout/Provider/TTS/README.md +186 -0
- webscout/Provider/TTS/__init__.py +43 -7
- webscout/Provider/TTS/base.py +523 -0
- 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 -0
- 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 -180
- webscout/Provider/TTS/streamElements.py +275 -333
- webscout/Provider/TTS/utils.py +280 -280
- webscout/Provider/TextPollinationsAI.py +221 -121
- webscout/Provider/TogetherAI.py +450 -0
- webscout/Provider/TwoAI.py +309 -199
- webscout/Provider/TypliAI.py +311 -0
- webscout/Provider/UNFINISHED/ChatHub.py +219 -0
- webscout/Provider/{OPENAI/glider.py → UNFINISHED/ChutesAI.py} +160 -145
- webscout/Provider/UNFINISHED/GizAI.py +300 -0
- webscout/Provider/UNFINISHED/Marcus.py +218 -0
- webscout/Provider/UNFINISHED/Qodo.py +481 -0
- webscout/Provider/UNFINISHED/XenAI.py +330 -0
- webscout/Provider/{Youchat.py → UNFINISHED/Youchat.py} +64 -47
- 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 -0
- webscout/Provider/UNFINISHED/samurai.py +231 -0
- webscout/Provider/WiseCat.py +256 -196
- webscout/Provider/WrDoChat.py +390 -0
- webscout/Provider/__init__.py +115 -198
- webscout/Provider/ai4chat.py +181 -202
- webscout/Provider/akashgpt.py +330 -342
- webscout/Provider/cerebras.py +397 -242
- webscout/Provider/cleeai.py +236 -213
- webscout/Provider/elmo.py +291 -234
- webscout/Provider/geminiapi.py +343 -208
- webscout/Provider/julius.py +245 -223
- webscout/Provider/learnfastai.py +333 -266
- webscout/Provider/llama3mitril.py +230 -180
- webscout/Provider/llmchat.py +308 -213
- webscout/Provider/llmchatco.py +321 -311
- webscout/Provider/meta.py +996 -794
- webscout/Provider/oivscode.py +332 -0
- webscout/Provider/searchchat.py +316 -293
- webscout/Provider/sonus.py +264 -208
- webscout/Provider/toolbaz.py +359 -320
- webscout/Provider/turboseek.py +332 -219
- webscout/Provider/typefully.py +262 -280
- webscout/Provider/x0gpt.py +332 -256
- webscout/__init__.py +31 -38
- webscout/__main__.py +5 -5
- webscout/cli.py +585 -293
- webscout/client.py +1497 -0
- webscout/conversation.py +140 -565
- webscout/exceptions.py +383 -339
- 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 +32 -378
- webscout/prompt_manager.py +376 -274
- webscout/sanitize.py +1514 -0
- webscout/scout/README.md +452 -0
- webscout/scout/__init__.py +8 -8
- webscout/scout/core/__init__.py +7 -7
- webscout/scout/core/crawler.py +330 -140
- webscout/scout/core/scout.py +800 -568
- 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 -460
- 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 -809
- webscout/swiftcli/core/__init__.py +7 -0
- webscout/swiftcli/core/cli.py +574 -0
- webscout/swiftcli/core/context.py +98 -0
- webscout/swiftcli/core/group.py +268 -0
- webscout/swiftcli/decorators/__init__.py +28 -0
- webscout/swiftcli/decorators/command.py +243 -0
- webscout/swiftcli/decorators/options.py +247 -0
- webscout/swiftcli/decorators/output.py +392 -0
- webscout/swiftcli/exceptions.py +21 -0
- webscout/swiftcli/plugins/__init__.py +9 -0
- webscout/swiftcli/plugins/base.py +134 -0
- webscout/swiftcli/plugins/manager.py +269 -0
- webscout/swiftcli/utils/__init__.py +58 -0
- webscout/swiftcli/utils/formatting.py +251 -0
- webscout/swiftcli/utils/parsing.py +368 -0
- 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 -55
- webscout/zeroart/base.py +70 -60
- webscout/zeroart/effects.py +155 -99
- webscout/zeroart/fonts.py +1799 -816
- webscout-2026.1.19.dist-info/METADATA +638 -0
- webscout-2026.1.19.dist-info/RECORD +312 -0
- {webscout-8.2.2.dist-info → webscout-2026.1.19.dist-info}/WHEEL +1 -1
- webscout-2026.1.19.dist-info/entry_points.txt +4 -0
- webscout-2026.1.19.dist-info/top_level.txt +1 -0
- inferno/__init__.py +0 -6
- inferno/__main__.py +0 -9
- inferno/cli.py +0 -6
- webscout/DWEBS.py +0 -477
- webscout/Extra/autocoder/__init__.py +0 -9
- webscout/Extra/autocoder/autocoder.py +0 -849
- webscout/Extra/autocoder/autocoder_utiles.py +0 -332
- webscout/LLM.py +0 -442
- webscout/Litlogger/__init__.py +0 -67
- webscout/Litlogger/core/__init__.py +0 -6
- webscout/Litlogger/core/level.py +0 -23
- webscout/Litlogger/core/logger.py +0 -165
- webscout/Litlogger/handlers/__init__.py +0 -12
- webscout/Litlogger/handlers/console.py +0 -33
- webscout/Litlogger/handlers/file.py +0 -143
- webscout/Litlogger/handlers/network.py +0 -173
- webscout/Litlogger/styles/__init__.py +0 -7
- webscout/Litlogger/styles/colors.py +0 -249
- webscout/Litlogger/styles/formats.py +0 -458
- webscout/Litlogger/styles/text.py +0 -87
- webscout/Litlogger/utils/__init__.py +0 -6
- webscout/Litlogger/utils/detectors.py +0 -153
- webscout/Litlogger/utils/formatters.py +0 -200
- webscout/Local/__init__.py +0 -12
- webscout/Local/__main__.py +0 -9
- webscout/Local/api.py +0 -576
- webscout/Local/cli.py +0 -516
- webscout/Local/config.py +0 -75
- webscout/Local/llm.py +0 -287
- webscout/Local/model_manager.py +0 -253
- webscout/Local/server.py +0 -721
- webscout/Local/utils.py +0 -93
- webscout/Provider/AI21.py +0 -177
- webscout/Provider/AISEARCH/DeepFind.py +0 -250
- webscout/Provider/AISEARCH/ISou.py +0 -256
- webscout/Provider/AISEARCH/felo_search.py +0 -228
- webscout/Provider/AISEARCH/genspark_search.py +0 -208
- webscout/Provider/AISEARCH/hika_search.py +0 -194
- webscout/Provider/AISEARCH/scira_search.py +0 -324
- webscout/Provider/Aitopia.py +0 -292
- webscout/Provider/AllenAI.py +0 -413
- webscout/Provider/Blackboxai.py +0 -229
- webscout/Provider/C4ai.py +0 -432
- webscout/Provider/ChatGPTClone.py +0 -226
- webscout/Provider/ChatGPTES.py +0 -237
- webscout/Provider/ChatGPTGratis.py +0 -194
- webscout/Provider/Chatify.py +0 -175
- webscout/Provider/Cloudflare.py +0 -273
- webscout/Provider/DeepSeek.py +0 -196
- webscout/Provider/ElectronHub.py +0 -709
- webscout/Provider/ExaChat.py +0 -342
- webscout/Provider/Free2GPT.py +0 -241
- webscout/Provider/GPTWeb.py +0 -193
- webscout/Provider/Glider.py +0 -211
- webscout/Provider/HF_space/__init__.py +0 -0
- webscout/Provider/HF_space/qwen_qwen2.py +0 -206
- webscout/Provider/HuggingFaceChat.py +0 -462
- webscout/Provider/Hunyuan.py +0 -272
- webscout/Provider/LambdaChat.py +0 -392
- webscout/Provider/Llama.py +0 -200
- webscout/Provider/Llama3.py +0 -204
- webscout/Provider/Marcus.py +0 -148
- webscout/Provider/OLLAMA.py +0 -396
- webscout/Provider/OPENAI/c4ai.py +0 -367
- webscout/Provider/OPENAI/chatgptclone.py +0 -460
- webscout/Provider/OPENAI/exachat.py +0 -433
- webscout/Provider/OPENAI/freeaichat.py +0 -352
- webscout/Provider/OPENAI/opkfc.py +0 -488
- webscout/Provider/OPENAI/scirachat.py +0 -463
- webscout/Provider/OPENAI/standardinput.py +0 -425
- webscout/Provider/OPENAI/typegpt.py +0 -346
- webscout/Provider/OPENAI/uncovrAI.py +0 -455
- webscout/Provider/OPENAI/venice.py +0 -413
- webscout/Provider/OPENAI/yep.py +0 -327
- webscout/Provider/OpenGPT.py +0 -199
- webscout/Provider/Perplexitylabs.py +0 -415
- webscout/Provider/Phind.py +0 -535
- webscout/Provider/PizzaGPT.py +0 -198
- webscout/Provider/Reka.py +0 -214
- webscout/Provider/StandardInput.py +0 -278
- webscout/Provider/TTI/AiForce/__init__.py +0 -22
- webscout/Provider/TTI/AiForce/async_aiforce.py +0 -224
- webscout/Provider/TTI/AiForce/sync_aiforce.py +0 -245
- webscout/Provider/TTI/FreeAIPlayground/__init__.py +0 -9
- webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +0 -181
- webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +0 -180
- webscout/Provider/TTI/ImgSys/__init__.py +0 -23
- webscout/Provider/TTI/ImgSys/async_imgsys.py +0 -202
- webscout/Provider/TTI/ImgSys/sync_imgsys.py +0 -195
- webscout/Provider/TTI/MagicStudio/__init__.py +0 -2
- webscout/Provider/TTI/MagicStudio/async_magicstudio.py +0 -111
- webscout/Provider/TTI/MagicStudio/sync_magicstudio.py +0 -109
- webscout/Provider/TTI/Nexra/__init__.py +0 -22
- webscout/Provider/TTI/Nexra/async_nexra.py +0 -286
- webscout/Provider/TTI/Nexra/sync_nexra.py +0 -258
- webscout/Provider/TTI/PollinationsAI/__init__.py +0 -23
- webscout/Provider/TTI/PollinationsAI/async_pollinations.py +0 -311
- webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +0 -265
- webscout/Provider/TTI/aiarta/__init__.py +0 -2
- webscout/Provider/TTI/aiarta/async_aiarta.py +0 -482
- webscout/Provider/TTI/aiarta/sync_aiarta.py +0 -440
- webscout/Provider/TTI/artbit/__init__.py +0 -22
- webscout/Provider/TTI/artbit/async_artbit.py +0 -155
- webscout/Provider/TTI/artbit/sync_artbit.py +0 -148
- webscout/Provider/TTI/fastflux/__init__.py +0 -22
- webscout/Provider/TTI/fastflux/async_fastflux.py +0 -261
- webscout/Provider/TTI/fastflux/sync_fastflux.py +0 -252
- webscout/Provider/TTI/huggingface/__init__.py +0 -22
- webscout/Provider/TTI/huggingface/async_huggingface.py +0 -199
- webscout/Provider/TTI/huggingface/sync_huggingface.py +0 -195
- webscout/Provider/TTI/piclumen/__init__.py +0 -23
- webscout/Provider/TTI/piclumen/async_piclumen.py +0 -268
- webscout/Provider/TTI/piclumen/sync_piclumen.py +0 -233
- webscout/Provider/TTI/pixelmuse/__init__.py +0 -4
- webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +0 -249
- webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +0 -182
- webscout/Provider/TTI/talkai/__init__.py +0 -4
- webscout/Provider/TTI/talkai/async_talkai.py +0 -229
- webscout/Provider/TTI/talkai/sync_talkai.py +0 -207
- webscout/Provider/TTS/gesserit.py +0 -127
- webscout/Provider/TeachAnything.py +0 -187
- webscout/Provider/Venice.py +0 -219
- webscout/Provider/VercelAI.py +0 -234
- webscout/Provider/WebSim.py +0 -228
- webscout/Provider/Writecream.py +0 -211
- webscout/Provider/WritingMate.py +0 -197
- webscout/Provider/aimathgpt.py +0 -189
- webscout/Provider/askmyai.py +0 -158
- webscout/Provider/asksteve.py +0 -203
- webscout/Provider/bagoodex.py +0 -145
- webscout/Provider/chatglm.py +0 -205
- webscout/Provider/copilot.py +0 -428
- webscout/Provider/freeaichat.py +0 -271
- webscout/Provider/gaurish.py +0 -244
- webscout/Provider/geminiprorealtime.py +0 -160
- webscout/Provider/granite.py +0 -187
- webscout/Provider/hermes.py +0 -219
- webscout/Provider/koala.py +0 -268
- webscout/Provider/labyrinth.py +0 -340
- webscout/Provider/lepton.py +0 -194
- webscout/Provider/llamatutor.py +0 -192
- webscout/Provider/multichat.py +0 -325
- webscout/Provider/promptrefine.py +0 -193
- webscout/Provider/scira_chat.py +0 -277
- webscout/Provider/scnet.py +0 -187
- webscout/Provider/talkai.py +0 -194
- webscout/Provider/tutorai.py +0 -252
- webscout/Provider/typegpt.py +0 -232
- webscout/Provider/uncovr.py +0 -312
- webscout/Provider/yep.py +0 -376
- webscout/litprinter/__init__.py +0 -59
- webscout/scout/core.py +0 -881
- webscout/tempid.py +0 -128
- webscout/webscout_search.py +0 -1346
- webscout/webscout_search_async.py +0 -877
- webscout/yep_search.py +0 -297
- webscout-8.2.2.dist-info/METADATA +0 -734
- webscout-8.2.2.dist-info/RECORD +0 -309
- webscout-8.2.2.dist-info/entry_points.txt +0 -5
- webscout-8.2.2.dist-info/top_level.txt +0 -3
- webstoken/__init__.py +0 -30
- webstoken/classifier.py +0 -189
- webstoken/keywords.py +0 -216
- webstoken/language.py +0 -128
- webstoken/ner.py +0 -164
- webstoken/normalizer.py +0 -35
- webstoken/processor.py +0 -77
- webstoken/sentiment.py +0 -206
- webstoken/stemmer.py +0 -73
- webstoken/tagger.py +0 -60
- webstoken/tokenizer.py +0 -158
- {webscout-8.2.2.dist-info → webscout-2026.1.19.dist-info/licenses}/LICENSE.md +0 -0
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import re
|
|
3
|
+
import time
|
|
4
|
+
import uuid
|
|
5
|
+
from typing import Any, Dict, Generator, List, Optional, Union, cast
|
|
6
|
+
|
|
7
|
+
# Import base classes and utility structures
|
|
8
|
+
from webscout.Provider.OPENAI.base import (
|
|
9
|
+
BaseChat,
|
|
10
|
+
BaseCompletions,
|
|
11
|
+
OpenAICompatibleProvider,
|
|
12
|
+
SimpleModelList,
|
|
13
|
+
)
|
|
14
|
+
from webscout.Provider.OPENAI.utils import (
|
|
15
|
+
ChatCompletion,
|
|
16
|
+
ChatCompletionChunk,
|
|
17
|
+
ChatCompletionMessage,
|
|
18
|
+
Choice,
|
|
19
|
+
ChoiceDelta,
|
|
20
|
+
CompletionUsage,
|
|
21
|
+
count_tokens,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
# Import LitAgent
|
|
25
|
+
from ...litagent import LitAgent
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Completions(BaseCompletions):
|
|
29
|
+
def __init__(self, client: "K2Think"):
|
|
30
|
+
self._client = client
|
|
31
|
+
|
|
32
|
+
def create(
|
|
33
|
+
self,
|
|
34
|
+
*,
|
|
35
|
+
model: str,
|
|
36
|
+
messages: List[Dict[str, str]],
|
|
37
|
+
max_tokens: Optional[int] = 2049,
|
|
38
|
+
stream: bool = False,
|
|
39
|
+
temperature: Optional[float] = None,
|
|
40
|
+
top_p: Optional[float] = None,
|
|
41
|
+
timeout: Optional[int] = None,
|
|
42
|
+
**kwargs: Any,
|
|
43
|
+
) -> Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]]:
|
|
44
|
+
"""
|
|
45
|
+
Creates a model response for the given chat conversation.
|
|
46
|
+
Mimics openai.chat.completions.create
|
|
47
|
+
"""
|
|
48
|
+
# Prepare the payload for K2Think API
|
|
49
|
+
payload: Dict[str, Any] = {
|
|
50
|
+
"stream": stream,
|
|
51
|
+
"model": model,
|
|
52
|
+
"messages": messages,
|
|
53
|
+
"params": {},
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# Add optional parameters if provided
|
|
57
|
+
if max_tokens is not None and max_tokens > 0:
|
|
58
|
+
payload["params"]["max_tokens"] = max_tokens
|
|
59
|
+
|
|
60
|
+
if temperature is not None:
|
|
61
|
+
payload["params"]["temperature"] = temperature
|
|
62
|
+
|
|
63
|
+
if top_p is not None:
|
|
64
|
+
payload["params"]["top_p"] = top_p
|
|
65
|
+
|
|
66
|
+
# Add any additional parameters
|
|
67
|
+
payload.update(kwargs)
|
|
68
|
+
|
|
69
|
+
request_id = f"chatcmpl-{uuid.uuid4()}"
|
|
70
|
+
created_time = int(time.time())
|
|
71
|
+
|
|
72
|
+
if stream:
|
|
73
|
+
return self._create_stream(request_id, created_time, model, payload, timeout)
|
|
74
|
+
else:
|
|
75
|
+
return self._create_non_stream(request_id, created_time, model, payload, timeout)
|
|
76
|
+
|
|
77
|
+
def _create_stream(
|
|
78
|
+
self,
|
|
79
|
+
request_id: str,
|
|
80
|
+
created_time: int,
|
|
81
|
+
model: str,
|
|
82
|
+
payload: Dict[str, Any],
|
|
83
|
+
timeout: Optional[int] = None,
|
|
84
|
+
) -> Generator[ChatCompletionChunk, None, None]:
|
|
85
|
+
try:
|
|
86
|
+
response = self._client.session.post(
|
|
87
|
+
self._client.base_url,
|
|
88
|
+
headers=self._client.headers,
|
|
89
|
+
json=payload,
|
|
90
|
+
stream=True,
|
|
91
|
+
timeout=timeout or self._client.timeout,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
# Handle non-200 responses
|
|
95
|
+
if not response.ok:
|
|
96
|
+
raise IOError(
|
|
97
|
+
f"Failed to generate response - ({response.status_code}, {response.reason}) - {response.text}"
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# Use count_tokens for prompt tokens
|
|
101
|
+
prompt_tokens = count_tokens(
|
|
102
|
+
[msg.get("content", "") for msg in payload.get("messages", [])]
|
|
103
|
+
)
|
|
104
|
+
completion_tokens = 0
|
|
105
|
+
total_tokens = 0
|
|
106
|
+
seen_content = set() # Track seen content to avoid duplicates
|
|
107
|
+
|
|
108
|
+
for line in response.iter_lines():
|
|
109
|
+
if line:
|
|
110
|
+
decoded_line = line.decode("utf-8").strip()
|
|
111
|
+
|
|
112
|
+
# Extract content using regex patterns (similar to x0gpt)
|
|
113
|
+
extract_regexes = [
|
|
114
|
+
r"<answer>([\s\S]*?)<\/answer>",
|
|
115
|
+
]
|
|
116
|
+
|
|
117
|
+
content = ""
|
|
118
|
+
for regex in extract_regexes:
|
|
119
|
+
match = re.search(regex, decoded_line)
|
|
120
|
+
if match:
|
|
121
|
+
content = match.group(1)
|
|
122
|
+
break
|
|
123
|
+
|
|
124
|
+
if content:
|
|
125
|
+
# Format the content
|
|
126
|
+
content = self._client.format_text(content)
|
|
127
|
+
|
|
128
|
+
# Skip if we've already seen this exact content
|
|
129
|
+
if content in seen_content:
|
|
130
|
+
continue
|
|
131
|
+
|
|
132
|
+
seen_content.add(content)
|
|
133
|
+
|
|
134
|
+
# Update token counts using count_tokens
|
|
135
|
+
completion_tokens += count_tokens(content)
|
|
136
|
+
total_tokens = prompt_tokens + completion_tokens
|
|
137
|
+
|
|
138
|
+
# Create the delta object
|
|
139
|
+
delta = ChoiceDelta(content=content, role="assistant", tool_calls=None)
|
|
140
|
+
|
|
141
|
+
# Create the choice object
|
|
142
|
+
choice = Choice(index=0, delta=delta, finish_reason=None, logprobs=None)
|
|
143
|
+
|
|
144
|
+
# Create the chunk object
|
|
145
|
+
chunk = ChatCompletionChunk(
|
|
146
|
+
id=request_id,
|
|
147
|
+
choices=[choice],
|
|
148
|
+
created=created_time,
|
|
149
|
+
model=model,
|
|
150
|
+
system_fingerprint=None,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
# Set usage directly on the chunk object
|
|
154
|
+
chunk.usage = {
|
|
155
|
+
"prompt_tokens": prompt_tokens,
|
|
156
|
+
"completion_tokens": completion_tokens,
|
|
157
|
+
"total_tokens": total_tokens,
|
|
158
|
+
"estimated_cost": None,
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
# Return the chunk object with usage information
|
|
162
|
+
yield chunk
|
|
163
|
+
|
|
164
|
+
# Final chunk with finish_reason="stop"
|
|
165
|
+
delta = ChoiceDelta(content=None, role=None, tool_calls=None)
|
|
166
|
+
|
|
167
|
+
choice = Choice(index=0, delta=delta, finish_reason="stop", logprobs=None)
|
|
168
|
+
|
|
169
|
+
chunk = ChatCompletionChunk(
|
|
170
|
+
id=request_id,
|
|
171
|
+
choices=[choice],
|
|
172
|
+
created=created_time,
|
|
173
|
+
model=model,
|
|
174
|
+
system_fingerprint=None,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
# Set usage directly on the chunk object
|
|
178
|
+
chunk.usage = {
|
|
179
|
+
"prompt_tokens": prompt_tokens,
|
|
180
|
+
"completion_tokens": completion_tokens,
|
|
181
|
+
"total_tokens": total_tokens,
|
|
182
|
+
"estimated_cost": None,
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
yield chunk
|
|
186
|
+
|
|
187
|
+
except Exception as e:
|
|
188
|
+
print(f"Error during K2Think stream request: {e}")
|
|
189
|
+
raise IOError(f"K2Think request failed: {e}") from e
|
|
190
|
+
|
|
191
|
+
def _create_non_stream(
|
|
192
|
+
self,
|
|
193
|
+
request_id: str,
|
|
194
|
+
created_time: int,
|
|
195
|
+
model: str,
|
|
196
|
+
payload: Dict[str, Any],
|
|
197
|
+
timeout: Optional[int] = None,
|
|
198
|
+
) -> ChatCompletion:
|
|
199
|
+
try:
|
|
200
|
+
response = self._client.session.post(
|
|
201
|
+
self._client.base_url,
|
|
202
|
+
headers=self._client.headers,
|
|
203
|
+
json=payload,
|
|
204
|
+
stream=True,
|
|
205
|
+
timeout=timeout or self._client.timeout,
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
# Handle non-200 responses
|
|
209
|
+
if not response.ok:
|
|
210
|
+
raise IOError(
|
|
211
|
+
f"Failed to generate response - ({response.status_code}, {response.reason}) - {response.text}"
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
# Collect the full response
|
|
215
|
+
full_text = ""
|
|
216
|
+
seen_content_parts = set() # Track seen content parts to avoid duplicates
|
|
217
|
+
|
|
218
|
+
for line in response.iter_lines(decode_unicode=True):
|
|
219
|
+
if line:
|
|
220
|
+
# Extract content using regex patterns
|
|
221
|
+
extract_regexes = [
|
|
222
|
+
r"<answer>([\s\S]*?)<\/answer>",
|
|
223
|
+
]
|
|
224
|
+
|
|
225
|
+
for regex in extract_regexes:
|
|
226
|
+
match = re.search(regex, line)
|
|
227
|
+
if match:
|
|
228
|
+
content = match.group(1)
|
|
229
|
+
# Only add if we haven't seen this exact content before
|
|
230
|
+
if content not in seen_content_parts:
|
|
231
|
+
seen_content_parts.add(content)
|
|
232
|
+
full_text += content
|
|
233
|
+
break
|
|
234
|
+
|
|
235
|
+
# Format the text
|
|
236
|
+
full_text = self._client.format_text(full_text)
|
|
237
|
+
|
|
238
|
+
# Use count_tokens for accurate token counts
|
|
239
|
+
prompt_tokens = count_tokens(
|
|
240
|
+
[msg.get("content", "") for msg in payload.get("messages", [])]
|
|
241
|
+
)
|
|
242
|
+
completion_tokens = count_tokens(full_text)
|
|
243
|
+
total_tokens = prompt_tokens + completion_tokens
|
|
244
|
+
|
|
245
|
+
# Create the message object
|
|
246
|
+
message = ChatCompletionMessage(role="assistant", content=full_text)
|
|
247
|
+
|
|
248
|
+
# Create the choice object
|
|
249
|
+
choice = Choice(index=0, message=message, finish_reason="stop")
|
|
250
|
+
|
|
251
|
+
# Create the usage object
|
|
252
|
+
usage = CompletionUsage(
|
|
253
|
+
prompt_tokens=prompt_tokens,
|
|
254
|
+
completion_tokens=completion_tokens,
|
|
255
|
+
total_tokens=total_tokens,
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
# Create the completion object
|
|
259
|
+
completion = ChatCompletion(
|
|
260
|
+
id=request_id,
|
|
261
|
+
choices=[choice],
|
|
262
|
+
created=created_time,
|
|
263
|
+
model=model,
|
|
264
|
+
usage=usage,
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
return completion
|
|
268
|
+
|
|
269
|
+
except Exception as e:
|
|
270
|
+
print(f"Error during K2Think non-stream request: {e}")
|
|
271
|
+
raise IOError(f"K2Think request failed: {e}") from e
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
class Chat(BaseChat):
|
|
275
|
+
def __init__(self, client: "K2Think"):
|
|
276
|
+
self.completions = Completions(client)
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
class Models:
|
|
280
|
+
"""Models class to mimic OpenAI models.list()"""
|
|
281
|
+
|
|
282
|
+
def __init__(self):
|
|
283
|
+
self.available_models = [
|
|
284
|
+
"MBZUAI-IFM/K2-Think",
|
|
285
|
+
]
|
|
286
|
+
|
|
287
|
+
def list(self):
|
|
288
|
+
"""Return list of available models"""
|
|
289
|
+
return [
|
|
290
|
+
{"id": model, "object": "model", "created": 0, "owned_by": "k2think"}
|
|
291
|
+
for model in self.available_models
|
|
292
|
+
]
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
class K2Think(OpenAICompatibleProvider):
|
|
296
|
+
"""
|
|
297
|
+
OpenAI-compatible client for K2Think API.
|
|
298
|
+
|
|
299
|
+
Usage:
|
|
300
|
+
client = K2Think()
|
|
301
|
+
response = client.chat.completions.create(
|
|
302
|
+
model="MBZUAI-IFM/K2-Think",
|
|
303
|
+
messages=[{"role": "user", "content": "Hello!"}]
|
|
304
|
+
)
|
|
305
|
+
"""
|
|
306
|
+
|
|
307
|
+
AVAILABLE_MODELS = ["MBZUAI-IFM/K2-Think"]
|
|
308
|
+
required_auth = False # No API key required for K2Think
|
|
309
|
+
|
|
310
|
+
def __init__(self, browser: str = "chrome", proxies: Optional[dict] = None):
|
|
311
|
+
"""
|
|
312
|
+
Initialize the K2Think client.
|
|
313
|
+
|
|
314
|
+
Args:
|
|
315
|
+
browser: Browser to emulate in user agent
|
|
316
|
+
proxies: Optional proxy configuration dictionary
|
|
317
|
+
"""
|
|
318
|
+
super().__init__(proxies=proxies)
|
|
319
|
+
self.timeout = 30
|
|
320
|
+
self.base_url = "https://www.k2think.ai/api/guest/chat/completions"
|
|
321
|
+
|
|
322
|
+
# Initialize LitAgent for user agent generation
|
|
323
|
+
agent = LitAgent()
|
|
324
|
+
self.fingerprint = agent.generate_fingerprint(browser)
|
|
325
|
+
|
|
326
|
+
self.headers = {
|
|
327
|
+
"Accept": "*/*",
|
|
328
|
+
"Accept-Language": self.fingerprint["accept_language"],
|
|
329
|
+
"Content-Type": "application/json",
|
|
330
|
+
"User-Agent": self.fingerprint["user_agent"],
|
|
331
|
+
"Origin": "https://www.k2think.ai",
|
|
332
|
+
"Referer": "https://www.k2think.ai/guest",
|
|
333
|
+
"Sec-Fetch-Dest": "empty",
|
|
334
|
+
"Sec-Fetch-Mode": "cors",
|
|
335
|
+
"Sec-Fetch-Site": "same-origin",
|
|
336
|
+
"Sec-Ch-Ua": '"Chromium";v="140", "Not=A?Brand";v="24", "Microsoft Edge";v="140"',
|
|
337
|
+
"Sec-Ch-Ua-Mobile": "?0",
|
|
338
|
+
"Sec-Ch-Ua-Platform": f'"{self.fingerprint["platform"]}"',
|
|
339
|
+
"Priority": "u=1, i",
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
self.session.headers.update(self.headers)
|
|
343
|
+
|
|
344
|
+
# Initialize the chat interface
|
|
345
|
+
self.chat = Chat(self)
|
|
346
|
+
|
|
347
|
+
@property
|
|
348
|
+
def models(self) -> SimpleModelList:
|
|
349
|
+
return SimpleModelList(type(self).AVAILABLE_MODELS)
|
|
350
|
+
|
|
351
|
+
def format_text(self, text: str) -> str:
|
|
352
|
+
"""
|
|
353
|
+
Format text by replacing escaped newlines with actual newlines.
|
|
354
|
+
|
|
355
|
+
Args:
|
|
356
|
+
text: Text to format
|
|
357
|
+
|
|
358
|
+
Returns:
|
|
359
|
+
Formatted text
|
|
360
|
+
"""
|
|
361
|
+
# Use a more comprehensive approach to handle all escape sequences
|
|
362
|
+
try:
|
|
363
|
+
# First handle double backslashes to avoid issues
|
|
364
|
+
text = text.replace("\\\\", "\\")
|
|
365
|
+
|
|
366
|
+
# Handle common escape sequences
|
|
367
|
+
text = text.replace("\\n", "\n")
|
|
368
|
+
text = text.replace("\\r", "\r")
|
|
369
|
+
text = text.replace("\\t", "\t")
|
|
370
|
+
text = text.replace('\\"', '"')
|
|
371
|
+
text = text.replace("\\'", "'")
|
|
372
|
+
|
|
373
|
+
# Handle any remaining escape sequences using JSON decoding
|
|
374
|
+
# This is a fallback in case there are other escape sequences
|
|
375
|
+
try:
|
|
376
|
+
# Add quotes to make it a valid JSON string
|
|
377
|
+
json_str = f'"{text}"'
|
|
378
|
+
# Use json module to decode all escape sequences
|
|
379
|
+
decoded = json.loads(json_str)
|
|
380
|
+
return decoded
|
|
381
|
+
except json.JSONDecodeError:
|
|
382
|
+
# If JSON decoding fails, return the text with the replacements we've already done
|
|
383
|
+
return text
|
|
384
|
+
except Exception as e:
|
|
385
|
+
# If any error occurs, return the original text
|
|
386
|
+
print(f"Warning: Error formatting text: {e}")
|
|
387
|
+
return text
|
|
388
|
+
|
|
389
|
+
def convert_model_name(self, model: str) -> str:
|
|
390
|
+
"""
|
|
391
|
+
Convert model names to ones supported by K2Think.
|
|
392
|
+
|
|
393
|
+
Args:
|
|
394
|
+
model: Model name to convert
|
|
395
|
+
|
|
396
|
+
Returns:
|
|
397
|
+
K2Think model name
|
|
398
|
+
"""
|
|
399
|
+
# K2Think doesn't actually use model names, but we'll keep this for compatibility
|
|
400
|
+
return model
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
# Convenience function for backward compatibility
|
|
404
|
+
def K2ThinkClient(**kwargs):
|
|
405
|
+
"""Create a new K2Think client instance"""
|
|
406
|
+
return K2Think(**kwargs)
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
if __name__ == "__main__":
|
|
410
|
+
from rich import print
|
|
411
|
+
|
|
412
|
+
client = K2Think()
|
|
413
|
+
response = client.chat.completions.create(
|
|
414
|
+
model="MBZUAI-IFM/K2-Think", messages=[{"role": "user", "content": "Hello!"}], stream=True
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
if hasattr(response, "__iter__") and not isinstance(response, (str, bytes, ChatCompletion)):
|
|
418
|
+
for chunk in response:
|
|
419
|
+
delta = chunk.choices[0].delta if chunk.choices else None
|
|
420
|
+
if delta and delta.content:
|
|
421
|
+
print(delta.content, end="", flush=True)
|
|
422
|
+
else:
|
|
423
|
+
print(response)
|