webscout 8.3__tar.gz → 8.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of webscout might be problematic. Click here for more details.

Files changed (355) hide show
  1. {webscout-8.3/webscout.egg-info → webscout-8.3.2}/PKG-INFO +41 -11
  2. {webscout-8.3 → webscout-8.3.2}/README.md +38 -10
  3. {webscout-8.3 → webscout-8.3.2}/pyproject.toml +3 -1
  4. {webscout-8.3 → webscout-8.3.2}/webscout/AIauto.py +4 -4
  5. {webscout-8.3 → webscout-8.3.2}/webscout/AIbase.py +61 -1
  6. {webscout-8.3 → webscout-8.3.2}/webscout/AIutel.py +46 -53
  7. webscout-8.3.2/webscout/Bing_search.py +418 -0
  8. webscout-8.3.2/webscout/Extra/YTToolkit/ytapi/patterns.py +61 -0
  9. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/ytapi/stream.py +1 -1
  10. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/ytapi/video.py +10 -10
  11. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/autocoder/autocoder_utiles.py +1 -1
  12. webscout-8.3.2/webscout/Extra/gguf.py +1213 -0
  13. webscout-8.3.2/webscout/Litlogger/formats.py +13 -0
  14. {webscout-8.3 → webscout-8.3.2}/webscout/Litlogger/handlers.py +18 -0
  15. {webscout-8.3 → webscout-8.3.2}/webscout/Litlogger/logger.py +43 -1
  16. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/AISEARCH/genspark_search.py +7 -7
  17. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/AISEARCH/scira_search.py +3 -2
  18. webscout-8.3.2/webscout/Provider/GeminiProxy.py +140 -0
  19. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/LambdaChat.py +7 -1
  20. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/MCPCore.py +78 -75
  21. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/BLACKBOXAI.py +1046 -1017
  22. webscout-8.3.2/webscout/Provider/OPENAI/GeminiProxy.py +328 -0
  23. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/Qwen3.py +303 -303
  24. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/README.md +5 -0
  25. webscout-8.3.2/webscout/Provider/OPENAI/README_AUTOPROXY.md +238 -0
  26. webscout-8.3.2/webscout/Provider/OPENAI/TogetherAI.py +355 -0
  27. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/__init__.py +16 -1
  28. webscout-8.3.2/webscout/Provider/OPENAI/autoproxy.py +332 -0
  29. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/base.py +101 -14
  30. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/chatgpt.py +15 -2
  31. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/chatgptclone.py +14 -3
  32. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/deepinfra.py +339 -328
  33. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/e2b.py +295 -74
  34. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/mcpcore.py +109 -70
  35. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/opkfc.py +18 -6
  36. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/scirachat.py +59 -50
  37. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/toolbaz.py +2 -10
  38. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/writecream.py +166 -166
  39. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/x0gpt.py +367 -367
  40. webscout-8.3.2/webscout/Provider/OPENAI/xenai.py +514 -0
  41. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/yep.py +389 -383
  42. webscout-8.3.2/webscout/Provider/STT/__init__.py +3 -0
  43. webscout-8.3.2/webscout/Provider/STT/base.py +281 -0
  44. webscout-8.3.2/webscout/Provider/STT/elevenlabs.py +265 -0
  45. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTI/__init__.py +4 -1
  46. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTI/aiarta.py +399 -365
  47. webscout-8.3.2/webscout/Provider/TTI/base.py +136 -0
  48. webscout-8.3.2/webscout/Provider/TTI/bing.py +231 -0
  49. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTI/fastflux.py +63 -30
  50. webscout-8.3.2/webscout/Provider/TTI/gpt1image.py +149 -0
  51. webscout-8.3.2/webscout/Provider/TTI/imagen.py +196 -0
  52. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTI/magicstudio.py +60 -29
  53. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTI/piclumen.py +43 -32
  54. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTI/pixelmuse.py +232 -225
  55. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTI/pollinations.py +43 -32
  56. webscout-8.3.2/webscout/Provider/TTI/together.py +287 -0
  57. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTI/utils.py +2 -1
  58. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTS/README.md +1 -0
  59. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTS/__init__.py +2 -1
  60. webscout-8.3.2/webscout/Provider/TTS/freetts.py +140 -0
  61. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTS/speechma.py +45 -39
  62. webscout-8.3.2/webscout/Provider/TogetherAI.py +366 -0
  63. webscout-8.3.2/webscout/Provider/UNFINISHED/ChutesAI.py +314 -0
  64. webscout-8.3.2/webscout/Provider/UNFINISHED/fetch_together_models.py +95 -0
  65. webscout-8.3.2/webscout/Provider/XenAI.py +324 -0
  66. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/__init__.py +8 -0
  67. webscout-8.3.2/webscout/Provider/deepseek_assistant.py +378 -0
  68. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/scira_chat.py +3 -2
  69. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/toolbaz.py +0 -1
  70. webscout-8.3.2/webscout/auth/__init__.py +44 -0
  71. webscout-8.3.2/webscout/auth/api_key_manager.py +189 -0
  72. webscout-8.3.2/webscout/auth/auth_system.py +100 -0
  73. webscout-8.3.2/webscout/auth/config.py +76 -0
  74. webscout-8.3.2/webscout/auth/database.py +400 -0
  75. webscout-8.3.2/webscout/auth/exceptions.py +67 -0
  76. webscout-8.3.2/webscout/auth/middleware.py +248 -0
  77. webscout-8.3.2/webscout/auth/models.py +130 -0
  78. webscout-8.3.2/webscout/auth/providers.py +257 -0
  79. webscout-8.3.2/webscout/auth/rate_limiter.py +254 -0
  80. webscout-8.3.2/webscout/auth/request_models.py +127 -0
  81. webscout-8.3.2/webscout/auth/request_processing.py +226 -0
  82. webscout-8.3.2/webscout/auth/routes.py +526 -0
  83. webscout-8.3.2/webscout/auth/schemas.py +103 -0
  84. webscout-8.3.2/webscout/auth/server.py +312 -0
  85. webscout-8.3.2/webscout/auth/static/favicon.svg +11 -0
  86. webscout-8.3.2/webscout/auth/swagger_ui.py +203 -0
  87. webscout-8.3.2/webscout/auth/templates/components/authentication.html +237 -0
  88. webscout-8.3.2/webscout/auth/templates/components/base.html +103 -0
  89. webscout-8.3.2/webscout/auth/templates/components/endpoints.html +750 -0
  90. webscout-8.3.2/webscout/auth/templates/components/examples.html +491 -0
  91. webscout-8.3.2/webscout/auth/templates/components/footer.html +75 -0
  92. webscout-8.3.2/webscout/auth/templates/components/header.html +27 -0
  93. webscout-8.3.2/webscout/auth/templates/components/models.html +286 -0
  94. webscout-8.3.2/webscout/auth/templates/components/navigation.html +70 -0
  95. webscout-8.3.2/webscout/auth/templates/static/api.js +455 -0
  96. webscout-8.3.2/webscout/auth/templates/static/icons.js +168 -0
  97. webscout-8.3.2/webscout/auth/templates/static/main.js +784 -0
  98. webscout-8.3.2/webscout/auth/templates/static/particles.js +201 -0
  99. webscout-8.3.2/webscout/auth/templates/static/styles.css +3353 -0
  100. webscout-8.3.2/webscout/auth/templates/static/ui.js +374 -0
  101. webscout-8.3.2/webscout/auth/templates/swagger_ui.html +170 -0
  102. {webscout-8.3 → webscout-8.3.2}/webscout/client.py +49 -3
  103. {webscout-8.3 → webscout-8.3.2}/webscout/litagent/Readme.md +12 -3
  104. {webscout-8.3 → webscout-8.3.2}/webscout/litagent/agent.py +99 -62
  105. {webscout-8.3 → webscout-8.3.2}/webscout/scout/core/scout.py +104 -26
  106. {webscout-8.3 → webscout-8.3.2}/webscout/scout/element.py +139 -18
  107. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/core/cli.py +14 -3
  108. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/decorators/output.py +59 -9
  109. {webscout-8.3 → webscout-8.3.2}/webscout/update_checker.py +31 -49
  110. webscout-8.3.2/webscout/version.py +2 -0
  111. {webscout-8.3 → webscout-8.3.2}/webscout/webscout_search.py +4 -12
  112. {webscout-8.3 → webscout-8.3.2}/webscout/webscout_search_async.py +3 -10
  113. {webscout-8.3 → webscout-8.3.2}/webscout/yep_search.py +2 -11
  114. {webscout-8.3 → webscout-8.3.2/webscout.egg-info}/PKG-INFO +41 -11
  115. {webscout-8.3 → webscout-8.3.2}/webscout.egg-info/SOURCES.txt +104 -8
  116. {webscout-8.3 → webscout-8.3.2}/webscout.egg-info/entry_points.txt +1 -1
  117. {webscout-8.3 → webscout-8.3.2}/webscout.egg-info/requires.txt +2 -0
  118. webscout-8.3/webscout/Extra/YTToolkit/ytapi/patterns.py +0 -61
  119. webscout-8.3/webscout/Extra/gguf.py +0 -684
  120. webscout-8.3/webscout/Litlogger/formats.py +0 -4
  121. webscout-8.3/webscout/Provider/HF_space/__init__.py +0 -0
  122. webscout-8.3/webscout/Provider/HF_space/qwen_qwen2.py +0 -206
  123. webscout-8.3/webscout/Provider/OPENAI/api.py +0 -1035
  124. webscout-8.3/webscout/Provider/TTI/artbit.py +0 -0
  125. webscout-8.3/webscout/Provider/TTI/base.py +0 -64
  126. webscout-8.3/webscout/version.py +0 -2
  127. {webscout-8.3 → webscout-8.3.2}/LEGAL_NOTICE.md +0 -0
  128. {webscout-8.3 → webscout-8.3.2}/LICENSE.md +0 -0
  129. {webscout-8.3 → webscout-8.3.2}/MANIFEST.in +0 -0
  130. {webscout-8.3 → webscout-8.3.2}/changelog.md +0 -0
  131. {webscout-8.3 → webscout-8.3.2}/setup.cfg +0 -0
  132. {webscout-8.3 → webscout-8.3.2}/webscout/Bard.py +0 -0
  133. {webscout-8.3 → webscout-8.3.2}/webscout/DWEBS.py +0 -0
  134. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/Act.md +0 -0
  135. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/GitToolkit/__init__.py +0 -0
  136. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/GitToolkit/gitapi/README.md +0 -0
  137. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/GitToolkit/gitapi/__init__.py +0 -0
  138. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/GitToolkit/gitapi/repository.py +0 -0
  139. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/GitToolkit/gitapi/user.py +0 -0
  140. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/GitToolkit/gitapi/utils.py +0 -0
  141. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/README.md +0 -0
  142. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/YTdownloader.py +0 -0
  143. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/__init__.py +0 -0
  144. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/transcriber.py +0 -0
  145. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/ytapi/README.md +0 -0
  146. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/ytapi/__init__.py +0 -0
  147. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/ytapi/channel.py +0 -0
  148. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/ytapi/errors.py +0 -0
  149. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/ytapi/extras.py +0 -0
  150. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/ytapi/https.py +0 -0
  151. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/ytapi/playlist.py +0 -0
  152. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/ytapi/pool.py +0 -0
  153. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/ytapi/query.py +0 -0
  154. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/YTToolkit/ytapi/utils.py +0 -0
  155. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/__init__.py +0 -0
  156. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/autocoder/__init__.py +0 -0
  157. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/autocoder/autocoder.py +0 -0
  158. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/gguf.md +0 -0
  159. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/tempmail/README.md +0 -0
  160. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/tempmail/__init__.py +0 -0
  161. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/tempmail/async_utils.py +0 -0
  162. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/tempmail/base.py +0 -0
  163. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/tempmail/cli.py +0 -0
  164. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/tempmail/emailnator.py +0 -0
  165. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/tempmail/mail_tm.py +0 -0
  166. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/tempmail/temp_mail_io.py +0 -0
  167. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/weather.md +0 -0
  168. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/weather.py +0 -0
  169. {webscout-8.3 → webscout-8.3.2}/webscout/Extra/weather_ascii.py +0 -0
  170. {webscout-8.3 → webscout-8.3.2}/webscout/Litlogger/README.md +0 -0
  171. {webscout-8.3 → webscout-8.3.2}/webscout/Litlogger/__init__.py +0 -0
  172. {webscout-8.3 → webscout-8.3.2}/webscout/Litlogger/levels.py +0 -0
  173. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/AI21.py +0 -0
  174. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/AISEARCH/DeepFind.py +0 -0
  175. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/AISEARCH/Perplexity.py +0 -0
  176. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/AISEARCH/README.md +0 -0
  177. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/AISEARCH/__init__.py +0 -0
  178. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/AISEARCH/felo_search.py +0 -0
  179. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/AISEARCH/hika_search.py +0 -0
  180. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/AISEARCH/iask_search.py +0 -0
  181. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/AISEARCH/monica_search.py +0 -0
  182. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/AISEARCH/webpilotai_search.py +0 -0
  183. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Aitopia.py +0 -0
  184. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/AllenAI.py +0 -0
  185. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Andi.py +0 -0
  186. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Blackboxai.py +0 -0
  187. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/ChatGPTClone.py +0 -0
  188. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/ChatSandbox.py +0 -0
  189. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Cloudflare.py +0 -0
  190. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Cohere.py +0 -0
  191. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Deepinfra.py +0 -0
  192. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/ExaAI.py +0 -0
  193. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/ExaChat.py +0 -0
  194. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Flowith.py +0 -0
  195. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/FreeGemini.py +0 -0
  196. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Gemini.py +0 -0
  197. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/GithubChat.py +0 -0
  198. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/GizAI.py +0 -0
  199. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Glider.py +0 -0
  200. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Groq.py +0 -0
  201. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/HeckAI.py +0 -0
  202. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/HuggingFaceChat.py +0 -0
  203. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Hunyuan.py +0 -0
  204. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Jadve.py +0 -0
  205. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Koboldai.py +0 -0
  206. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Llama3.py +0 -0
  207. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Marcus.py +0 -0
  208. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Nemotron.py +0 -0
  209. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Netwrck.py +0 -0
  210. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OLLAMA.py +0 -0
  211. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/Cloudflare.py +0 -0
  212. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/FalconH1.py +0 -0
  213. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/FreeGemini.py +0 -0
  214. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/NEMOTRON.py +0 -0
  215. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/PI.py +0 -0
  216. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/TwoAI.py +0 -0
  217. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/ai4chat.py +0 -0
  218. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/c4ai.py +0 -0
  219. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/chatsandbox.py +0 -0
  220. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/copilot.py +0 -0
  221. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/exaai.py +0 -0
  222. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/exachat.py +0 -0
  223. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/flowith.py +0 -0
  224. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/freeaichat.py +0 -0
  225. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/glider.py +0 -0
  226. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/groq.py +0 -0
  227. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/heckai.py +0 -0
  228. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/llmchatco.py +0 -0
  229. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/multichat.py +0 -0
  230. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/netwrck.py +0 -0
  231. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/oivscode.py +0 -0
  232. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/pydantic_imports.py +0 -0
  233. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/sonus.py +0 -0
  234. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/standardinput.py +0 -0
  235. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/textpollinations.py +0 -0
  236. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/typefully.py +0 -0
  237. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/typegpt.py +0 -0
  238. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/uncovrAI.py +0 -0
  239. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/utils.py +0 -0
  240. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/venice.py +0 -0
  241. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OPENAI/wisecat.py +0 -0
  242. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/OpenGPT.py +0 -0
  243. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Openai.py +0 -0
  244. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/PI.py +0 -0
  245. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Perplexitylabs.py +0 -0
  246. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/QwenLM.py +0 -0
  247. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Reka.py +0 -0
  248. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/StandardInput.py +0 -0
  249. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTI/README.md +0 -0
  250. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTS/base.py +0 -0
  251. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTS/deepgram.py +0 -0
  252. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTS/elevenlabs.py +0 -0
  253. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTS/gesserit.py +0 -0
  254. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTS/murfai.py +0 -0
  255. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTS/openai_fm.py +0 -0
  256. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTS/parler.py +0 -0
  257. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTS/sthir.py +0 -0
  258. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTS/streamElements.py +0 -0
  259. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TTS/utils.py +0 -0
  260. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TeachAnything.py +0 -0
  261. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TextPollinationsAI.py +0 -0
  262. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TwoAI.py +0 -0
  263. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/TypliAI.py +0 -0
  264. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/UNFINISHED/ChatHub.py +0 -0
  265. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/UNFINISHED/Youchat.py +0 -0
  266. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/UNFINISHED/liner_api_request.py +0 -0
  267. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/UNFINISHED/puterjs.py +0 -0
  268. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/UNFINISHED/test_lmarena.py +0 -0
  269. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Venice.py +0 -0
  270. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/VercelAI.py +0 -0
  271. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/WiseCat.py +0 -0
  272. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/WrDoChat.py +0 -0
  273. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/Writecream.py +0 -0
  274. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/WritingMate.py +0 -0
  275. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/ai4chat.py +0 -0
  276. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/akashgpt.py +0 -0
  277. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/asksteve.py +0 -0
  278. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/cerebras.py +0 -0
  279. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/chatglm.py +0 -0
  280. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/cleeai.py +0 -0
  281. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/copilot.py +0 -0
  282. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/elmo.py +0 -0
  283. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/freeaichat.py +0 -0
  284. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/geminiapi.py +0 -0
  285. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/granite.py +0 -0
  286. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/hermes.py +0 -0
  287. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/julius.py +0 -0
  288. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/koala.py +0 -0
  289. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/learnfastai.py +0 -0
  290. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/llama3mitril.py +0 -0
  291. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/llmchat.py +0 -0
  292. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/llmchatco.py +0 -0
  293. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/lmarena.py +0 -0
  294. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/meta.py +0 -0
  295. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/multichat.py +0 -0
  296. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/oivscode.py +0 -0
  297. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/samurai.py +0 -0
  298. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/scnet.py +0 -0
  299. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/searchchat.py +0 -0
  300. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/sonus.py +0 -0
  301. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/talkai.py +0 -0
  302. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/turboseek.py +0 -0
  303. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/typefully.py +0 -0
  304. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/typegpt.py +0 -0
  305. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/uncovr.py +0 -0
  306. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/x0gpt.py +0 -0
  307. {webscout-8.3 → webscout-8.3.2}/webscout/Provider/yep.py +0 -0
  308. {webscout-8.3 → webscout-8.3.2}/webscout/__init__.py +0 -0
  309. {webscout-8.3 → webscout-8.3.2}/webscout/__main__.py +0 -0
  310. {webscout-8.3 → webscout-8.3.2}/webscout/cli.py +0 -0
  311. {webscout-8.3 → webscout-8.3.2}/webscout/conversation.py +0 -0
  312. {webscout-8.3 → webscout-8.3.2}/webscout/exceptions.py +0 -0
  313. {webscout-8.3 → webscout-8.3.2}/webscout/litagent/__init__.py +0 -0
  314. {webscout-8.3 → webscout-8.3.2}/webscout/litagent/constants.py +0 -0
  315. {webscout-8.3 → webscout-8.3.2}/webscout/litprinter/__init__.py +0 -0
  316. {webscout-8.3 → webscout-8.3.2}/webscout/models.py +0 -0
  317. {webscout-8.3 → webscout-8.3.2}/webscout/optimizers.py +0 -0
  318. {webscout-8.3 → webscout-8.3.2}/webscout/prompt_manager.py +0 -0
  319. {webscout-8.3 → webscout-8.3.2}/webscout/scout/README.md +0 -0
  320. {webscout-8.3 → webscout-8.3.2}/webscout/scout/__init__.py +0 -0
  321. {webscout-8.3 → webscout-8.3.2}/webscout/scout/core/__init__.py +0 -0
  322. {webscout-8.3 → webscout-8.3.2}/webscout/scout/core/crawler.py +0 -0
  323. {webscout-8.3 → webscout-8.3.2}/webscout/scout/core/search_result.py +0 -0
  324. {webscout-8.3 → webscout-8.3.2}/webscout/scout/core/text_analyzer.py +0 -0
  325. {webscout-8.3 → webscout-8.3.2}/webscout/scout/core/text_utils.py +0 -0
  326. {webscout-8.3 → webscout-8.3.2}/webscout/scout/core/web_analyzer.py +0 -0
  327. {webscout-8.3 → webscout-8.3.2}/webscout/scout/parsers/__init__.py +0 -0
  328. {webscout-8.3 → webscout-8.3.2}/webscout/scout/parsers/html5lib_parser.py +0 -0
  329. {webscout-8.3 → webscout-8.3.2}/webscout/scout/parsers/html_parser.py +0 -0
  330. {webscout-8.3 → webscout-8.3.2}/webscout/scout/parsers/lxml_parser.py +0 -0
  331. {webscout-8.3 → webscout-8.3.2}/webscout/scout/utils.py +0 -0
  332. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/Readme.md +0 -0
  333. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/__init__.py +0 -0
  334. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/core/__init__.py +0 -0
  335. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/core/context.py +0 -0
  336. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/core/group.py +0 -0
  337. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/decorators/__init__.py +0 -0
  338. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/decorators/command.py +0 -0
  339. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/decorators/options.py +0 -0
  340. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/exceptions.py +0 -0
  341. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/plugins/__init__.py +0 -0
  342. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/plugins/base.py +0 -0
  343. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/plugins/manager.py +0 -0
  344. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/utils/__init__.py +0 -0
  345. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/utils/formatting.py +0 -0
  346. {webscout-8.3 → webscout-8.3.2}/webscout/swiftcli/utils/parsing.py +0 -0
  347. {webscout-8.3 → webscout-8.3.2}/webscout/tempid.py +0 -0
  348. {webscout-8.3 → webscout-8.3.2}/webscout/utils.py +0 -0
  349. {webscout-8.3 → webscout-8.3.2}/webscout/zeroart/README.md +0 -0
  350. {webscout-8.3 → webscout-8.3.2}/webscout/zeroart/__init__.py +0 -0
  351. {webscout-8.3 → webscout-8.3.2}/webscout/zeroart/base.py +0 -0
  352. {webscout-8.3 → webscout-8.3.2}/webscout/zeroart/effects.py +0 -0
  353. {webscout-8.3 → webscout-8.3.2}/webscout/zeroart/fonts.py +0 -0
  354. {webscout-8.3 → webscout-8.3.2}/webscout.egg-info/dependency_links.txt +0 -0
  355. {webscout-8.3 → webscout-8.3.2}/webscout.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: webscout
