webscout 8.3.4__tar.gz → 8.3.5__tar.gz
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.
Potentially problematic release.
This version of webscout might be problematic. Click here for more details.
- {webscout-8.3.4/webscout.egg-info → webscout-8.3.5}/PKG-INFO +9 -149
- {webscout-8.3.4 → webscout-8.3.5}/README.md +7 -147
- webscout-8.3.5/changelog.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/pyproject.toml +1 -1
- webscout-8.3.5/webscout/AIutel.py +58 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/AISEARCH/__init__.py +11 -10
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/AISEARCH/felo_search.py +7 -3
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/AISEARCH/scira_search.py +2 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/AISEARCH/stellar_search.py +53 -8
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Deepinfra.py +7 -1
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/TogetherAI.py +57 -48
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/TwoAI.py +94 -1
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/__init__.py +0 -2
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/deepinfra.py +6 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/scirachat.py +4 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/textpollinations.py +11 -7
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/venice.py +1 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Perplexitylabs.py +163 -147
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Qodo.py +30 -6
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/__init__.py +1 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/together.py +7 -6
- webscout-8.3.5/webscout/Provider/TTI/venice.py +368 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TextPollinationsAI.py +11 -7
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TogetherAI.py +57 -44
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TwoAI.py +96 -2
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TypliAI.py +33 -27
- webscout-8.3.5/webscout/Provider/UNFINISHED/PERPLEXED_search.py +254 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/UNFINISHED/fetch_together_models.py +6 -11
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Venice.py +1 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/WiseCat.py +18 -20
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/__init__.py +0 -6
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/scira_chat.py +4 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/toolbaz.py +5 -10
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/typefully.py +1 -11
- {webscout-8.3.4 → webscout-8.3.5}/webscout/__init__.py +3 -15
- {webscout-8.3.4 → webscout-8.3.5}/webscout/auth/__init__.py +19 -4
- {webscout-8.3.4 → webscout-8.3.5}/webscout/auth/api_key_manager.py +189 -189
- {webscout-8.3.4 → webscout-8.3.5}/webscout/auth/auth_system.py +25 -40
- webscout-8.3.5/webscout/auth/config.py +175 -0
- webscout-8.3.5/webscout/auth/database.py +755 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/auth/models.py +185 -130
- {webscout-8.3.4 → webscout-8.3.5}/webscout/auth/request_processing.py +175 -11
- {webscout-8.3.4 → webscout-8.3.5}/webscout/auth/routes.py +99 -2
- {webscout-8.3.4 → webscout-8.3.5}/webscout/auth/server.py +9 -2
- webscout-8.3.5/webscout/auth/simple_logger.py +236 -0
- webscout-8.3.4/webscout/AIutel.py → webscout-8.3.5/webscout/sanitize.py +71 -19
- webscout-8.3.5/webscout/version.py +2 -0
- {webscout-8.3.4 → webscout-8.3.5/webscout.egg-info}/PKG-INFO +9 -149
- {webscout-8.3.4 → webscout-8.3.5}/webscout.egg-info/SOURCES.txt +8 -12
- {webscout-8.3.4 → webscout-8.3.5}/webscout.egg-info/requires.txt +1 -1
- webscout-8.3.4/changelog.md +0 -0
- webscout-8.3.4/webscout/Provider/OPENAI/README_AUTOPROXY.md +0 -238
- webscout-8.3.4/webscout/Provider/OPENAI/typegpt.py +0 -368
- webscout-8.3.4/webscout/Provider/OPENAI/uncovrAI.py +0 -477
- webscout-8.3.4/webscout/Provider/WritingMate.py +0 -273
- webscout-8.3.4/webscout/Provider/typegpt.py +0 -284
- webscout-8.3.4/webscout/Provider/uncovr.py +0 -333
- webscout-8.3.4/webscout/auth/config.py +0 -76
- webscout-8.3.4/webscout/auth/database.py +0 -400
- webscout-8.3.4/webscout/version.py +0 -2
- {webscout-8.3.4 → webscout-8.3.5}/LEGAL_NOTICE.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/LICENSE.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/MANIFEST.in +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/setup.cfg +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/AIauto.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/AIbase.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Bard.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Bing_search.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/DWEBS.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/Act.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/GitToolkit/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/GitToolkit/gitapi/README.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/GitToolkit/gitapi/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/GitToolkit/gitapi/repository.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/GitToolkit/gitapi/user.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/GitToolkit/gitapi/utils.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/README.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/YTdownloader.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/transcriber.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/ytapi/README.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/ytapi/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/ytapi/channel.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/ytapi/errors.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/ytapi/extras.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/ytapi/https.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/ytapi/patterns.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/ytapi/playlist.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/ytapi/pool.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/ytapi/query.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/ytapi/stream.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/ytapi/utils.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/YTToolkit/ytapi/video.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/autocoder/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/autocoder/autocoder.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/autocoder/autocoder_utiles.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/gguf.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/gguf.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/tempmail/README.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/tempmail/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/tempmail/async_utils.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/tempmail/base.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/tempmail/cli.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/tempmail/emailnator.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/tempmail/mail_tm.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/tempmail/temp_mail_io.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/weather.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/weather.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Extra/weather_ascii.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Litlogger/README.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Litlogger/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Litlogger/formats.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Litlogger/handlers.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Litlogger/levels.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Litlogger/logger.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/AISEARCH/DeepFind.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/AISEARCH/Perplexity.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/AISEARCH/README.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/AISEARCH/genspark_search.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/AISEARCH/hika_search.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/AISEARCH/iask_search.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/AISEARCH/monica_search.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/AISEARCH/webpilotai_search.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Aitopia.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/AllenAI.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Andi.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Blackboxai.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/ChatGPTClone.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/ChatSandbox.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Cloudflare.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Cohere.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/ExaAI.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/ExaChat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Flowith.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/FreeGemini.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Gemini.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/GeminiProxy.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/GithubChat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/GizAI.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Glider.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Groq.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/HeckAI.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Hunyuan.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Jadve.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Koboldai.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/LambdaChat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Llama3.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/MCPCore.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Marcus.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/MiniMax.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Nemotron.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Netwrck.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OLLAMA.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/BLACKBOXAI.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/Cloudflare.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/FalconH1.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/FreeGemini.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/GeminiProxy.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/MiniMax.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/NEMOTRON.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/PI.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/Qwen3.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/README.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/ai4chat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/autoproxy.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/base.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/c4ai.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/chatgpt.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/chatgptclone.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/chatsandbox.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/copilot.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/e2b.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/exaai.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/exachat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/flowith.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/friendli.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/glider.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/groq.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/heckai.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/llmchatco.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/mcpcore.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/monochat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/multichat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/netwrck.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/oivscode.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/opkfc.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/pydantic_imports.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/qodo.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/sonus.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/standardinput.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/toolbaz.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/typefully.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/utils.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/wisecat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/writecream.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/x0gpt.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/xenai.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OPENAI/yep.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/OpenGPT.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Openai.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/PI.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/QwenLM.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/Reka.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/STT/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/STT/base.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/STT/elevenlabs.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/StandardInput.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/README.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/aiarta.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/base.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/bing.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/gpt1image.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/imagen.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/infip.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/magicstudio.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/monochat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/piclumen.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/pixelmuse.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/pollinations.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTI/utils.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTS/README.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTS/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTS/base.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTS/deepgram.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTS/elevenlabs.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTS/freetts.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTS/gesserit.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTS/murfai.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTS/openai_fm.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTS/parler.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTS/speechma.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTS/sthir.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTS/streamElements.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TTS/utils.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/TeachAnything.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/UNFINISHED/ChatHub.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/UNFINISHED/ChutesAI.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/UNFINISHED/Youchat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/UNFINISHED/liner_api_request.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/UNFINISHED/puterjs.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/UNFINISHED/test_lmarena.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/VercelAI.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/WrDoChat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/XenAI.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/ai4chat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/akashgpt.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/asksteve.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/cerebras.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/chatglm.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/cleeai.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/copilot.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/deepseek_assistant.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/elmo.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/freeaichat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/geminiapi.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/granite.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/hermes.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/julius.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/koala.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/learnfastai.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/llama3mitril.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/llmchat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/llmchatco.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/lmarena.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/meta.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/monochat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/multichat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/oivscode.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/samurai.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/scnet.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/searchchat.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/sonus.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/talkai.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/turboseek.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/x0gpt.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/Provider/yep.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/__main__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/auth/exceptions.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/auth/middleware.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/auth/providers.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/auth/rate_limiter.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/auth/request_models.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/auth/schemas.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/cli.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/client.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/conversation.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/exceptions.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/litagent/Readme.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/litagent/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/litagent/agent.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/litagent/constants.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/litprinter/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/models.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/optimizers.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/prompt_manager.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/README.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/core/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/core/crawler.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/core/scout.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/core/search_result.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/core/text_analyzer.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/core/text_utils.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/core/web_analyzer.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/element.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/parsers/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/parsers/html5lib_parser.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/parsers/html_parser.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/parsers/lxml_parser.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/scout/utils.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/Readme.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/core/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/core/cli.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/core/context.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/core/group.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/decorators/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/decorators/command.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/decorators/options.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/decorators/output.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/exceptions.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/plugins/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/plugins/base.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/plugins/manager.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/utils/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/utils/formatting.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/swiftcli/utils/parsing.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/tempid.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/update_checker.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/utils.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/webscout_search.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/webscout_search_async.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/yep_search.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/zeroart/README.md +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/zeroart/__init__.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/zeroart/base.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/zeroart/effects.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout/zeroart/fonts.py +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout.egg-info/dependency_links.txt +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout.egg-info/entry_points.txt +0 -0
- {webscout-8.3.4 → webscout-8.3.5}/webscout.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: webscout
|
|
3
|
-
Version: 8.3.
|
|
3
|
+
Version: 8.3.5
|
|
4
4
|
Summary: Search for anything using Google, DuckDuckGo, phind.com, Contains AI models, can transcribe yt videos, temporary email and phone number generation, has TTS support, webai (terminal gpt and open interpreter) and offline LLMs and more
|
|
5
5
|
Author-email: OEvortex <helpingai5@gmail.com>
|
|
6
6
|
License: HelpingAI
|
|
@@ -41,7 +41,6 @@ Requires-Dist: nodriver
|
|
|
41
41
|
Requires-Dist: mistune
|
|
42
42
|
Requires-Dist: curl_cffi
|
|
43
43
|
Requires-Dist: nest-asyncio
|
|
44
|
-
Requires-Dist: websocket-client
|
|
45
44
|
Requires-Dist: colorama
|
|
46
45
|
Requires-Dist: rich
|
|
47
46
|
Requires-Dist: markdownify
|
|
@@ -73,6 +72,7 @@ Requires-Dist: python-multipart; extra == "api"
|
|
|
73
72
|
Requires-Dist: tiktoken; extra == "api"
|
|
74
73
|
Requires-Dist: motor; extra == "api"
|
|
75
74
|
Requires-Dist: jinja2; extra == "api"
|
|
75
|
+
Requires-Dist: supabase; extra == "api"
|
|
76
76
|
Dynamic: license-file
|
|
77
77
|
|
|
78
78
|
<div align="center">
|
|
@@ -105,7 +105,7 @@ Dynamic: license-file
|
|
|
105
105
|
- [🌟 Key Features](#-features)
|
|
106
106
|
- [⚙️ Installation](#️-installation)
|
|
107
107
|
- [🖥️ Command Line Interface](#️-command-line-interface)
|
|
108
|
-
- [🔄 OpenAI-Compatible API Server](
|
|
108
|
+
- [🔄 OpenAI-Compatible API Server](docs/openai-api-server.md)
|
|
109
109
|
- [🔍 Search Engines](#-search-engines)
|
|
110
110
|
- [🦆 DuckDuckGo Search](#-duckduckgo-search-with-webs-and-asyncwebs)
|
|
111
111
|
- [💻 WEBS API Reference](#-webs-api-reference)
|
|
@@ -117,7 +117,7 @@ Dynamic: license-file
|
|
|
117
117
|
|
|
118
118
|
<hr/>
|
|
119
119
|
|
|
120
|
-
> [!IMPORTANT]
|
|
120
|
+
> [!IMPORTANT]
|
|
121
121
|
> **Webscout supports three types of compatibility:**
|
|
122
122
|
>
|
|
123
123
|
> - **Native Compatibility:** Webscout's own native API for maximum flexibility
|
|
@@ -181,6 +181,8 @@ Dynamic: license-file
|
|
|
181
181
|
- **[Scout](webscout/scout/README.md):** Advanced web parsing and crawling library with intelligent HTML/XML parsing
|
|
182
182
|
- **[Inferno](https://github.com/HelpingAI/inferno):** Run local LLMs with an OpenAI-compatible API and interactive CLI (now a standalone package: `pip install inferno-llm`)
|
|
183
183
|
- **[GGUF Conversion](webscout/Extra/gguf.md):** Convert and quantize Hugging Face models to GGUF format
|
|
184
|
+
- **[Utility Decorators](docs/decorators.md):** Easily measure function execution time (`timeIt`) and add retry logic (`retry`) to any function
|
|
185
|
+
- **[Stream Sanitization Utilities](docs/sanitize.md):** Advanced tools for cleaning, decoding, and processing data streams
|
|
184
186
|
</p>
|
|
185
187
|
</details>
|
|
186
188
|
|
|
@@ -381,7 +383,8 @@ For more information, visit the [Inferno GitHub repository](https://github.com/H
|
|
|
381
383
|
</p>
|
|
382
384
|
</details>
|
|
383
385
|
|
|
384
|
-
> [!NOTE]
|
|
386
|
+
> [!NOTE]
|
|
387
|
+
> **Hardware requirements for running models with Inferno:**
|
|
385
388
|
>
|
|
386
389
|
> - Around 2 GB of RAM for 1B models
|
|
387
390
|
> - Around 4 GB of RAM for 3B models
|
|
@@ -390,150 +393,7 @@ For more information, visit the [Inferno GitHub repository](https://github.com/H
|
|
|
390
393
|
> - 32 GB of RAM for 33B models
|
|
391
394
|
> - GPU acceleration is recommended for better performance
|
|
392
395
|
|
|
393
|
-
|
|
394
|
-
<summary><b>🔄 OpenAI-Compatible API Server</b></summary>
|
|
395
|
-
<p>
|
|
396
|
-
|
|
397
|
-
Webscout includes an OpenAI-compatible API server that allows you to use any supported provider with tools and applications designed for OpenAI's API.
|
|
398
|
-
|
|
399
|
-
### Starting the API Server
|
|
400
|
-
|
|
401
|
-
#### From Command Line (Recommended)
|
|
402
|
-
|
|
403
|
-
```bash
|
|
404
|
-
# Start with default settings (port 8000)
|
|
405
|
-
webscout-server
|
|
406
|
-
|
|
407
|
-
# Start with custom port
|
|
408
|
-
webscout-server --port 8080
|
|
409
|
-
|
|
410
|
-
# Start with API key authentication
|
|
411
|
-
webscout-server --api-key "your-secret-key"
|
|
412
|
-
|
|
413
|
-
# Start in no-auth mode using command line flag (no API key required)
|
|
414
|
-
webscout-server --no-auth
|
|
415
|
-
|
|
416
|
-
# Start in no-auth mode using environment variable
|
|
417
|
-
$env:WEBSCOUT_NO_AUTH='true'; webscout-server
|
|
418
|
-
|
|
419
|
-
# Specify a default provider
|
|
420
|
-
webscout-server --default-provider "Claude"
|
|
421
|
-
|
|
422
|
-
# Run in debug mode
|
|
423
|
-
webscout-server --debug
|
|
424
|
-
|
|
425
|
-
# Get help for all options (includes authentication options)
|
|
426
|
-
webscout-server --help
|
|
427
|
-
```
|
|
428
|
-
|
|
429
|
-
#### Alternative Methods
|
|
430
|
-
|
|
431
|
-
```bash
|
|
432
|
-
# Using UV (no installation required)
|
|
433
|
-
uv run --extra api webscout-server
|
|
434
|
-
|
|
435
|
-
# Using Python module
|
|
436
|
-
python -m webscout.auth.server
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
#### Environment Variables
|
|
440
|
-
|
|
441
|
-
Webscout server supports configuration through environment variables:
|
|
442
|
-
|
|
443
|
-
```bash
|
|
444
|
-
# Start server in no-auth mode (no API key required)
|
|
445
|
-
$env:WEBSCOUT_NO_AUTH='true'; webscout-server
|
|
446
|
-
|
|
447
|
-
# Disable rate limiting
|
|
448
|
-
$env:WEBSCOUT_NO_RATE_LIMIT='true'; webscout-server
|
|
449
|
-
|
|
450
|
-
# Start with custom port using environment variable
|
|
451
|
-
$env:WEBSCOUT_PORT='7860'; webscout-server
|
|
452
|
-
```
|
|
453
|
-
|
|
454
|
-
For a complete list of supported environment variables and Docker deployment options, see [DOCKER.md](DOCKER.md).
|
|
455
|
-
|
|
456
|
-
#### From Python Code
|
|
457
|
-
|
|
458
|
-
> **Recommended:**
|
|
459
|
-
> Use `start_server` from `webscout.client` for the simplest programmatic startup.
|
|
460
|
-
> For advanced control (custom host, debug, etc.), use `run_api`.
|
|
461
|
-
|
|
462
|
-
```python
|
|
463
|
-
# Method 1: Using the helper function (recommended)
|
|
464
|
-
from webscout.client import start_server
|
|
465
|
-
|
|
466
|
-
# Start with default settings
|
|
467
|
-
start_server()
|
|
468
|
-
|
|
469
|
-
# Start with custom settings
|
|
470
|
-
start_server(port=8080, api_key="your-secret-key", default_provider="Claude")
|
|
471
|
-
|
|
472
|
-
# Start in no-auth mode (no API key required)
|
|
473
|
-
start_server(no_auth=True)
|
|
474
|
-
|
|
475
|
-
# Method 2: Advanced usage with run_api
|
|
476
|
-
from webscout.client import run_api
|
|
477
|
-
|
|
478
|
-
run_api(
|
|
479
|
-
host="0.0.0.0",
|
|
480
|
-
debug=True
|
|
481
|
-
)
|
|
482
|
-
```
|
|
483
|
-
|
|
484
|
-
### Using the API
|
|
485
|
-
|
|
486
|
-
Once the server is running, you can use it with any OpenAI client library or tool:
|
|
487
|
-
|
|
488
|
-
```python
|
|
489
|
-
# Using the OpenAI Python client
|
|
490
|
-
from openai import OpenAI
|
|
491
|
-
|
|
492
|
-
client = OpenAI(
|
|
493
|
-
api_key="your-secret-key", # Only needed if you set an API key
|
|
494
|
-
base_url="http://localhost:8000/v1" # Point to your local server
|
|
495
|
-
)
|
|
496
|
-
|
|
497
|
-
# Chat completion
|
|
498
|
-
response = client.chat.completions.create(
|
|
499
|
-
model="gpt-4", # This can be any model name registered with Webscout
|
|
500
|
-
messages=[
|
|
501
|
-
{"role": "system", "content": "You are a helpful assistant."},
|
|
502
|
-
{"role": "user", "content": "Hello, how are you?"}
|
|
503
|
-
]
|
|
504
|
-
)
|
|
505
|
-
|
|
506
|
-
print(response.choices[0].message.content)
|
|
507
|
-
```
|
|
508
|
-
|
|
509
|
-
### Using with cURL
|
|
510
|
-
|
|
511
|
-
```bash
|
|
512
|
-
# Basic chat completion request
|
|
513
|
-
curl http://localhost:8000/v1/chat/completions \
|
|
514
|
-
-H "Content-Type: application/json" \
|
|
515
|
-
-H "Authorization: Bearer your-secret-key" \
|
|
516
|
-
-d '{
|
|
517
|
-
"model": "gpt-4",
|
|
518
|
-
"messages": [
|
|
519
|
-
{"role": "system", "content": "You are a helpful assistant."},
|
|
520
|
-
{"role": "user", "content": "Hello, how are you?"}
|
|
521
|
-
]
|
|
522
|
-
}'
|
|
523
|
-
|
|
524
|
-
# List available models
|
|
525
|
-
curl http://localhost:8000/v1/models \
|
|
526
|
-
-H "Authorization: Bearer your-secret-key"
|
|
527
|
-
```
|
|
528
|
-
|
|
529
|
-
### Available Endpoints
|
|
530
|
-
|
|
531
|
-
- `GET /v1/models` - List all available models
|
|
532
|
-
- `GET /v1/models/{model_name}` - Get information about a specific model
|
|
533
|
-
- `POST /v1/chat/completions` - Create a chat completion
|
|
534
|
-
|
|
535
|
-
</p>
|
|
536
|
-
</details>
|
|
396
|
+
For detailed information about the OpenAI-compatible API server, including setup, configuration, and usage examples, see the [OpenAI API Server Documentation](docs/openai-api-server.md).
|
|
537
397
|
|
|
538
398
|
<hr/>
|
|
539
399
|
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
- [🌟 Key Features](#-features)
|
|
29
29
|
- [⚙️ Installation](#️-installation)
|
|
30
30
|
- [🖥️ Command Line Interface](#️-command-line-interface)
|
|
31
|
-
- [🔄 OpenAI-Compatible API Server](
|
|
31
|
+
- [🔄 OpenAI-Compatible API Server](docs/openai-api-server.md)
|
|
32
32
|
- [🔍 Search Engines](#-search-engines)
|
|
33
33
|
- [🦆 DuckDuckGo Search](#-duckduckgo-search-with-webs-and-asyncwebs)
|
|
34
34
|
- [💻 WEBS API Reference](#-webs-api-reference)
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
|
|
41
41
|
<hr/>
|
|
42
42
|
|
|
43
|
-
> [!IMPORTANT]
|
|
43
|
+
> [!IMPORTANT]
|
|
44
44
|
> **Webscout supports three types of compatibility:**
|
|
45
45
|
>
|
|
46
46
|
> - **Native Compatibility:** Webscout's own native API for maximum flexibility
|
|
@@ -104,6 +104,8 @@
|
|
|
104
104
|
- **[Scout](webscout/scout/README.md):** Advanced web parsing and crawling library with intelligent HTML/XML parsing
|
|
105
105
|
- **[Inferno](https://github.com/HelpingAI/inferno):** Run local LLMs with an OpenAI-compatible API and interactive CLI (now a standalone package: `pip install inferno-llm`)
|
|
106
106
|
- **[GGUF Conversion](webscout/Extra/gguf.md):** Convert and quantize Hugging Face models to GGUF format
|
|
107
|
+
- **[Utility Decorators](docs/decorators.md):** Easily measure function execution time (`timeIt`) and add retry logic (`retry`) to any function
|
|
108
|
+
- **[Stream Sanitization Utilities](docs/sanitize.md):** Advanced tools for cleaning, decoding, and processing data streams
|
|
107
109
|
</p>
|
|
108
110
|
</details>
|
|
109
111
|
|
|
@@ -304,7 +306,8 @@ For more information, visit the [Inferno GitHub repository](https://github.com/H
|
|
|
304
306
|
</p>
|
|
305
307
|
</details>
|
|
306
308
|
|
|
307
|
-
> [!NOTE]
|
|
309
|
+
> [!NOTE]
|
|
310
|
+
> **Hardware requirements for running models with Inferno:**
|
|
308
311
|
>
|
|
309
312
|
> - Around 2 GB of RAM for 1B models
|
|
310
313
|
> - Around 4 GB of RAM for 3B models
|
|
@@ -313,150 +316,7 @@ For more information, visit the [Inferno GitHub repository](https://github.com/H
|
|
|
313
316
|
> - 32 GB of RAM for 33B models
|
|
314
317
|
> - GPU acceleration is recommended for better performance
|
|
315
318
|
|
|
316
|
-
|
|
317
|
-
<summary><b>🔄 OpenAI-Compatible API Server</b></summary>
|
|
318
|
-
<p>
|
|
319
|
-
|
|
320
|
-
Webscout includes an OpenAI-compatible API server that allows you to use any supported provider with tools and applications designed for OpenAI's API.
|
|
321
|
-
|
|
322
|
-
### Starting the API Server
|
|
323
|
-
|
|
324
|
-
#### From Command Line (Recommended)
|
|
325
|
-
|
|
326
|
-
```bash
|
|
327
|
-
# Start with default settings (port 8000)
|
|
328
|
-
webscout-server
|
|
329
|
-
|
|
330
|
-
# Start with custom port
|
|
331
|
-
webscout-server --port 8080
|
|
332
|
-
|
|
333
|
-
# Start with API key authentication
|
|
334
|
-
webscout-server --api-key "your-secret-key"
|
|
335
|
-
|
|
336
|
-
# Start in no-auth mode using command line flag (no API key required)
|
|
337
|
-
webscout-server --no-auth
|
|
338
|
-
|
|
339
|
-
# Start in no-auth mode using environment variable
|
|
340
|
-
$env:WEBSCOUT_NO_AUTH='true'; webscout-server
|
|
341
|
-
|
|
342
|
-
# Specify a default provider
|
|
343
|
-
webscout-server --default-provider "Claude"
|
|
344
|
-
|
|
345
|
-
# Run in debug mode
|
|
346
|
-
webscout-server --debug
|
|
347
|
-
|
|
348
|
-
# Get help for all options (includes authentication options)
|
|
349
|
-
webscout-server --help
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
#### Alternative Methods
|
|
353
|
-
|
|
354
|
-
```bash
|
|
355
|
-
# Using UV (no installation required)
|
|
356
|
-
uv run --extra api webscout-server
|
|
357
|
-
|
|
358
|
-
# Using Python module
|
|
359
|
-
python -m webscout.auth.server
|
|
360
|
-
```
|
|
361
|
-
|
|
362
|
-
#### Environment Variables
|
|
363
|
-
|
|
364
|
-
Webscout server supports configuration through environment variables:
|
|
365
|
-
|
|
366
|
-
```bash
|
|
367
|
-
# Start server in no-auth mode (no API key required)
|
|
368
|
-
$env:WEBSCOUT_NO_AUTH='true'; webscout-server
|
|
369
|
-
|
|
370
|
-
# Disable rate limiting
|
|
371
|
-
$env:WEBSCOUT_NO_RATE_LIMIT='true'; webscout-server
|
|
372
|
-
|
|
373
|
-
# Start with custom port using environment variable
|
|
374
|
-
$env:WEBSCOUT_PORT='7860'; webscout-server
|
|
375
|
-
```
|
|
376
|
-
|
|
377
|
-
For a complete list of supported environment variables and Docker deployment options, see [DOCKER.md](DOCKER.md).
|
|
378
|
-
|
|
379
|
-
#### From Python Code
|
|
380
|
-
|
|
381
|
-
> **Recommended:**
|
|
382
|
-
> Use `start_server` from `webscout.client` for the simplest programmatic startup.
|
|
383
|
-
> For advanced control (custom host, debug, etc.), use `run_api`.
|
|
384
|
-
|
|
385
|
-
```python
|
|
386
|
-
# Method 1: Using the helper function (recommended)
|
|
387
|
-
from webscout.client import start_server
|
|
388
|
-
|
|
389
|
-
# Start with default settings
|
|
390
|
-
start_server()
|
|
391
|
-
|
|
392
|
-
# Start with custom settings
|
|
393
|
-
start_server(port=8080, api_key="your-secret-key", default_provider="Claude")
|
|
394
|
-
|
|
395
|
-
# Start in no-auth mode (no API key required)
|
|
396
|
-
start_server(no_auth=True)
|
|
397
|
-
|
|
398
|
-
# Method 2: Advanced usage with run_api
|
|
399
|
-
from webscout.client import run_api
|
|
400
|
-
|
|
401
|
-
run_api(
|
|
402
|
-
host="0.0.0.0",
|
|
403
|
-
debug=True
|
|
404
|
-
)
|
|
405
|
-
```
|
|
406
|
-
|
|
407
|
-
### Using the API
|
|
408
|
-
|
|
409
|
-
Once the server is running, you can use it with any OpenAI client library or tool:
|
|
410
|
-
|
|
411
|
-
```python
|
|
412
|
-
# Using the OpenAI Python client
|
|
413
|
-
from openai import OpenAI
|
|
414
|
-
|
|
415
|
-
client = OpenAI(
|
|
416
|
-
api_key="your-secret-key", # Only needed if you set an API key
|
|
417
|
-
base_url="http://localhost:8000/v1" # Point to your local server
|
|
418
|
-
)
|
|
419
|
-
|
|
420
|
-
# Chat completion
|
|
421
|
-
response = client.chat.completions.create(
|
|
422
|
-
model="gpt-4", # This can be any model name registered with Webscout
|
|
423
|
-
messages=[
|
|
424
|
-
{"role": "system", "content": "You are a helpful assistant."},
|
|
425
|
-
{"role": "user", "content": "Hello, how are you?"}
|
|
426
|
-
]
|
|
427
|
-
)
|
|
428
|
-
|
|
429
|
-
print(response.choices[0].message.content)
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
### Using with cURL
|
|
433
|
-
|
|
434
|
-
```bash
|
|
435
|
-
# Basic chat completion request
|
|
436
|
-
curl http://localhost:8000/v1/chat/completions \
|
|
437
|
-
-H "Content-Type: application/json" \
|
|
438
|
-
-H "Authorization: Bearer your-secret-key" \
|
|
439
|
-
-d '{
|
|
440
|
-
"model": "gpt-4",
|
|
441
|
-
"messages": [
|
|
442
|
-
{"role": "system", "content": "You are a helpful assistant."},
|
|
443
|
-
{"role": "user", "content": "Hello, how are you?"}
|
|
444
|
-
]
|
|
445
|
-
}'
|
|
446
|
-
|
|
447
|
-
# List available models
|
|
448
|
-
curl http://localhost:8000/v1/models \
|
|
449
|
-
-H "Authorization: Bearer your-secret-key"
|
|
450
|
-
```
|
|
451
|
-
|
|
452
|
-
### Available Endpoints
|
|
453
|
-
|
|
454
|
-
- `GET /v1/models` - List all available models
|
|
455
|
-
- `GET /v1/models/{model_name}` - Get information about a specific model
|
|
456
|
-
- `POST /v1/chat/completions` - Create a chat completion
|
|
457
|
-
|
|
458
|
-
</p>
|
|
459
|
-
</details>
|
|
319
|
+
For detailed information about the OpenAI-compatible API server, including setup, configuration, and usage examples, see the [OpenAI API Server Documentation](docs/openai-api-server.md).
|
|
460
320
|
|
|
461
321
|
<hr/>
|
|
462
322
|
|
|
Binary file
|
|
@@ -52,7 +52,6 @@ dependencies = [
|
|
|
52
52
|
"mistune",
|
|
53
53
|
"curl_cffi",
|
|
54
54
|
"nest-asyncio",
|
|
55
|
-
"websocket-client",
|
|
56
55
|
"colorama",
|
|
57
56
|
"rich",
|
|
58
57
|
"markdownify",
|
|
@@ -98,6 +97,7 @@ api = [
|
|
|
98
97
|
"tiktoken", # Added tiktoken for token counting support
|
|
99
98
|
"motor", # MongoDB async driver for enhanced authentication
|
|
100
99
|
"jinja2", # Template engine for custom Swagger UI
|
|
100
|
+
"supabase", # Supabase client for database operations
|
|
101
101
|
]
|
|
102
102
|
|
|
103
103
|
[tool.setuptools]
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
from .sanitize import * # noqa: E402,F401
|
|
2
|
+
from .conversation import Conversation # noqa: E402,F401
|
|
3
|
+
from .Extra.autocoder import AutoCoder # noqa: E402,F401
|
|
4
|
+
from .optimizers import Optimizers # noqa: E402,F401
|
|
5
|
+
from .prompt_manager import AwesomePrompts # noqa: E402,F401
|
|
6
|
+
|
|
7
|
+
# --- Utility Decorators ---
|
|
8
|
+
from typing import Callable
|
|
9
|
+
import time
|
|
10
|
+
import functools
|
|
11
|
+
|
|
12
|
+
def timeIt(func: Callable):
|
|
13
|
+
"""
|
|
14
|
+
Decorator to measure execution time of a function (sync or async).
|
|
15
|
+
Prints: - Execution time for '{func.__name__}' : {elapsed:.6f} Seconds.
|
|
16
|
+
"""
|
|
17
|
+
import asyncio
|
|
18
|
+
GREEN_BOLD = "\033[1;92m"
|
|
19
|
+
RESET = "\033[0m"
|
|
20
|
+
@functools.wraps(func)
|
|
21
|
+
def sync_wrapper(*args, **kwargs):
|
|
22
|
+
start_time = time.time()
|
|
23
|
+
result = func(*args, **kwargs)
|
|
24
|
+
end_time = time.time()
|
|
25
|
+
print(f"{GREEN_BOLD}- Execution time for '{func.__name__}' : {end_time - start_time:.6f} Seconds. {RESET}\n")
|
|
26
|
+
return result
|
|
27
|
+
|
|
28
|
+
@functools.wraps(func)
|
|
29
|
+
async def async_wrapper(*args, **kwargs):
|
|
30
|
+
start_time = time.time()
|
|
31
|
+
result = await func(*args, **kwargs)
|
|
32
|
+
end_time = time.time()
|
|
33
|
+
print(f"{GREEN_BOLD}- Execution time for '{func.__name__}' : {end_time - start_time:.6f} Seconds. {RESET}\n")
|
|
34
|
+
return result
|
|
35
|
+
|
|
36
|
+
if asyncio.iscoroutinefunction(func):
|
|
37
|
+
return async_wrapper
|
|
38
|
+
else:
|
|
39
|
+
return sync_wrapper
|
|
40
|
+
|
|
41
|
+
def retry(retries: int = 3, delay: float = 1) -> Callable:
|
|
42
|
+
"""
|
|
43
|
+
Decorator to retry a function on exception.
|
|
44
|
+
"""
|
|
45
|
+
def decorator(func: Callable):
|
|
46
|
+
@functools.wraps(func)
|
|
47
|
+
def wrapper(*args, **kwargs):
|
|
48
|
+
last_exc = None
|
|
49
|
+
for attempt in range(retries):
|
|
50
|
+
try:
|
|
51
|
+
return func(*args, **kwargs)
|
|
52
|
+
except Exception as exc:
|
|
53
|
+
last_exc = exc
|
|
54
|
+
print(f"Attempt {attempt + 1} failed: {exc}. Retrying in {delay} seconds...")
|
|
55
|
+
time.sleep(delay)
|
|
56
|
+
raise last_exc
|
|
57
|
+
return wrapper
|
|
58
|
+
return decorator
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
from .stellar_search import *
|
|
2
|
-
from .felo_search import *
|
|
3
|
-
from .DeepFind import *
|
|
4
|
-
from .genspark_search import *
|
|
5
|
-
from .monica_search import *
|
|
6
|
-
from .webpilotai_search import *
|
|
7
|
-
from .hika_search import *
|
|
8
|
-
from .scira_search import *
|
|
9
|
-
from .iask_search import *
|
|
10
|
-
from .Perplexity import *
|
|
1
|
+
from .stellar_search import *
|
|
2
|
+
from .felo_search import *
|
|
3
|
+
from .DeepFind import *
|
|
4
|
+
from .genspark_search import *
|
|
5
|
+
from .monica_search import *
|
|
6
|
+
from .webpilotai_search import *
|
|
7
|
+
from .hika_search import *
|
|
8
|
+
from .scira_search import *
|
|
9
|
+
from .iask_search import *
|
|
10
|
+
from .Perplexity import *
|
|
11
|
+
# from .PERPLEXED_search import *
|
|
@@ -69,7 +69,7 @@ class Felo(AISearch):
|
|
|
69
69
|
"accept-encoding": "gzip, deflate, br, zstd",
|
|
70
70
|
"accept-language": "en-US,en;q=0.9,en-IN;q=0.8",
|
|
71
71
|
"content-type": "application/json",
|
|
72
|
-
"cookie": "_clck=1gifk45%7C2%7Cfoa%7C0%7C1686; _clsk=1g5lv07%7C1723558310439%7C1%7C1%7Cu.clarity.ms%2Fcollect; _ga=GA1.1.877307181.1723558313; _ga_8SZPRV97HV=GS1.1.1723558313.1.1.1723558341.0.0.0; _ga_Q9Q1E734CC=GS1.1.1723558313.1.1.1723558341.0.0.0",
|
|
72
|
+
# "cookie": "_clck=1gifk45%7C2%7Cfoa%7C0%7C1686; _clsk=1g5lv07%7C1723558310439%7C1%7C1%7Cu.clarity.ms%2Fcollect; _ga=GA1.1.877307181.1723558313; _ga_8SZPRV97HV=GS1.1.1723558313.1.1.1723558341.0.0.0; _ga_Q9Q1E734CC=GS1.1.1723558313.1.1.1723558341.0.0.0",
|
|
73
73
|
"dnt": "1",
|
|
74
74
|
"origin": "https://felo.ai",
|
|
75
75
|
"referer": "https://felo.ai/",
|
|
@@ -141,10 +141,14 @@ class Felo(AISearch):
|
|
|
141
141
|
"lang": "",
|
|
142
142
|
"agent_lang": "en",
|
|
143
143
|
"search_options": {
|
|
144
|
-
"langcode": "en-US"
|
|
144
|
+
"langcode": "en-US",
|
|
145
|
+
"search_image": True,
|
|
146
|
+
"search_video": True,
|
|
145
147
|
},
|
|
146
148
|
"search_video": True,
|
|
147
|
-
"
|
|
149
|
+
"model": "",
|
|
150
|
+
"contexts_from": "google",
|
|
151
|
+
"auto_routing": True,
|
|
148
152
|
}
|
|
149
153
|
|
|
150
154
|
def for_stream():
|
|
@@ -67,6 +67,8 @@ class Scira(AISearch):
|
|
|
67
67
|
"scira-opus": "claude-4-opus-20250514",
|
|
68
68
|
"scira-opus-pro": "claude-4-opus-20250514",
|
|
69
69
|
"scira-llama-4": "meta-llama/llama-4-maverick-17b-128e-instruct",
|
|
70
|
+
"scira-kimi-k2": "kimi-k2-instruct",
|
|
71
|
+
"kimi-k2-instruct": "scira-kimi-k2",
|
|
70
72
|
}
|
|
71
73
|
def __init__(
|
|
72
74
|
self,
|
|
@@ -53,7 +53,12 @@ class Stellar(AISearch):
|
|
|
53
53
|
|
|
54
54
|
@staticmethod
|
|
55
55
|
def _stellar_extractor(chunk: Union[str, bytes, Dict[str, Any]]) -> Optional[str]:
|
|
56
|
-
"""
|
|
56
|
+
"""
|
|
57
|
+
Extracts content from the Stellar stream format with focused pattern matching.
|
|
58
|
+
|
|
59
|
+
Prioritizes the primary diff pattern to avoid duplication and focuses on
|
|
60
|
+
incremental content building from stellar.chatastra.ai streaming response.
|
|
61
|
+
"""
|
|
57
62
|
if isinstance(chunk, bytes):
|
|
58
63
|
try:
|
|
59
64
|
chunk = chunk.decode('utf-8', errors='replace')
|
|
@@ -61,14 +66,54 @@ class Stellar(AISearch):
|
|
|
61
66
|
return None
|
|
62
67
|
if not isinstance(chunk, str):
|
|
63
68
|
return None
|
|
64
|
-
|
|
65
|
-
pattern
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
|
|
70
|
+
# Primary pattern: Hex key diff format (most reliable for streaming)
|
|
71
|
+
# Matches: 16:{"diff":[0,"AI"],"next":"$@18"}
|
|
72
|
+
primary_pattern = r'[0-9a-f]+:\{"diff":\[0,"([^"]*?)"\]'
|
|
73
|
+
primary_matches = re.findall(primary_pattern, chunk)
|
|
74
|
+
|
|
75
|
+
if primary_matches:
|
|
76
|
+
# Join the matches and clean up
|
|
77
|
+
extracted_text = ''.join(primary_matches)
|
|
78
|
+
|
|
79
|
+
# Handle escape sequences properly
|
|
80
|
+
extracted_text = extracted_text.replace('\\n', '\n')
|
|
81
|
+
extracted_text = extracted_text.replace('\\r', '\r')
|
|
82
|
+
extracted_text = extracted_text.replace('\\"', '"')
|
|
83
|
+
extracted_text = extracted_text.replace('\\t', '\t')
|
|
84
|
+
extracted_text = extracted_text.replace('\\/', '/')
|
|
85
|
+
extracted_text = extracted_text.replace('\\\\', '\\')
|
|
86
|
+
|
|
87
|
+
# Clean up markdown formatting
|
|
88
|
+
extracted_text = extracted_text.replace('\\*', '*')
|
|
89
|
+
extracted_text = extracted_text.replace('\\#', '#')
|
|
90
|
+
extracted_text = extracted_text.replace('\\[', '[')
|
|
91
|
+
extracted_text = extracted_text.replace('\\]', ']')
|
|
92
|
+
extracted_text = extracted_text.replace('\\(', '(')
|
|
93
|
+
extracted_text = extracted_text.replace('\\)', ')')
|
|
94
|
+
|
|
71
95
|
return extracted_text if extracted_text.strip() else None
|
|
96
|
+
|
|
97
|
+
# # Fallback: Look for Ta24 content blocks (complete responses)
|
|
98
|
+
# if ':Ta24,' in chunk:
|
|
99
|
+
# ta24_pattern = r':Ta24,([^}]*?)(?:\d+:|$)'
|
|
100
|
+
# ta24_matches = re.findall(ta24_pattern, chunk)
|
|
101
|
+
# if ta24_matches:
|
|
102
|
+
# extracted_text = ''.join(ta24_matches)
|
|
103
|
+
# # Basic cleanup
|
|
104
|
+
# extracted_text = extracted_text.replace('\\n', '\n')
|
|
105
|
+
# extracted_text = extracted_text.replace('\\"', '"')
|
|
106
|
+
# return extracted_text.strip() if extracted_text.strip() else None
|
|
107
|
+
|
|
108
|
+
# # Secondary fallback: Direct diff patterns without hex prefix
|
|
109
|
+
# fallback_pattern = r'\{"diff":\[0,"([^"]*?)"\]'
|
|
110
|
+
# fallback_matches = re.findall(fallback_pattern, chunk)
|
|
111
|
+
# if fallback_matches:
|
|
112
|
+
# extracted_text = ''.join(fallback_matches)
|
|
113
|
+
# extracted_text = extracted_text.replace('\\n', '\n')
|
|
114
|
+
# extracted_text = extracted_text.replace('\\"', '"')
|
|
115
|
+
# return extracted_text if extracted_text.strip() else None
|
|
116
|
+
|
|
72
117
|
return None
|
|
73
118
|
|
|
74
119
|
def search(self, prompt: str, stream: bool = False, raw: bool = False) -> Union[SearchResponse, Generator[Union[Dict[str, str], SearchResponse, str], None, None]]:
|
|
@@ -18,8 +18,13 @@ class DeepInfra(Provider):
|
|
|
18
18
|
|
|
19
19
|
AVAILABLE_MODELS = [
|
|
20
20
|
"anthropic/claude-4-opus",
|
|
21
|
+
"moonshotai/Kimi-K2-Instruct",
|
|
21
22
|
"anthropic/claude-4-sonnet",
|
|
22
23
|
"deepseek-ai/DeepSeek-R1-0528-Turbo",
|
|
24
|
+
"Qwen/Qwen3-235B-A22B-Thinking-2507",
|
|
25
|
+
"Qwen/Qwen3-Coder-480B-A35B-Instruct",
|
|
26
|
+
"Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo",
|
|
27
|
+
"Qwen/Qwen3-235B-A22B-Instruct-2507",
|
|
23
28
|
"Qwen/Qwen3-235B-A22B",
|
|
24
29
|
"Qwen/Qwen3-30B-A3B",
|
|
25
30
|
"Qwen/Qwen3-32B",
|
|
@@ -71,6 +76,7 @@ class DeepInfra(Provider):
|
|
|
71
76
|
"meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",
|
|
72
77
|
"microsoft/WizardLM-2-8x22B",
|
|
73
78
|
"mistralai/Devstral-Small-2505",
|
|
79
|
+
"mistralai/Devstral-Small-2507",
|
|
74
80
|
"mistralai/Mistral-7B-Instruct-v0.3",
|
|
75
81
|
"mistralai/Mistral-Nemo-Instruct-2407",
|
|
76
82
|
"mistralai/Mistral-Small-24B-Instruct-2501",
|
|
@@ -339,7 +345,7 @@ if __name__ == "__main__":
|
|
|
339
345
|
|
|
340
346
|
for model in DeepInfra.AVAILABLE_MODELS:
|
|
341
347
|
try:
|
|
342
|
-
test_ai = DeepInfra(model=model, timeout=60,
|
|
348
|
+
test_ai = DeepInfra(model=model, timeout=60,)
|
|
343
349
|
response = test_ai.chat("Say 'Hello' in one word", stream=True)
|
|
344
350
|
response_text = ""
|
|
345
351
|
for chunk in response:
|