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,106 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<h1>🔍 Webscout AI Search Providers</h1>
|
|
3
|
+
<p><strong>Powerful AI-powered search capabilities with multiple provider support</strong></p>
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
> [!NOTE]
|
|
7
|
+
> AI Search Providers leverage advanced language models and search algorithms to deliver high-quality, context-aware responses with web search integration.
|
|
8
|
+
|
|
9
|
+
## ✨ Features
|
|
10
|
+
|
|
11
|
+
- **Multiple Search Providers**: Support for 6 specialized AI search services
|
|
12
|
+
- **Streaming Responses**: Real-time streaming of AI-generated responses
|
|
13
|
+
- **Raw Response Format**: Access to raw response data when needed
|
|
14
|
+
- **Automatic Text Handling**: Smart response formatting and cleaning
|
|
15
|
+
- **Robust Error Handling**: Comprehensive error management
|
|
16
|
+
- **Cross-Platform Compatibility**: Works seamlessly across different environments
|
|
17
|
+
|
|
18
|
+
## 📦 Supported Search Providers
|
|
19
|
+
|
|
20
|
+
| Provider | Description | Key Features |
|
|
21
|
+
|----------|-------------|-------------|
|
|
22
|
+
| **PERPLEXED** | Resilient AI search | High availability, clean formatting |
|
|
23
|
+
| **Perplexity** | Advanced AI search & chat | Multiple modes, model selection, source control |
|
|
24
|
+
| **IAsk** | Multi-mode research | Academic, Question, Fast modes, detail levels |
|
|
25
|
+
| **Monica** | Comprehensive AI search | Clean formatted responses, web integration |
|
|
26
|
+
| **BraveAI** | Privacy-focused AI search | Fast, accurate, web-integrated responses |
|
|
27
|
+
| **WebPilotAI** | Web-integrated analysis | Content extraction, source references |
|
|
28
|
+
| **Stellar** | Agentic AI search | Next.js powered, deep search capabilities (Quota limited) |
|
|
29
|
+
|
|
30
|
+
## 🚀 Installation
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pip install -U webscout
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 💻 Quick Start Guide
|
|
37
|
+
|
|
38
|
+
### Basic Usage Pattern
|
|
39
|
+
|
|
40
|
+
All AI Search providers follow a consistent usage pattern:
|
|
41
|
+
|
|
42
|
+
```python
|
|
43
|
+
from webscout.Provider.AISEARCH import PERPLEXED
|
|
44
|
+
|
|
45
|
+
# Initialize the provider
|
|
46
|
+
ai = PERPLEXED()
|
|
47
|
+
|
|
48
|
+
# Basic search
|
|
49
|
+
response = ai.search("Your query here")
|
|
50
|
+
print(response) # Automatically formats the response
|
|
51
|
+
|
|
52
|
+
# Streaming search
|
|
53
|
+
for chunk in ai.search("Your query here", stream=True):
|
|
54
|
+
print(chunk, end="", flush=True) # Print response as it arrives
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Provider Examples
|
|
58
|
+
|
|
59
|
+
<details>
|
|
60
|
+
<summary><strong>Perplexity Example</strong></summary>
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
from webscout.Provider.AISEARCH import Perplexity
|
|
64
|
+
|
|
65
|
+
ai = Perplexity()
|
|
66
|
+
|
|
67
|
+
# Basic search (auto mode)
|
|
68
|
+
response = ai.search("What is the weather in London?")
|
|
69
|
+
print(response)
|
|
70
|
+
|
|
71
|
+
# Streaming search
|
|
72
|
+
for chunk in ai.search("Explain black holes", stream=True):
|
|
73
|
+
print(chunk, end="", flush=True)
|
|
74
|
+
```
|
|
75
|
+
</details>
|
|
76
|
+
|
|
77
|
+
<details>
|
|
78
|
+
<summary><strong>IAsk Example</strong></summary>
|
|
79
|
+
|
|
80
|
+
```python
|
|
81
|
+
from webscout.Provider.AISEARCH import IAsk
|
|
82
|
+
|
|
83
|
+
# Initialize with academic mode
|
|
84
|
+
ai = IAsk(mode="academic")
|
|
85
|
+
|
|
86
|
+
response = ai.search("Recent developments in mRNA vaccines")
|
|
87
|
+
print(response)
|
|
88
|
+
```
|
|
89
|
+
</details>
|
|
90
|
+
|
|
91
|
+
## 🛡️ Error Handling
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
from webscout import exceptions
|
|
95
|
+
|
|
96
|
+
try:
|
|
97
|
+
response = ai.search("Your query")
|
|
98
|
+
except exceptions.APIConnectionError as e:
|
|
99
|
+
print(f"API error: {e}")
|
|
100
|
+
except exceptions.FailedToGenerateResponseError as e:
|
|
101
|
+
print(f"Generation error: {e}")
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 🤝 Contributing
|
|
105
|
+
|
|
106
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
from .
|
|
2
|
-
from .
|
|
3
|
-
from .
|
|
4
|
-
from .
|
|
5
|
-
from .
|
|
6
|
-
from .webpilotai_search import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
from webscout.Provider.AISEARCH.brave_search import BraveAI
|
|
2
|
+
from webscout.Provider.AISEARCH.iask_search import IAsk
|
|
3
|
+
from webscout.Provider.AISEARCH.monica_search import Monica
|
|
4
|
+
from webscout.Provider.AISEARCH.PERPLEXED_search import PERPLEXED
|
|
5
|
+
from webscout.Provider.AISEARCH.Perplexity import Perplexity
|
|
6
|
+
from webscout.Provider.AISEARCH.webpilotai_search import webpilotai
|
|
7
|
+
|
|
8
|
+
# List of all exported names
|
|
9
|
+
__all__ = [
|
|
10
|
+
"PERPLEXED",
|
|
11
|
+
"Perplexity",
|
|
12
|
+
"IAsk",
|
|
13
|
+
"Monica",
|
|
14
|
+
"webpilotai",
|
|
15
|
+
"BraveAI",
|
|
16
|
+
]
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import base64
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
from typing import Any, AsyncIterator, Dict, Generator, List, Optional, Union, cast
|
|
6
|
+
from urllib.parse import quote
|
|
7
|
+
|
|
8
|
+
from curl_cffi.requests import AsyncSession
|
|
9
|
+
|
|
10
|
+
from webscout import exceptions
|
|
11
|
+
from webscout.AIbase import AISearch, SearchResponse
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class BraveAI(AISearch):
|
|
15
|
+
"""
|
|
16
|
+
A class to interact with Brave Search AI Chat.
|
|
17
|
+
|
|
18
|
+
BraveAI provides AI-generated responses based on web search results.
|
|
19
|
+
It supports both streaming and non-streaming responses.
|
|
20
|
+
|
|
21
|
+
Basic Usage:
|
|
22
|
+
>>> from webscout.Provider.AISEARCH import BraveAI
|
|
23
|
+
>>> ai = BraveAI()
|
|
24
|
+
>>> response = ai.search("What is Python?")
|
|
25
|
+
>>> print(response)
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
timeout (int, optional): Request timeout in seconds. Defaults to 30.
|
|
29
|
+
proxies (dict, optional): Proxy configuration for requests. Defaults to None.
|
|
30
|
+
language (str, optional): Language for the search. Defaults to "en".
|
|
31
|
+
country (str, optional): Country code for localization. Defaults to "US".
|
|
32
|
+
ui_lang (str, optional): UI language. Defaults to "en-us".
|
|
33
|
+
geoloc (str, optional): Geolocation coordinates. Defaults to None.
|
|
34
|
+
"""
|
|
35
|
+
BASE_URL = "https://search.brave.com/api/tap/v1"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def __init__(
|
|
39
|
+
self,
|
|
40
|
+
timeout: int = 30,
|
|
41
|
+
proxies: Optional[dict] = None,
|
|
42
|
+
language: str = "en",
|
|
43
|
+
country: str = "US",
|
|
44
|
+
ui_lang: str = "en-us",
|
|
45
|
+
geoloc: Optional[str] = None,
|
|
46
|
+
):
|
|
47
|
+
self.timeout = timeout
|
|
48
|
+
self.proxies = proxies or {}
|
|
49
|
+
self.language = language
|
|
50
|
+
self.country = country
|
|
51
|
+
self.ui_lang = ui_lang
|
|
52
|
+
self.geoloc = geoloc
|
|
53
|
+
self.last_response = {}
|
|
54
|
+
self.chat_id = None
|
|
55
|
+
self.symmetric_key = None
|
|
56
|
+
self.headers = {
|
|
57
|
+
"accept": "application/json",
|
|
58
|
+
"accept-language": "en-US,en;q=0.9",
|
|
59
|
+
"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",
|
|
60
|
+
"sec-ch-ua": '"Chromium";v="127", "Not)A;Brand";v="99"',
|
|
61
|
+
"sec-ch-ua-mobile": "?0",
|
|
62
|
+
"sec-ch-ua-platform": '"Windows"',
|
|
63
|
+
"sec-fetch-dest": "empty",
|
|
64
|
+
"sec-fetch-mode": "cors",
|
|
65
|
+
"sec-fetch-site": "same-origin",
|
|
66
|
+
"referer": "https://search.brave.com/ask"
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
def _generate_key_b64(self) -> str:
|
|
70
|
+
"""Generates a 256-bit AES-GCM key in JWK format, base64 encoded."""
|
|
71
|
+
key = os.urandom(32)
|
|
72
|
+
k = base64.urlsafe_b64encode(key).decode().rstrip("=")
|
|
73
|
+
jwk = {
|
|
74
|
+
"alg": "A256GCM",
|
|
75
|
+
"ext": True,
|
|
76
|
+
"k": k,
|
|
77
|
+
"key_ops": ["encrypt", "decrypt"],
|
|
78
|
+
"kty": "oct"
|
|
79
|
+
}
|
|
80
|
+
return base64.b64encode(json.dumps(jwk, separators=(',', ':')).encode()).decode()
|
|
81
|
+
|
|
82
|
+
def search(
|
|
83
|
+
self,
|
|
84
|
+
prompt: str,
|
|
85
|
+
stream: bool = False,
|
|
86
|
+
raw: bool = False,
|
|
87
|
+
enable_research: bool = False,
|
|
88
|
+
**kwargs: Any,
|
|
89
|
+
) -> Union[SearchResponse, Generator[Union[Dict[str, str], SearchResponse], None, None]]:
|
|
90
|
+
"""Search using the Brave Search AI and get AI-generated responses.
|
|
91
|
+
|
|
92
|
+
This method sends a search query to Brave AI and returns the AI-generated response.
|
|
93
|
+
It supports both streaming and non-streaming modes, as well as raw response format.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
prompt (str): The search query or prompt to send to the API.
|
|
97
|
+
stream (bool, optional): If True, yields response chunks as they arrive.
|
|
98
|
+
If False, returns complete response. Defaults to False.
|
|
99
|
+
raw (bool, optional): If True, returns raw response dictionaries with 'text' key.
|
|
100
|
+
If False, returns Response objects that convert to text automatically.
|
|
101
|
+
Defaults to False.
|
|
102
|
+
enable_research (bool, optional): If True, enables deep research mode for more comprehensive responses.
|
|
103
|
+
Defaults to False.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
Union[Response, Generator[Union[Dict[str, str], Response], None, None]]:
|
|
107
|
+
- If stream=False: Returns complete response as Response object
|
|
108
|
+
- If stream=True: Yields response chunks as either Dict or Response objects
|
|
109
|
+
|
|
110
|
+
Raises:
|
|
111
|
+
APIConnectionError: If the API request fails
|
|
112
|
+
|
|
113
|
+
Examples:
|
|
114
|
+
Basic search:
|
|
115
|
+
>>> ai = BraveAI()
|
|
116
|
+
>>> response = ai.search("What is Python?")
|
|
117
|
+
>>> print(response)
|
|
118
|
+
|
|
119
|
+
Research-enabled search:
|
|
120
|
+
>>> response = ai.search("What is Python?", enable_research=True)
|
|
121
|
+
>>> print(response)
|
|
122
|
+
|
|
123
|
+
Streaming response:
|
|
124
|
+
>>> for chunk in ai.search("Tell me about AI", stream=True):
|
|
125
|
+
... print(chunk, end="")
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
if not stream:
|
|
129
|
+
loop = asyncio.new_event_loop()
|
|
130
|
+
asyncio.set_event_loop(loop)
|
|
131
|
+
try:
|
|
132
|
+
result = loop.run_until_complete(
|
|
133
|
+
self._async_search(prompt, False, raw, enable_research)
|
|
134
|
+
)
|
|
135
|
+
return cast(Union[SearchResponse, Generator[Union[Dict[str, str], SearchResponse], None, None]], result)
|
|
136
|
+
finally:
|
|
137
|
+
loop.close()
|
|
138
|
+
|
|
139
|
+
buffer = ""
|
|
140
|
+
|
|
141
|
+
def sync_generator():
|
|
142
|
+
nonlocal buffer
|
|
143
|
+
loop = asyncio.new_event_loop()
|
|
144
|
+
asyncio.set_event_loop(loop)
|
|
145
|
+
try:
|
|
146
|
+
async_gen = loop.run_until_complete(self._async_search(prompt, True, raw, enable_research))
|
|
147
|
+
if hasattr(async_gen, "__anext__"):
|
|
148
|
+
async_iterator = cast(AsyncIterator, async_gen)
|
|
149
|
+
while True:
|
|
150
|
+
try:
|
|
151
|
+
chunk = loop.run_until_complete(async_iterator.__anext__())
|
|
152
|
+
if isinstance(chunk, dict) and "text" in chunk:
|
|
153
|
+
buffer += chunk["text"]
|
|
154
|
+
elif isinstance(chunk, SearchResponse):
|
|
155
|
+
buffer += chunk.text
|
|
156
|
+
yield chunk
|
|
157
|
+
except StopAsyncIteration:
|
|
158
|
+
break
|
|
159
|
+
elif isinstance(async_gen, SearchResponse):
|
|
160
|
+
yield async_gen
|
|
161
|
+
finally:
|
|
162
|
+
self.last_response = {"text": buffer}
|
|
163
|
+
loop.close()
|
|
164
|
+
|
|
165
|
+
return cast(Union[SearchResponse, Generator[Union[Dict[str, str], SearchResponse], None, None]], sync_generator())
|
|
166
|
+
|
|
167
|
+
async def _async_search(
|
|
168
|
+
self,
|
|
169
|
+
prompt: str,
|
|
170
|
+
stream: bool = False,
|
|
171
|
+
raw: bool = False,
|
|
172
|
+
enable_research: bool = False,
|
|
173
|
+
) -> Union[
|
|
174
|
+
SearchResponse,
|
|
175
|
+
str,
|
|
176
|
+
AsyncIterator[Union[Dict[str, str], SearchResponse]],
|
|
177
|
+
]:
|
|
178
|
+
"""Internal async implementation of the search method."""
|
|
179
|
+
|
|
180
|
+
session = AsyncSession()
|
|
181
|
+
try:
|
|
182
|
+
session.headers.update(self.headers)
|
|
183
|
+
if self.proxies:
|
|
184
|
+
session.proxies.update(self.proxies)
|
|
185
|
+
|
|
186
|
+
# Initialize new chat if needed
|
|
187
|
+
if not self.chat_id or not self.symmetric_key:
|
|
188
|
+
key_b64 = self._generate_key_b64()
|
|
189
|
+
params = {
|
|
190
|
+
"language": self.language,
|
|
191
|
+
"country": self.country,
|
|
192
|
+
"ui_lang": self.ui_lang,
|
|
193
|
+
"symmetric_key": key_b64,
|
|
194
|
+
"source": "home" if enable_research else "llmSuggest",
|
|
195
|
+
"query": prompt,
|
|
196
|
+
"enable_research": "true" if enable_research else "false",
|
|
197
|
+
}
|
|
198
|
+
if self.geoloc:
|
|
199
|
+
params["geoloc"] = self.geoloc
|
|
200
|
+
response = await session.get(
|
|
201
|
+
f"{self.BASE_URL}/new",
|
|
202
|
+
params=params,
|
|
203
|
+
timeout=self.timeout,
|
|
204
|
+
impersonate="chrome110"
|
|
205
|
+
)
|
|
206
|
+
if response.status_code != 200:
|
|
207
|
+
raise exceptions.FailedToGenerateResponseError(f"Failed to create new chat: {response.text}")
|
|
208
|
+
|
|
209
|
+
data = response.json()
|
|
210
|
+
self.chat_id = data.get("id")
|
|
211
|
+
self.symmetric_key = key_b64
|
|
212
|
+
|
|
213
|
+
params = {
|
|
214
|
+
"id": self.chat_id,
|
|
215
|
+
"query": prompt,
|
|
216
|
+
"symmetric_key": self.symmetric_key,
|
|
217
|
+
"language": self.language,
|
|
218
|
+
"country": self.country,
|
|
219
|
+
"ui_lang": self.ui_lang,
|
|
220
|
+
"enable_research": "true" if enable_research else "false",
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
ref = f"https://search.brave.com/ask?q={quote(prompt)}&conversation={self.chat_id}"
|
|
224
|
+
headers = {"referer": ref}
|
|
225
|
+
|
|
226
|
+
if not stream:
|
|
227
|
+
full_text = ""
|
|
228
|
+
response = await session.get(
|
|
229
|
+
f"{self.BASE_URL}/stream",
|
|
230
|
+
params={**params, "enable_followups": "true" if enable_research else "false"},
|
|
231
|
+
headers=headers,
|
|
232
|
+
stream=True,
|
|
233
|
+
timeout=self.timeout,
|
|
234
|
+
impersonate="chrome110"
|
|
235
|
+
)
|
|
236
|
+
response.raise_for_status()
|
|
237
|
+
|
|
238
|
+
async for line in response.aiter_lines():
|
|
239
|
+
if not line:
|
|
240
|
+
continue
|
|
241
|
+
try:
|
|
242
|
+
j = json.loads(line)
|
|
243
|
+
if j.get("type") == "text_delta":
|
|
244
|
+
full_text += j.get("delta", "")
|
|
245
|
+
except json.JSONDecodeError:
|
|
246
|
+
continue
|
|
247
|
+
|
|
248
|
+
self.last_response = SearchResponse(full_text)
|
|
249
|
+
return full_text if raw else self.last_response
|
|
250
|
+
|
|
251
|
+
async def process_stream():
|
|
252
|
+
buffer = ""
|
|
253
|
+
try:
|
|
254
|
+
response = await session.get(
|
|
255
|
+
f"{self.BASE_URL}/stream",
|
|
256
|
+
params=params,
|
|
257
|
+
headers=headers,
|
|
258
|
+
stream=True,
|
|
259
|
+
timeout=self.timeout,
|
|
260
|
+
impersonate="chrome110"
|
|
261
|
+
)
|
|
262
|
+
response.raise_for_status()
|
|
263
|
+
|
|
264
|
+
async for line in response.aiter_lines():
|
|
265
|
+
if not line:
|
|
266
|
+
continue
|
|
267
|
+
try:
|
|
268
|
+
j = json.loads(line)
|
|
269
|
+
t = j.get("type")
|
|
270
|
+
if t == "text_delta":
|
|
271
|
+
delta = j.get("delta", "")
|
|
272
|
+
buffer += delta
|
|
273
|
+
if raw:
|
|
274
|
+
yield j
|
|
275
|
+
else:
|
|
276
|
+
yield SearchResponse(delta)
|
|
277
|
+
except json.JSONDecodeError:
|
|
278
|
+
continue
|
|
279
|
+
self.last_response = SearchResponse(buffer)
|
|
280
|
+
finally:
|
|
281
|
+
await session.close()
|
|
282
|
+
|
|
283
|
+
return process_stream()
|
|
284
|
+
except Exception:
|
|
285
|
+
if not stream:
|
|
286
|
+
await session.close()
|
|
287
|
+
raise
|
|
288
|
+
|
|
289
|
+
if __name__ == "__main__":
|
|
290
|
+
ai = BraveAI()
|
|
291
|
+
res = ai.search("What is Python?", stream=True, enable_research=False)
|
|
292
|
+
from collections.abc import Iterable
|
|
293
|
+
|
|
294
|
+
if isinstance(res, Iterable):
|
|
295
|
+
for chunk in res:
|
|
296
|
+
print(chunk, end="", flush=True)
|
|
297
|
+
else:
|
|
298
|
+
print(res)
|