webscout 2025.10.17__tar.gz → 2025.10.18__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-2025.10.17/webscout.egg-info → webscout-2025.10.18}/PKG-INFO +1 -1
- {webscout-2025.10.17 → webscout-2025.10.18}/changelog.md +0 -0
- webscout-2025.10.18/webscout/Provider/Gradient.py +231 -0
- webscout-2025.10.18/webscout/Provider/TogetherAI.py +297 -0
- webscout-2025.10.18/webscout/version.py +2 -0
- {webscout-2025.10.17 → webscout-2025.10.18/webscout.egg-info}/PKG-INFO +1 -1
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout.egg-info/SOURCES.txt +2 -0
- webscout-2025.10.17/webscout/Provider/TogetherAI.py +0 -357
- webscout-2025.10.17/webscout/version.py.bak +0 -2
- {webscout-2025.10.17 → webscout-2025.10.18}/LEGAL_NOTICE.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/LICENSE.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/MANIFEST.in +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/README.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/pyproject.toml +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/setup.cfg +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/AIauto.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/AIbase.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/AIutel.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Bard.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/Act.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/GitToolkit/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/GitToolkit/gitapi/README.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/GitToolkit/gitapi/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/GitToolkit/gitapi/repository.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/GitToolkit/gitapi/user.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/GitToolkit/gitapi/utils.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/README.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/YTdownloader.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/transcriber.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/README.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/channel.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/errors.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/extras.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/https.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/patterns.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/playlist.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/pool.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/query.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/stream.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/utils.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/video.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/autocoder/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/autocoder/autocoder.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/autocoder/autocoder_utiles.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/gguf.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/gguf.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/README.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/async_utils.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/base.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/cli.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/emailnator.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/mail_tm.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/temp_mail_io.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/weather.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/weather_ascii.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Litlogger/README.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Litlogger/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Litlogger/formats.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Litlogger/handlers.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Litlogger/levels.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Litlogger/logger.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/PERPLEXED_search.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/Perplexity.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/README.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/felo_search.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/genspark_search.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/hika_search.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/iask_search.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/monica_search.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/scira_search.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/stellar_search.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/webpilotai_search.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Aitopia.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Andi.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Apriel.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/ChatGPTClone.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/ChatSandbox.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/ClaudeOnline.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Cloudflare.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Cohere.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Deepinfra.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/ExaAI.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/ExaChat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Flowith.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/GMI.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Gemini.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/GeminiProxy.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/GithubChat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Groq.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/HeckAI.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Jadve.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/K2Think.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Koboldai.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/LambdaChat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Nemotron.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Netwrck.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OLLAMA.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/Cloudflare.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/FalconH1.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/FreeGemini.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/GeminiProxy.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/K2Think.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/NEMOTRON.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/PI.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/README.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/TogetherAI.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/TwoAI.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/ai4chat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/base.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/chatglm.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/chatgpt.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/chatgptclone.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/chatsandbox.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/deepinfra.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/e2b.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/exaai.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/exachat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/flowith.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/friendli.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/generate_api_key.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/gmi.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/groq.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/heckai.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/llmchatco.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/netwrck.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/oivscode.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/opkfc.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/pydantic_imports.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/scirachat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/sonus.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/standardinput.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/textpollinations.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/toolbaz.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/typefully.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/utils.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/venice.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/wisecat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/writecream.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/x0gpt.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/yep.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OpenGPT.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Openai.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/PI.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Perplexitylabs.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/QwenLM.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/STT/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/STT/base.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/STT/elevenlabs.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Sambanova.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/StandardInput.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/README.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/aiarta.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/base.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/bing.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/claudeonline.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/gpt1image.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/imagen.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/infip.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/magicstudio.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/monochat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/piclumen.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/pixelmuse.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/pollinations.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/together.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/utils.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/venice.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/README.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/base.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/deepgram.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/elevenlabs.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/freetts.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/gesserit.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/murfai.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/openai_fm.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/parler.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/speechma.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/streamElements.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/utils.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TeachAnything.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TextPollinationsAI.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TwoAI.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TypliAI.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/ChatHub.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/ChutesAI.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/GizAI.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/Marcus.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/Qodo.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/VercelAIGateway.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/XenAI.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/Youchat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/liner.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/liner_api_request.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/puterjs.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/samurai.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/test_lmarena.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Venice.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/VercelAI.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/WiseCat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/WrDoChat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/ai4chat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/akashgpt.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/cerebras.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/chatglm.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/cleeai.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/deepseek_assistant.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/elmo.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/geminiapi.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/granite.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/hermes.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/julius.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/learnfastai.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/llama3mitril.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/llmchat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/llmchatco.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/meta.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/oivscode.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/scira_chat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/searchchat.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/sonus.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/toolbaz.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/turboseek.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/typefully.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/x0gpt.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/yep.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/__main__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/cli.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/client.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/conversation.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/exceptions.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/litagent/Readme.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/litagent/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/litagent/agent.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/litagent/constants.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/litprinter/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/models.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/optimizers.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/prompt_manager.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/sanitize.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/README.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/core/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/core/crawler.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/core/scout.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/core/search_result.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/core/text_analyzer.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/core/text_utils.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/core/web_analyzer.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/element.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/parsers/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/parsers/html5lib_parser.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/parsers/html_parser.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/parsers/lxml_parser.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/utils.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/base.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/bing_main.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/duckduckgo_main.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/bing/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/bing/base.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/bing/images.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/bing/news.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/bing/suggestions.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/bing/text.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/brave.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/answers.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/base.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/images.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/maps.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/news.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/suggestions.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/text.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/translate.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/videos.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/weather.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/mojeek.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/wikipedia.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/answers.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/base.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/images.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/maps.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/news.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/suggestions.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/text.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/translate.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/videos.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/weather.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yandex.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yep/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yep/base.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yep/images.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yep/suggestions.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yep/text.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/http_client.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/results.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/yahoo_main.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/yep_main.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/config.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/exceptions.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/providers.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/request_models.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/request_processing.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/routes.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/schemas.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/server.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/simple_logger.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/Readme.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/core/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/core/cli.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/core/context.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/core/group.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/decorators/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/decorators/command.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/decorators/options.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/decorators/output.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/exceptions.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/plugins/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/plugins/base.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/plugins/manager.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/utils/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/utils/formatting.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/utils/parsing.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/update_checker.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/utils.py +0 -0
- /webscout-2025.10.17/webscout/version.py → /webscout-2025.10.18/webscout/version.py.bak +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/zeroart/README.md +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/zeroart/__init__.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/zeroart/base.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/zeroart/effects.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout/zeroart/fonts.py +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout.egg-info/dependency_links.txt +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout.egg-info/entry_points.txt +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout.egg-info/requires.txt +0 -0
- {webscout-2025.10.17 → webscout-2025.10.18}/webscout.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: webscout
|
|
3
|
-
Version: 2025.10.
|
|
3
|
+
Version: 2025.10.18
|
|
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
|
|
Binary file
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Gradient Network Chat API Provider
|
|
3
|
+
Reverse engineered from https://chat.gradient.network/
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from curl_cffi.requests import Session
|
|
7
|
+
from curl_cffi import CurlError
|
|
8
|
+
from typing import Optional, Generator, Dict, Any, Union
|
|
9
|
+
|
|
10
|
+
from webscout.AIutel import Optimizers, Conversation, AwesomePrompts, sanitize_stream
|
|
11
|
+
from webscout.AIbase import Provider
|
|
12
|
+
from webscout import exceptions
|
|
13
|
+
from webscout.litagent import LitAgent
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Gradient(Provider):
|
|
17
|
+
"""
|
|
18
|
+
Provider for Gradient Network chat API
|
|
19
|
+
Supports real-time streaming responses from distributed GPU clusters
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
required_auth = False
|
|
23
|
+
AVAILABLE_MODELS = [
|
|
24
|
+
"GPT-OSS-120B",
|
|
25
|
+
"Qwen3-235B",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
model: str = "GPT-OSS-120B",
|
|
31
|
+
is_conversation: bool = True,
|
|
32
|
+
max_tokens: int = 2049,
|
|
33
|
+
timeout: int = 30,
|
|
34
|
+
intro: str = None,
|
|
35
|
+
filepath: str = None,
|
|
36
|
+
update_file: bool = True,
|
|
37
|
+
proxies: dict = {},
|
|
38
|
+
history_offset: int = 10250,
|
|
39
|
+
act: str = None,
|
|
40
|
+
system_prompt: str = "You are a helpful assistant.",
|
|
41
|
+
cluster_mode: str = "nvidia",
|
|
42
|
+
enable_thinking: bool = True,
|
|
43
|
+
):
|
|
44
|
+
if model not in self.AVAILABLE_MODELS:
|
|
45
|
+
raise ValueError(f"Invalid model: {model}. Choose from: {self.AVAILABLE_MODELS}")
|
|
46
|
+
|
|
47
|
+
self.model = model
|
|
48
|
+
self.is_conversation = is_conversation
|
|
49
|
+
self.max_tokens_to_sample = max_tokens
|
|
50
|
+
self.timeout = timeout
|
|
51
|
+
self.proxies = proxies
|
|
52
|
+
self.system_prompt = system_prompt
|
|
53
|
+
self.cluster_mode = cluster_mode
|
|
54
|
+
self.enable_thinking = enable_thinking
|
|
55
|
+
|
|
56
|
+
self.session = Session()
|
|
57
|
+
self.session.proxies = proxies
|
|
58
|
+
|
|
59
|
+
self.agent = LitAgent()
|
|
60
|
+
self.fingerprint = self.agent.generate_fingerprint("chrome")
|
|
61
|
+
|
|
62
|
+
self.headers = {
|
|
63
|
+
"User-Agent": self.fingerprint.get("user_agent", ""),
|
|
64
|
+
"Accept": "*/*",
|
|
65
|
+
"Accept-Language": self.fingerprint.get("accept_language", ""),
|
|
66
|
+
"Content-Type": "application/json",
|
|
67
|
+
"Origin": "https://chat.gradient.network",
|
|
68
|
+
"Referer": "https://chat.gradient.network/",
|
|
69
|
+
"Sec-Fetch-Dest": "empty",
|
|
70
|
+
"Sec-Fetch-Mode": "cors",
|
|
71
|
+
"Sec-Fetch-Site": "same-origin",
|
|
72
|
+
}
|
|
73
|
+
self.session.headers.update(self.headers)
|
|
74
|
+
|
|
75
|
+
self.__available_optimizers = (
|
|
76
|
+
method
|
|
77
|
+
for method in dir(Optimizers)
|
|
78
|
+
if callable(getattr(Optimizers, method)) and not method.startswith("__")
|
|
79
|
+
)
|
|
80
|
+
Conversation.intro = (
|
|
81
|
+
AwesomePrompts().get_act(
|
|
82
|
+
act, raise_not_found=True, default=None, case_insensitive=True
|
|
83
|
+
)
|
|
84
|
+
if act
|
|
85
|
+
else intro or Conversation.intro
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
self.conversation = Conversation(
|
|
89
|
+
is_conversation, self.max_tokens_to_sample, filepath, update_file
|
|
90
|
+
)
|
|
91
|
+
self.conversation.history_offset = history_offset
|
|
92
|
+
|
|
93
|
+
def ask(
|
|
94
|
+
self,
|
|
95
|
+
prompt: str,
|
|
96
|
+
stream: bool = False,
|
|
97
|
+
raw: bool = False,
|
|
98
|
+
optimizer: str = None,
|
|
99
|
+
conversationally: bool = False,
|
|
100
|
+
) -> Union[Dict[str, Any], Generator]:
|
|
101
|
+
conversation_prompt = self.conversation.gen_complete_prompt(prompt)
|
|
102
|
+
if optimizer:
|
|
103
|
+
if optimizer in self.__available_optimizers:
|
|
104
|
+
conversation_prompt = getattr(Optimizers, optimizer)(
|
|
105
|
+
conversation_prompt if conversationally else prompt
|
|
106
|
+
)
|
|
107
|
+
else:
|
|
108
|
+
raise Exception(f"Optimizer is not one of {self.__available_optimizers}")
|
|
109
|
+
|
|
110
|
+
messages = [
|
|
111
|
+
{"role": "system", "content": self.system_prompt},
|
|
112
|
+
{"role": "user", "content": conversation_prompt},
|
|
113
|
+
]
|
|
114
|
+
|
|
115
|
+
payload = {
|
|
116
|
+
"model": self.model,
|
|
117
|
+
"clusterMode": self.cluster_mode,
|
|
118
|
+
"messages": messages,
|
|
119
|
+
"enableThinking": self.enable_thinking,
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
def for_stream():
|
|
123
|
+
streaming_text = ""
|
|
124
|
+
try:
|
|
125
|
+
response = self.session.post(
|
|
126
|
+
"https://chat.gradient.network/api/generate",
|
|
127
|
+
json=payload,
|
|
128
|
+
stream=True,
|
|
129
|
+
timeout=self.timeout,
|
|
130
|
+
impersonate="chrome110",
|
|
131
|
+
)
|
|
132
|
+
response.raise_for_status()
|
|
133
|
+
|
|
134
|
+
processed_stream = sanitize_stream(
|
|
135
|
+
data=response.iter_content(chunk_size=None),
|
|
136
|
+
intro_value=None,
|
|
137
|
+
to_json=True,
|
|
138
|
+
skip_markers=[],
|
|
139
|
+
content_extractor=self._Gradient_extractor,
|
|
140
|
+
yield_raw_on_error=False,
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
for content_chunk in processed_stream:
|
|
144
|
+
if content_chunk and isinstance(content_chunk, str):
|
|
145
|
+
streaming_text += content_chunk
|
|
146
|
+
resp = dict(text=content_chunk)
|
|
147
|
+
yield resp if not raw else content_chunk
|
|
148
|
+
|
|
149
|
+
except CurlError as e:
|
|
150
|
+
raise exceptions.FailedToGenerateResponseError(f"Request failed (CurlError): {str(e)}") from e
|
|
151
|
+
except Exception as e:
|
|
152
|
+
raise exceptions.FailedToGenerateResponseError(f"Request failed ({type(e).__name__}): {str(e)}") from e
|
|
153
|
+
finally:
|
|
154
|
+
if streaming_text:
|
|
155
|
+
self.last_response = {"text": streaming_text}
|
|
156
|
+
self.conversation.update_chat_history(prompt, streaming_text)
|
|
157
|
+
|
|
158
|
+
def for_non_stream():
|
|
159
|
+
try:
|
|
160
|
+
full_response = ""
|
|
161
|
+
for chunk in for_stream():
|
|
162
|
+
full_response += self.get_message(chunk)
|
|
163
|
+
|
|
164
|
+
self.last_response = {"text": full_response}
|
|
165
|
+
self.conversation.update_chat_history(prompt, full_response)
|
|
166
|
+
return self.last_response if not raw else full_response
|
|
167
|
+
|
|
168
|
+
except Exception as e:
|
|
169
|
+
raise exceptions.FailedToGenerateResponseError(f"Request failed ({type(e).__name__}): {str(e)}") from e
|
|
170
|
+
|
|
171
|
+
return for_stream() if stream else for_non_stream()
|
|
172
|
+
|
|
173
|
+
def chat(
|
|
174
|
+
self,
|
|
175
|
+
prompt: str,
|
|
176
|
+
stream: bool = False,
|
|
177
|
+
optimizer: str = None,
|
|
178
|
+
conversationally: bool = False,
|
|
179
|
+
) -> Union[str, Generator[str, None, None]]:
|
|
180
|
+
def for_stream_chat():
|
|
181
|
+
gen = self.ask(
|
|
182
|
+
prompt, stream=True, raw=False,
|
|
183
|
+
optimizer=optimizer, conversationally=conversationally
|
|
184
|
+
)
|
|
185
|
+
for response_dict in gen:
|
|
186
|
+
yield self.get_message(response_dict)
|
|
187
|
+
|
|
188
|
+
def for_non_stream_chat():
|
|
189
|
+
response_data = self.ask(
|
|
190
|
+
prompt, stream=False, raw=False,
|
|
191
|
+
optimizer=optimizer, conversationally=conversationally
|
|
192
|
+
)
|
|
193
|
+
return self.get_message(response_data)
|
|
194
|
+
|
|
195
|
+
return for_stream_chat() if stream else for_non_stream_chat()
|
|
196
|
+
|
|
197
|
+
def get_message(self, response: dict) -> str:
|
|
198
|
+
assert isinstance(response, dict), "Response should be of dict data-type only"
|
|
199
|
+
return response.get("text", "")
|
|
200
|
+
|
|
201
|
+
@staticmethod
|
|
202
|
+
def _Gradient_extractor(chunk: Union[str, Dict[str, Any]]) -> Optional[str]:
|
|
203
|
+
if isinstance(chunk, dict):
|
|
204
|
+
chunk_type = chunk.get("type")
|
|
205
|
+
if chunk_type == "reply":
|
|
206
|
+
return chunk.get("data", {}).get("reasoningContent", "")
|
|
207
|
+
return None
|
|
208
|
+
|
|
209
|
+
if __name__ == "__main__":
|
|
210
|
+
print("-" * 80)
|
|
211
|
+
print(f"{'Model':<50} {'Status':<10} {'Response'}")
|
|
212
|
+
print("-" * 80)
|
|
213
|
+
|
|
214
|
+
for model in Gradient.AVAILABLE_MODELS:
|
|
215
|
+
try:
|
|
216
|
+
test_ai = Gradient(model=model, timeout=60)
|
|
217
|
+
response = test_ai.chat("Say 'Hello' in one word", stream=True)
|
|
218
|
+
response_text = ""
|
|
219
|
+
for chunk in response:
|
|
220
|
+
response_text += chunk
|
|
221
|
+
|
|
222
|
+
if response_text and len(response_text.strip()) > 0:
|
|
223
|
+
status = "v"
|
|
224
|
+
clean_text = response_text.strip().encode('utf-8', errors='ignore').decode('utf-8')
|
|
225
|
+
display_text = clean_text[:50] + "..." if len(clean_text) > 50 else clean_text
|
|
226
|
+
else:
|
|
227
|
+
status = "x"
|
|
228
|
+
display_text = "Empty or invalid response"
|
|
229
|
+
print(f"\r{model:<50} {status:<10} {display_text}")
|
|
230
|
+
except Exception as e:
|
|
231
|
+
print(f"\r{model:<50} {'x':<10} {str(e)}")
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
from curl_cffi.requests import Session
|
|
2
|
+
from curl_cffi import CurlError
|
|
3
|
+
import json
|
|
4
|
+
from typing import Any, Dict, Optional, Generator, Union
|
|
5
|
+
from webscout.AIutel import Optimizers
|
|
6
|
+
from webscout.AIutel import Conversation
|
|
7
|
+
from webscout.AIutel import AwesomePrompts, sanitize_stream
|
|
8
|
+
from webscout.AIbase import Provider
|
|
9
|
+
from webscout import exceptions
|
|
10
|
+
from webscout.litagent import LitAgent
|
|
11
|
+
|
|
12
|
+
class TogetherAI(Provider):
|
|
13
|
+
"""
|
|
14
|
+
A class to interact with the Together AI Chat API (https://chat.together.ai/).
|
|
15
|
+
Uses the chat interface API endpoint with model UUIDs.
|
|
16
|
+
"""
|
|
17
|
+
required_auth = False
|
|
18
|
+
AVAILABLE_MODELS = {
|
|
19
|
+
"DeepSeek R1 (0528)": "dc11fae1-a7a2-4bed-9bd5-bd31bd8f5053",
|
|
20
|
+
"DeepSeek V3 (0324)": "3e26fb3e-5b59-454d-b4af-dcd10d8c91a4",
|
|
21
|
+
"GPT OSS 120B": "34dd95c6-5b8b-42f8-b7a9-99cc01b27a39",
|
|
22
|
+
"Kimi K2 Instruct (0905)": "e91f96e5-fc2f-4e15-95af-43edaa1c6549",
|
|
23
|
+
"Qwen3 Coder 480B": "4fbbacb9-2b02-42db-827e-4c4dd6e12f84",
|
|
24
|
+
"GLM-4.5-Air": "37fb891c-1c2c-43f5-8cc0-f2a80b1f4a36",
|
|
25
|
+
"Llama 4 Maverick": "84b39408-ac91-43a0-a2f0-6e4fb72e9800",
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@staticmethod
|
|
29
|
+
def _together_ai_extractor(chunk: Union[str, Dict[str, Any]]) -> Optional[str]:
|
|
30
|
+
"""Extracts content from Together AI stream JSON objects."""
|
|
31
|
+
if isinstance(chunk, dict):
|
|
32
|
+
# Extract from streaming response format
|
|
33
|
+
choices = chunk.get("choices", [])
|
|
34
|
+
if choices and len(choices) > 0:
|
|
35
|
+
delta = choices[0].get("delta", {})
|
|
36
|
+
if isinstance(delta, dict):
|
|
37
|
+
return delta.get("content")
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
def __init__(
|
|
41
|
+
self,
|
|
42
|
+
api_key: Optional[str] = None,
|
|
43
|
+
is_conversation: bool = True,
|
|
44
|
+
max_tokens: int = 2049,
|
|
45
|
+
timeout: int = 30,
|
|
46
|
+
intro: str = None,
|
|
47
|
+
filepath: str = None,
|
|
48
|
+
update_file: bool = True,
|
|
49
|
+
proxies: dict = {},
|
|
50
|
+
history_offset: int = 10250,
|
|
51
|
+
act: str = None,
|
|
52
|
+
model: str = "DeepSeek R1 (0528)",
|
|
53
|
+
system_prompt: str = "You are a helpful assistant.",
|
|
54
|
+
temperature: float = 0.6,
|
|
55
|
+
top_p: float = 0.95,
|
|
56
|
+
browser: str = "chrome"
|
|
57
|
+
):
|
|
58
|
+
"""Initializes the Together AI chat client."""
|
|
59
|
+
if model not in self.AVAILABLE_MODELS:
|
|
60
|
+
raise ValueError(f"Invalid model: {model}. Choose from: {list(self.AVAILABLE_MODELS.keys())}")
|
|
61
|
+
|
|
62
|
+
self.url = "https://chat.together.ai/api/chat-completion"
|
|
63
|
+
self.model_name = model
|
|
64
|
+
self.model_id = self.AVAILABLE_MODELS[model]
|
|
65
|
+
self.temperature = temperature
|
|
66
|
+
self.top_p = top_p
|
|
67
|
+
|
|
68
|
+
# Initialize LitAgent
|
|
69
|
+
self.agent = LitAgent()
|
|
70
|
+
self.fingerprint = self.agent.generate_fingerprint(browser)
|
|
71
|
+
self.api = api_key
|
|
72
|
+
|
|
73
|
+
# Setup headers
|
|
74
|
+
self.headers = {
|
|
75
|
+
"Accept": self.fingerprint["accept"],
|
|
76
|
+
"Accept-Language": self.fingerprint["accept_language"],
|
|
77
|
+
"Content-Type": "application/json",
|
|
78
|
+
"Cache-Control": "no-cache",
|
|
79
|
+
"Origin": "https://chat.together.ai",
|
|
80
|
+
"Pragma": "no-cache",
|
|
81
|
+
"Referer": "https://chat.together.ai/",
|
|
82
|
+
"Sec-Fetch-Dest": "empty",
|
|
83
|
+
"Sec-Fetch-Mode": "cors",
|
|
84
|
+
"Sec-Fetch-Site": "same-origin",
|
|
85
|
+
"User-Agent": self.fingerprint.get("user_agent", ""),
|
|
86
|
+
"Sec-CH-UA": self.fingerprint.get("sec_ch_ua", ""),
|
|
87
|
+
"Sec-CH-UA-Mobile": "?0",
|
|
88
|
+
"Sec-CH-UA-Platform": f'"{self.fingerprint.get("platform", "")}"',
|
|
89
|
+
"X-Forwarded-For": self.fingerprint.get("x-forwarded-for", ""),
|
|
90
|
+
"X-Real-IP": self.fingerprint.get("x-real-ip", ""),
|
|
91
|
+
"X-Client-IP": self.fingerprint.get("x-client-ip", ""),
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if self.api is not None:
|
|
95
|
+
self.headers["Authorization"] = f"Bearer {self.api}"
|
|
96
|
+
|
|
97
|
+
# Initialize curl_cffi Session
|
|
98
|
+
self.session = Session()
|
|
99
|
+
self.session.headers.update(self.headers)
|
|
100
|
+
self.session.proxies = proxies
|
|
101
|
+
self.system_prompt = system_prompt
|
|
102
|
+
self.is_conversation = is_conversation
|
|
103
|
+
self.max_tokens_to_sample = max_tokens
|
|
104
|
+
self.timeout = timeout
|
|
105
|
+
self.last_response = {}
|
|
106
|
+
|
|
107
|
+
self.__available_optimizers = (
|
|
108
|
+
method
|
|
109
|
+
for method in dir(Optimizers)
|
|
110
|
+
if callable(getattr(Optimizers, method)) and not method.startswith("__")
|
|
111
|
+
)
|
|
112
|
+
Conversation.intro = (
|
|
113
|
+
AwesomePrompts().get_act(
|
|
114
|
+
act, raise_not_found=True, default=None, case_insensitive=True
|
|
115
|
+
)
|
|
116
|
+
if act
|
|
117
|
+
else intro or Conversation.intro
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
self.conversation = Conversation(
|
|
121
|
+
is_conversation, self.max_tokens_to_sample, filepath, update_file
|
|
122
|
+
)
|
|
123
|
+
self.conversation.history_offset = history_offset
|
|
124
|
+
|
|
125
|
+
def refresh_identity(self, browser: str = None):
|
|
126
|
+
"""
|
|
127
|
+
Refreshes the browser identity fingerprint.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
browser: Specific browser to use for the new fingerprint
|
|
131
|
+
"""
|
|
132
|
+
browser = browser or self.fingerprint.get("browser_type", "chrome")
|
|
133
|
+
self.fingerprint = self.agent.generate_fingerprint(browser)
|
|
134
|
+
|
|
135
|
+
# Update headers with new fingerprint
|
|
136
|
+
self.headers.update({
|
|
137
|
+
"Accept": self.fingerprint["accept"],
|
|
138
|
+
"Accept-Language": self.fingerprint["accept_language"],
|
|
139
|
+
"User-Agent": self.fingerprint.get("user_agent", ""),
|
|
140
|
+
"Sec-CH-UA": self.fingerprint.get("sec_ch_ua", ""),
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
self.session.headers.update(self.headers)
|
|
144
|
+
return self.fingerprint
|
|
145
|
+
|
|
146
|
+
def ask(
|
|
147
|
+
self,
|
|
148
|
+
prompt: str,
|
|
149
|
+
stream: bool = False,
|
|
150
|
+
raw: bool = False,
|
|
151
|
+
optimizer: str = None,
|
|
152
|
+
conversationally: bool = False,
|
|
153
|
+
) -> Union[Dict[str, Any], Generator]:
|
|
154
|
+
conversation_prompt = self.conversation.gen_complete_prompt(prompt)
|
|
155
|
+
if optimizer:
|
|
156
|
+
if optimizer in self.__available_optimizers:
|
|
157
|
+
conversation_prompt = getattr(Optimizers, optimizer)(
|
|
158
|
+
conversation_prompt if conversationally else prompt
|
|
159
|
+
)
|
|
160
|
+
else:
|
|
161
|
+
raise Exception(f"Optimizer is not one of {self.__available_optimizers}")
|
|
162
|
+
|
|
163
|
+
# Payload construction
|
|
164
|
+
payload = {
|
|
165
|
+
"modelId": self.model_id,
|
|
166
|
+
"temperature": self.temperature,
|
|
167
|
+
"topP": self.top_p,
|
|
168
|
+
"messages": [
|
|
169
|
+
{"role": "system", "content": self.system_prompt},
|
|
170
|
+
{"role": "user", "content": conversation_prompt},
|
|
171
|
+
],
|
|
172
|
+
"stream": stream,
|
|
173
|
+
"maxTokens": self.max_tokens_to_sample,
|
|
174
|
+
"options": {}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
def for_stream():
|
|
178
|
+
streaming_text = ""
|
|
179
|
+
try:
|
|
180
|
+
response = self.session.post(
|
|
181
|
+
self.url,
|
|
182
|
+
data=json.dumps(payload),
|
|
183
|
+
stream=True,
|
|
184
|
+
timeout=self.timeout,
|
|
185
|
+
impersonate="chrome110"
|
|
186
|
+
)
|
|
187
|
+
response.raise_for_status()
|
|
188
|
+
|
|
189
|
+
processed_stream = sanitize_stream(
|
|
190
|
+
data=response.iter_content(chunk_size=None),
|
|
191
|
+
intro_value="data:",
|
|
192
|
+
to_json=True,
|
|
193
|
+
skip_markers=["[DONE]"],
|
|
194
|
+
content_extractor=self._together_ai_extractor,
|
|
195
|
+
yield_raw_on_error=False
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
for content_chunk in processed_stream:
|
|
199
|
+
if content_chunk and isinstance(content_chunk, str):
|
|
200
|
+
streaming_text += content_chunk
|
|
201
|
+
resp = dict(text=content_chunk)
|
|
202
|
+
yield resp if not raw else content_chunk
|
|
203
|
+
|
|
204
|
+
except CurlError as e:
|
|
205
|
+
raise exceptions.FailedToGenerateResponseError(f"Request failed (CurlError): {str(e)}") from e
|
|
206
|
+
except Exception as e:
|
|
207
|
+
raise exceptions.FailedToGenerateResponseError(f"Request failed ({type(e).__name__}): {str(e)}") from e
|
|
208
|
+
finally:
|
|
209
|
+
if streaming_text:
|
|
210
|
+
self.last_response = {"text": streaming_text}
|
|
211
|
+
self.conversation.update_chat_history(prompt, streaming_text)
|
|
212
|
+
|
|
213
|
+
def for_non_stream():
|
|
214
|
+
try:
|
|
215
|
+
response = self.session.post(
|
|
216
|
+
self.url,
|
|
217
|
+
data=json.dumps(payload),
|
|
218
|
+
timeout=self.timeout,
|
|
219
|
+
impersonate="chrome110"
|
|
220
|
+
)
|
|
221
|
+
response.raise_for_status()
|
|
222
|
+
|
|
223
|
+
response_text = response.text
|
|
224
|
+
|
|
225
|
+
processed_stream = sanitize_stream(
|
|
226
|
+
data=response_text,
|
|
227
|
+
to_json=True,
|
|
228
|
+
intro_value=None,
|
|
229
|
+
content_extractor=lambda chunk: chunk.get("choices", [{}])[0].get("message", {}).get("content") if isinstance(chunk, dict) else None,
|
|
230
|
+
yield_raw_on_error=False
|
|
231
|
+
)
|
|
232
|
+
content = next(processed_stream, None)
|
|
233
|
+
content = content if isinstance(content, str) else ""
|
|
234
|
+
|
|
235
|
+
self.last_response = {"text": content}
|
|
236
|
+
self.conversation.update_chat_history(prompt, content)
|
|
237
|
+
return self.last_response if not raw else content
|
|
238
|
+
|
|
239
|
+
except CurlError as e:
|
|
240
|
+
raise exceptions.FailedToGenerateResponseError(f"Request failed (CurlError): {e}") from e
|
|
241
|
+
except Exception as e:
|
|
242
|
+
err_text = getattr(e, 'response', None) and getattr(e.response, 'text', '')
|
|
243
|
+
raise exceptions.FailedToGenerateResponseError(f"Request failed ({type(e).__name__}): {e} - {err_text}") from e
|
|
244
|
+
|
|
245
|
+
return for_stream() if stream else for_non_stream()
|
|
246
|
+
|
|
247
|
+
def chat(
|
|
248
|
+
self,
|
|
249
|
+
prompt: str,
|
|
250
|
+
stream: bool = False,
|
|
251
|
+
optimizer: str = None,
|
|
252
|
+
conversationally: bool = False,
|
|
253
|
+
) -> Union[str, Generator[str, None, None]]:
|
|
254
|
+
def for_stream_chat():
|
|
255
|
+
gen = self.ask(
|
|
256
|
+
prompt, stream=True, raw=False,
|
|
257
|
+
optimizer=optimizer, conversationally=conversationally
|
|
258
|
+
)
|
|
259
|
+
for response_dict in gen:
|
|
260
|
+
yield self.get_message(response_dict)
|
|
261
|
+
|
|
262
|
+
def for_non_stream_chat():
|
|
263
|
+
response_data = self.ask(
|
|
264
|
+
prompt, stream=False, raw=False,
|
|
265
|
+
optimizer=optimizer, conversationally=conversationally
|
|
266
|
+
)
|
|
267
|
+
return self.get_message(response_data)
|
|
268
|
+
|
|
269
|
+
return for_stream_chat() if stream else for_non_stream_chat()
|
|
270
|
+
|
|
271
|
+
def get_message(self, response: dict) -> str:
|
|
272
|
+
assert isinstance(response, dict), "Response should be of dict data-type only"
|
|
273
|
+
return response["text"]
|
|
274
|
+
|
|
275
|
+
if __name__ == "__main__":
|
|
276
|
+
print("-" * 100)
|
|
277
|
+
print(f"{'Model':<50} {'Status':<10} {'Response'}")
|
|
278
|
+
print("-" * 100)
|
|
279
|
+
|
|
280
|
+
for model_name in TogetherAI.AVAILABLE_MODELS:
|
|
281
|
+
try:
|
|
282
|
+
test_ai = TogetherAI(model=model_name, timeout=60)
|
|
283
|
+
response = test_ai.chat("Say 'Hello' in one word", stream=True)
|
|
284
|
+
response_text = ""
|
|
285
|
+
for chunk in response:
|
|
286
|
+
response_text += chunk
|
|
287
|
+
|
|
288
|
+
if response_text and len(response_text.strip()) > 0:
|
|
289
|
+
status = "✓"
|
|
290
|
+
clean_text = response_text.strip().encode('utf-8', errors='ignore').decode('utf-8')
|
|
291
|
+
display_text = clean_text[:50] + "..." if len(clean_text) > 50 else clean_text
|
|
292
|
+
else:
|
|
293
|
+
status = "✗"
|
|
294
|
+
display_text = "Empty or invalid response"
|
|
295
|
+
print(f"\r{model_name:<50} {status:<10} {display_text}")
|
|
296
|
+
except Exception as e:
|
|
297
|
+
print(f"\r{model_name:<50} {'✗':<10} {str(e)[:50]}")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: webscout
|
|
3
|
-
Version: 2025.10.
|
|
3
|
+
Version: 2025.10.18
|
|
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
|
|
@@ -84,6 +84,7 @@ pyproject.toml
|
|
|
84
84
|
./webscout/Provider/Gemini.py
|
|
85
85
|
./webscout/Provider/GeminiProxy.py
|
|
86
86
|
./webscout/Provider/GithubChat.py
|
|
87
|
+
./webscout/Provider/Gradient.py
|
|
87
88
|
./webscout/Provider/Groq.py
|
|
88
89
|
./webscout/Provider/HeckAI.py
|
|
89
90
|
./webscout/Provider/Jadve.py
|
|
@@ -421,6 +422,7 @@ webscout/Provider/GMI.py
|
|
|
421
422
|
webscout/Provider/Gemini.py
|
|
422
423
|
webscout/Provider/GeminiProxy.py
|
|
423
424
|
webscout/Provider/GithubChat.py
|
|
425
|
+
webscout/Provider/Gradient.py
|
|
424
426
|
webscout/Provider/Groq.py
|
|
425
427
|
webscout/Provider/HeckAI.py
|
|
426
428
|
webscout/Provider/Jadve.py
|