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.

Files changed (348) hide show
  1. {webscout-2025.10.17/webscout.egg-info → webscout-2025.10.18}/PKG-INFO +1 -1
  2. {webscout-2025.10.17 → webscout-2025.10.18}/changelog.md +0 -0
  3. webscout-2025.10.18/webscout/Provider/Gradient.py +231 -0
  4. webscout-2025.10.18/webscout/Provider/TogetherAI.py +297 -0
  5. webscout-2025.10.18/webscout/version.py +2 -0
  6. {webscout-2025.10.17 → webscout-2025.10.18/webscout.egg-info}/PKG-INFO +1 -1
  7. {webscout-2025.10.17 → webscout-2025.10.18}/webscout.egg-info/SOURCES.txt +2 -0
  8. webscout-2025.10.17/webscout/Provider/TogetherAI.py +0 -357
  9. webscout-2025.10.17/webscout/version.py.bak +0 -2
  10. {webscout-2025.10.17 → webscout-2025.10.18}/LEGAL_NOTICE.md +0 -0
  11. {webscout-2025.10.17 → webscout-2025.10.18}/LICENSE.md +0 -0
  12. {webscout-2025.10.17 → webscout-2025.10.18}/MANIFEST.in +0 -0
  13. {webscout-2025.10.17 → webscout-2025.10.18}/README.md +0 -0
  14. {webscout-2025.10.17 → webscout-2025.10.18}/pyproject.toml +0 -0
  15. {webscout-2025.10.17 → webscout-2025.10.18}/setup.cfg +0 -0
  16. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/AIauto.py +0 -0
  17. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/AIbase.py +0 -0
  18. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/AIutel.py +0 -0
  19. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Bard.py +0 -0
  20. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/Act.md +0 -0
  21. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/GitToolkit/__init__.py +0 -0
  22. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/GitToolkit/gitapi/README.md +0 -0
  23. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/GitToolkit/gitapi/__init__.py +0 -0
  24. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/GitToolkit/gitapi/repository.py +0 -0
  25. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/GitToolkit/gitapi/user.py +0 -0
  26. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/GitToolkit/gitapi/utils.py +0 -0
  27. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/README.md +0 -0
  28. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/YTdownloader.py +0 -0
  29. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/__init__.py +0 -0
  30. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/transcriber.py +0 -0
  31. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/README.md +0 -0
  32. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/__init__.py +0 -0
  33. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/channel.py +0 -0
  34. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/errors.py +0 -0
  35. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/extras.py +0 -0
  36. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/https.py +0 -0
  37. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/patterns.py +0 -0
  38. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/playlist.py +0 -0
  39. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/pool.py +0 -0
  40. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/query.py +0 -0
  41. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/stream.py +0 -0
  42. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/utils.py +0 -0
  43. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/YTToolkit/ytapi/video.py +0 -0
  44. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/__init__.py +0 -0
  45. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/autocoder/__init__.py +0 -0
  46. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/autocoder/autocoder.py +0 -0
  47. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/autocoder/autocoder_utiles.py +0 -0
  48. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/gguf.md +0 -0
  49. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/gguf.py +0 -0
  50. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/README.md +0 -0
  51. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/__init__.py +0 -0
  52. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/async_utils.py +0 -0
  53. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/base.py +0 -0
  54. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/cli.py +0 -0
  55. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/emailnator.py +0 -0
  56. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/mail_tm.py +0 -0
  57. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/tempmail/temp_mail_io.py +0 -0
  58. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/weather.py +0 -0
  59. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Extra/weather_ascii.py +0 -0
  60. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Litlogger/README.md +0 -0
  61. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Litlogger/__init__.py +0 -0
  62. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Litlogger/formats.py +0 -0
  63. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Litlogger/handlers.py +0 -0
  64. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Litlogger/levels.py +0 -0
  65. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Litlogger/logger.py +0 -0
  66. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/PERPLEXED_search.py +0 -0
  67. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/Perplexity.py +0 -0
  68. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/README.md +0 -0
  69. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/__init__.py +0 -0
  70. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/felo_search.py +0 -0
  71. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/genspark_search.py +0 -0
  72. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/hika_search.py +0 -0
  73. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/iask_search.py +0 -0
  74. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/monica_search.py +0 -0
  75. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/scira_search.py +0 -0
  76. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/stellar_search.py +0 -0
  77. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/AISEARCH/webpilotai_search.py +0 -0
  78. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Aitopia.py +0 -0
  79. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Andi.py +0 -0
  80. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Apriel.py +0 -0
  81. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/ChatGPTClone.py +0 -0
  82. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/ChatSandbox.py +0 -0
  83. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/ClaudeOnline.py +0 -0
  84. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Cloudflare.py +0 -0
  85. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Cohere.py +0 -0
  86. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Deepinfra.py +0 -0
  87. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/ExaAI.py +0 -0
  88. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/ExaChat.py +0 -0
  89. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Flowith.py +0 -0
  90. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/GMI.py +0 -0
  91. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Gemini.py +0 -0
  92. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/GeminiProxy.py +0 -0
  93. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/GithubChat.py +0 -0
  94. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Groq.py +0 -0
  95. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/HeckAI.py +0 -0
  96. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Jadve.py +0 -0
  97. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/K2Think.py +0 -0
  98. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Koboldai.py +0 -0
  99. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/LambdaChat.py +0 -0
  100. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Nemotron.py +0 -0
  101. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Netwrck.py +0 -0
  102. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OLLAMA.py +0 -0
  103. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/Cloudflare.py +0 -0
  104. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/FalconH1.py +0 -0
  105. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/FreeGemini.py +0 -0
  106. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/GeminiProxy.py +0 -0
  107. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/K2Think.py +0 -0
  108. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/NEMOTRON.py +0 -0
  109. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/PI.py +0 -0
  110. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/README.md +0 -0
  111. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/TogetherAI.py +0 -0
  112. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/TwoAI.py +0 -0
  113. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/__init__.py +0 -0
  114. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/ai4chat.py +0 -0
  115. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/base.py +0 -0
  116. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/chatglm.py +0 -0
  117. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/chatgpt.py +0 -0
  118. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/chatgptclone.py +0 -0
  119. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/chatsandbox.py +0 -0
  120. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/deepinfra.py +0 -0
  121. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/e2b.py +0 -0
  122. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/exaai.py +0 -0
  123. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/exachat.py +0 -0
  124. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/flowith.py +0 -0
  125. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/friendli.py +0 -0
  126. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/generate_api_key.py +0 -0
  127. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/gmi.py +0 -0
  128. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/groq.py +0 -0
  129. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/heckai.py +0 -0
  130. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/llmchatco.py +0 -0
  131. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/netwrck.py +0 -0
  132. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/oivscode.py +0 -0
  133. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/opkfc.py +0 -0
  134. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/pydantic_imports.py +0 -0
  135. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/scirachat.py +0 -0
  136. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/sonus.py +0 -0
  137. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/standardinput.py +0 -0
  138. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/textpollinations.py +0 -0
  139. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/toolbaz.py +0 -0
  140. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/typefully.py +0 -0
  141. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/utils.py +0 -0
  142. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/venice.py +0 -0
  143. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/wisecat.py +0 -0
  144. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/writecream.py +0 -0
  145. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/x0gpt.py +0 -0
  146. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OPENAI/yep.py +0 -0
  147. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/OpenGPT.py +0 -0
  148. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Openai.py +0 -0
  149. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/PI.py +0 -0
  150. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Perplexitylabs.py +0 -0
  151. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/QwenLM.py +0 -0
  152. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/STT/__init__.py +0 -0
  153. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/STT/base.py +0 -0
  154. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/STT/elevenlabs.py +0 -0
  155. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Sambanova.py +0 -0
  156. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/StandardInput.py +0 -0
  157. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/README.md +0 -0
  158. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/__init__.py +0 -0
  159. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/aiarta.py +0 -0
  160. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/base.py +0 -0
  161. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/bing.py +0 -0
  162. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/claudeonline.py +0 -0
  163. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/gpt1image.py +0 -0
  164. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/imagen.py +0 -0
  165. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/infip.py +0 -0
  166. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/magicstudio.py +0 -0
  167. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/monochat.py +0 -0
  168. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/piclumen.py +0 -0
  169. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/pixelmuse.py +0 -0
  170. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/pollinations.py +0 -0
  171. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/together.py +0 -0
  172. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/utils.py +0 -0
  173. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTI/venice.py +0 -0
  174. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/README.md +0 -0
  175. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/__init__.py +0 -0
  176. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/base.py +0 -0
  177. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/deepgram.py +0 -0
  178. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/elevenlabs.py +0 -0
  179. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/freetts.py +0 -0
  180. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/gesserit.py +0 -0
  181. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/murfai.py +0 -0
  182. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/openai_fm.py +0 -0
  183. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/parler.py +0 -0
  184. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/speechma.py +0 -0
  185. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/streamElements.py +0 -0
  186. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TTS/utils.py +0 -0
  187. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TeachAnything.py +0 -0
  188. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TextPollinationsAI.py +0 -0
  189. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TwoAI.py +0 -0
  190. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/TypliAI.py +0 -0
  191. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/ChatHub.py +0 -0
  192. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/ChutesAI.py +0 -0
  193. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/GizAI.py +0 -0
  194. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/Marcus.py +0 -0
  195. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/Qodo.py +0 -0
  196. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/VercelAIGateway.py +0 -0
  197. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/XenAI.py +0 -0
  198. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/Youchat.py +0 -0
  199. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/liner.py +0 -0
  200. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/liner_api_request.py +0 -0
  201. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/puterjs.py +0 -0
  202. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/samurai.py +0 -0
  203. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/UNFINISHED/test_lmarena.py +0 -0
  204. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/Venice.py +0 -0
  205. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/VercelAI.py +0 -0
  206. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/WiseCat.py +0 -0
  207. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/WrDoChat.py +0 -0
  208. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/__init__.py +0 -0
  209. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/ai4chat.py +0 -0
  210. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/akashgpt.py +0 -0
  211. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/cerebras.py +0 -0
  212. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/chatglm.py +0 -0
  213. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/cleeai.py +0 -0
  214. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/deepseek_assistant.py +0 -0
  215. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/elmo.py +0 -0
  216. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/geminiapi.py +0 -0
  217. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/granite.py +0 -0
  218. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/hermes.py +0 -0
  219. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/julius.py +0 -0
  220. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/learnfastai.py +0 -0
  221. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/llama3mitril.py +0 -0
  222. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/llmchat.py +0 -0
  223. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/llmchatco.py +0 -0
  224. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/meta.py +0 -0
  225. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/oivscode.py +0 -0
  226. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/scira_chat.py +0 -0
  227. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/searchchat.py +0 -0
  228. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/sonus.py +0 -0
  229. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/toolbaz.py +0 -0
  230. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/turboseek.py +0 -0
  231. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/typefully.py +0 -0
  232. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/x0gpt.py +0 -0
  233. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/Provider/yep.py +0 -0
  234. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/__init__.py +0 -0
  235. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/__main__.py +0 -0
  236. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/cli.py +0 -0
  237. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/client.py +0 -0
  238. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/conversation.py +0 -0
  239. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/exceptions.py +0 -0
  240. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/litagent/Readme.md +0 -0
  241. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/litagent/__init__.py +0 -0
  242. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/litagent/agent.py +0 -0
  243. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/litagent/constants.py +0 -0
  244. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/litprinter/__init__.py +0 -0
  245. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/models.py +0 -0
  246. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/optimizers.py +0 -0
  247. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/prompt_manager.py +0 -0
  248. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/sanitize.py +0 -0
  249. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/README.md +0 -0
  250. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/__init__.py +0 -0
  251. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/core/__init__.py +0 -0
  252. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/core/crawler.py +0 -0
  253. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/core/scout.py +0 -0
  254. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/core/search_result.py +0 -0
  255. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/core/text_analyzer.py +0 -0
  256. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/core/text_utils.py +0 -0
  257. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/core/web_analyzer.py +0 -0
  258. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/element.py +0 -0
  259. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/parsers/__init__.py +0 -0
  260. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/parsers/html5lib_parser.py +0 -0
  261. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/parsers/html_parser.py +0 -0
  262. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/parsers/lxml_parser.py +0 -0
  263. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/scout/utils.py +0 -0
  264. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/__init__.py +0 -0
  265. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/base.py +0 -0
  266. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/bing_main.py +0 -0
  267. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/duckduckgo_main.py +0 -0
  268. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/__init__.py +0 -0
  269. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/bing/__init__.py +0 -0
  270. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/bing/base.py +0 -0
  271. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/bing/images.py +0 -0
  272. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/bing/news.py +0 -0
  273. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/bing/suggestions.py +0 -0
  274. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/bing/text.py +0 -0
  275. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/brave.py +0 -0
  276. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/__init__.py +0 -0
  277. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/answers.py +0 -0
  278. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/base.py +0 -0
  279. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/images.py +0 -0
  280. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/maps.py +0 -0
  281. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/news.py +0 -0
  282. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/suggestions.py +0 -0
  283. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/text.py +0 -0
  284. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/translate.py +0 -0
  285. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/videos.py +0 -0
  286. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/duckduckgo/weather.py +0 -0
  287. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/mojeek.py +0 -0
  288. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/wikipedia.py +0 -0
  289. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/__init__.py +0 -0
  290. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/answers.py +0 -0
  291. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/base.py +0 -0
  292. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/images.py +0 -0
  293. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/maps.py +0 -0
  294. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/news.py +0 -0
  295. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/suggestions.py +0 -0
  296. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/text.py +0 -0
  297. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/translate.py +0 -0
  298. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/videos.py +0 -0
  299. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yahoo/weather.py +0 -0
  300. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yandex.py +0 -0
  301. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yep/__init__.py +0 -0
  302. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yep/base.py +0 -0
  303. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yep/images.py +0 -0
  304. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yep/suggestions.py +0 -0
  305. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/engines/yep/text.py +0 -0
  306. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/http_client.py +0 -0
  307. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/results.py +0 -0
  308. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/yahoo_main.py +0 -0
  309. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/search/yep_main.py +0 -0
  310. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/__init__.py +0 -0
  311. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/config.py +0 -0
  312. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/exceptions.py +0 -0
  313. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/providers.py +0 -0
  314. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/request_models.py +0 -0
  315. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/request_processing.py +0 -0
  316. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/routes.py +0 -0
  317. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/schemas.py +0 -0
  318. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/server.py +0 -0
  319. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/server/simple_logger.py +0 -0
  320. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/Readme.md +0 -0
  321. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/__init__.py +0 -0
  322. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/core/__init__.py +0 -0
  323. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/core/cli.py +0 -0
  324. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/core/context.py +0 -0
  325. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/core/group.py +0 -0
  326. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/decorators/__init__.py +0 -0
  327. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/decorators/command.py +0 -0
  328. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/decorators/options.py +0 -0
  329. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/decorators/output.py +0 -0
  330. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/exceptions.py +0 -0
  331. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/plugins/__init__.py +0 -0
  332. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/plugins/base.py +0 -0
  333. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/plugins/manager.py +0 -0
  334. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/utils/__init__.py +0 -0
  335. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/utils/formatting.py +0 -0
  336. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/swiftcli/utils/parsing.py +0 -0
  337. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/update_checker.py +0 -0
  338. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/utils.py +0 -0
  339. /webscout-2025.10.17/webscout/version.py → /webscout-2025.10.18/webscout/version.py.bak +0 -0
  340. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/zeroart/README.md +0 -0
  341. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/zeroart/__init__.py +0 -0
  342. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/zeroart/base.py +0 -0
  343. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/zeroart/effects.py +0 -0
  344. {webscout-2025.10.17 → webscout-2025.10.18}/webscout/zeroart/fonts.py +0 -0
  345. {webscout-2025.10.17 → webscout-2025.10.18}/webscout.egg-info/dependency_links.txt +0 -0
  346. {webscout-2025.10.17 → webscout-2025.10.18}/webscout.egg-info/entry_points.txt +0 -0
  347. {webscout-2025.10.17 → webscout-2025.10.18}/webscout.egg-info/requires.txt +0 -0
  348. {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.17
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
@@ -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]}")
@@ -0,0 +1,2 @@
1
+ __version__ = "2025.10.18"
2
+ __prog__ = "webscout"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: webscout
3
- Version: 2025.10.17
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