webscout 2025.10.17__tar.gz → 2025.10.19__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 (351) hide show
  1. {webscout-2025.10.17/webscout.egg-info → webscout-2025.10.19}/PKG-INFO +1 -1
  2. {webscout-2025.10.17 → webscout-2025.10.19}/changelog.md +0 -0
  3. webscout-2025.10.19/webscout/Provider/DeepAI.py +362 -0
  4. webscout-2025.10.19/webscout/Provider/Gradient.py +231 -0
  5. webscout-2025.10.19/webscout/Provider/OPENAI/DeepAI.py +300 -0
  6. webscout-2025.10.19/webscout/Provider/TogetherAI.py +297 -0
  7. webscout-2025.10.19/webscout/version.py +2 -0
  8. webscout-2025.10.19/webscout/version.py.bak +2 -0
  9. {webscout-2025.10.17 → webscout-2025.10.19/webscout.egg-info}/PKG-INFO +1 -1
  10. {webscout-2025.10.17 → webscout-2025.10.19}/webscout.egg-info/SOURCES.txt +6 -0
  11. webscout-2025.10.17/webscout/Provider/TogetherAI.py +0 -357
  12. webscout-2025.10.17/webscout/version.py +0 -2
  13. webscout-2025.10.17/webscout/version.py.bak +0 -2
  14. {webscout-2025.10.17 → webscout-2025.10.19}/LEGAL_NOTICE.md +0 -0
  15. {webscout-2025.10.17 → webscout-2025.10.19}/LICENSE.md +0 -0
  16. {webscout-2025.10.17 → webscout-2025.10.19}/MANIFEST.in +0 -0
  17. {webscout-2025.10.17 → webscout-2025.10.19}/README.md +0 -0
  18. {webscout-2025.10.17 → webscout-2025.10.19}/pyproject.toml +0 -0
  19. {webscout-2025.10.17 → webscout-2025.10.19}/setup.cfg +0 -0
  20. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/AIauto.py +0 -0
  21. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/AIbase.py +0 -0
  22. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/AIutel.py +0 -0
  23. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Bard.py +0 -0
  24. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/Act.md +0 -0
  25. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/GitToolkit/__init__.py +0 -0
  26. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/GitToolkit/gitapi/README.md +0 -0
  27. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/GitToolkit/gitapi/__init__.py +0 -0
  28. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/GitToolkit/gitapi/repository.py +0 -0
  29. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/GitToolkit/gitapi/user.py +0 -0
  30. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/GitToolkit/gitapi/utils.py +0 -0
  31. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/README.md +0 -0
  32. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/YTdownloader.py +0 -0
  33. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/__init__.py +0 -0
  34. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/transcriber.py +0 -0
  35. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/ytapi/README.md +0 -0
  36. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/ytapi/__init__.py +0 -0
  37. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/ytapi/channel.py +0 -0
  38. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/ytapi/errors.py +0 -0
  39. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/ytapi/extras.py +0 -0
  40. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/ytapi/https.py +0 -0
  41. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/ytapi/patterns.py +0 -0
  42. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/ytapi/playlist.py +0 -0
  43. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/ytapi/pool.py +0 -0
  44. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/ytapi/query.py +0 -0
  45. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/ytapi/stream.py +0 -0
  46. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/ytapi/utils.py +0 -0
  47. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/YTToolkit/ytapi/video.py +0 -0
  48. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/__init__.py +0 -0
  49. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/autocoder/__init__.py +0 -0
  50. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/autocoder/autocoder.py +0 -0
  51. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/autocoder/autocoder_utiles.py +0 -0
  52. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/gguf.md +0 -0
  53. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/gguf.py +0 -0
  54. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/tempmail/README.md +0 -0
  55. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/tempmail/__init__.py +0 -0
  56. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/tempmail/async_utils.py +0 -0
  57. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/tempmail/base.py +0 -0
  58. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/tempmail/cli.py +0 -0
  59. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/tempmail/emailnator.py +0 -0
  60. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/tempmail/mail_tm.py +0 -0
  61. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/tempmail/temp_mail_io.py +0 -0
  62. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/weather.py +0 -0
  63. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Extra/weather_ascii.py +0 -0
  64. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Litlogger/README.md +0 -0
  65. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Litlogger/__init__.py +0 -0
  66. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Litlogger/formats.py +0 -0
  67. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Litlogger/handlers.py +0 -0
  68. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Litlogger/levels.py +0 -0
  69. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Litlogger/logger.py +0 -0
  70. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/AISEARCH/PERPLEXED_search.py +0 -0
  71. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/AISEARCH/Perplexity.py +0 -0
  72. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/AISEARCH/README.md +0 -0
  73. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/AISEARCH/__init__.py +0 -0
  74. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/AISEARCH/felo_search.py +0 -0
  75. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/AISEARCH/genspark_search.py +0 -0
  76. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/AISEARCH/hika_search.py +0 -0
  77. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/AISEARCH/iask_search.py +0 -0
  78. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/AISEARCH/monica_search.py +0 -0
  79. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/AISEARCH/scira_search.py +0 -0
  80. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/AISEARCH/stellar_search.py +0 -0
  81. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/AISEARCH/webpilotai_search.py +0 -0
  82. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Aitopia.py +0 -0
  83. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Andi.py +0 -0
  84. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Apriel.py +0 -0
  85. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/ChatGPTClone.py +0 -0
  86. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/ChatSandbox.py +0 -0
  87. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/ClaudeOnline.py +0 -0
  88. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Cloudflare.py +0 -0
  89. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Cohere.py +0 -0
  90. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Deepinfra.py +0 -0
  91. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/ExaAI.py +0 -0
  92. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/ExaChat.py +0 -0
  93. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Flowith.py +0 -0
  94. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/GMI.py +0 -0
  95. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Gemini.py +0 -0
  96. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/GeminiProxy.py +0 -0
  97. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/GithubChat.py +0 -0
  98. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Groq.py +0 -0
  99. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/HeckAI.py +0 -0
  100. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Jadve.py +0 -0
  101. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/K2Think.py +0 -0
  102. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Koboldai.py +0 -0
  103. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/LambdaChat.py +0 -0
  104. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Nemotron.py +0 -0
  105. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Netwrck.py +0 -0
  106. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OLLAMA.py +0 -0
  107. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/Cloudflare.py +0 -0
  108. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/FalconH1.py +0 -0
  109. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/FreeGemini.py +0 -0
  110. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/GeminiProxy.py +0 -0
  111. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/K2Think.py +0 -0
  112. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/NEMOTRON.py +0 -0
  113. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/PI.py +0 -0
  114. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/README.md +0 -0
  115. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/TogetherAI.py +0 -0
  116. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/TwoAI.py +0 -0
  117. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/__init__.py +0 -0
  118. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/ai4chat.py +0 -0
  119. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/base.py +0 -0
  120. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/chatglm.py +0 -0
  121. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/chatgpt.py +0 -0
  122. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/chatgptclone.py +0 -0
  123. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/chatsandbox.py +0 -0
  124. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/deepinfra.py +0 -0
  125. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/e2b.py +0 -0
  126. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/exaai.py +0 -0
  127. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/exachat.py +0 -0
  128. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/flowith.py +0 -0
  129. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/friendli.py +0 -0
  130. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/generate_api_key.py +0 -0
  131. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/gmi.py +0 -0
  132. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/groq.py +0 -0
  133. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/heckai.py +0 -0
  134. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/llmchatco.py +0 -0
  135. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/netwrck.py +0 -0
  136. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/oivscode.py +0 -0
  137. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/opkfc.py +0 -0
  138. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/pydantic_imports.py +0 -0
  139. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/scirachat.py +0 -0
  140. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/sonus.py +0 -0
  141. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/standardinput.py +0 -0
  142. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/textpollinations.py +0 -0
  143. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/toolbaz.py +0 -0
  144. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/typefully.py +0 -0
  145. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/utils.py +0 -0
  146. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/venice.py +0 -0
  147. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/wisecat.py +0 -0
  148. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/writecream.py +0 -0
  149. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/x0gpt.py +0 -0
  150. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OPENAI/yep.py +0 -0
  151. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/OpenGPT.py +0 -0
  152. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Openai.py +0 -0
  153. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/PI.py +0 -0
  154. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Perplexitylabs.py +0 -0
  155. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/QwenLM.py +0 -0
  156. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/STT/__init__.py +0 -0
  157. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/STT/base.py +0 -0
  158. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/STT/elevenlabs.py +0 -0
  159. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Sambanova.py +0 -0
  160. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/StandardInput.py +0 -0
  161. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/README.md +0 -0
  162. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/__init__.py +0 -0
  163. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/aiarta.py +0 -0
  164. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/base.py +0 -0
  165. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/bing.py +0 -0
  166. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/claudeonline.py +0 -0
  167. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/gpt1image.py +0 -0
  168. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/imagen.py +0 -0
  169. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/infip.py +0 -0
  170. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/magicstudio.py +0 -0
  171. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/monochat.py +0 -0
  172. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/piclumen.py +0 -0
  173. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/pixelmuse.py +0 -0
  174. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/pollinations.py +0 -0
  175. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/together.py +0 -0
  176. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/utils.py +0 -0
  177. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTI/venice.py +0 -0
  178. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTS/README.md +0 -0
  179. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTS/__init__.py +0 -0
  180. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTS/base.py +0 -0
  181. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTS/deepgram.py +0 -0
  182. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTS/elevenlabs.py +0 -0
  183. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTS/freetts.py +0 -0
  184. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTS/gesserit.py +0 -0
  185. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTS/murfai.py +0 -0
  186. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTS/openai_fm.py +0 -0
  187. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTS/parler.py +0 -0
  188. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTS/speechma.py +0 -0
  189. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTS/streamElements.py +0 -0
  190. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TTS/utils.py +0 -0
  191. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TeachAnything.py +0 -0
  192. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TextPollinationsAI.py +0 -0
  193. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TwoAI.py +0 -0
  194. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/TypliAI.py +0 -0
  195. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/UNFINISHED/ChatHub.py +0 -0
  196. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/UNFINISHED/ChutesAI.py +0 -0
  197. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/UNFINISHED/GizAI.py +0 -0
  198. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/UNFINISHED/Marcus.py +0 -0
  199. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/UNFINISHED/Qodo.py +0 -0
  200. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/UNFINISHED/VercelAIGateway.py +0 -0
  201. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/UNFINISHED/XenAI.py +0 -0
  202. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/UNFINISHED/Youchat.py +0 -0
  203. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/UNFINISHED/liner.py +0 -0
  204. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/UNFINISHED/liner_api_request.py +0 -0
  205. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/UNFINISHED/puterjs.py +0 -0
  206. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/UNFINISHED/samurai.py +0 -0
  207. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/UNFINISHED/test_lmarena.py +0 -0
  208. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/Venice.py +0 -0
  209. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/VercelAI.py +0 -0
  210. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/WiseCat.py +0 -0
  211. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/WrDoChat.py +0 -0
  212. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/__init__.py +0 -0
  213. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/ai4chat.py +0 -0
  214. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/akashgpt.py +0 -0
  215. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/cerebras.py +0 -0
  216. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/chatglm.py +0 -0
  217. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/cleeai.py +0 -0
  218. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/deepseek_assistant.py +0 -0
  219. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/elmo.py +0 -0
  220. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/geminiapi.py +0 -0
  221. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/granite.py +0 -0
  222. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/hermes.py +0 -0
  223. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/julius.py +0 -0
  224. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/learnfastai.py +0 -0
  225. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/llama3mitril.py +0 -0
  226. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/llmchat.py +0 -0
  227. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/llmchatco.py +0 -0
  228. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/meta.py +0 -0
  229. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/oivscode.py +0 -0
  230. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/scira_chat.py +0 -0
  231. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/searchchat.py +0 -0
  232. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/sonus.py +0 -0
  233. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/toolbaz.py +0 -0
  234. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/turboseek.py +0 -0
  235. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/typefully.py +0 -0
  236. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/x0gpt.py +0 -0
  237. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/Provider/yep.py +0 -0
  238. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/__init__.py +0 -0
  239. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/__main__.py +0 -0
  240. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/cli.py +0 -0
  241. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/client.py +0 -0
  242. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/conversation.py +0 -0
  243. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/exceptions.py +0 -0
  244. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/litagent/Readme.md +0 -0
  245. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/litagent/__init__.py +0 -0
  246. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/litagent/agent.py +0 -0
  247. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/litagent/constants.py +0 -0
  248. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/litprinter/__init__.py +0 -0
  249. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/models.py +0 -0
  250. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/optimizers.py +0 -0
  251. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/prompt_manager.py +0 -0
  252. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/sanitize.py +0 -0
  253. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/README.md +0 -0
  254. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/__init__.py +0 -0
  255. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/core/__init__.py +0 -0
  256. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/core/crawler.py +0 -0
  257. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/core/scout.py +0 -0
  258. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/core/search_result.py +0 -0
  259. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/core/text_analyzer.py +0 -0
  260. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/core/text_utils.py +0 -0
  261. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/core/web_analyzer.py +0 -0
  262. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/element.py +0 -0
  263. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/parsers/__init__.py +0 -0
  264. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/parsers/html5lib_parser.py +0 -0
  265. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/parsers/html_parser.py +0 -0
  266. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/parsers/lxml_parser.py +0 -0
  267. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/scout/utils.py +0 -0
  268. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/__init__.py +0 -0
  269. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/base.py +0 -0
  270. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/bing_main.py +0 -0
  271. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/duckduckgo_main.py +0 -0
  272. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/__init__.py +0 -0
  273. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/bing/__init__.py +0 -0
  274. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/bing/base.py +0 -0
  275. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/bing/images.py +0 -0
  276. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/bing/news.py +0 -0
  277. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/bing/suggestions.py +0 -0
  278. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/bing/text.py +0 -0
  279. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/brave.py +0 -0
  280. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/duckduckgo/__init__.py +0 -0
  281. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/duckduckgo/answers.py +0 -0
  282. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/duckduckgo/base.py +0 -0
  283. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/duckduckgo/images.py +0 -0
  284. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/duckduckgo/maps.py +0 -0
  285. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/duckduckgo/news.py +0 -0
  286. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/duckduckgo/suggestions.py +0 -0
  287. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/duckduckgo/text.py +0 -0
  288. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/duckduckgo/translate.py +0 -0
  289. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/duckduckgo/videos.py +0 -0
  290. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/duckduckgo/weather.py +0 -0
  291. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/mojeek.py +0 -0
  292. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/wikipedia.py +0 -0
  293. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yahoo/__init__.py +0 -0
  294. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yahoo/answers.py +0 -0
  295. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yahoo/base.py +0 -0
  296. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yahoo/images.py +0 -0
  297. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yahoo/maps.py +0 -0
  298. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yahoo/news.py +0 -0
  299. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yahoo/suggestions.py +0 -0
  300. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yahoo/text.py +0 -0
  301. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yahoo/translate.py +0 -0
  302. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yahoo/videos.py +0 -0
  303. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yahoo/weather.py +0 -0
  304. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yandex.py +0 -0
  305. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yep/__init__.py +0 -0
  306. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yep/base.py +0 -0
  307. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yep/images.py +0 -0
  308. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yep/suggestions.py +0 -0
  309. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/engines/yep/text.py +0 -0
  310. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/http_client.py +0 -0
  311. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/results.py +0 -0
  312. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/yahoo_main.py +0 -0
  313. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/search/yep_main.py +0 -0
  314. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/server/__init__.py +0 -0
  315. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/server/config.py +0 -0
  316. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/server/exceptions.py +0 -0
  317. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/server/providers.py +0 -0
  318. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/server/request_models.py +0 -0
  319. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/server/request_processing.py +0 -0
  320. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/server/routes.py +0 -0
  321. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/server/schemas.py +0 -0
  322. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/server/server.py +0 -0
  323. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/server/simple_logger.py +0 -0
  324. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/Readme.md +0 -0
  325. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/__init__.py +0 -0
  326. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/core/__init__.py +0 -0
  327. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/core/cli.py +0 -0
  328. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/core/context.py +0 -0
  329. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/core/group.py +0 -0
  330. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/decorators/__init__.py +0 -0
  331. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/decorators/command.py +0 -0
  332. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/decorators/options.py +0 -0
  333. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/decorators/output.py +0 -0
  334. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/exceptions.py +0 -0
  335. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/plugins/__init__.py +0 -0
  336. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/plugins/base.py +0 -0
  337. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/plugins/manager.py +0 -0
  338. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/utils/__init__.py +0 -0
  339. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/utils/formatting.py +0 -0
  340. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/swiftcli/utils/parsing.py +0 -0
  341. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/update_checker.py +0 -0
  342. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/utils.py +0 -0
  343. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/zeroart/README.md +0 -0
  344. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/zeroart/__init__.py +0 -0
  345. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/zeroart/base.py +0 -0
  346. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/zeroart/effects.py +0 -0
  347. {webscout-2025.10.17 → webscout-2025.10.19}/webscout/zeroart/fonts.py +0 -0
  348. {webscout-2025.10.17 → webscout-2025.10.19}/webscout.egg-info/dependency_links.txt +0 -0
  349. {webscout-2025.10.17 → webscout-2025.10.19}/webscout.egg-info/entry_points.txt +0 -0
  350. {webscout-2025.10.17 → webscout-2025.10.19}/webscout.egg-info/requires.txt +0 -0
  351. {webscout-2025.10.17 → webscout-2025.10.19}/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.19
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,362 @@
1
+ from curl_cffi.requests import Session
2
+ from curl_cffi import CurlError
3
+ import json
4
+ from typing import Any, Dict, List, Optional, Union, Iterator
5
+
6
+ from webscout.AIutel import Optimizers
7
+ from webscout.AIutel import Conversation
8
+ from webscout.AIutel import AwesomePrompts
9
+ from webscout.AIbase import Provider
10
+ from webscout import exceptions
11
+ from webscout.litagent import LitAgent
12
+
13
+
14
+ class DeepAI(Provider):
15
+ """
16
+ DeepAI Chat Provider
17
+
18
+ A provider for DeepAI's chat functionality, supporting both streaming and non-streaming responses.
19
+ Structured similarly to other providers like DeepInfra and X0GPT.
20
+ """
21
+ required_auth = False
22
+ AVAILABLE_MODELS = [
23
+ "standard",
24
+ "genius",
25
+ "online",
26
+ "supergenius",
27
+ "onlinegenius",
28
+ "deepseek-v3.2",
29
+ "gemini-2.5-flash-lite",
30
+ "qwen3-30b-a3b",
31
+ "gpt-5-nano",
32
+ "gpt-oss-120b",
33
+ "gpt-5-chat-latest",
34
+ "claude-opus-4-1",
35
+ "llama-4-scout",
36
+ "claude-4.5-sonnet",
37
+ "deepseek-v3.1-terminus",
38
+ "llama-3.3-70b-instruct",
39
+ "grok-4",
40
+ "claude-sonnet-4",
41
+ "qwen3-coder",
42
+ "gpt-5",
43
+ "kimi-k2-0905",
44
+ "claude-opus-4",
45
+ "gpt-5-mini",
46
+ "gemini-2.5-pro",
47
+ "grok-code-fast-1",
48
+ "gpt-4.1",
49
+
50
+ ]
51
+
52
+ def __init__(
53
+ self,
54
+ api_key: str = "tryit-53926507126-2c8a2543c7b5638ca6b92b6e53ef2d2b",
55
+ timeout: int = 30,
56
+ proxies: Optional[Dict[str, str]] = None,
57
+ model: str = "standard",
58
+ chat_style: str = "chat",
59
+ enabled_tools: Optional[List[str]] = None,
60
+ is_conversation: bool = True,
61
+ max_tokens: int = 2048,
62
+ intro: Optional[str] = None,
63
+ filepath: Optional[str] = None,
64
+ update_file: bool = True,
65
+ history_offset: int = 10250,
66
+ act: Optional[str] = None,
67
+ system_prompt: str = "You are a helpful assistant.",
68
+ browser: str = "chrome",
69
+ **kwargs
70
+ ):
71
+ """
72
+ Initialize the DeepAI provider.
73
+
74
+ Args:
75
+ api_key: API key for authentication (trial key provided by default)
76
+ timeout: Request timeout in seconds
77
+ proxies: Proxy configuration
78
+ model: Model to use (default: "standard")
79
+ chat_style: Chat style (default: "chat")
80
+ enabled_tools: List of enabled tools (default: ["image_generator"])
81
+ is_conversation: Whether to maintain conversation history
82
+ max_tokens: Maximum tokens for conversation
83
+ intro: Introduction prompt
84
+ filepath: Path to conversation history file
85
+ update_file: Whether to update history file
86
+ history_offset: History offset for truncation
87
+ act: Act prompt from AwesomePrompts
88
+ system_prompt: System prompt for the AI
89
+ browser: Browser type for fingerprinting
90
+ **kwargs: Additional arguments
91
+ """
92
+ if model not in self.AVAILABLE_MODELS:
93
+ raise ValueError(f"Invalid model: {model}. Choose from: {self.AVAILABLE_MODELS}")
94
+
95
+ self.url = "https://api.deepai.org/hacking_is_a_serious_crime"
96
+ self.api_key = api_key
97
+ self.proxies = proxies or {}
98
+ self.model = model
99
+ self.chat_style = chat_style
100
+ self.enabled_tools = enabled_tools or ["image_generator"]
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
+ # LitAgent for fingerprinting
108
+ self.agent = LitAgent()
109
+ self.fingerprint = self.agent.generate_fingerprint(browser)
110
+
111
+ # Setup headers similar to other providers
112
+ self.headers = {
113
+ "User-Agent": self.fingerprint.get("user_agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"),
114
+ "Accept": "*/*",
115
+ "Accept-Language": self.fingerprint.get("accept_language", "en-US,en;q=0.9"),
116
+ "Origin": "https://deepai.org",
117
+ "Referer": "https://deepai.org/",
118
+ "Sec-CH-UA": self.fingerprint.get("sec_ch_ua", '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"'),
119
+ "Sec-CH-UA-Mobile": "?0",
120
+ "Sec-CH-UA-Platform": f'"{self.fingerprint.get("platform", "Windows")}"',
121
+ "api-key": self.api_key
122
+ }
123
+
124
+ # Setup session
125
+ self.session = Session()
126
+ self.session.headers.update(self.headers)
127
+ self.session.proxies = self.proxies
128
+
129
+ # Optimizers
130
+ self.__available_optimizers = (
131
+ method
132
+ for method in dir(Optimizers)
133
+ if callable(getattr(Optimizers, method)) and not method.startswith("__")
134
+ )
135
+
136
+ # Conversation setup similar to other providers
137
+ Conversation.intro = (
138
+ AwesomePrompts().get_act(
139
+ act, raise_not_found=True, default=None, case_insensitive=True
140
+ )
141
+ if act
142
+ else intro or Conversation.intro
143
+ )
144
+ self.conversation = Conversation(
145
+ is_conversation, self.max_tokens_to_sample, filepath, update_file
146
+ )
147
+ self.conversation.history_offset = history_offset
148
+
149
+ def refresh_identity(self, browser: str = None):
150
+ """
151
+ Refreshes the browser identity fingerprint.
152
+
153
+ Args:
154
+ browser: Specific browser to use for the new fingerprint
155
+ """
156
+ browser = browser or self.fingerprint.get("browser_type", "chrome")
157
+ self.fingerprint = self.agent.generate_fingerprint(browser)
158
+
159
+ # Update relevant headers
160
+ self.headers.update({
161
+ "User-Agent": self.fingerprint.get("user_agent"),
162
+ "Accept-Language": self.fingerprint.get("accept_language"),
163
+ "Sec-CH-UA": self.fingerprint.get("sec_ch_ua"),
164
+ "Sec-CH-UA-Platform": f'"{self.fingerprint.get("platform")}"',
165
+ })
166
+
167
+ self.session.headers.update(self.headers)
168
+ return self.fingerprint
169
+
170
+ def ask(
171
+ self,
172
+ prompt: str,
173
+ stream: bool = False,
174
+ raw: bool = False,
175
+ optimizer: Optional[str] = None,
176
+ conversationally: bool = False,
177
+ **kwargs
178
+ ) -> Union[Dict[str, Any], Iterator[Dict[str, Any]]]:
179
+ """
180
+ Send a prompt to DeepAI and get the response.
181
+
182
+ Args:
183
+ prompt: The prompt to send
184
+ stream: Whether to stream the response (fake streaming: yields full response in one chunk)
185
+ raw: Whether to return raw response
186
+ optimizer: Optimizer to use
187
+ conversationally: Whether to apply optimizer to full conversation
188
+ **kwargs: Additional arguments
189
+
190
+ Returns:
191
+ Response dictionary with the AI response or generator for streaming
192
+ """
193
+ # Generate conversation prompt similar to other providers
194
+ conversation_prompt = self.conversation.gen_complete_prompt(prompt)
195
+
196
+ if optimizer:
197
+ if optimizer in self.__available_optimizers:
198
+ conversation_prompt = getattr(Optimizers, optimizer)(
199
+ conversation_prompt if conversationally else prompt
200
+ )
201
+ else:
202
+ raise Exception(f"Optimizer is not one of {list(self.__available_optimizers)}")
203
+
204
+ # Prepare form data
205
+ # Use conversation_prompt as user content in chatHistory
206
+ chat_history = [
207
+ {"role": "system", "content": self.system_prompt},
208
+ {"role": "user", "content": conversation_prompt}
209
+ ]
210
+ data = {
211
+ "chat_style": self.chat_style,
212
+ "chatHistory": json.dumps(chat_history),
213
+ "model": self.model,
214
+ "hacker_is_stinky": "very_stinky",
215
+ "enabled_tools": json.dumps(self.enabled_tools)
216
+ }
217
+
218
+ # Always perform non-streaming request
219
+ try:
220
+ # Make request with curl_cffi
221
+ response = self.session.post(
222
+ self.url,
223
+ data=data,
224
+ timeout=self.timeout,
225
+ impersonate="chrome110"
226
+ )
227
+ response.raise_for_status()
228
+
229
+ # Get response text
230
+ result = response.text.strip()
231
+
232
+ # Update last response and conversation history
233
+ self.last_response = {"text": result}
234
+ self.conversation.update_chat_history(prompt, result)
235
+
236
+ if stream:
237
+ # Fake streaming: yield the full response in one chunk
238
+ if raw:
239
+ yield result
240
+ else:
241
+ yield self.last_response
242
+ else:
243
+ return self.last_response if not raw else result
244
+
245
+ except CurlError as e:
246
+ raise exceptions.FailedToGenerateResponseError(f"DeepAI API request failed (CurlError): {str(e)}")
247
+ except Exception as e:
248
+ raise exceptions.FailedToGenerateResponseError(f"DeepAI API request failed ({type(e).__name__}): {str(e)}")
249
+
250
+ def chat(
251
+ self,
252
+ prompt: str,
253
+ stream: bool = False,
254
+ optimizer: Optional[str] = None,
255
+ conversationally: bool = False,
256
+ raw: bool = False,
257
+ **kwargs
258
+ ) -> Union[str, Iterator[str]]:
259
+ """
260
+ Send a chat message to DeepAI and get the response.
261
+
262
+ Args:
263
+ prompt: The prompt to send
264
+ stream: Whether to stream the response (fake streaming: yields full response in one chunk)
265
+ optimizer: Optimizer to use
266
+ conversationally: Whether to apply optimizer to full conversation
267
+ raw: Whether to return raw response
268
+ **kwargs: Additional arguments
269
+
270
+ Returns:
271
+ The AI response as a string or generator for streaming
272
+ """
273
+ if stream:
274
+ for resp in self.ask(
275
+ prompt=prompt,
276
+ stream=True,
277
+ raw=raw,
278
+ optimizer=optimizer,
279
+ conversationally=conversationally,
280
+ **kwargs
281
+ ):
282
+ if raw:
283
+ yield resp
284
+ else:
285
+ yield self.get_message(resp)
286
+ else:
287
+ response = self.ask(
288
+ prompt=prompt,
289
+ stream=False,
290
+ raw=raw,
291
+ optimizer=optimizer,
292
+ conversationally=conversationally,
293
+ **kwargs
294
+ )
295
+ if raw:
296
+ return response
297
+ else:
298
+ return self.get_message(response)
299
+
300
+ def get_message(self, response: Union[Dict[str, Any], str]) -> str:
301
+ """
302
+ Extract the message from the response.
303
+
304
+ Args:
305
+ response: Response dictionary from ask method or str if raw
306
+
307
+ Returns:
308
+ The message text
309
+ """
310
+ if isinstance(response, dict):
311
+ return response.get("text", "")
312
+ elif isinstance(response, str):
313
+ return response
314
+ else:
315
+ raise ValueError(f"Unexpected response type: {type(response)}")
316
+
317
+ @classmethod
318
+ def get_models(cls) -> List[str]:
319
+ """
320
+ Get available models.
321
+
322
+ Returns:
323
+ List of available model names
324
+ """
325
+ return cls.AVAILABLE_MODELS
326
+
327
+ @classmethod
328
+ def get_chat_styles(cls) -> List[str]:
329
+ """
330
+ Get available chat styles.
331
+
332
+ Returns:
333
+ List of available chat styles
334
+ """
335
+ return ["chat"]
336
+
337
+
338
+ if __name__ == "__main__":
339
+ # Test similar to other providers, using stream=True for consistency
340
+ print("-" * 80)
341
+ print(f"{'Model':<50} {'Status':<10} {'Response'}")
342
+ print("-" * 80)
343
+
344
+ for model in DeepAI.AVAILABLE_MODELS:
345
+ try:
346
+ test_ai = DeepAI(model=model, timeout=60)
347
+ response = test_ai.chat("Say 'Hello' in one word", stream=True)
348
+ response_text = ""
349
+ for chunk in response:
350
+ response_text += chunk
351
+
352
+ if response_text and len(response_text.strip()) > 0:
353
+ status = "✓"
354
+ # Clean and truncate response
355
+ clean_text = response_text.strip().encode('utf-8', errors='ignore').decode('utf-8')
356
+ display_text = clean_text[:50] + "..." if len(clean_text) > 50 else clean_text
357
+ else:
358
+ status = "✗"
359
+ display_text = "Empty or invalid response"
360
+ print(f"{model:<50} {status:<10} {display_text}")
361
+ except Exception as e:
362
+ print(f"{model:<50} {'✗':<10} {str(e)}")
@@ -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)}")