webscout 7.1__tar.gz → 7.2__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-7.1/webscout.egg-info → webscout-7.2}/PKG-INFO +4 -3
- {webscout-7.1 → webscout-7.2}/README.md +1 -1
- {webscout-7.1 → webscout-7.2}/setup.py +93 -92
- {webscout-7.1 → webscout-7.2}/webscout/AIauto.py +191 -191
- {webscout-7.1 → webscout-7.2}/webscout/AIbase.py +122 -122
- {webscout-7.1 → webscout-7.2}/webscout/AIutel.py +440 -440
- webscout-7.2/webscout/Bard.py +547 -0
- {webscout-7.1 → webscout-7.2}/webscout/DWEBS.py +489 -492
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/YTdownloader.py +995 -995
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/__init__.py +2 -2
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/transcriber.py +476 -479
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/ytapi/channel.py +307 -307
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/ytapi/playlist.py +58 -58
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/ytapi/pool.py +7 -7
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/ytapi/utils.py +62 -62
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/ytapi/video.py +103 -103
- {webscout-7.1 → webscout-7.2}/webscout/Extra/autocoder/__init__.py +9 -9
- {webscout-7.1 → webscout-7.2}/webscout/Extra/autocoder/autocoder_utiles.py +199 -199
- {webscout-7.1 → webscout-7.2}/webscout/Extra/autocoder/rawdog.py +5 -7
- {webscout-7.1 → webscout-7.2}/webscout/Extra/autollama.py +230 -230
- {webscout-7.1 → webscout-7.2}/webscout/Extra/gguf.py +3 -3
- {webscout-7.1 → webscout-7.2}/webscout/Extra/weather.py +171 -171
- {webscout-7.1 → webscout-7.2}/webscout/LLM.py +442 -442
- webscout-7.2/webscout/Litlogger/__init__.py +67 -0
- webscout-7.2/webscout/Litlogger/core/__init__.py +6 -0
- webscout-7.2/webscout/Litlogger/core/level.py +20 -0
- webscout-7.2/webscout/Litlogger/core/logger.py +123 -0
- webscout-7.2/webscout/Litlogger/handlers/__init__.py +12 -0
- webscout-7.2/webscout/Litlogger/handlers/console.py +50 -0
- webscout-7.2/webscout/Litlogger/handlers/file.py +143 -0
- webscout-7.2/webscout/Litlogger/handlers/network.py +174 -0
- webscout-7.2/webscout/Litlogger/styles/__init__.py +7 -0
- webscout-7.2/webscout/Litlogger/styles/colors.py +231 -0
- webscout-7.2/webscout/Litlogger/styles/formats.py +377 -0
- webscout-7.2/webscout/Litlogger/styles/text.py +87 -0
- webscout-7.2/webscout/Litlogger/utils/__init__.py +6 -0
- webscout-7.2/webscout/Litlogger/utils/detectors.py +154 -0
- webscout-7.2/webscout/Litlogger/utils/formatters.py +200 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/AISEARCH/DeepFind.py +250 -250
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Blackboxai.py +3 -3
- webscout-7.2/webscout/Provider/ChatGPTGratis.py +226 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Cloudflare.py +3 -4
- webscout-7.2/webscout/Provider/DeepSeek.py +218 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Deepinfra.py +3 -3
- webscout-7.2/webscout/Provider/Free2GPT.py +241 -0
- webscout-7.2/webscout/Provider/Gemini.py +179 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Glider.py +3 -3
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Groq.py +5 -1
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Jadve.py +3 -3
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Marcus.py +191 -192
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Netwrck.py +3 -3
- {webscout-7.1 → webscout-7.2}/webscout/Provider/PI.py +2 -2
- {webscout-7.1 → webscout-7.2}/webscout/Provider/PizzaGPT.py +2 -3
- webscout-7.2/webscout/Provider/QwenLM.py +311 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/AiForce/__init__.py +22 -22
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/AiForce/async_aiforce.py +257 -257
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/AiForce/sync_aiforce.py +242 -242
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/Nexra/__init__.py +22 -22
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/Nexra/async_nexra.py +286 -286
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/Nexra/sync_nexra.py +258 -258
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/PollinationsAI/__init__.py +23 -23
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/PollinationsAI/async_pollinations.py +330 -330
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +285 -285
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/artbit/__init__.py +22 -22
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/artbit/async_artbit.py +184 -184
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/artbit/sync_artbit.py +176 -176
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/blackbox/__init__.py +4 -4
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/blackbox/async_blackbox.py +212 -212
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/blackbox/sync_blackbox.py +199 -199
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/deepinfra/__init__.py +4 -4
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/deepinfra/async_deepinfra.py +227 -227
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/deepinfra/sync_deepinfra.py +199 -199
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/huggingface/__init__.py +22 -22
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/huggingface/async_huggingface.py +199 -199
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/huggingface/sync_huggingface.py +195 -195
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/imgninza/__init__.py +4 -4
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/imgninza/async_ninza.py +214 -214
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/imgninza/sync_ninza.py +209 -209
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/talkai/__init__.py +4 -4
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/talkai/async_talkai.py +229 -229
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/talkai/sync_talkai.py +207 -207
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTS/deepgram.py +182 -182
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTS/elevenlabs.py +136 -136
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTS/gesserit.py +150 -150
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTS/murfai.py +138 -138
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTS/parler.py +133 -134
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTS/streamElements.py +360 -360
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTS/utils.py +280 -280
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTS/voicepod.py +116 -116
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TextPollinationsAI.py +2 -3
- webscout-7.2/webscout/Provider/WiseCat.py +193 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/__init__.py +144 -134
- {webscout-7.1 → webscout-7.2}/webscout/Provider/cerebras.py +242 -227
- {webscout-7.1 → webscout-7.2}/webscout/Provider/chatglm.py +204 -204
- {webscout-7.1 → webscout-7.2}/webscout/Provider/dgaf.py +2 -3
- {webscout-7.1 → webscout-7.2}/webscout/Provider/gaurish.py +2 -3
- {webscout-7.1 → webscout-7.2}/webscout/Provider/geminiapi.py +208 -208
- webscout-7.2/webscout/Provider/granite.py +223 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/hermes.py +218 -218
- {webscout-7.1 → webscout-7.2}/webscout/Provider/llama3mitril.py +179 -179
- {webscout-7.1 → webscout-7.2}/webscout/Provider/llamatutor.py +3 -3
- {webscout-7.1 → webscout-7.2}/webscout/Provider/llmchat.py +2 -3
- {webscout-7.1 → webscout-7.2}/webscout/Provider/meta.py +794 -794
- {webscout-7.1 → webscout-7.2}/webscout/Provider/multichat.py +331 -331
- {webscout-7.1 → webscout-7.2}/webscout/Provider/typegpt.py +359 -359
- {webscout-7.1 → webscout-7.2}/webscout/Provider/yep.py +2 -2
- {webscout-7.1 → webscout-7.2}/webscout/__main__.py +5 -5
- {webscout-7.1 → webscout-7.2}/webscout/cli.py +319 -319
- {webscout-7.1 → webscout-7.2}/webscout/conversation.py +241 -242
- {webscout-7.1 → webscout-7.2}/webscout/exceptions.py +328 -328
- {webscout-7.1 → webscout-7.2}/webscout/litagent/__init__.py +28 -28
- {webscout-7.1 → webscout-7.2}/webscout/litagent/agent.py +2 -3
- {webscout-7.1 → webscout-7.2}/webscout/litprinter/__init__.py +0 -58
- {webscout-7.1 → webscout-7.2}/webscout/scout/__init__.py +8 -8
- {webscout-7.1 → webscout-7.2}/webscout/scout/core.py +884 -884
- {webscout-7.1 → webscout-7.2}/webscout/scout/element.py +459 -459
- {webscout-7.1 → webscout-7.2}/webscout/scout/parsers/__init__.py +69 -69
- {webscout-7.1 → webscout-7.2}/webscout/scout/parsers/html5lib_parser.py +172 -172
- {webscout-7.1 → webscout-7.2}/webscout/scout/parsers/html_parser.py +236 -236
- {webscout-7.1 → webscout-7.2}/webscout/scout/parsers/lxml_parser.py +178 -178
- {webscout-7.1 → webscout-7.2}/webscout/scout/utils.py +38 -38
- {webscout-7.1 → webscout-7.2}/webscout/swiftcli/__init__.py +811 -811
- {webscout-7.1 → webscout-7.2}/webscout/update_checker.py +2 -12
- {webscout-7.1 → webscout-7.2}/webscout/version.py +1 -1
- {webscout-7.1 → webscout-7.2}/webscout/webscout_search.py +5 -4
- {webscout-7.1 → webscout-7.2}/webscout/zeroart/__init__.py +54 -54
- {webscout-7.1 → webscout-7.2}/webscout/zeroart/base.py +60 -60
- {webscout-7.1 → webscout-7.2}/webscout/zeroart/effects.py +99 -99
- {webscout-7.1 → webscout-7.2}/webscout/zeroart/fonts.py +816 -816
- {webscout-7.1 → webscout-7.2/webscout.egg-info}/PKG-INFO +4 -3
- {webscout-7.1 → webscout-7.2}/webscout.egg-info/SOURCES.txt +19 -0
- {webscout-7.1 → webscout-7.2}/webscout.egg-info/requires.txt +2 -1
- {webscout-7.1 → webscout-7.2}/webstoken/__init__.py +30 -30
- {webscout-7.1 → webscout-7.2}/webstoken/classifier.py +189 -189
- {webscout-7.1 → webscout-7.2}/webstoken/keywords.py +216 -216
- {webscout-7.1 → webscout-7.2}/webstoken/language.py +128 -128
- {webscout-7.1 → webscout-7.2}/webstoken/ner.py +164 -164
- {webscout-7.1 → webscout-7.2}/webstoken/normalizer.py +35 -35
- {webscout-7.1 → webscout-7.2}/webstoken/processor.py +77 -77
- {webscout-7.1 → webscout-7.2}/webstoken/sentiment.py +206 -206
- {webscout-7.1 → webscout-7.2}/webstoken/stemmer.py +73 -73
- {webscout-7.1 → webscout-7.2}/webstoken/tagger.py +60 -60
- {webscout-7.1 → webscout-7.2}/webstoken/tokenizer.py +158 -158
- webscout-7.1/webscout/Bard.py +0 -365
- webscout-7.1/webscout/Litlogger/__init__.py +0 -681
- webscout-7.1/webscout/Provider/Free2GPT.py +0 -234
- webscout-7.1/webscout/Provider/Gemini.py +0 -194
- {webscout-7.1 → webscout-7.2}/LICENSE.md +0 -0
- {webscout-7.1 → webscout-7.2}/setup.cfg +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/ytapi/__init__.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/ytapi/errors.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/ytapi/extras.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/ytapi/https.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/ytapi/patterns.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/ytapi/query.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Extra/YTToolkit/ytapi/stream.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Extra/__init__.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Extra/weather_ascii.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Local/__init__.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Local/_version.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Local/formats.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Local/model.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Local/samplers.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Local/thread.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Local/ui.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Local/utils.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/AI21.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/AISEARCH/__init__.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/AISEARCH/felo_search.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Amigo.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Andi.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Bing.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/ChatGPTES.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Chatify.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Cohere.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/DARKAI.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/DiscordRocks.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/EDITEE.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/GPTWeb.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/HF_space/__init__.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/HF_space/qwen_qwen2.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Koboldai.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Llama.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Llama3.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/OLLAMA.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Openai.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Phind.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Reka.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTI/__init__.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TTS/__init__.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/TeachAnything.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/Youchat.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/ai4chat.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/aimathgpt.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/askmyai.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/bagoodex.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/cleeai.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/elmo.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/geminiprorealtime.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/julius.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/koala.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/learnfastai.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/lepton.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/promptrefine.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/talkai.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/turboseek.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/tutorai.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/Provider/x0gpt.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/__init__.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/litagent/constants.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/litprinter/colors.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/optimizers.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/prompt_manager.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/scout/core/__init__.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/scout/core/crawler.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/scout/core/scout.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/scout/core/search_result.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/scout/core/text_analyzer.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/scout/core/text_utils.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/scout/core/web_analyzer.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/tempid.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/utils.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout/webscout_search_async.py +0 -0
- {webscout-7.1 → webscout-7.2}/webscout.egg-info/dependency_links.txt +0 -0
- {webscout-7.1 → webscout-7.2}/webscout.egg-info/entry_points.txt +0 -0
- {webscout-7.1 → webscout-7.2}/webscout.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: webscout
|
|
3
|
-
Version: 7.
|
|
3
|
+
Version: 7.2
|
|
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: OEvortex
|
|
6
6
|
Author-email: helpingai5@gmail.com
|
|
@@ -41,7 +41,7 @@ Requires-Dist: orjson
|
|
|
41
41
|
Requires-Dist: PyYAML
|
|
42
42
|
Requires-Dist: tls_client
|
|
43
43
|
Requires-Dist: clipman
|
|
44
|
-
Requires-Dist: playsound
|
|
44
|
+
Requires-Dist: playsound==1.2.2
|
|
45
45
|
Requires-Dist: ollama
|
|
46
46
|
Requires-Dist: pillow
|
|
47
47
|
Requires-Dist: bson
|
|
@@ -56,6 +56,7 @@ Requires-Dist: pyreqwest_impersonate
|
|
|
56
56
|
Requires-Dist: gradio_client
|
|
57
57
|
Requires-Dist: psutil
|
|
58
58
|
Requires-Dist: pygetwindow
|
|
59
|
+
Requires-Dist: aiohttp
|
|
59
60
|
Provides-Extra: dev
|
|
60
61
|
Requires-Dist: ruff>=0.1.6; extra == "dev"
|
|
61
62
|
Requires-Dist: pytest>=7.4.2; extra == "dev"
|
|
@@ -1107,7 +1108,7 @@ print(a.chat("HelpingAI-9B"))
|
|
|
1107
1108
|
```
|
|
1108
1109
|
|
|
1109
1110
|
|
|
1110
|
-
### LLAMA3, pizzagpt, RUBIKSAI, Koala, Darkai, AI4Chat, Farfalle, PIAI, Felo, Julius, YouChat, YEPCHAT, Cloudflare, TurboSeek, Editee, AI21, Chatify, Cerebras, X0GPT, Lepton, GEMINIAPI, Cleeai, Elmo, Free2GPT, Bing, DiscordRocks, GPTWeb, LlamaTutor, PromptRefine, TutorAI, ChatGPTES, Bagoodex, ChatHub, AmigoChat, AIMathGPT, GaurishCerebras, NinjaChat, GeminiPro, Talkai, LLMChat, AskMyAI, Llama3Mitril, Marcus, TypeGPT, Mhystical, Netwrck, MultiChatAI, JadveOpenAI, ChatGLM, Deepfind, NousHermes, TextPollinationsAI, GliderAI, DGAFAI
|
|
1111
|
+
### LLAMA3, pizzagpt, RUBIKSAI, Koala, Darkai, AI4Chat, Farfalle, PIAI, Felo, Julius, YouChat, YEPCHAT, Cloudflare, TurboSeek, Editee, AI21, Chatify, Cerebras, X0GPT, Lepton, GEMINIAPI, Cleeai, Elmo, Free2GPT, Bing, DiscordRocks, GPTWeb, LlamaTutor, PromptRefine, TutorAI, ChatGPTES, Bagoodex, ChatHub, AmigoChat, AIMathGPT, GaurishCerebras, NinjaChat, GeminiPro, Talkai, LLMChat, AskMyAI, Llama3Mitril, Marcus, TypeGPT, Mhystical, Netwrck, MultiChatAI, JadveOpenAI, ChatGLM, Deepfind, NousHermes, TextPollinationsAI, GliderAI, DGAFAI, ChatGPTGratis, QwenLM, IBMGranite, WiseCat, DeepSeek
|
|
1111
1112
|
|
|
1112
1113
|
Code is similar to other providers.
|
|
1113
1114
|
|
|
@@ -1028,7 +1028,7 @@ print(a.chat("HelpingAI-9B"))
|
|
|
1028
1028
|
```
|
|
1029
1029
|
|
|
1030
1030
|
|
|
1031
|
-
### LLAMA3, pizzagpt, RUBIKSAI, Koala, Darkai, AI4Chat, Farfalle, PIAI, Felo, Julius, YouChat, YEPCHAT, Cloudflare, TurboSeek, Editee, AI21, Chatify, Cerebras, X0GPT, Lepton, GEMINIAPI, Cleeai, Elmo, Free2GPT, Bing, DiscordRocks, GPTWeb, LlamaTutor, PromptRefine, TutorAI, ChatGPTES, Bagoodex, ChatHub, AmigoChat, AIMathGPT, GaurishCerebras, NinjaChat, GeminiPro, Talkai, LLMChat, AskMyAI, Llama3Mitril, Marcus, TypeGPT, Mhystical, Netwrck, MultiChatAI, JadveOpenAI, ChatGLM, Deepfind, NousHermes, TextPollinationsAI, GliderAI, DGAFAI
|
|
1031
|
+
### LLAMA3, pizzagpt, RUBIKSAI, Koala, Darkai, AI4Chat, Farfalle, PIAI, Felo, Julius, YouChat, YEPCHAT, Cloudflare, TurboSeek, Editee, AI21, Chatify, Cerebras, X0GPT, Lepton, GEMINIAPI, Cleeai, Elmo, Free2GPT, Bing, DiscordRocks, GPTWeb, LlamaTutor, PromptRefine, TutorAI, ChatGPTES, Bagoodex, ChatHub, AmigoChat, AIMathGPT, GaurishCerebras, NinjaChat, GeminiPro, Talkai, LLMChat, AskMyAI, Llama3Mitril, Marcus, TypeGPT, Mhystical, Netwrck, MultiChatAI, JadveOpenAI, ChatGLM, Deepfind, NousHermes, TextPollinationsAI, GliderAI, DGAFAI, ChatGPTGratis, QwenLM, IBMGranite, WiseCat, DeepSeek
|
|
1032
1032
|
|
|
1033
1033
|
Code is similar to other providers.
|
|
1034
1034
|
|
|
@@ -1,92 +1,93 @@
|
|
|
1
|
-
from setuptools import setup, find_packages
|
|
2
|
-
from webscout.version import __prog__, __version__
|
|
3
|
-
|
|
4
|
-
with open("README.md", encoding="utf-8") as f:
|
|
5
|
-
README = f.read()
|
|
6
|
-
|
|
7
|
-
setup(
|
|
8
|
-
name="webscout",
|
|
9
|
-
version=__version__,
|
|
10
|
-
description="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",
|
|
11
|
-
long_description=README,
|
|
12
|
-
long_description_content_type="text/markdown",
|
|
13
|
-
author="OEvortex",
|
|
14
|
-
author_email="helpingai5@gmail.com",
|
|
15
|
-
packages=find_packages(),
|
|
16
|
-
python_requires=">=3.7",
|
|
17
|
-
classifiers=[
|
|
18
|
-
"Development Status :: 5 - Production/Stable",
|
|
19
|
-
"Intended Audience :: Developers",
|
|
20
|
-
"License :: Other/Proprietary License",
|
|
21
|
-
"Operating System :: OS Independent",
|
|
22
|
-
"Programming Language :: Python :: 3",
|
|
23
|
-
"Programming Language :: Python :: 3.8",
|
|
24
|
-
"Programming Language :: Python :: 3.9",
|
|
25
|
-
"Programming Language :: Python :: 3.10",
|
|
26
|
-
"Programming Language :: Python :: 3.11",
|
|
27
|
-
"Programming Language :: Python :: 3.12",
|
|
28
|
-
"Programming Language :: Python :: Implementation :: CPython",
|
|
29
|
-
"Topic :: Internet :: WWW/HTTP :: Indexing/Search",
|
|
30
|
-
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
31
|
-
],
|
|
32
|
-
install_requires=[
|
|
33
|
-
"setuptools",
|
|
34
|
-
"wheel",
|
|
35
|
-
"pip",
|
|
36
|
-
"mistune",
|
|
37
|
-
"tenacity",
|
|
38
|
-
"curl_cffi",
|
|
39
|
-
"nest-asyncio",
|
|
40
|
-
"rich",
|
|
41
|
-
"markdownify",
|
|
42
|
-
"requests",
|
|
43
|
-
"google-generativeai",
|
|
44
|
-
"lxml>=5.2.2",
|
|
45
|
-
"termcolor",
|
|
46
|
-
"orjson",
|
|
47
|
-
"PyYAML",
|
|
48
|
-
"tls_client",
|
|
49
|
-
"clipman",
|
|
50
|
-
"playsound",
|
|
51
|
-
"ollama",
|
|
52
|
-
"pillow",
|
|
53
|
-
"bson",
|
|
54
|
-
"cloudscraper",
|
|
55
|
-
"html5lib",
|
|
56
|
-
"aiofiles",
|
|
57
|
-
"emoji",
|
|
58
|
-
"openai",
|
|
59
|
-
"prompt-toolkit",
|
|
60
|
-
"primp",
|
|
61
|
-
"pyreqwest_impersonate",
|
|
62
|
-
"gradio_client",
|
|
63
|
-
"psutil",
|
|
64
|
-
"pygetwindow",
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
"
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
"
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
'
|
|
81
|
-
'
|
|
82
|
-
'
|
|
83
|
-
'
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
|
|
92
|
-
|
|
1
|
+
from setuptools import setup, find_packages
|
|
2
|
+
from webscout.version import __prog__, __version__
|
|
3
|
+
|
|
4
|
+
with open("README.md", encoding="utf-8") as f:
|
|
5
|
+
README = f.read()
|
|
6
|
+
|
|
7
|
+
setup(
|
|
8
|
+
name="webscout",
|
|
9
|
+
version=__version__,
|
|
10
|
+
description="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",
|
|
11
|
+
long_description=README,
|
|
12
|
+
long_description_content_type="text/markdown",
|
|
13
|
+
author="OEvortex",
|
|
14
|
+
author_email="helpingai5@gmail.com",
|
|
15
|
+
packages=find_packages(),
|
|
16
|
+
python_requires=">=3.7",
|
|
17
|
+
classifiers=[
|
|
18
|
+
"Development Status :: 5 - Production/Stable",
|
|
19
|
+
"Intended Audience :: Developers",
|
|
20
|
+
"License :: Other/Proprietary License",
|
|
21
|
+
"Operating System :: OS Independent",
|
|
22
|
+
"Programming Language :: Python :: 3",
|
|
23
|
+
"Programming Language :: Python :: 3.8",
|
|
24
|
+
"Programming Language :: Python :: 3.9",
|
|
25
|
+
"Programming Language :: Python :: 3.10",
|
|
26
|
+
"Programming Language :: Python :: 3.11",
|
|
27
|
+
"Programming Language :: Python :: 3.12",
|
|
28
|
+
"Programming Language :: Python :: Implementation :: CPython",
|
|
29
|
+
"Topic :: Internet :: WWW/HTTP :: Indexing/Search",
|
|
30
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
31
|
+
],
|
|
32
|
+
install_requires=[
|
|
33
|
+
"setuptools",
|
|
34
|
+
"wheel",
|
|
35
|
+
"pip",
|
|
36
|
+
"mistune",
|
|
37
|
+
"tenacity",
|
|
38
|
+
"curl_cffi",
|
|
39
|
+
"nest-asyncio",
|
|
40
|
+
"rich",
|
|
41
|
+
"markdownify",
|
|
42
|
+
"requests",
|
|
43
|
+
"google-generativeai",
|
|
44
|
+
"lxml>=5.2.2",
|
|
45
|
+
"termcolor",
|
|
46
|
+
"orjson",
|
|
47
|
+
"PyYAML",
|
|
48
|
+
"tls_client",
|
|
49
|
+
"clipman",
|
|
50
|
+
"playsound==1.2.2",
|
|
51
|
+
"ollama",
|
|
52
|
+
"pillow",
|
|
53
|
+
"bson",
|
|
54
|
+
"cloudscraper",
|
|
55
|
+
"html5lib",
|
|
56
|
+
"aiofiles",
|
|
57
|
+
"emoji",
|
|
58
|
+
"openai",
|
|
59
|
+
"prompt-toolkit",
|
|
60
|
+
"primp",
|
|
61
|
+
"pyreqwest_impersonate",
|
|
62
|
+
"gradio_client",
|
|
63
|
+
"psutil",
|
|
64
|
+
"pygetwindow",
|
|
65
|
+
"aiohttp",
|
|
66
|
+
],
|
|
67
|
+
|
|
68
|
+
entry_points={
|
|
69
|
+
"console_scripts": [
|
|
70
|
+
"WEBS = webscout.cli:cli",
|
|
71
|
+
"webscout = webscout.cli:cli",
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
extras_require={
|
|
75
|
+
"dev": [
|
|
76
|
+
"ruff>=0.1.6",
|
|
77
|
+
"pytest>=7.4.2",
|
|
78
|
+
],
|
|
79
|
+
"local": [
|
|
80
|
+
'llama-cpp-python',
|
|
81
|
+
'colorama',
|
|
82
|
+
'numpy',
|
|
83
|
+
'huggingface_hub[cli]',
|
|
84
|
+
'unicorn',
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
|
+
license="HelpingAI",
|
|
88
|
+
project_urls={
|
|
89
|
+
"Source": "https://github.com/HelpingAI/Webscout",
|
|
90
|
+
"Tracker": "https://github.com/HelpingAI/Webscout/issues",
|
|
91
|
+
"YouTube": "https://youtube.com/@OEvortex",
|
|
92
|
+
},
|
|
93
|
+
)
|
|
@@ -1,191 +1,191 @@
|
|
|
1
|
-
from webscout.AIbase import Provider
|
|
2
|
-
from webscout.g4f import GPT4FREE, TestProviders
|
|
3
|
-
from webscout.exceptions import AllProvidersFailure
|
|
4
|
-
from webscout.Litlogger import Litlogger, LogFormat, ColorScheme
|
|
5
|
-
from typing import Union, Any, Dict, Generator
|
|
6
|
-
import importlib
|
|
7
|
-
import pkgutil
|
|
8
|
-
import random
|
|
9
|
-
import inspect
|
|
10
|
-
|
|
11
|
-
# Initialize LitLogger with cyberpunk theme
|
|
12
|
-
logger = Litlogger(
|
|
13
|
-
name="AIauto",
|
|
14
|
-
format=LogFormat.DETAILED,
|
|
15
|
-
color_scheme=ColorScheme.CYBERPUNK
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
def load_providers():
|
|
19
|
-
provider_map = {}
|
|
20
|
-
api_key_providers = set()
|
|
21
|
-
provider_package = importlib.import_module("webscout.Provider")
|
|
22
|
-
|
|
23
|
-
for _, module_name, _ in pkgutil.iter_modules(provider_package.__path__):
|
|
24
|
-
try:
|
|
25
|
-
module = importlib.import_module(f"webscout.Provider.{module_name}")
|
|
26
|
-
for attr_name in dir(module):
|
|
27
|
-
attr = getattr(module, attr_name)
|
|
28
|
-
if isinstance(attr, type) and issubclass(attr, Provider) and attr != Provider:
|
|
29
|
-
provider_map[attr_name.upper()] = attr
|
|
30
|
-
# Check if the provider needs an API key
|
|
31
|
-
if 'api_key' in inspect.signature(attr.__init__).parameters:
|
|
32
|
-
api_key_providers.add(attr_name.upper())
|
|
33
|
-
logger.debug(f"Provider {attr_name} requires API key")
|
|
34
|
-
logger.success(f"Loaded provider module: {module_name}")
|
|
35
|
-
except Exception as e:
|
|
36
|
-
logger.error(f"Failed to load provider {module_name}: {str(e)}")
|
|
37
|
-
|
|
38
|
-
logger.info(f"Total providers loaded: {len(provider_map)}")
|
|
39
|
-
logger.info(f"API key providers: {len(api_key_providers)}")
|
|
40
|
-
return provider_map, api_key_providers
|
|
41
|
-
|
|
42
|
-
provider_map, api_key_providers = load_providers()
|
|
43
|
-
|
|
44
|
-
class AUTO(Provider):
|
|
45
|
-
def __init__(
|
|
46
|
-
self,
|
|
47
|
-
is_conversation: bool = True,
|
|
48
|
-
max_tokens: int = 600,
|
|
49
|
-
timeout: int = 30,
|
|
50
|
-
intro: str = None,
|
|
51
|
-
filepath: str = None,
|
|
52
|
-
update_file: bool = True,
|
|
53
|
-
proxies: dict = {},
|
|
54
|
-
history_offset: int = 10250,
|
|
55
|
-
act: str = None,
|
|
56
|
-
exclude: list[str] = [],
|
|
57
|
-
):
|
|
58
|
-
self.provider = None
|
|
59
|
-
self.provider_name = None
|
|
60
|
-
self.is_conversation = is_conversation
|
|
61
|
-
self.max_tokens = max_tokens
|
|
62
|
-
self.timeout = timeout
|
|
63
|
-
self.intro = intro
|
|
64
|
-
self.filepath = filepath
|
|
65
|
-
self.update_file = update_file
|
|
66
|
-
self.proxies = proxies
|
|
67
|
-
self.history_offset = history_offset
|
|
68
|
-
self.act = act
|
|
69
|
-
self.exclude = [e.upper() for e in exclude]
|
|
70
|
-
|
|
71
|
-
@property
|
|
72
|
-
def last_response(self) -> dict[str, Any]:
|
|
73
|
-
return self.provider.last_response if self.provider else {}
|
|
74
|
-
|
|
75
|
-
@property
|
|
76
|
-
def conversation(self) -> object:
|
|
77
|
-
return self.provider.conversation if self.provider else None
|
|
78
|
-
|
|
79
|
-
def ask(
|
|
80
|
-
self,
|
|
81
|
-
prompt: str,
|
|
82
|
-
stream: bool = False,
|
|
83
|
-
raw: bool = False,
|
|
84
|
-
optimizer: str = None,
|
|
85
|
-
conversationally: bool = False,
|
|
86
|
-
run_new_test: bool = False,
|
|
87
|
-
) -> Union[Dict, Generator]:
|
|
88
|
-
ask_kwargs = {
|
|
89
|
-
"prompt": prompt,
|
|
90
|
-
"stream": stream,
|
|
91
|
-
"raw": raw,
|
|
92
|
-
"optimizer": optimizer,
|
|
93
|
-
"conversationally": conversationally,
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
# Filter out API key required providers and excluded providers
|
|
97
|
-
available_providers = [
|
|
98
|
-
(name, cls) for name, cls in provider_map.items()
|
|
99
|
-
if name not in api_key_providers and name not in self.exclude
|
|
100
|
-
]
|
|
101
|
-
|
|
102
|
-
# Shuffle the list of available providers
|
|
103
|
-
random.shuffle(available_providers)
|
|
104
|
-
|
|
105
|
-
# Try webscout-based providers
|
|
106
|
-
for provider_name, provider_class in available_providers:
|
|
107
|
-
try:
|
|
108
|
-
self.provider_name = f"webscout-{provider_name}"
|
|
109
|
-
logger.info(f"Trying provider: {self.provider_name}")
|
|
110
|
-
|
|
111
|
-
self.provider = provider_class(
|
|
112
|
-
is_conversation=self.is_conversation,
|
|
113
|
-
max_tokens=self.max_tokens,
|
|
114
|
-
timeout=self.timeout,
|
|
115
|
-
intro=self.intro,
|
|
116
|
-
filepath=self.filepath,
|
|
117
|
-
update_file=self.update_file,
|
|
118
|
-
proxies=self.proxies,
|
|
119
|
-
history_offset=self.history_offset,
|
|
120
|
-
act=self.act,
|
|
121
|
-
)
|
|
122
|
-
response = self.provider.ask(**ask_kwargs)
|
|
123
|
-
logger.success(f"Successfully used provider: {self.provider_name}")
|
|
124
|
-
return response
|
|
125
|
-
except Exception as e:
|
|
126
|
-
logger.warning(f"Provider {self.provider_name} failed: {str(e)}")
|
|
127
|
-
continue
|
|
128
|
-
|
|
129
|
-
# Try GPT4FREE providers
|
|
130
|
-
gpt4free_providers = TestProviders(timeout=self.timeout).get_results(run=run_new_test)
|
|
131
|
-
random.shuffle(gpt4free_providers)
|
|
132
|
-
|
|
133
|
-
for provider_info in gpt4free_providers:
|
|
134
|
-
if provider_info["name"].upper() in self.exclude:
|
|
135
|
-
continue
|
|
136
|
-
try:
|
|
137
|
-
self.provider_name = f"g4f-{provider_info['name']}"
|
|
138
|
-
logger.info(f"Trying provider: {self.provider_name}")
|
|
139
|
-
|
|
140
|
-
self.provider = GPT4FREE(
|
|
141
|
-
provider=provider_info["name"],
|
|
142
|
-
is_conversation=self.is_conversation,
|
|
143
|
-
max_tokens=self.max_tokens,
|
|
144
|
-
intro=self.intro,
|
|
145
|
-
filepath=self.filepath,
|
|
146
|
-
update_file=self.update_file,
|
|
147
|
-
proxies=self.proxies,
|
|
148
|
-
history_offset=self.history_offset,
|
|
149
|
-
act=self.act,
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
response = self.provider.ask(**ask_kwargs)
|
|
153
|
-
logger.success(f"Successfully used provider: {self.provider_name}")
|
|
154
|
-
return response
|
|
155
|
-
except Exception as e:
|
|
156
|
-
logger.warning(f"Provider {self.provider_name} failed: {str(e)}")
|
|
157
|
-
continue
|
|
158
|
-
|
|
159
|
-
# If we get here, all providers failed
|
|
160
|
-
logger.error("All providers failed to process the request")
|
|
161
|
-
raise AllProvidersFailure("All providers failed to process the request")
|
|
162
|
-
|
|
163
|
-
def chat(
|
|
164
|
-
self,
|
|
165
|
-
prompt: str,
|
|
166
|
-
stream: bool = False,
|
|
167
|
-
optimizer: str = None,
|
|
168
|
-
conversationally: bool = False,
|
|
169
|
-
run_new_test: bool = False,
|
|
170
|
-
) -> Union[str, Generator[str, None, None]]:
|
|
171
|
-
response = self.ask(
|
|
172
|
-
prompt,
|
|
173
|
-
stream,
|
|
174
|
-
optimizer=optimizer,
|
|
175
|
-
conversationally=conversationally,
|
|
176
|
-
run_new_test=run_new_test,
|
|
177
|
-
)
|
|
178
|
-
|
|
179
|
-
if stream:
|
|
180
|
-
return (self.get_message(chunk) for chunk in response)
|
|
181
|
-
else:
|
|
182
|
-
return self.get_message(response)
|
|
183
|
-
|
|
184
|
-
def get_message(self, response: dict) -> str:
|
|
185
|
-
assert self.provider is not None, "Chat with AI first"
|
|
186
|
-
return self.provider.get_message(response)
|
|
187
|
-
if __name__ == "__main__":
|
|
188
|
-
auto = AUTO()
|
|
189
|
-
|
|
190
|
-
response = auto.chat("Hello, how are you?")
|
|
191
|
-
print(response)
|
|
1
|
+
from webscout.AIbase import Provider
|
|
2
|
+
from webscout.g4f import GPT4FREE, TestProviders
|
|
3
|
+
from webscout.exceptions import AllProvidersFailure
|
|
4
|
+
from webscout.Litlogger import Litlogger, LogFormat, ColorScheme
|
|
5
|
+
from typing import Union, Any, Dict, Generator
|
|
6
|
+
import importlib
|
|
7
|
+
import pkgutil
|
|
8
|
+
import random
|
|
9
|
+
import inspect
|
|
10
|
+
|
|
11
|
+
# Initialize LitLogger with cyberpunk theme
|
|
12
|
+
logger = Litlogger(
|
|
13
|
+
name="AIauto",
|
|
14
|
+
format=LogFormat.DETAILED,
|
|
15
|
+
color_scheme=ColorScheme.CYBERPUNK
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
def load_providers():
|
|
19
|
+
provider_map = {}
|
|
20
|
+
api_key_providers = set()
|
|
21
|
+
provider_package = importlib.import_module("webscout.Provider")
|
|
22
|
+
|
|
23
|
+
for _, module_name, _ in pkgutil.iter_modules(provider_package.__path__):
|
|
24
|
+
try:
|
|
25
|
+
module = importlib.import_module(f"webscout.Provider.{module_name}")
|
|
26
|
+
for attr_name in dir(module):
|
|
27
|
+
attr = getattr(module, attr_name)
|
|
28
|
+
if isinstance(attr, type) and issubclass(attr, Provider) and attr != Provider:
|
|
29
|
+
provider_map[attr_name.upper()] = attr
|
|
30
|
+
# Check if the provider needs an API key
|
|
31
|
+
if 'api_key' in inspect.signature(attr.__init__).parameters:
|
|
32
|
+
api_key_providers.add(attr_name.upper())
|
|
33
|
+
logger.debug(f"Provider {attr_name} requires API key")
|
|
34
|
+
logger.success(f"Loaded provider module: {module_name}")
|
|
35
|
+
except Exception as e:
|
|
36
|
+
logger.error(f"Failed to load provider {module_name}: {str(e)}")
|
|
37
|
+
|
|
38
|
+
logger.info(f"Total providers loaded: {len(provider_map)}")
|
|
39
|
+
logger.info(f"API key providers: {len(api_key_providers)}")
|
|
40
|
+
return provider_map, api_key_providers
|
|
41
|
+
|
|
42
|
+
provider_map, api_key_providers = load_providers()
|
|
43
|
+
|
|
44
|
+
class AUTO(Provider):
|
|
45
|
+
def __init__(
|
|
46
|
+
self,
|
|
47
|
+
is_conversation: bool = True,
|
|
48
|
+
max_tokens: int = 600,
|
|
49
|
+
timeout: int = 30,
|
|
50
|
+
intro: str = None,
|
|
51
|
+
filepath: str = None,
|
|
52
|
+
update_file: bool = True,
|
|
53
|
+
proxies: dict = {},
|
|
54
|
+
history_offset: int = 10250,
|
|
55
|
+
act: str = None,
|
|
56
|
+
exclude: list[str] = [],
|
|
57
|
+
):
|
|
58
|
+
self.provider = None
|
|
59
|
+
self.provider_name = None
|
|
60
|
+
self.is_conversation = is_conversation
|
|
61
|
+
self.max_tokens = max_tokens
|
|
62
|
+
self.timeout = timeout
|
|
63
|
+
self.intro = intro
|
|
64
|
+
self.filepath = filepath
|
|
65
|
+
self.update_file = update_file
|
|
66
|
+
self.proxies = proxies
|
|
67
|
+
self.history_offset = history_offset
|
|
68
|
+
self.act = act
|
|
69
|
+
self.exclude = [e.upper() for e in exclude]
|
|
70
|
+
|
|
71
|
+
@property
|
|
72
|
+
def last_response(self) -> dict[str, Any]:
|
|
73
|
+
return self.provider.last_response if self.provider else {}
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def conversation(self) -> object:
|
|
77
|
+
return self.provider.conversation if self.provider else None
|
|
78
|
+
|
|
79
|
+
def ask(
|
|
80
|
+
self,
|
|
81
|
+
prompt: str,
|
|
82
|
+
stream: bool = False,
|
|
83
|
+
raw: bool = False,
|
|
84
|
+
optimizer: str = None,
|
|
85
|
+
conversationally: bool = False,
|
|
86
|
+
run_new_test: bool = False,
|
|
87
|
+
) -> Union[Dict, Generator]:
|
|
88
|
+
ask_kwargs = {
|
|
89
|
+
"prompt": prompt,
|
|
90
|
+
"stream": stream,
|
|
91
|
+
"raw": raw,
|
|
92
|
+
"optimizer": optimizer,
|
|
93
|
+
"conversationally": conversationally,
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
# Filter out API key required providers and excluded providers
|
|
97
|
+
available_providers = [
|
|
98
|
+
(name, cls) for name, cls in provider_map.items()
|
|
99
|
+
if name not in api_key_providers and name not in self.exclude
|
|
100
|
+
]
|
|
101
|
+
|
|
102
|
+
# Shuffle the list of available providers
|
|
103
|
+
random.shuffle(available_providers)
|
|
104
|
+
|
|
105
|
+
# Try webscout-based providers
|
|
106
|
+
for provider_name, provider_class in available_providers:
|
|
107
|
+
try:
|
|
108
|
+
self.provider_name = f"webscout-{provider_name}"
|
|
109
|
+
logger.info(f"Trying provider: {self.provider_name}")
|
|
110
|
+
|
|
111
|
+
self.provider = provider_class(
|
|
112
|
+
is_conversation=self.is_conversation,
|
|
113
|
+
max_tokens=self.max_tokens,
|
|
114
|
+
timeout=self.timeout,
|
|
115
|
+
intro=self.intro,
|
|
116
|
+
filepath=self.filepath,
|
|
117
|
+
update_file=self.update_file,
|
|
118
|
+
proxies=self.proxies,
|
|
119
|
+
history_offset=self.history_offset,
|
|
120
|
+
act=self.act,
|
|
121
|
+
)
|
|
122
|
+
response = self.provider.ask(**ask_kwargs)
|
|
123
|
+
logger.success(f"Successfully used provider: {self.provider_name}")
|
|
124
|
+
return response
|
|
125
|
+
except Exception as e:
|
|
126
|
+
logger.warning(f"Provider {self.provider_name} failed: {str(e)}")
|
|
127
|
+
continue
|
|
128
|
+
|
|
129
|
+
# Try GPT4FREE providers
|
|
130
|
+
gpt4free_providers = TestProviders(timeout=self.timeout).get_results(run=run_new_test)
|
|
131
|
+
random.shuffle(gpt4free_providers)
|
|
132
|
+
|
|
133
|
+
for provider_info in gpt4free_providers:
|
|
134
|
+
if provider_info["name"].upper() in self.exclude:
|
|
135
|
+
continue
|
|
136
|
+
try:
|
|
137
|
+
self.provider_name = f"g4f-{provider_info['name']}"
|
|
138
|
+
logger.info(f"Trying provider: {self.provider_name}")
|
|
139
|
+
|
|
140
|
+
self.provider = GPT4FREE(
|
|
141
|
+
provider=provider_info["name"],
|
|
142
|
+
is_conversation=self.is_conversation,
|
|
143
|
+
max_tokens=self.max_tokens,
|
|
144
|
+
intro=self.intro,
|
|
145
|
+
filepath=self.filepath,
|
|
146
|
+
update_file=self.update_file,
|
|
147
|
+
proxies=self.proxies,
|
|
148
|
+
history_offset=self.history_offset,
|
|
149
|
+
act=self.act,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
response = self.provider.ask(**ask_kwargs)
|
|
153
|
+
logger.success(f"Successfully used provider: {self.provider_name}")
|
|
154
|
+
return response
|
|
155
|
+
except Exception as e:
|
|
156
|
+
logger.warning(f"Provider {self.provider_name} failed: {str(e)}")
|
|
157
|
+
continue
|
|
158
|
+
|
|
159
|
+
# If we get here, all providers failed
|
|
160
|
+
logger.error("All providers failed to process the request")
|
|
161
|
+
raise AllProvidersFailure("All providers failed to process the request")
|
|
162
|
+
|
|
163
|
+
def chat(
|
|
164
|
+
self,
|
|
165
|
+
prompt: str,
|
|
166
|
+
stream: bool = False,
|
|
167
|
+
optimizer: str = None,
|
|
168
|
+
conversationally: bool = False,
|
|
169
|
+
run_new_test: bool = False,
|
|
170
|
+
) -> Union[str, Generator[str, None, None]]:
|
|
171
|
+
response = self.ask(
|
|
172
|
+
prompt,
|
|
173
|
+
stream,
|
|
174
|
+
optimizer=optimizer,
|
|
175
|
+
conversationally=conversationally,
|
|
176
|
+
run_new_test=run_new_test,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
if stream:
|
|
180
|
+
return (self.get_message(chunk) for chunk in response)
|
|
181
|
+
else:
|
|
182
|
+
return self.get_message(response)
|
|
183
|
+
|
|
184
|
+
def get_message(self, response: dict) -> str:
|
|
185
|
+
assert self.provider is not None, "Chat with AI first"
|
|
186
|
+
return self.provider.get_message(response)
|
|
187
|
+
if __name__ == "__main__":
|
|
188
|
+
auto = AUTO()
|
|
189
|
+
|
|
190
|
+
response = auto.chat("Hello, how are you?")
|
|
191
|
+
print(response)
|