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
|
@@ -1,38 +1,94 @@
|
|
|
1
|
-
import requests
|
|
2
1
|
import json
|
|
2
|
+
import random
|
|
3
|
+
import re
|
|
4
|
+
import string
|
|
3
5
|
import time
|
|
4
6
|
import uuid
|
|
5
|
-
from typing import
|
|
7
|
+
from typing import Any, Dict, Generator, List, Optional, Union
|
|
8
|
+
|
|
9
|
+
import cloudscraper
|
|
10
|
+
from curl_cffi.requests import Session
|
|
11
|
+
from rich import print
|
|
12
|
+
|
|
13
|
+
from webscout.litagent.agent import LitAgent
|
|
6
14
|
|
|
7
15
|
# Import base classes and utility structures
|
|
8
|
-
from .base import
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
16
|
+
from webscout.Provider.OPENAI.base import (
|
|
17
|
+
BaseChat,
|
|
18
|
+
BaseCompletions,
|
|
19
|
+
OpenAICompatibleProvider,
|
|
20
|
+
SimpleModelList,
|
|
21
|
+
)
|
|
22
|
+
from webscout.Provider.OPENAI.utils import (
|
|
23
|
+
ChatCompletion,
|
|
24
|
+
ChatCompletionChunk,
|
|
25
|
+
ChatCompletionMessage,
|
|
26
|
+
Choice,
|
|
27
|
+
ChoiceDelta,
|
|
28
|
+
CompletionUsage,
|
|
12
29
|
)
|
|
13
30
|
|
|
14
|
-
# Attempt to import LitAgent, fallback if not available
|
|
15
|
-
try:
|
|
16
|
-
from webscout.litagent import LitAgent
|
|
17
|
-
except ImportError:
|
|
18
|
-
# Define a dummy LitAgent if webscout is not installed or accessible
|
|
19
|
-
class LitAgent:
|
|
20
|
-
def generate_fingerprint(self, browser: str = "chrome") -> Dict[str, Any]:
|
|
21
|
-
# Return minimal default headers if LitAgent is unavailable
|
|
22
|
-
print("Warning: LitAgent not found. Using default minimal headers.")
|
|
23
|
-
return {
|
|
24
|
-
"accept": "*/*",
|
|
25
|
-
"accept_language": "en-US,en;q=0.9",
|
|
26
|
-
"platform": "Windows",
|
|
27
|
-
"sec_ch_ua": '"Not/A)Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
|
|
28
|
-
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",
|
|
29
|
-
"browser_type": browser,
|
|
30
|
-
}
|
|
31
31
|
|
|
32
|
-
# ---
|
|
32
|
+
# --- ChutesAI API Key Auto-Generator ---
|
|
33
|
+
def generate_chutesai_api_key():
|
|
34
|
+
url = "https://chutes.ai/auth/start?/create"
|
|
35
|
+
def generate_username(length=8):
|
|
36
|
+
return ''.join(random.choices(string.ascii_letters, k=length))
|
|
37
|
+
username = generate_username()
|
|
38
|
+
agent = LitAgent()
|
|
39
|
+
fingerprint = agent.generate_fingerprint("chrome")
|
|
40
|
+
headers = {
|
|
41
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
42
|
+
"Accept": "application/json",
|
|
43
|
+
"User-Agent": fingerprint["user_agent"],
|
|
44
|
+
"Accept-Encoding": "gzip, deflate, br, zstd",
|
|
45
|
+
"Accept-Language": fingerprint["accept_language"],
|
|
46
|
+
"DNT": "1",
|
|
47
|
+
"Origin": "https://chutes.ai",
|
|
48
|
+
"Referer": "https://chutes.ai/auth/start",
|
|
49
|
+
"Sec-Ch-Ua": fingerprint["sec_ch_ua"],
|
|
50
|
+
"Sec-Ch-Ua-Mobile": "?0",
|
|
51
|
+
"Sec-Ch-Ua-Platform": fingerprint["platform"],
|
|
52
|
+
"X-Sveltekit-Action": "true"
|
|
53
|
+
}
|
|
54
|
+
data = {
|
|
55
|
+
"username": username,
|
|
56
|
+
"coldkey": "hotkey",
|
|
57
|
+
"__superform_id": "xpsmbd"
|
|
58
|
+
}
|
|
59
|
+
scraper = cloudscraper.create_scraper()
|
|
60
|
+
response = scraper.post(url, headers=headers, data=data)
|
|
61
|
+
print(f"[bold green]Status:[/] {response.status_code}")
|
|
62
|
+
|
|
63
|
+
# Ensure response is decoded as UTF-8
|
|
64
|
+
response.encoding = 'utf-8'
|
|
65
|
+
|
|
66
|
+
try:
|
|
67
|
+
resp_json = response.json()
|
|
68
|
+
except Exception:
|
|
69
|
+
try:
|
|
70
|
+
# Try to decode the response text with UTF-8 explicitly
|
|
71
|
+
decoded_text = response.content.decode('utf-8', errors='replace')
|
|
72
|
+
print(decoded_text)
|
|
73
|
+
except Exception:
|
|
74
|
+
print("Failed to decode response content")
|
|
75
|
+
return None
|
|
76
|
+
print(resp_json)
|
|
77
|
+
# Extract the api_key using regex from the 'data' field
|
|
78
|
+
if 'data' in resp_json:
|
|
79
|
+
api_key_match = re.search(r'(cpk_[a-zA-Z0-9.]+)', resp_json['data'])
|
|
80
|
+
if api_key_match:
|
|
81
|
+
api_key = api_key_match.group(1)
|
|
82
|
+
print(f"[bold yellow]Auto-generated ChutesAI API Key:[/] {api_key}")
|
|
83
|
+
return api_key
|
|
84
|
+
else:
|
|
85
|
+
print("[red]API key not found in response data.")
|
|
86
|
+
return None
|
|
87
|
+
|
|
88
|
+
# --- ChutesAI Client ---
|
|
33
89
|
|
|
34
90
|
class Completions(BaseCompletions):
|
|
35
|
-
def __init__(self, client: '
|
|
91
|
+
def __init__(self, client: 'ChutesAI'):
|
|
36
92
|
self._client = client
|
|
37
93
|
|
|
38
94
|
def create(
|
|
@@ -40,7 +96,7 @@ class Completions(BaseCompletions):
|
|
|
40
96
|
*,
|
|
41
97
|
model: str,
|
|
42
98
|
messages: List[Dict[str, str]],
|
|
43
|
-
max_tokens: Optional[int] =
|
|
99
|
+
max_tokens: Optional[int] = 1024,
|
|
44
100
|
stream: bool = False,
|
|
45
101
|
temperature: Optional[float] = None,
|
|
46
102
|
top_p: Optional[float] = None,
|
|
@@ -50,23 +106,16 @@ class Completions(BaseCompletions):
|
|
|
50
106
|
Creates a model response for the given chat conversation.
|
|
51
107
|
Mimics openai.chat.completions.create
|
|
52
108
|
"""
|
|
53
|
-
# Prepare the payload for Glider API
|
|
54
109
|
payload = {
|
|
110
|
+
"model": model,
|
|
55
111
|
"messages": messages,
|
|
56
|
-
"
|
|
112
|
+
"max_tokens": max_tokens,
|
|
113
|
+
"stream": stream,
|
|
57
114
|
}
|
|
58
|
-
|
|
59
|
-
# Add optional parameters if provided
|
|
60
|
-
if max_tokens is not None and max_tokens > 0:
|
|
61
|
-
payload["max_tokens"] = max_tokens
|
|
62
|
-
|
|
63
115
|
if temperature is not None:
|
|
64
116
|
payload["temperature"] = temperature
|
|
65
|
-
|
|
66
117
|
if top_p is not None:
|
|
67
118
|
payload["top_p"] = top_p
|
|
68
|
-
|
|
69
|
-
# Add any additional parameters
|
|
70
119
|
payload.update(kwargs)
|
|
71
120
|
|
|
72
121
|
request_id = f"chatcmpl-{uuid.uuid4()}"
|
|
@@ -81,8 +130,8 @@ class Completions(BaseCompletions):
|
|
|
81
130
|
self, request_id: str, created_time: int, model: str, payload: Dict[str, Any]
|
|
82
131
|
) -> Generator[ChatCompletionChunk, None, None]:
|
|
83
132
|
try:
|
|
84
|
-
response = self._client.
|
|
85
|
-
self._client.
|
|
133
|
+
response = self._client.scraper.post(
|
|
134
|
+
self._client.base_url,
|
|
86
135
|
headers=self._client.headers,
|
|
87
136
|
json=payload,
|
|
88
137
|
stream=True,
|
|
@@ -90,51 +139,43 @@ class Completions(BaseCompletions):
|
|
|
90
139
|
)
|
|
91
140
|
response.raise_for_status()
|
|
92
141
|
|
|
93
|
-
# Track token usage across chunks
|
|
94
142
|
prompt_tokens = 0
|
|
95
143
|
completion_tokens = 0
|
|
96
144
|
total_tokens = 0
|
|
97
145
|
|
|
98
146
|
for line in response.iter_lines():
|
|
99
147
|
if line:
|
|
100
|
-
decoded_line = line.decode('utf-8').strip()
|
|
101
|
-
|
|
148
|
+
decoded_line = line.decode('utf-8', errors='replace').strip()
|
|
102
149
|
if decoded_line.startswith("data: "):
|
|
103
150
|
json_str = decoded_line[6:]
|
|
104
151
|
if json_str == "[DONE]":
|
|
105
|
-
# Format the final [DONE] marker in OpenAI format
|
|
106
|
-
# print("data: [DONE]")
|
|
107
152
|
break
|
|
108
|
-
|
|
109
153
|
try:
|
|
110
154
|
data = json.loads(json_str)
|
|
111
|
-
|
|
155
|
+
choices = data.get('choices')
|
|
156
|
+
if not choices:
|
|
157
|
+
continue
|
|
158
|
+
choice_data = choices[0] if choices else {}
|
|
112
159
|
delta_data = choice_data.get('delta', {})
|
|
113
160
|
finish_reason = choice_data.get('finish_reason')
|
|
114
161
|
|
|
115
|
-
# Update token counts if available
|
|
116
162
|
usage_data = data.get('usage', {})
|
|
117
163
|
if usage_data:
|
|
118
164
|
prompt_tokens = usage_data.get('prompt_tokens', prompt_tokens)
|
|
119
165
|
completion_tokens = usage_data.get('completion_tokens', completion_tokens)
|
|
120
166
|
total_tokens = usage_data.get('total_tokens', total_tokens)
|
|
121
167
|
|
|
122
|
-
# Create the delta object
|
|
123
168
|
delta = ChoiceDelta(
|
|
124
169
|
content=delta_data.get('content'),
|
|
125
170
|
role=delta_data.get('role'),
|
|
126
171
|
tool_calls=delta_data.get('tool_calls')
|
|
127
172
|
)
|
|
128
|
-
|
|
129
|
-
# Create the choice object
|
|
130
173
|
choice = Choice(
|
|
131
174
|
index=choice_data.get('index', 0),
|
|
132
175
|
delta=delta,
|
|
133
176
|
finish_reason=finish_reason,
|
|
134
177
|
logprobs=choice_data.get('logprobs')
|
|
135
178
|
)
|
|
136
|
-
|
|
137
|
-
# Create the chunk object
|
|
138
179
|
chunk = ChatCompletionChunk(
|
|
139
180
|
id=request_id,
|
|
140
181
|
choices=[choice],
|
|
@@ -142,62 +183,47 @@ class Completions(BaseCompletions):
|
|
|
142
183
|
model=model,
|
|
143
184
|
system_fingerprint=data.get('system_fingerprint')
|
|
144
185
|
)
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
# Add usage information to match OpenAI format
|
|
150
|
-
# Even if we don't have real token counts, include estimated usage
|
|
151
|
-
# This matches the format in the examples
|
|
186
|
+
if hasattr(chunk, "model_dump"):
|
|
187
|
+
chunk_dict = chunk.model_dump(exclude_none=True)
|
|
188
|
+
else:
|
|
189
|
+
chunk_dict = chunk.dict(exclude_none=True)
|
|
152
190
|
usage_dict = {
|
|
153
191
|
"prompt_tokens": prompt_tokens or 10,
|
|
154
192
|
"completion_tokens": completion_tokens or (len(delta_data.get('content', '')) if delta_data.get('content') else 0),
|
|
155
193
|
"total_tokens": total_tokens or (10 + (len(delta_data.get('content', '')) if delta_data.get('content') else 0)),
|
|
156
194
|
"estimated_cost": None
|
|
157
195
|
}
|
|
158
|
-
|
|
159
|
-
# Update completion_tokens and total_tokens as we receive more content
|
|
160
196
|
if delta_data.get('content'):
|
|
161
197
|
completion_tokens += 1
|
|
162
198
|
total_tokens = prompt_tokens + completion_tokens
|
|
163
199
|
usage_dict["completion_tokens"] = completion_tokens
|
|
164
200
|
usage_dict["total_tokens"] = total_tokens
|
|
165
|
-
|
|
166
201
|
chunk_dict["usage"] = usage_dict
|
|
167
|
-
|
|
168
|
-
# Format the response in OpenAI format exactly as requested
|
|
169
|
-
# We need to print the raw string and also yield the chunk object
|
|
170
|
-
# This ensures both the console output and the returned object are correct
|
|
171
|
-
# print(f"data: {json.dumps(chunk_dict)}")
|
|
172
|
-
|
|
173
|
-
# Return the chunk object for internal processing
|
|
174
202
|
yield chunk
|
|
175
203
|
except json.JSONDecodeError:
|
|
176
204
|
print(f"Warning: Could not decode JSON line: {json_str}")
|
|
177
205
|
continue
|
|
178
|
-
except requests.exceptions.RequestException as e:
|
|
179
|
-
print(f"Error during Glider stream request: {e}")
|
|
180
|
-
raise IOError(f"Glider request failed: {e}") from e
|
|
181
206
|
except Exception as e:
|
|
182
|
-
print(f"Error
|
|
207
|
+
print(f"Error during ChutesAI stream request: {e}")
|
|
208
|
+
raise IOError(f"ChutesAI request failed: {e}") from e
|
|
209
|
+
except Exception as e:
|
|
210
|
+
print(f"Error processing ChutesAI stream: {e}")
|
|
183
211
|
raise
|
|
184
212
|
|
|
185
213
|
def _create_non_stream(
|
|
186
214
|
self, request_id: str, created_time: int, model: str, payload: Dict[str, Any]
|
|
187
215
|
) -> ChatCompletion:
|
|
188
216
|
try:
|
|
189
|
-
response = self._client.
|
|
190
|
-
self._client.
|
|
217
|
+
response = self._client.scraper.post(
|
|
218
|
+
self._client.base_url,
|
|
191
219
|
headers=self._client.headers,
|
|
192
220
|
json=payload,
|
|
193
221
|
timeout=self._client.timeout
|
|
194
222
|
)
|
|
195
223
|
response.raise_for_status()
|
|
196
224
|
data = response.json()
|
|
197
|
-
|
|
198
225
|
choices_data = data.get('choices', [])
|
|
199
226
|
usage_data = data.get('usage', {})
|
|
200
|
-
|
|
201
227
|
choices = []
|
|
202
228
|
for choice_d in choices_data:
|
|
203
229
|
message_d = choice_d.get('message', {})
|
|
@@ -211,13 +237,11 @@ class Completions(BaseCompletions):
|
|
|
211
237
|
finish_reason=choice_d.get('finish_reason', 'stop')
|
|
212
238
|
)
|
|
213
239
|
choices.append(choice)
|
|
214
|
-
|
|
215
240
|
usage = CompletionUsage(
|
|
216
241
|
prompt_tokens=usage_data.get('prompt_tokens', 0),
|
|
217
242
|
completion_tokens=usage_data.get('completion_tokens', 0),
|
|
218
243
|
total_tokens=usage_data.get('total_tokens', 0)
|
|
219
244
|
)
|
|
220
|
-
|
|
221
245
|
completion = ChatCompletion(
|
|
222
246
|
id=request_id,
|
|
223
247
|
choices=choices,
|
|
@@ -226,91 +250,82 @@ class Completions(BaseCompletions):
|
|
|
226
250
|
usage=usage,
|
|
227
251
|
)
|
|
228
252
|
return completion
|
|
229
|
-
|
|
230
|
-
except requests.exceptions.RequestException as e:
|
|
231
|
-
print(f"Error during Glider non-stream request: {e}")
|
|
232
|
-
raise IOError(f"Glider request failed: {e}") from e
|
|
233
253
|
except Exception as e:
|
|
234
|
-
print(f"Error
|
|
254
|
+
print(f"Error during ChutesAI non-stream request: {e}")
|
|
255
|
+
raise IOError(f"ChutesAI request failed: {e}") from e
|
|
256
|
+
except Exception as e:
|
|
257
|
+
print(f"Error processing ChutesAI response: {e}")
|
|
235
258
|
raise
|
|
236
259
|
|
|
237
260
|
class Chat(BaseChat):
|
|
238
|
-
def __init__(self, client: '
|
|
261
|
+
def __init__(self, client: 'ChutesAI'):
|
|
239
262
|
self.completions = Completions(client)
|
|
240
263
|
|
|
241
|
-
class
|
|
242
|
-
"""
|
|
243
|
-
OpenAI-compatible client for Glider.so API.
|
|
244
|
-
|
|
245
|
-
Usage:
|
|
246
|
-
client = Glider()
|
|
247
|
-
response = client.chat.completions.create(
|
|
248
|
-
model="chat-llama-3-1-70b",
|
|
249
|
-
messages=[{"role": "user", "content": "Hello!"}]
|
|
250
|
-
)
|
|
251
|
-
"""
|
|
252
|
-
|
|
264
|
+
class ChutesAI(OpenAICompatibleProvider):
|
|
253
265
|
AVAILABLE_MODELS = [
|
|
254
|
-
"
|
|
255
|
-
"chat-llama-3-2-3b",
|
|
256
|
-
"chat-deepseek-r1-qwen-32b",
|
|
257
|
-
"chat-qwen-2-5-7b",
|
|
258
|
-
"chat-qwen-qwq-32b",
|
|
266
|
+
"deepseek-ai/DeepSeek-V3-0324",
|
|
259
267
|
"deepseek-ai/DeepSeek-R1",
|
|
268
|
+
"NousResearch/DeepHermes-3-Mistral-24B-Preview",
|
|
269
|
+
"chutesai/Llama-4-Maverick-17B-128E-Instruct-FP8",
|
|
260
270
|
]
|
|
271
|
+
def __init__(self, api_key: Optional[str] = None,):
|
|
272
|
+
self.timeout = None # Infinite timeout
|
|
273
|
+
self.base_url = "https://llm.chutes.ai/v1/chat/completions"
|
|
261
274
|
|
|
262
|
-
|
|
275
|
+
# Always generate a new API key, ignore any provided key
|
|
276
|
+
print("[yellow]Generating new ChutesAI API key...[/]")
|
|
277
|
+
self.api_key = generate_chutesai_api_key()
|
|
263
278
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
279
|
+
if not self.api_key:
|
|
280
|
+
print("[red]Failed to generate API key. Retrying...[/]")
|
|
281
|
+
# Retry once more
|
|
282
|
+
self.api_key = generate_chutesai_api_key()
|
|
267
283
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
browser: Browser to emulate in user agent
|
|
271
|
-
"""
|
|
272
|
-
self.timeout = timeout
|
|
273
|
-
self.api_endpoint = "https://glider.so/api/chat"
|
|
274
|
-
self.session = requests.Session()
|
|
284
|
+
if not self.api_key:
|
|
285
|
+
raise ValueError("Failed to generate ChutesAI API key after multiple attempts.")
|
|
275
286
|
|
|
276
|
-
|
|
277
|
-
fingerprint = agent.generate_fingerprint(browser)
|
|
287
|
+
print(f"[green]Successfully generated API key: {self.api_key[:20]}...[/]")
|
|
278
288
|
|
|
289
|
+
self.scraper = cloudscraper.create_scraper()
|
|
279
290
|
self.headers = {
|
|
280
|
-
"
|
|
281
|
-
"
|
|
282
|
-
"Accept-Language": fingerprint["accept_language"],
|
|
283
|
-
"Content-Type": "application/json",
|
|
284
|
-
"Cache-Control": "no-cache",
|
|
285
|
-
"Connection": "keep-alive",
|
|
286
|
-
"Origin": "https://glider.so",
|
|
287
|
-
"Pragma": "no-cache",
|
|
288
|
-
"Referer": "https://glider.so/",
|
|
289
|
-
"Sec-Fetch-Dest": "empty",
|
|
290
|
-
"Sec-Fetch-Mode": "cors",
|
|
291
|
-
"Sec-Fetch-Site": "same-site",
|
|
292
|
-
"Sec-CH-UA": fingerprint["sec_ch_ua"] or '"Not)A;Brand";v="99", "Microsoft Edge";v="127", "Chromium";v="127"',
|
|
293
|
-
"Sec-CH-UA-Mobile": "?0",
|
|
294
|
-
"Sec-CH-UA-Platform": f'"{fingerprint["platform"]}"',
|
|
295
|
-
"User-Agent": fingerprint["user_agent"],
|
|
291
|
+
"Authorization": f"Bearer {self.api_key}",
|
|
292
|
+
"Content-Type": "application/json"
|
|
296
293
|
}
|
|
297
|
-
self.
|
|
294
|
+
self.scraper.headers.update(self.headers)
|
|
298
295
|
self.chat = Chat(self)
|
|
299
296
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
297
|
+
@property
|
|
298
|
+
def models(self) -> SimpleModelList:
|
|
299
|
+
return SimpleModelList(type(self).AVAILABLE_MODELS)
|
|
303
300
|
|
|
304
|
-
|
|
305
|
-
|
|
301
|
+
if __name__ == "__main__":
|
|
302
|
+
try:
|
|
303
|
+
# Example usage - always use generated API key
|
|
304
|
+
client = ChutesAI()
|
|
306
305
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
if model in self.AVAILABLE_MODELS:
|
|
312
|
-
return model
|
|
306
|
+
messages = [
|
|
307
|
+
{"role": "system", "content": "You are a helpful assistant."},
|
|
308
|
+
{"role": "user", "content": "What is the capital of France?"}
|
|
309
|
+
]
|
|
313
310
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
311
|
+
print("[cyan]Making API request...[/]")
|
|
312
|
+
response = client.chat.completions.create(
|
|
313
|
+
model="deepseek-ai/DeepSeek-V3-0324",
|
|
314
|
+
messages=messages,
|
|
315
|
+
max_tokens=50,
|
|
316
|
+
stream=True
|
|
317
|
+
)
|
|
318
|
+
for chunk in response:
|
|
319
|
+
if isinstance(chunk, (bytes, str)):
|
|
320
|
+
chunk_dict = {"chunk": chunk}
|
|
321
|
+
elif hasattr(chunk, "model_dump") and callable(chunk.model_dump):
|
|
322
|
+
chunk_dict = chunk.model_dump() # type: ignore[call-arg]
|
|
323
|
+
elif hasattr(chunk, "dict") and callable(chunk.dict):
|
|
324
|
+
chunk_dict = chunk.dict() # type: ignore[call-arg]
|
|
325
|
+
else:
|
|
326
|
+
chunk_dict = {"chunk": chunk}
|
|
327
|
+
print(f"[green]Response Chunk:[/] {chunk_dict}")
|
|
328
|
+
|
|
329
|
+
except Exception as e:
|
|
330
|
+
print(f"[red]Error: {e}[/]")
|
|
331
|
+
print("[yellow]If the issue persists, the ChutesAI service might be down or the API key generation method needs updating.[/]")
|