3
- Version: 8.3
3
+ Version: 8.3.2
4
4
  Summary: Search for anything using Google, DuckDuckGo, phind.com, Contains AI models, can transcribe yt videos, temporary email and phone number generation, has TTS support, webai (terminal gpt and open interpreter) and offline LLMs and more
5
5
  Author-email: OEvortex <helpingai5@gmail.com>
6
6
  License: HelpingAI
@@ -71,6 +71,8 @@ Requires-Dist: uvicorn[standard]; extra == "api"
71
71
  Requires-Dist: pydantic; extra == "api"
72
72
  Requires-Dist: python-multipart; extra == "api"
73
73
  Requires-Dist: tiktoken; extra == "api"
74
+ Requires-Dist: motor; extra == "api"
75
+ Requires-Dist: jinja2; extra == "api"
74
76
  Dynamic: license-file
75
77
 
76
78
  <div align="center">
@@ -227,14 +229,14 @@ uv add "webscout[api]"
227
229
  uv run webscout --help
228
230
 
229
231
  # Run with API dependencies
230
- uv run --extra api webscout-server
232
+ uv run webscout --extra api webscout-server
231
233
 
232
234
  # Install as a UV tool for global access
233
235
  uv tool install webscout
234
236
 
235
237
  # Use UV tool commands
