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,46 +1,76 @@
|
|
|
1
|
+
import re
|
|
1
2
|
import time
|
|
2
3
|
import uuid
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
import
|
|
6
|
-
from
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
from typing import Any, Dict, Generator, List, Optional, Union
|
|
5
|
+
|
|
6
|
+
from curl_cffi.const import CurlHttpVersion
|
|
7
|
+
from curl_cffi.requests import Session
|
|
8
|
+
|
|
9
|
+
from webscout.Provider.OPENAI.base import (
|
|
10
|
+
BaseChat,
|
|
11
|
+
BaseCompletions,
|
|
12
|
+
OpenAICompatibleProvider,
|
|
13
|
+
SimpleModelList,
|
|
14
|
+
)
|
|
15
|
+
from webscout.Provider.OPENAI.utils import (
|
|
16
|
+
ChatCompletion,
|
|
17
|
+
ChatCompletionChunk,
|
|
18
|
+
ChatCompletionMessage,
|
|
19
|
+
Choice,
|
|
20
|
+
ChoiceDelta,
|
|
21
|
+
CompletionUsage,
|
|
22
|
+
count_tokens,
|
|
13
23
|
)
|
|
14
24
|
|
|
15
|
-
|
|
16
|
-
from webscout.litagent import LitAgent
|
|
25
|
+
try:
|
|
26
|
+
from webscout.litagent import LitAgent
|
|
27
|
+
except ImportError:
|
|
28
|
+
LitAgent = None # type: ignore
|
|
17
29
|
|
|
18
|
-
# --- X0GPT Client ---
|
|
19
30
|
|
|
20
31
|
class Completions(BaseCompletions):
|
|
21
|
-
|
|
32
|
+
"""Completions handler for X0GPT API."""
|
|
33
|
+
|
|
34
|
+
def __init__(self, client: "X0GPT") -> None:
|
|
35
|
+
"""Initialize Completions with X0GPT client."""
|
|
22
36
|
self._client = client
|
|
23
37
|
|
|
24
38
|
def create(
|
|
25
39
|
self,
|
|
26
40
|
*,
|
|
27
41
|
model: str,
|
|
28
|
-
messages: List[Dict[str,
|
|
42
|
+
messages: List[Dict[str, Any]],
|
|
29
43
|
max_tokens: Optional[int] = 2049,
|
|
30
44
|
stream: bool = False,
|
|
31
45
|
temperature: Optional[float] = None,
|
|
32
46
|
top_p: Optional[float] = None,
|
|
33
|
-
|
|
47
|
+
timeout: Optional[int] = None,
|
|
48
|
+
proxies: Optional[Dict[str, str]] = None,
|
|
49
|
+
**kwargs: Any,
|
|
34
50
|
) -> Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]]:
|
|
35
|
-
"""
|
|
36
|
-
|
|
51
|
+
"""Create a model response for the given chat conversation.
|
|
52
|
+
|
|
37
53
|
Mimics openai.chat.completions.create
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
model: Model name to use
|
|
57
|
+
messages: List of message dictionaries
|
|
58
|
+
max_tokens: Maximum tokens to generate
|
|
59
|
+
stream: Whether to stream the response
|
|
60
|
+
temperature: Sampling temperature
|
|
61
|
+
top_p: Nucleus sampling parameter
|
|
62
|
+
timeout: Request timeout in seconds
|
|
63
|
+
proxies: Proxy configuration
|
|
64
|
+
**kwargs: Additional parameters
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
ChatCompletion or generator of ChatCompletionChunk
|
|
38
68
|
"""
|
|
39
69
|
# Prepare the payload for X0GPT API
|
|
40
|
-
payload = {
|
|
70
|
+
payload: Dict[str, Any] = {
|
|
41
71
|
"messages": messages,
|
|
42
72
|
"chatId": uuid.uuid4().hex,
|
|
43
|
-
"namespace": None
|
|
73
|
+
"namespace": None,
|
|
44
74
|
}
|
|
45
75
|
|
|
46
76
|
# Add optional parameters if provided
|
|
@@ -60,58 +90,84 @@ class Completions(BaseCompletions):
|
|
|
60
90
|
created_time = int(time.time())
|
|
61
91
|
|
|
62
92
|
if stream:
|
|
63
|
-
return self._create_stream(request_id, created_time, model, payload)
|
|
64
|
-
|
|
65
|
-
return self._create_non_stream(request_id, created_time, model, payload)
|
|
93
|
+
return self._create_stream(request_id, created_time, model, payload, timeout, proxies)
|
|
94
|
+
return self._create_non_stream(request_id, created_time, model, payload, timeout, proxies)
|
|
66
95
|
|
|
67
96
|
def _create_stream(
|
|
68
|
-
self,
|
|
97
|
+
self,
|
|
98
|
+
request_id: str,
|
|
99
|
+
created_time: int,
|
|
100
|
+
model: str,
|
|
101
|
+
payload: Dict[str, Any],
|
|
102
|
+
timeout: Optional[int] = None,
|
|
103
|
+
proxies: Optional[Dict[str, str]] = None,
|
|
69
104
|
) -> Generator[ChatCompletionChunk, None, None]:
|
|
105
|
+
"""Create a streaming response from X0GPT API.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
request_id: Unique request identifier
|
|
109
|
+
created_time: Timestamp of request creation
|
|
110
|
+
model: Model name
|
|
111
|
+
payload: Request payload
|
|
112
|
+
timeout: Request timeout
|
|
113
|
+
proxies: Proxy configuration
|
|
114
|
+
|
|
115
|
+
Yields:
|
|
116
|
+
ChatCompletionChunk objects
|
|
117
|
+
|
|
118
|
+
Raises:
|
|
119
|
+
IOError: If request fails
|
|
120
|
+
"""
|
|
70
121
|
try:
|
|
71
122
|
response = self._client.session.post(
|
|
72
123
|
self._client.api_endpoint,
|
|
73
124
|
headers=self._client.headers,
|
|
74
125
|
json=payload,
|
|
75
126
|
stream=True,
|
|
76
|
-
timeout=self._client.timeout
|
|
127
|
+
timeout=timeout if timeout is not None else self._client.timeout,
|
|
128
|
+
proxies=proxies or getattr(self._client, "proxies", None),
|
|
129
|
+
impersonate="chrome120",
|
|
130
|
+
http_version=CurlHttpVersion.V1_1,
|
|
77
131
|
)
|
|
78
132
|
|
|
79
133
|
# Handle non-200 responses
|
|
80
|
-
if
|
|
134
|
+
if response.status_code != 200:
|
|
81
135
|
raise IOError(
|
|
82
|
-
f"Failed to generate response - ({response.status_code},
|
|
136
|
+
f"Failed to generate response - ({response.status_code}, "
|
|
137
|
+
f"{response.reason}) - {response.text}"
|
|
83
138
|
)
|
|
84
139
|
|
|
85
140
|
# Track token usage across chunks
|
|
86
141
|
prompt_tokens = 0
|
|
87
142
|
completion_tokens = 0
|
|
88
|
-
total_tokens = 0
|
|
89
143
|
|
|
90
144
|
# Estimate prompt tokens based on message length
|
|
91
145
|
for msg in payload.get("messages", []):
|
|
92
|
-
prompt_tokens +=
|
|
146
|
+
prompt_tokens += count_tokens(msg.get("content", ""))
|
|
93
147
|
|
|
94
148
|
for line in response.iter_lines():
|
|
95
149
|
if line:
|
|
96
|
-
|
|
150
|
+
# Handle both bytes and string responses
|
|
151
|
+
decoded_line = (
|
|
152
|
+
line.strip() if isinstance(line, str) else line.decode("utf-8").strip()
|
|
153
|
+
)
|
|
97
154
|
|
|
98
|
-
# X0GPT uses a different format,
|
|
99
|
-
match = re.search(r'
|
|
155
|
+
# X0GPT uses a different format, extract the content
|
|
156
|
+
match = re.search(r'"([^"]*)"', decoded_line)
|
|
100
157
|
if match:
|
|
101
158
|
content = match.group(1)
|
|
102
159
|
|
|
103
|
-
# Format the content (replace escaped
|
|
160
|
+
# Format the content (replace escaped sequences)
|
|
104
161
|
content = self._client.format_text(content)
|
|
105
162
|
|
|
106
163
|
# Update token counts
|
|
107
|
-
completion_tokens +=
|
|
108
|
-
total_tokens = prompt_tokens + completion_tokens
|
|
164
|
+
completion_tokens += count_tokens(content)
|
|
109
165
|
|
|
110
166
|
# Create the delta object
|
|
111
167
|
delta = ChoiceDelta(
|
|
112
168
|
content=content,
|
|
113
169
|
role="assistant",
|
|
114
|
-
tool_calls=None
|
|
170
|
+
tool_calls=None,
|
|
115
171
|
)
|
|
116
172
|
|
|
117
173
|
# Create the choice object
|
|
@@ -119,7 +175,7 @@ class Completions(BaseCompletions):
|
|
|
119
175
|
index=0,
|
|
120
176
|
delta=delta,
|
|
121
177
|
finish_reason=None,
|
|
122
|
-
logprobs=None
|
|
178
|
+
logprobs=None,
|
|
123
179
|
)
|
|
124
180
|
|
|
125
181
|
# Create the chunk object
|
|
@@ -128,22 +184,9 @@ class Completions(BaseCompletions):
|
|
|
128
184
|
choices=[choice],
|
|
129
185
|
created=created_time,
|
|
130
186
|
model=model,
|
|
131
|
-
system_fingerprint=None
|
|
187
|
+
system_fingerprint=None,
|
|
132
188
|
)
|
|
133
189
|
|
|
134
|
-
# Convert to dict for proper formatting
|
|
135
|
-
chunk_dict = chunk.to_dict()
|
|
136
|
-
|
|
137
|
-
# Add usage information to match OpenAI format
|
|
138
|
-
usage_dict = {
|
|
139
|
-
"prompt_tokens": prompt_tokens,
|
|
140
|
-
"completion_tokens": completion_tokens,
|
|
141
|
-
"total_tokens": total_tokens,
|
|
142
|
-
"estimated_cost": None
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
chunk_dict["usage"] = usage_dict
|
|
146
|
-
|
|
147
190
|
# Return the chunk object for internal processing
|
|
148
191
|
yield chunk
|
|
149
192
|
|
|
@@ -151,14 +194,14 @@ class Completions(BaseCompletions):
|
|
|
151
194
|
delta = ChoiceDelta(
|
|
152
195
|
content=None,
|
|
153
196
|
role=None,
|
|
154
|
-
tool_calls=None
|
|
197
|
+
tool_calls=None,
|
|
155
198
|
)
|
|
156
199
|
|
|
157
200
|
choice = Choice(
|
|
158
201
|
index=0,
|
|
159
202
|
delta=delta,
|
|
160
203
|
finish_reason="stop",
|
|
161
|
-
logprobs=None
|
|
204
|
+
logprobs=None,
|
|
162
205
|
)
|
|
163
206
|
|
|
164
207
|
chunk = ChatCompletionChunk(
|
|
@@ -166,80 +209,94 @@ class Completions(BaseCompletions):
|
|
|
166
209
|
choices=[choice],
|
|
167
210
|
created=created_time,
|
|
168
211
|
model=model,
|
|
169
|
-
system_fingerprint=None
|
|
212
|
+
system_fingerprint=None,
|
|
170
213
|
)
|
|
171
214
|
|
|
172
|
-
chunk_dict = chunk.to_dict()
|
|
173
|
-
chunk_dict["usage"] = {
|
|
174
|
-
"prompt_tokens": prompt_tokens,
|
|
175
|
-
"completion_tokens": completion_tokens,
|
|
176
|
-
"total_tokens": total_tokens,
|
|
177
|
-
"estimated_cost": None
|
|
178
|
-
}
|
|
179
|
-
|
|
180
215
|
yield chunk
|
|
181
216
|
|
|
182
217
|
except Exception as e:
|
|
183
|
-
print(f"Error during X0GPT stream request: {e}")
|
|
184
218
|
raise IOError(f"X0GPT request failed: {e}") from e
|
|
185
219
|
|
|
186
220
|
def _create_non_stream(
|
|
187
|
-
self,
|
|
221
|
+
self,
|
|
222
|
+
request_id: str,
|
|
223
|
+
created_time: int,
|
|
224
|
+
model: str,
|
|
225
|
+
payload: Dict[str, Any],
|
|
226
|
+
timeout: Optional[int] = None,
|
|
227
|
+
proxies: Optional[Dict[str, str]] = None,
|
|
188
228
|
) -> ChatCompletion:
|
|
229
|
+
"""Create a non-streaming response from X0GPT API.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
request_id: Unique request identifier
|
|
233
|
+
created_time: Timestamp of request creation
|
|
234
|
+
model: Model name
|
|
235
|
+
payload: Request payload
|
|
236
|
+
timeout: Request timeout
|
|
237
|
+
proxies: Proxy configuration
|
|
238
|
+
|
|
239
|
+
Returns:
|
|
240
|
+
ChatCompletion object
|
|
241
|
+
|
|
242
|
+
Raises:
|
|
243
|
+
IOError: If request fails
|
|
244
|
+
"""
|
|
189
245
|
try:
|
|
190
|
-
# For non-streaming, we still use streaming internally
|
|
246
|
+
# For non-streaming, we still use streaming internally
|
|
191
247
|
response = self._client.session.post(
|
|
192
248
|
self._client.api_endpoint,
|
|
193
249
|
headers=self._client.headers,
|
|
194
250
|
json=payload,
|
|
195
251
|
stream=True,
|
|
196
|
-
timeout=self._client.timeout
|
|
252
|
+
timeout=timeout if timeout is not None else self._client.timeout,
|
|
253
|
+
proxies=proxies or getattr(self._client, "proxies", None),
|
|
254
|
+
impersonate="chrome120",
|
|
255
|
+
http_version=CurlHttpVersion.V1_1,
|
|
197
256
|
)
|
|
198
257
|
|
|
199
258
|
# Handle non-200 responses
|
|
200
|
-
if
|
|
259
|
+
if response.status_code != 200:
|
|
201
260
|
raise IOError(
|
|
202
|
-
f"Failed to generate response - ({response.status_code},
|
|
261
|
+
f"Failed to generate response - ({response.status_code}, "
|
|
262
|
+
f"{response.reason}) - {response.text}"
|
|
203
263
|
)
|
|
204
264
|
|
|
205
265
|
# Collect the full response
|
|
206
266
|
full_text = ""
|
|
207
|
-
for line in response.iter_lines(
|
|
267
|
+
for line in response.iter_lines():
|
|
208
268
|
if line:
|
|
209
|
-
|
|
269
|
+
# Handle both bytes and string responses
|
|
270
|
+
decoded_line = (
|
|
271
|
+
line.strip() if isinstance(line, str) else line.decode("utf-8").strip()
|
|
272
|
+
)
|
|
273
|
+
match = re.search(r'"([^"]*)"', decoded_line)
|
|
210
274
|
if match:
|
|
211
275
|
content = match.group(1)
|
|
212
276
|
full_text += content
|
|
213
277
|
|
|
214
|
-
# Format the text (replace escaped
|
|
278
|
+
# Format the text (replace escaped sequences)
|
|
215
279
|
full_text = self._client.format_text(full_text)
|
|
216
280
|
|
|
217
281
|
# Estimate token counts
|
|
218
282
|
prompt_tokens = 0
|
|
219
283
|
for msg in payload.get("messages", []):
|
|
220
|
-
prompt_tokens +=
|
|
284
|
+
prompt_tokens += count_tokens(msg.get("content", ""))
|
|
221
285
|
|
|
222
|
-
completion_tokens =
|
|
286
|
+
completion_tokens = count_tokens(full_text)
|
|
223
287
|
total_tokens = prompt_tokens + completion_tokens
|
|
224
288
|
|
|
225
289
|
# Create the message object
|
|
226
|
-
message = ChatCompletionMessage(
|
|
227
|
-
role="assistant",
|
|
228
|
-
content=full_text
|
|
229
|
-
)
|
|
290
|
+
message = ChatCompletionMessage(role="assistant", content=full_text)
|
|
230
291
|
|
|
231
292
|
# Create the choice object
|
|
232
|
-
choice = Choice(
|
|
233
|
-
index=0,
|
|
234
|
-
message=message,
|
|
235
|
-
finish_reason="stop"
|
|
236
|
-
)
|
|
293
|
+
choice = Choice(index=0, message=message, finish_reason="stop")
|
|
237
294
|
|
|
238
295
|
# Create the usage object
|
|
239
296
|
usage = CompletionUsage(
|
|
240
297
|
prompt_tokens=prompt_tokens,
|
|
241
298
|
completion_tokens=completion_tokens,
|
|
242
|
-
total_tokens=total_tokens
|
|
299
|
+
total_tokens=total_tokens,
|
|
243
300
|
)
|
|
244
301
|
|
|
245
302
|
# Create the completion object
|
|
@@ -254,34 +311,33 @@ class Completions(BaseCompletions):
|
|
|
254
311
|
return completion
|
|
255
312
|
|
|
256
313
|
except Exception as e:
|
|
257
|
-
print(f"Error during X0GPT non-stream request: {e}")
|
|
258
314
|
raise IOError(f"X0GPT request failed: {e}") from e
|
|
259
315
|
|
|
316
|
+
|
|
260
317
|
class Chat(BaseChat):
|
|
261
|
-
|
|
318
|
+
"""Chat handler for X0GPT API."""
|
|
319
|
+
|
|
320
|
+
def __init__(self, client: "X0GPT") -> None:
|
|
321
|
+
"""Initialize Chat with X0GPT client."""
|
|
262
322
|
self.completions = Completions(client)
|
|
263
323
|
|
|
324
|
+
|
|
264
325
|
class X0GPT(OpenAICompatibleProvider):
|
|
265
|
-
"""
|
|
266
|
-
OpenAI-compatible client for X0GPT API.
|
|
326
|
+
"""OpenAI-compatible client for X0GPT API.
|
|
267
327
|
|
|
268
328
|
Usage:
|
|
269
329
|
client = X0GPT()
|
|
270
330
|
response = client.chat.completions.create(
|
|
271
|
-
model="
|
|
331
|
+
model="X0GPT",
|
|
272
332
|
messages=[{"role": "user", "content": "Hello!"}]
|
|
273
333
|
)
|
|
274
334
|
"""
|
|
275
335
|
|
|
276
|
-
|
|
336
|
+
required_auth = False
|
|
337
|
+
AVAILABLE_MODELS = ["X0GPT"]
|
|
277
338
|
|
|
278
|
-
def __init__(
|
|
279
|
-
|
|
280
|
-
timeout: Optional[int] = None,
|
|
281
|
-
browser: str = "chrome"
|
|
282
|
-
):
|
|
283
|
-
"""
|
|
284
|
-
Initialize the X0GPT client.
|
|
339
|
+
def __init__(self, timeout: Optional[int] = None, browser: str = "chrome") -> None:
|
|
340
|
+
"""Initialize the X0GPT client.
|
|
285
341
|
|
|
286
342
|
Args:
|
|
287
343
|
timeout: Request timeout in seconds (None for no timeout)
|
|
@@ -289,39 +345,67 @@ class X0GPT(OpenAICompatibleProvider):
|
|
|
289
345
|
"""
|
|
290
346
|
self.timeout = timeout
|
|
291
347
|
self.api_endpoint = "https://x0-gpt.devwtf.in/api/stream/reply"
|
|
292
|
-
self.session =
|
|
348
|
+
self.session: Session = Session()
|
|
293
349
|
|
|
294
|
-
# Initialize
|
|
295
|
-
|
|
296
|
-
self.fingerprint = agent.generate_fingerprint(browser)
|
|
350
|
+
# Initialize user agent
|
|
351
|
+
user_agent = self._get_user_agent(browser)
|
|
297
352
|
|
|
298
|
-
self.headers = {
|
|
353
|
+
self.headers: Dict[str, str] = {
|
|
299
354
|
"authority": "x0-gpt.devwtf.in",
|
|
300
355
|
"method": "POST",
|
|
301
356
|
"path": "/api/stream/reply",
|
|
302
357
|
"scheme": "https",
|
|
303
|
-
"accept":
|
|
358
|
+
"accept": "*/*",
|
|
304
359
|
"accept-encoding": "gzip, deflate, br, zstd",
|
|
305
|
-
"accept-language":
|
|
360
|
+
"accept-language": "en-US,en;q=0.9,en-IN;q=0.8",
|
|
306
361
|
"content-type": "application/json",
|
|
307
362
|
"dnt": "1",
|
|
308
363
|
"origin": "https://x0-gpt.devwtf.in",
|
|
309
|
-
"priority": "u=1, i",
|
|
310
364
|
"referer": "https://x0-gpt.devwtf.in/chat",
|
|
311
|
-
"sec-ch-ua":
|
|
365
|
+
"sec-ch-ua": ('"Not)A;Brand";v="99", "Microsoft Edge";v="127", "Chromium";v="127"'),
|
|
312
366
|
"sec-ch-ua-mobile": "?0",
|
|
313
|
-
"sec-ch-ua-platform":
|
|
314
|
-
"user-agent":
|
|
367
|
+
"sec-ch-ua-platform": '"Windows"',
|
|
368
|
+
"user-agent": user_agent,
|
|
315
369
|
}
|
|
316
370
|
|
|
317
371
|
self.session.headers.update(self.headers)
|
|
318
372
|
|
|
319
373
|
# Initialize the chat interface
|
|
320
|
-
self.chat = Chat(self)
|
|
374
|
+
self.chat: Chat = Chat(self)
|
|
321
375
|
|
|
322
|
-
|
|
376
|
+
@staticmethod
|
|
377
|
+
def _get_user_agent(browser: str) -> str:
|
|
378
|
+
"""Get a user agent string, with fallback if LitAgent unavailable.
|
|
379
|
+
|
|
380
|
+
Args:
|
|
381
|
+
browser: Browser to emulate
|
|
382
|
+
|
|
383
|
+
Returns:
|
|
384
|
+
User agent string
|
|
323
385
|
"""
|
|
324
|
-
|
|
386
|
+
if LitAgent is not None:
|
|
387
|
+
try:
|
|
388
|
+
agent = LitAgent()
|
|
389
|
+
fingerprint = agent.generate_fingerprint(browser)
|
|
390
|
+
return fingerprint.get("user_agent", X0GPT._default_user_agent())
|
|
391
|
+
except Exception:
|
|
392
|
+
return X0GPT._default_user_agent()
|
|
393
|
+
return X0GPT._default_user_agent()
|
|
394
|
+
|
|
395
|
+
@staticmethod
|
|
396
|
+
def _default_user_agent() -> str:
|
|
397
|
+
"""Return a default user agent string.
|
|
398
|
+
|
|
399
|
+
Returns:
|
|
400
|
+
Default user agent
|
|
401
|
+
"""
|
|
402
|
+
return (
|
|
403
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
|
|
404
|
+
"(KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
def format_text(self, text: str) -> str:
|
|
408
|
+
"""Format text by replacing escaped sequences with actual characters.
|
|
325
409
|
|
|
326
410
|
Args:
|
|
327
411
|
text: Text to format
|
|
@@ -329,37 +413,20 @@ class X0GPT(OpenAICompatibleProvider):
|
|
|
329
413
|
Returns:
|
|
330
414
|
Formatted text
|
|
331
415
|
"""
|
|
332
|
-
# Use a more comprehensive approach to handle all escape sequences
|
|
333
416
|
try:
|
|
334
|
-
#
|
|
335
|
-
text = text.replace(
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
text = text.replace('\\n', '\n')
|
|
339
|
-
text = text.replace('\\r', '\r')
|
|
340
|
-
text = text.replace('\\t', '\t')
|
|
417
|
+
# Replace common escape sequences
|
|
418
|
+
text = text.replace("\\n", "\n")
|
|
419
|
+
text = text.replace("\\r", "\r")
|
|
420
|
+
text = text.replace("\\t", "\t")
|
|
341
421
|
text = text.replace('\\"', '"')
|
|
342
|
-
text = text.replace("
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
# This is a fallback in case there are other escape sequences
|
|
346
|
-
try:
|
|
347
|
-
# Add quotes to make it a valid JSON string
|
|
348
|
-
json_str = f'"{text}"'
|
|
349
|
-
# Use json module to decode all escape sequences
|
|
350
|
-
decoded = json.loads(json_str)
|
|
351
|
-
return decoded
|
|
352
|
-
except json.JSONDecodeError:
|
|
353
|
-
# If JSON decoding fails, return the text with the replacements we've already done
|
|
354
|
-
return text
|
|
355
|
-
except Exception as e:
|
|
422
|
+
text = text.replace("\\\\", "\\")
|
|
423
|
+
return text
|
|
424
|
+
except Exception:
|
|
356
425
|
# If any error occurs, return the original text
|
|
357
|
-
print(f"Warning: Error formatting text: {e}")
|
|
358
426
|
return text
|
|
359
427
|
|
|
360
428
|
def convert_model_name(self, model: str) -> str:
|
|
361
|
-
"""
|
|
362
|
-
Convert model names to ones supported by X0GPT.
|
|
429
|
+
"""Convert model names to ones supported by X0GPT.
|
|
363
430
|
|
|
364
431
|
Args:
|
|
365
432
|
model: Model name to convert
|
|
@@ -367,5 +434,29 @@ class X0GPT(OpenAICompatibleProvider):
|
|
|
367
434
|
Returns:
|
|
368
435
|
X0GPT model name
|
|
369
436
|
"""
|
|
370
|
-
# X0GPT doesn't
|
|
437
|
+
# X0GPT doesn't use model names, but keep for compatibility
|
|
371
438
|
return model
|
|
439
|
+
|
|
440
|
+
@property
|
|
441
|
+
def models(self) -> SimpleModelList:
|
|
442
|
+
"""Get available models.
|
|
443
|
+
|
|
444
|
+
Returns:
|
|
445
|
+
SimpleModelList of available models
|
|
446
|
+
"""
|
|
447
|
+
return SimpleModelList(type(self).AVAILABLE_MODELS)
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
if __name__ == "__main__":
|
|
451
|
+
# Test the provider
|
|
452
|
+
client = X0GPT()
|
|
453
|
+
response = client.chat.completions.create(
|
|
454
|
+
model="X0GPT",
|
|
455
|
+
messages=[
|
|
456
|
+
{"role": "system", "content": "You are a helpful assistant."},
|
|
457
|
+
{"role": "user", "content": "Hello! How are you today?"},
|
|
458
|
+
],
|
|
459
|
+
)
|
|
460
|
+
if not isinstance(response, Generator):
|
|
461
|
+
message = response.choices[0].message if response.choices else None
|
|
462
|
+
print(message.content if message else "")
|