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,64 +1,17 @@
|
|
|
1
|
-
import aiohttp
|
|
2
1
|
import asyncio
|
|
3
|
-
import lxml.html
|
|
4
2
|
import re
|
|
5
3
|
import urllib.parse
|
|
6
|
-
from
|
|
7
|
-
|
|
4
|
+
from typing import Any, AsyncIterator, Dict, Generator, Literal, Optional, Union, cast
|
|
5
|
+
|
|
6
|
+
import lxml.html
|
|
7
|
+
from curl_cffi.requests import AsyncSession
|
|
8
8
|
|
|
9
|
-
from webscout.AIbase import AISearch
|
|
10
9
|
from webscout import exceptions
|
|
10
|
+
from webscout.AIbase import AISearch, SearchResponse
|
|
11
|
+
from webscout.litagent import LitAgent
|
|
11
12
|
from webscout.scout import Scout
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
class Response:
|
|
15
|
-
"""A wrapper class for IAsk API responses.
|
|
16
|
-
|
|
17
|
-
This class automatically converts response objects to their text representation
|
|
18
|
-
when printed or converted to string.
|
|
19
|
-
|
|
20
|
-
Attributes:
|
|
21
|
-
text (str): The text content of the response
|
|
22
|
-
|
|
23
|
-
Example:
|
|
24
|
-
>>> response = Response("Hello, world!")
|
|
25
|
-
>>> print(response)
|
|
26
|
-
Hello, world!
|
|
27
|
-
>>> str(response)
|
|
28
|
-
'Hello, world!'
|
|
29
|
-
"""
|
|
30
|
-
def __init__(self, text: str):
|
|
31
|
-
self.text = text
|
|
32
|
-
|
|
33
|
-
def __str__(self):
|
|
34
|
-
return self.text
|
|
35
|
-
|
|
36
|
-
def __repr__(self):
|
|
37
|
-
return self.text
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def cache_find(diff: Union[dict, list]) -> Optional[str]:
|
|
41
|
-
"""Find HTML content in a nested dictionary or list structure.
|
|
42
|
-
|
|
43
|
-
Args:
|
|
44
|
-
diff (Union[dict, list]): The nested structure to search
|
|
45
|
-
|
|
46
|
-
Returns:
|
|
47
|
-
Optional[str]: The found HTML content, or None if not found
|
|
48
|
-
"""
|
|
49
|
-
values = diff if isinstance(diff, list) else diff.values()
|
|
50
|
-
for value in values:
|
|
51
|
-
if isinstance(value, (list, dict)):
|
|
52
|
-
cache = cache_find(value)
|
|
53
|
-
if cache:
|
|
54
|
-
return cache
|
|
55
|
-
if isinstance(value, str) and re.search(r"<p>.+?</p>", value):
|
|
56
|
-
return md(value).strip()
|
|
57
|
-
|
|
58
|
-
return None
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
ModeType = Literal["question", "academic", "fast", "forums", "wiki", "advanced"]
|
|
14
|
+
ModeType = Literal["question", "academic", "forums", "wiki", "thinking"]
|
|
62
15
|
DetailLevelType = Literal["concise", "detailed", "comprehensive"]
|
|
63
16
|
|
|
64
17
|
|
|
@@ -113,10 +66,17 @@ class IAsk(AISearch):
|
|
|
113
66
|
self.proxies = proxies or {}
|
|
114
67
|
self.default_mode = mode
|
|
115
68
|
self.default_detail_level = detail_level
|
|
116
|
-
self.api_endpoint = "https://iask.ai
|
|
69
|
+
self.api_endpoint = "https://iask.ai"
|
|
70
|
+
self.query_endpoint = "https://iask.ai/q"
|
|
117
71
|
self.last_response = {}
|
|
72
|
+
self.agent = LitAgent()
|
|
118
73
|
|
|
119
|
-
def create_url(
|
|
74
|
+
def create_url(
|
|
75
|
+
self,
|
|
76
|
+
query: str,
|
|
77
|
+
mode: ModeType = "question",
|
|
78
|
+
detail_level: Optional[DetailLevelType] = None,
|
|
79
|
+
) -> str:
|
|
120
80
|
"""Create a properly formatted URL with mode and detail level parameters.
|
|
121
81
|
|
|
122
82
|
Args:
|
|
@@ -131,13 +91,10 @@ class IAsk(AISearch):
|
|
|
131
91
|
>>> ai = IAsk()
|
|
132
92
|
>>> url = ai.create_url("Climate change", mode="academic", detail_level="detailed")
|
|
133
93
|
>>> print(url)
|
|
134
|
-
https://iask.ai
|
|
94
|
+
https://iask.ai/q?mode=academic&q=Climate+change&options%5Bdetail_level%5D=detailed
|
|
135
95
|
"""
|
|
136
96
|
# Create a dictionary of parameters with flattened structure
|
|
137
|
-
params = {
|
|
138
|
-
"mode": mode,
|
|
139
|
-
"q": query
|
|
140
|
-
}
|
|
97
|
+
params = {"mode": mode, "q": query}
|
|
141
98
|
|
|
142
99
|
# Add detail_level if provided using the flattened format
|
|
143
100
|
if detail_level:
|
|
@@ -145,7 +102,7 @@ class IAsk(AISearch):
|
|
|
145
102
|
|
|
146
103
|
# Encode the parameters and build the URL
|
|
147
104
|
query_string = urllib.parse.urlencode(params)
|
|
148
|
-
url = f"{self.
|
|
105
|
+
url = f"{self.query_endpoint}?{query_string}"
|
|
149
106
|
|
|
150
107
|
return url
|
|
151
108
|
|
|
@@ -158,17 +115,19 @@ class IAsk(AISearch):
|
|
|
158
115
|
Returns:
|
|
159
116
|
str: Formatted text.
|
|
160
117
|
"""
|
|
161
|
-
scout = Scout(html_content, features=
|
|
118
|
+
scout = Scout(html_content, features="html.parser")
|
|
162
119
|
output_lines = []
|
|
163
120
|
|
|
164
|
-
for child in scout.find_all([
|
|
121
|
+
for child in scout.find_all(["h1", "h2", "h3", "p", "ol", "ul", "div"]):
|
|
165
122
|
if child.name in ["h1", "h2", "h3"]:
|
|
166
123
|
output_lines.append(f"\n**{child.get_text().strip()}**\n")
|
|
167
124
|
elif child.name == "p":
|
|
168
125
|
text = child.get_text().strip()
|
|
169
|
-
text = re.sub(
|
|
126
|
+
text = re.sub(
|
|
127
|
+
r"^According to Ask AI & Question AI www\.iAsk\.ai:\s*", "", text
|
|
128
|
+
).strip()
|
|
170
129
|
# Remove footnote markers
|
|
171
|
-
text = re.sub(r
|
|
130
|
+
text = re.sub(r"\[\d+\]\(#fn:\d+ \'see footnote\'\)", "", text)
|
|
172
131
|
output_lines.append(text + "\n")
|
|
173
132
|
elif child.name in ["ol", "ul"]:
|
|
174
133
|
for li in child.find_all("li"):
|
|
@@ -189,7 +148,8 @@ class IAsk(AISearch):
|
|
|
189
148
|
raw: bool = False,
|
|
190
149
|
mode: Optional[ModeType] = None,
|
|
191
150
|
detail_level: Optional[DetailLevelType] = None,
|
|
192
|
-
|
|
151
|
+
**kwargs: Any,
|
|
152
|
+
) -> Union[SearchResponse, Generator[Union[Dict[str, str], SearchResponse], None, None]]:
|
|
193
153
|
"""Search using the IAsk API and get AI-generated responses.
|
|
194
154
|
|
|
195
155
|
This method sends a search query to IAsk and returns the AI-generated response.
|
|
@@ -236,9 +196,10 @@ class IAsk(AISearch):
|
|
|
236
196
|
>>> print(response)
|
|
237
197
|
Climate change refers to...
|
|
238
198
|
"""
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
199
|
+
search_mode = cast(ModeType, mode or self.default_mode)
|
|
200
|
+
search_detail_level = cast(
|
|
201
|
+
Optional[DetailLevelType], detail_level or self.default_detail_level
|
|
202
|
+
)
|
|
242
203
|
|
|
243
204
|
# For non-streaming, run the async search and return the complete response
|
|
244
205
|
if not stream:
|
|
@@ -249,52 +210,84 @@ class IAsk(AISearch):
|
|
|
249
210
|
result = loop.run_until_complete(
|
|
250
211
|
self._async_search(prompt, False, raw, search_mode, search_detail_level)
|
|
251
212
|
)
|
|
252
|
-
return
|
|
213
|
+
return cast(
|
|
214
|
+
Union[
|
|
215
|
+
SearchResponse, Generator[Union[Dict[str, str], SearchResponse], None, None]
|
|
216
|
+
],
|
|
217
|
+
result,
|
|
218
|
+
)
|
|
253
219
|
finally:
|
|
254
220
|
loop.close()
|
|
255
|
-
|
|
256
|
-
# For streaming, use a simpler approach with a single event loop
|
|
257
|
-
# that stays open until the generator is exhausted
|
|
258
221
|
buffer = ""
|
|
259
222
|
|
|
260
223
|
def sync_generator():
|
|
261
224
|
nonlocal buffer
|
|
262
|
-
|
|
225
|
+
|
|
263
226
|
loop = asyncio.new_event_loop()
|
|
264
227
|
asyncio.set_event_loop(loop)
|
|
265
228
|
|
|
266
229
|
try:
|
|
267
230
|
# Get the async generator
|
|
268
|
-
async_gen_coro = self._async_search(
|
|
231
|
+
async_gen_coro = self._async_search(
|
|
232
|
+
prompt, True, raw, search_mode, search_detail_level
|
|
233
|
+
)
|
|
269
234
|
async_gen = loop.run_until_complete(async_gen_coro)
|
|
270
235
|
|
|
271
236
|
# Process chunks one by one
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
buffer
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
237
|
+
if hasattr(async_gen, "__anext__"):
|
|
238
|
+
async_iterator = cast(AsyncIterator, async_gen)
|
|
239
|
+
while True:
|
|
240
|
+
try:
|
|
241
|
+
# Get the next chunk
|
|
242
|
+
chunk_coro = async_iterator.__anext__()
|
|
243
|
+
chunk = loop.run_until_complete(chunk_coro)
|
|
244
|
+
|
|
245
|
+
# Update buffer and yield the chunk
|
|
246
|
+
if isinstance(chunk, dict) and "text" in chunk:
|
|
247
|
+
buffer += chunk["text"]
|
|
248
|
+
elif isinstance(chunk, SearchResponse):
|
|
249
|
+
buffer += chunk.text
|
|
250
|
+
else:
|
|
251
|
+
buffer += str(chunk)
|
|
252
|
+
|
|
253
|
+
yield chunk
|
|
254
|
+
except StopAsyncIteration:
|
|
255
|
+
break
|
|
256
|
+
except Exception as e:
|
|
257
|
+
print(f"Error in generator: {e}")
|
|
258
|
+
break
|
|
259
|
+
elif isinstance(async_gen, SearchResponse):
|
|
260
|
+
yield async_gen
|
|
261
|
+
else:
|
|
262
|
+
yield str(async_gen)
|
|
292
263
|
finally:
|
|
293
264
|
# Store the final response and close the loop
|
|
294
265
|
self.last_response = {"text": buffer}
|
|
295
266
|
loop.close()
|
|
296
267
|
|
|
297
|
-
return
|
|
268
|
+
return cast(
|
|
269
|
+
Union[SearchResponse, Generator[Union[Dict[str, str], SearchResponse], None, None]],
|
|
270
|
+
sync_generator(),
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
def _extract_answer(self, html_content: str) -> str:
|
|
274
|
+
"""Extract and format the answer HTML from the results page."""
|
|
275
|
+
etree = lxml.html.fromstring(html_content)
|
|
276
|
+
text_nodes = etree.xpath('//*[@id="text"]')
|
|
277
|
+
if not text_nodes:
|
|
278
|
+
raise exceptions.APIConnectionError("No answer content found in iAsk response.")
|
|
279
|
+
text_node = text_nodes[0]
|
|
280
|
+
text_html = lxml.html.tostring(text_node, encoding="unicode", method="html")
|
|
281
|
+
return self.format_html(text_html).strip()
|
|
282
|
+
|
|
283
|
+
def _iter_chunks(self, text: str) -> Generator[str, None, None]:
|
|
284
|
+
"""Yield a response string in readable chunks for streaming."""
|
|
285
|
+
for line in text.splitlines(keepends=True):
|
|
286
|
+
if line.strip() == "":
|
|
287
|
+
yield line
|
|
288
|
+
continue
|
|
289
|
+
for chunk in re.findall(r".{1,800}(?:\s+|$)", line):
|
|
290
|
+
yield chunk
|
|
298
291
|
|
|
299
292
|
async def _async_search(
|
|
300
293
|
self,
|
|
@@ -303,134 +296,62 @@ class IAsk(AISearch):
|
|
|
303
296
|
raw: bool = False,
|
|
304
297
|
mode: ModeType = "question",
|
|
305
298
|
detail_level: Optional[DetailLevelType] = None,
|
|
306
|
-
) -> Union[
|
|
299
|
+
) -> Union[SearchResponse, str, AsyncIterator[Union[str, Dict[str, str], SearchResponse]]]:
|
|
307
300
|
"""Internal async implementation of the search method."""
|
|
308
301
|
|
|
309
|
-
async def
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
async with session.ws_connect(
|
|
335
|
-
f"{self.api_endpoint}live/websocket",
|
|
336
|
-
params={
|
|
337
|
-
"_csrf_token": csrf_token,
|
|
338
|
-
"vsn": "2.0.0",
|
|
339
|
-
},
|
|
340
|
-
proxy=self.proxies.get('http') if self.proxies else None,
|
|
341
|
-
timeout=self.timeout
|
|
342
|
-
) as wsResponse:
|
|
343
|
-
await wsResponse.send_json(
|
|
344
|
-
[
|
|
345
|
-
None,
|
|
346
|
-
None,
|
|
347
|
-
f"lv:{phx_node.get('id')}",
|
|
348
|
-
"phx_join",
|
|
349
|
-
{
|
|
350
|
-
"params": {"_csrf_token": csrf_token},
|
|
351
|
-
"url": str(response.url),
|
|
352
|
-
"session": phx_node.get("data-phx-session"),
|
|
353
|
-
},
|
|
354
|
-
]
|
|
355
|
-
)
|
|
356
|
-
while True:
|
|
357
|
-
json_data = await wsResponse.receive_json()
|
|
358
|
-
if not json_data:
|
|
359
|
-
break
|
|
360
|
-
diff: dict = json_data[4]
|
|
361
|
-
try:
|
|
362
|
-
chunk: str = diff["e"][0][1]["data"]
|
|
363
|
-
# Check if the chunk contains HTML content
|
|
364
|
-
if re.search(r"<[^>]+>", chunk):
|
|
365
|
-
formatted_chunk = self.format_html(chunk)
|
|
366
|
-
yield formatted_chunk
|
|
367
|
-
else:
|
|
368
|
-
yield chunk.replace("<br/>", "\n")
|
|
369
|
-
except:
|
|
370
|
-
cache = cache_find(diff)
|
|
371
|
-
if cache:
|
|
372
|
-
if diff.get("response", None):
|
|
373
|
-
# Format the cache content if it contains HTML
|
|
374
|
-
if re.search(r"<[^>]+>", cache):
|
|
375
|
-
formatted_cache = self.format_html(cache)
|
|
376
|
-
yield formatted_cache
|
|
377
|
-
else:
|
|
378
|
-
yield cache
|
|
379
|
-
break
|
|
380
|
-
except Exception as e:
|
|
381
|
-
raise exceptions.APIConnectionError(f"Error connecting to IAsk API: {str(e)}")
|
|
302
|
+
async def fetch_answer() -> str:
|
|
303
|
+
timeout = self.timeout
|
|
304
|
+
params = {"mode": mode, "q": prompt}
|
|
305
|
+
if detail_level:
|
|
306
|
+
params["options[detail_level]"] = detail_level
|
|
307
|
+
|
|
308
|
+
headers = {
|
|
309
|
+
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
310
|
+
"User-Agent": self.agent.random(),
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
async with AsyncSession() as session:
|
|
314
|
+
response = await session.get(
|
|
315
|
+
self.query_endpoint,
|
|
316
|
+
params=params,
|
|
317
|
+
headers=headers,
|
|
318
|
+
proxies=self.proxies or None,
|
|
319
|
+
timeout=timeout,
|
|
320
|
+
)
|
|
321
|
+
if response.status_code != 200:
|
|
322
|
+
raise exceptions.APIConnectionError(
|
|
323
|
+
"Failed to generate response - "
|
|
324
|
+
f"({response.status_code}, {response.reason}) - {response.text}"
|
|
325
|
+
)
|
|
326
|
+
return self._extract_answer(response.text)
|
|
382
327
|
|
|
383
328
|
# For non-streaming, collect all chunks and return a single response
|
|
384
329
|
if not stream:
|
|
385
|
-
buffer =
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
self.last_response = {"text": buffer}
|
|
389
|
-
return Response(buffer) if not raw else {"text": buffer}
|
|
330
|
+
buffer = await fetch_answer()
|
|
331
|
+
self.last_response = SearchResponse(buffer)
|
|
332
|
+
return buffer if raw else self.last_response
|
|
390
333
|
|
|
391
334
|
# For streaming, create an async generator that yields chunks
|
|
392
335
|
async def process_stream():
|
|
393
336
|
buffer = ""
|
|
394
|
-
|
|
337
|
+
text = await fetch_answer()
|
|
338
|
+
for chunk in self._iter_chunks(text):
|
|
395
339
|
buffer += chunk
|
|
396
340
|
if raw:
|
|
397
|
-
yield
|
|
341
|
+
yield chunk
|
|
398
342
|
else:
|
|
399
|
-
yield
|
|
400
|
-
self.last_response =
|
|
343
|
+
yield SearchResponse(chunk)
|
|
344
|
+
self.last_response = SearchResponse(buffer)
|
|
401
345
|
|
|
402
346
|
# Return the async generator
|
|
403
347
|
return process_stream()
|
|
404
348
|
|
|
405
349
|
|
|
406
350
|
if __name__ == "__main__":
|
|
407
|
-
from rich import print
|
|
408
|
-
|
|
409
351
|
ai = IAsk()
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
print(
|
|
416
|
-
print("\n\n[bold green]Response complete.[/bold green]\n")
|
|
417
|
-
|
|
418
|
-
# Example 2: Search with academic mode
|
|
419
|
-
print("\n[bold cyan]Example 2: Search with academic mode[/bold cyan]")
|
|
420
|
-
response = ai.search("Quantum computing applications", mode="academic", stream=True)
|
|
421
|
-
for chunk in response:
|
|
422
|
-
print(chunk, end="", flush=True)
|
|
423
|
-
print("\n\n[bold green]Response complete.[/bold green]\n")
|
|
424
|
-
|
|
425
|
-
# Example 3: Search with advanced mode and detailed level
|
|
426
|
-
print("\n[bold cyan]Example 3: Search with advanced mode and detailed level[/bold cyan]")
|
|
427
|
-
response = ai.search("Climate change solutions", mode="advanced", detail_level="detailed", stream=True)
|
|
428
|
-
for chunk in response:
|
|
429
|
-
print(chunk, end="", flush=True)
|
|
430
|
-
print("\n\n[bold green]Response complete.[/bold green]\n")
|
|
431
|
-
|
|
432
|
-
# Example 4: Demonstrating the create_url method
|
|
433
|
-
print("\n[bold cyan]Example 4: Generated URL for browser access[/bold cyan]")
|
|
434
|
-
url = ai.create_url("Helpingai details", mode="question", detail_level="detailed")
|
|
435
|
-
print(f"URL: {url}")
|
|
436
|
-
print("This URL can be used directly in a browser or with other HTTP clients.")
|
|
352
|
+
response = ai.search("What is Python?", stream=True, raw=True)
|
|
353
|
+
if hasattr(response, "__iter__") and not isinstance(response, (str, SearchResponse)):
|
|
354
|
+
for chunk in response:
|
|
355
|
+
print(chunk, end="", flush=True)
|
|
356
|
+
else:
|
|
357
|
+
print(response)
|