236
238
  webscout --help
237
- webscout-server --help
239
+ webscout-server
238
240
  ```
239
241
 
240
242
  ### 🔧 Development Installation
@@ -308,7 +310,7 @@ uv run --extra api webscout-server
308
310
  ```bash
309
311
  # Traditional Python module execution
310
312
  python -m webscout --help
311
- python -m webscout.client # Start API server
313
+ python -m webscout-server
312
314
  ```
313
315
 
314
316
  <details open>
@@ -403,13 +405,19 @@ webscout-server --port 8080
403
405
  # Start with API key authentication
404
406
  webscout-server --api-key "your-secret-key"
405
407
 
408
+ # Start in no-auth mode using command line flag (no API key required)
409
+ webscout-server --no-auth
410
+
411
+ # Start in no-auth mode using environment variable
412
+ $env:WEBSCOUT_NO_AUTH='true'; webscout-server
413
+
406
414
  # Specify a default provider
407
415
  webscout-server --default-provider "Claude"
408
416
 
409
417
  # Run in debug mode
410
418
  webscout-server --debug
411
419
 
412
- # Get help for all options
420
+ # Get help for all options (includes authentication options)
413
421
  webscout-server --help
414
422
  ```
415
423
 
@@ -420,17 +428,36 @@ webscout-server --help
420
428
  uv run --extra api webscout-server
421
429
 
422
430
  # Using Python module
423
- python -m webscout.client
431
+ python -m webscout.auth.server
432
+ ```
433
+
434
+ #### Environment Variables
435
+
436
+ Webscout server supports configuration through environment variables:
424
437
 
425
- # Legacy method (still supported)
426
- python -m webscout.Provider.OPENAI.api
438
+ ```bash
439
+ # Start server in no-auth mode (no API key required)
440
+ $env:WEBSCOUT_NO_AUTH='true'; webscout-server
441
+
442
+ # Disable rate limiting
443
+ $env:WEBSCOUT_NO_RATE_LIMIT='true'; webscout-server
444
+
445
+ # Start with custom port using environment variable
446
+ $env:WEBSCOUT_PORT='7860'; webscout-server
427
447
  ```
428
448
 
449
+ For a complete list of supported environment variables and Docker deployment options, see [DOCKER.md](DOCKER.md).
450
+
451
+
429
452
  #### From Python Code
430
453
 
454
+ > **Recommended:**
455
+ > Use `start_server` from `webscout.client` for the simplest programmatic startup.
456
+ > For advanced control (custom host, debug, etc.), use `run_api`.
457
+
431
458
  ```python
432
- # Method 1: Using the helper function
433
- from webscout.client import start_server # <--- Now recommended
459
+ # Method 1: Using the helper function (recommended)
460
+ from webscout.client import start_server
434
461
 
435
462
  # Start with default settings
436
463
  start_server()
@@ -438,7 +465,10 @@ start_server()
438
465
  # Start with custom settings
439
466
  start_server(port=8080, api_key="your-secret-key", default_provider="Claude")
440
467
 
441
- # Method 2: Using the run_api function for more control
468
+ # Start in no-auth mode (no API key required)
469
+ start_server(no_auth=True)
470
+
471
+ # Method 2: Advanced usage with run_api
442
472
  from webscout.client import run_api
443
473
 
444
474
  run_api(
@@ -152,14 +152,14 @@ uv add "webscout[api]"
152
152
  uv run webscout --help
153
153
 
154
154
  # Run with API dependencies
155
- uv run --extra api webscout-server
155
+ uv run webscout --extra api webscout-server
156
156
 
157
157
  # Install as a UV tool for global access
158
158
  uv tool install webscout
159
159
 
160
160
  # Use UV tool commands
161
161
  webscout --help
162
- webscout-server --help
162
+ webscout-server
163
163
  ```
164
164
 
165
165
  ### 🔧 Development Installation
@@ -233,7 +233,7 @@ uv run --extra api webscout-server
233
233
  ```bash
234
234
  # Traditional Python module execution
235
235
  python -m webscout --help
236
- python -m webscout.client # Start API server
236
+ python -m webscout-server
237
237
  ```
238
238
 
239
239
  <details open>
@@ -328,13 +328,19 @@ webscout-server --port 8080
328
328
  # Start with API key authentication
329
329
  webscout-server --api-key "your-secret-key"
330
330
 
331
+ # Start in no-auth mode using command line flag (no API key required)
332
+ webscout-server --no-auth
333
+
334
+ # Start in no-auth mode using environment variable
335
+ $env:WEBSCOUT_NO_AUTH='true'; webscout-server
336
+
331
337
  # Specify a default provider
332
338
  webscout-server --default-provider "Claude"
333
339
 
334
340
  # Run in debug mode
335
341
  webscout-server --debug
336
342
 
337
- # Get help for all options
343
+ # Get help for all options (includes authentication options)
338
344
  webscout-server --help
339
345
  ```
340
346
 
@@ -345,17 +351,36 @@ webscout-server --help
345
351
  uv run --extra api webscout-server
346
352
 
347
353
  # Using Python module
348
- python -m webscout.client
354
+ python -m webscout.auth.server
355
+ ```
356
+
357
+ #### Environment Variables
358
+
359
+ Webscout server supports configuration through environment variables:
349
360
 
350
- # Legacy method (still supported)
351
- python -m webscout.Provider.OPENAI.api
361
+ ```bash
362
+ # Start server in no-auth mode (no API key required)
363
+ $env:WEBSCOUT_NO_AUTH='true'; webscout-server
364
+
365
+ # Disable rate limiting
366
+ $env:WEBSCOUT_NO_RATE_LIMIT='true'; webscout-server
367
+
368
+ # Start with custom port using environment variable
369
+ $env:WEBSCOUT_PORT='7860'; webscout-server
352
370
  ```
353
371
 
372
+ For a complete list of supported environment variables and Docker deployment options, see [DOCKER.md](DOCKER.md).
373
+
374
+
354
375
  #### From Python Code
355
376
 
377
+ > **Recommended:**
378
+ > Use `start_server` from `webscout.client` for the simplest programmatic startup.
379
+ > For advanced control (custom host, debug, etc.), use `run_api`.
380
+
356
381
  ```python
357
- # Method 1: Using the helper function
358
- from webscout.client import start_server # <--- Now recommended
382
+ # Method 1: Using the helper function (recommended)
383
+ from webscout.client import start_server
359
384
 
360
385
  # Start with default settings
361
386
  start_server()
@@ -363,7 +388,10 @@ start_server()
363
388
  # Start with custom settings
364
389
  start_server(port=8080, api_key="your-secret-key", default_provider="Claude")
365
390
 
366
- # Method 2: Using the run_api function for more control
391
+ # Start in no-auth mode (no API key required)
392
+ start_server(no_auth=True)
393
+
394
+ # Method 2: Advanced usage with run_api
367
395
  from webscout.client import run_api
368
396
 
369
397
  run_api(
@@ -78,7 +78,7 @@ dependencies = [
78
78
  [project.scripts]
79
79
  WEBS = "webscout.cli:main"
80
80
  webscout = "webscout.cli:main"
81
- webscout-server = "webscout.client:start_server" # Instantly start the OpenAI-compatible API server
81
+ webscout-server = "webscout.auth.server:main" # Instantly start the OpenAI-compatible API server
82
82
 
83
83
  [project.urls]
84
84
  Source = "https://github.com/OE-LUCIFER/Webscout"
@@ -96,6 +96,8 @@ api = [
96
96
  "pydantic",
97
97
  "python-multipart",
98
98
  "tiktoken", # Added tiktoken for token counting support
99
+ "motor", # MongoDB async driver for enhanced authentication
100
+ "jinja2", # Template engine for custom Swagger UI
99
101
  ]
100
102
 
101
103
  [tool.setuptools]
@@ -6,7 +6,7 @@ API keys or cookies.
6
6
 
7
7
  from webscout.AIbase import Provider
8
8
  from webscout.exceptions import AllProvidersFailure
9
- from typing import Union, Any, Dict, Generator
9
+ from typing import Union, Any, Dict, Generator, Optional
10
10
  import importlib
11
11
  import pkgutil
12
12
  import random
@@ -71,7 +71,7 @@ class AUTO(Provider):
71
71
  proxies: dict = {},
72
72
  history_offset: int = 10250,
73
73
  act: str = None,
74
- exclude: list[str] = [],
74
+ exclude: Optional[list[str]] = None,
75
75
  print_provider_info: bool = False,
76
76
  ):
77
77
  """
@@ -90,7 +90,7 @@ class AUTO(Provider):
90
90
  proxies (dict): Proxies for requests. Defaults to {}.
91
91
  history_offset (int): History character offset limit. Defaults to 10250.
92
92
  act (str, optional): Awesome prompt key. Defaults to None.
93
- exclude (list[str]): List of provider names (uppercase) to exclude. Defaults to [].
93
+ exclude (Optional[list[str]]): List of provider names (uppercase) to exclude. Defaults to None.
94
94
  print_provider_info (bool): Whether to print the name of the successful provider. Defaults to False.
95
95
  """
96
96
  self.provider = None # type: Provider
@@ -104,7 +104,7 @@ class AUTO(Provider):
104
104
  self.proxies: dict = proxies
105
105
  self.history_offset: int = history_offset
106
106
  self.act: str = act
107
- self.exclude: list[str] = [e.upper() for e in exclude]
107
+ self.exclude: list[str] = [e.upper() for e in exclude] if exclude else []
108
108
  self.print_provider_info: bool = print_provider_info
109
109
 
110
110
 
@@ -1,6 +1,6 @@
1
1
  from abc import ABC, abstractmethod
2
2
  from pathlib import Path
3
- from typing import AsyncGenerator, Dict, List, Union, Generator, Optional
3
+ from typing import AsyncGenerator, Dict, List, Union, Generator, Optional, Any
4
4
  from typing_extensions import TypeAlias
5
5
 
6
6
  # Type aliases for better readability
@@ -178,6 +178,66 @@ class AsyncTTSProvider(ABC):
178
178
  """
179
179
  raise NotImplementedError("Method needs to be implemented in subclass")
180
180
 
181
+
182
+ class STTProvider(ABC):
183
+ """Abstract base class for Speech-to-Text providers."""
184
+
185
+ @abstractmethod
186
+ def transcribe(self, audio_path: Union[str, Path], **kwargs) -> Dict[str, Any]:
187
+ """Transcribe audio file to text.
188
+
189
+ Args:
190
+ audio_path (Union[str, Path]): Path to the audio file
191
+ **kwargs: Additional provider-specific parameters
192
+
193
+ Returns:
194
+ Dict[str, Any]: Transcription result in OpenAI Whisper format
195
+ """
196
+ raise NotImplementedError("Method needs to be implemented in subclass")
197
+
198
+ @abstractmethod
199
+ def transcribe_from_url(self, audio_url: str, **kwargs) -> Dict[str, Any]:
200
+ """Transcribe audio from URL to text.
201
+
202
+ Args:
203
+ audio_url (str): URL of the audio file
204
+ **kwargs: Additional provider-specific parameters
205
+
206
+ Returns:
207
+ Dict[str, Any]: Transcription result in OpenAI Whisper format
208
+ """
209
+ raise NotImplementedError("Method needs to be implemented in subclass")
210
+
211
+
212
+ class AsyncSTTProvider(ABC):
213
+ """Abstract base class for asynchronous Speech-to-Text providers."""
214
+
215
+ @abstractmethod
216
+ async def transcribe(self, audio_path: Union[str, Path], **kwargs) -> Dict[str, Any]:
217
+ """Transcribe audio file to text asynchronously.
218
+
219
+ Args:
220
+ audio_path (Union[str, Path]): Path to the audio file
221
+ **kwargs: Additional provider-specific parameters
222
+
223
+ Returns:
224
+ Dict[str, Any]: Transcription result in OpenAI Whisper format
225
+ """
226
+ raise NotImplementedError("Method needs to be implemented in subclass")
227
+
228
+ @abstractmethod
229
+ async def transcribe_from_url(self, audio_url: str, **kwargs) -> Dict[str, Any]:
230
+ """Transcribe audio from URL to text asynchronously.
231
+
232
+ Args:
233
+ audio_url (str): URL of the audio file
234
+ **kwargs: Additional provider-specific parameters
235
+
236
+ Returns:
237
+ Dict[str, Any]: Transcription result in OpenAI Whisper format
238
+ """
239
+ raise NotImplementedError("Method needs to be implemented in subclass")
240
+
181
241
  async def save_audio(self, audio_file: str, destination: str = None, verbose: bool = False) -> str:
182
242
  """Save audio to a specific destination asynchronously.
183
243
 
@@ -277,69 +277,50 @@ def _sanitize_stream_sync(
277
277
  processing_active = start_marker is None
278
278
  buffer = ""
279
279
  found_start = False if start_marker else True
280
+ line_iterator: Iterable[str]
280
281
 
281
- # Fast path for single string processing
282
282
  if isinstance(data, str):
283
- processed_item = None
284
- if processing_active:
285
- if to_json:
286
- try:
287
- data = data.strip()
288
- if data:
289
- processed_item = json.loads(data)
290
- except Exception as e:
291
- if error_handler:
292
- try:
293
- handled = error_handler(e, data)
294
- if handled is not None:
295
- processed_item = handled
296
-
297
- except Exception:
298
- pass
299
- if processed_item is None:
300
- processed_item = data if yield_raw_on_error else None
283
+ # If data is a string, decide whether to split it into lines
284
+ # or treat it as an iterable containing a single chunk.
285
+ temp_lines: List[str]
286
+ if line_delimiter is None: # Default: split by newlines if present
287
+ if '\n' in data or '\r' in data:
288
+ temp_lines = data.splitlines()
301
289
  else:
302
- processed_item = _process_chunk(
303
- data, intro_value, False, effective_skip_markers,
304
- strip_chars, yield_raw_on_error, error_handler
305
- )
306
- if processed_item is not None:
307
- if content_extractor:
308
- try:
309
- final_content = content_extractor(processed_item)
310
- if final_content is not None:
311
- yield final_content
312
- except Exception:
313
- pass
314
- else:
315
- yield processed_item
316
- return
317
-
318
- # Stream processing path
319
- if not hasattr(data, '__iter__'):
320
- raise TypeError(f"Input must be a string or an iterable, not {type(data).__name__}")
321
-
322
- try:
323
- iterator = iter(data)
324
- first_item = next(iterator, None)
325
- if first_item is None:
290
+ temp_lines = [data] # Treat as a single line/chunk
291
+ elif line_delimiter in data: # Custom delimiter found in string
292
+ temp_lines = data.split(line_delimiter)
293
+ else: # Custom delimiter not found, or string is effectively a single segment
294
+ temp_lines = [data]
295
+ line_iterator = iter(temp_lines)
296
+ elif hasattr(data, '__iter__'): # data is an iterable (but not a string)
297
+ _iter = iter(data)
298
+ first_item = next(_iter, None)
299
+
300
+ if first_item is None: # Iterable was empty
326
301
  return
302
+
327
303
  from itertools import chain
328
- stream = chain([first_item], iterator)
304
+ # Reconstruct the full iterable including the first_item
305
+ stream_input_iterable = chain([first_item], _iter)
329
306
 
330
- # Determine if we're dealing with bytes or strings
331
307
  if isinstance(first_item, bytes):
308
+ # Ensure stream_input_iterable is typed as Iterable[bytes] for _decode_byte_stream
332
309
  line_iterator = _decode_byte_stream(
333
- stream,
310
+ stream_input_iterable, # type: ignore
334
311
  encoding=encoding,
335
312
  errors=encoding_errors,
336
313
  buffer_size=buffer_size
337
314
  )
338
315
  elif isinstance(first_item, str):
339
- line_iterator = stream
316
+ # Ensure stream_input_iterable is typed as Iterable[str]
317
+ line_iterator = stream_input_iterable # type: ignore
340
318
  else:
341
- raise TypeError(f"Stream must yield strings or bytes, not {type(first_item).__name__}")
319
+ raise TypeError(f"Iterable must yield strings or bytes, not {type(first_item).__name__}")
320
+ else: # Not a string and not an iterable
321
+ raise TypeError(f"Input must be a string or an iterable, not {type(data).__name__}")
342
322
 
323
+ try:
343
324
  for line in line_iterator:
344
325
  if not line:
345
326
  continue
@@ -683,20 +664,32 @@ def sanitize_stream(
683
664
  Union[Generator[Any, None, None], AsyncGenerator[Any, None]]:
684
665
  A generator or an asynchronous generator yielding the processed data.
685
666
  """
667
+ # Determine the actual data payload to process
668
+ payload: Any # The type of payload can change based on data's attributes
686
669
 
687
- if hasattr(data, "__aiter__"):
670
+ text_attr = getattr(data, "text", None)
671
+ content_attr = getattr(data, "content", None)
672
+
673
+ if isinstance(text_attr, str):
674
+ payload = text_attr
675
+ elif isinstance(content_attr, bytes):
676
+ payload = content_attr.decode(encoding, encoding_errors)
677
+ else:
678
+ # Use the original data if .text or .content are not applicable or not found
679
+ payload = data
680
+
681
+ # Dispatch to sync or async worker based on the nature of the 'payload'
682
+ if hasattr(payload, "__aiter__"):
688
683
  return _sanitize_stream_async(
689
- data, intro_value, to_json, skip_markers, strip_chars,
684
+ payload, intro_value, to_json, skip_markers, strip_chars,
690
685
  start_marker, end_marker, content_extractor, yield_raw_on_error,
691
686
  encoding, encoding_errors, buffer_size, line_delimiter, error_handler,
692
687
  )
693
688
  return _sanitize_stream_sync(
694
- data, intro_value, to_json, skip_markers, strip_chars,
689
+ payload, intro_value, to_json, skip_markers, strip_chars,
695
690
  start_marker, end_marker, content_extractor, yield_raw_on_error,
696
691
  encoding, encoding_errors, buffer_size, line_delimiter, error_handler,
697
692
  )
698
-
699
-
700
693
  from .conversation import Conversation # noqa: E402,F401
701
694
  from .Extra.autocoder import AutoCoder # noqa: E402,F401
702
695
  from .optimizers import Optimizers # noqa: E402,F401