webscout 8.2.2__py3-none-any.whl → 2026.1.19__py3-none-any.whl

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.
Files changed (483) hide show
  1. webscout/AIauto.py +524 -143
  2. webscout/AIbase.py +247 -123
  3. webscout/AIutel.py +68 -132
  4. webscout/Bard.py +1072 -535
  5. webscout/Extra/GitToolkit/__init__.py +2 -2
  6. webscout/Extra/GitToolkit/gitapi/__init__.py +20 -12
  7. webscout/Extra/GitToolkit/gitapi/gist.py +142 -0
  8. webscout/Extra/GitToolkit/gitapi/organization.py +91 -0
  9. webscout/Extra/GitToolkit/gitapi/repository.py +308 -195
  10. webscout/Extra/GitToolkit/gitapi/search.py +162 -0
  11. webscout/Extra/GitToolkit/gitapi/trending.py +236 -0
  12. webscout/Extra/GitToolkit/gitapi/user.py +128 -96
  13. webscout/Extra/GitToolkit/gitapi/utils.py +82 -62
  14. webscout/Extra/YTToolkit/README.md +443 -0
  15. webscout/Extra/YTToolkit/YTdownloader.py +953 -957
  16. webscout/Extra/YTToolkit/__init__.py +3 -3
  17. webscout/Extra/YTToolkit/transcriber.py +595 -476
  18. webscout/Extra/YTToolkit/ytapi/README.md +230 -0
  19. webscout/Extra/YTToolkit/ytapi/__init__.py +22 -6
  20. webscout/Extra/YTToolkit/ytapi/captions.py +190 -0
  21. webscout/Extra/YTToolkit/ytapi/channel.py +302 -307
  22. webscout/Extra/YTToolkit/ytapi/errors.py +13 -13
  23. webscout/Extra/YTToolkit/ytapi/extras.py +178 -45
  24. webscout/Extra/YTToolkit/ytapi/hashtag.py +120 -0
  25. webscout/Extra/YTToolkit/ytapi/https.py +89 -88
  26. webscout/Extra/YTToolkit/ytapi/patterns.py +61 -61
  27. webscout/Extra/YTToolkit/ytapi/playlist.py +59 -59
  28. webscout/Extra/YTToolkit/ytapi/pool.py +8 -8
  29. webscout/Extra/YTToolkit/ytapi/query.py +143 -40
  30. webscout/Extra/YTToolkit/ytapi/shorts.py +122 -0
  31. webscout/Extra/YTToolkit/ytapi/stream.py +68 -63
  32. webscout/Extra/YTToolkit/ytapi/suggestions.py +97 -0
  33. webscout/Extra/YTToolkit/ytapi/utils.py +66 -62
  34. webscout/Extra/YTToolkit/ytapi/video.py +189 -18
  35. webscout/Extra/__init__.py +2 -3
  36. webscout/Extra/gguf.py +1298 -682
  37. webscout/Extra/tempmail/README.md +488 -0
  38. webscout/Extra/tempmail/__init__.py +28 -28
  39. webscout/Extra/tempmail/async_utils.py +143 -141
  40. webscout/Extra/tempmail/base.py +172 -161
  41. webscout/Extra/tempmail/cli.py +191 -187
  42. webscout/Extra/tempmail/emailnator.py +88 -84
  43. webscout/Extra/tempmail/mail_tm.py +378 -361
  44. webscout/Extra/tempmail/temp_mail_io.py +304 -292
  45. webscout/Extra/weather.py +196 -194
  46. webscout/Extra/weather_ascii.py +17 -15
  47. webscout/Provider/AISEARCH/PERPLEXED_search.py +175 -0
  48. webscout/Provider/AISEARCH/Perplexity.py +237 -304
  49. webscout/Provider/AISEARCH/README.md +106 -0
  50. webscout/Provider/AISEARCH/__init__.py +16 -10
  51. webscout/Provider/AISEARCH/brave_search.py +298 -0
  52. webscout/Provider/AISEARCH/iask_search.py +130 -209
  53. webscout/Provider/AISEARCH/monica_search.py +200 -246
  54. webscout/Provider/AISEARCH/webpilotai_search.py +242 -281
  55. webscout/Provider/Algion.py +413 -0
  56. webscout/Provider/Andi.py +74 -69
  57. webscout/Provider/Apriel.py +313 -0
  58. webscout/Provider/Ayle.py +323 -0
  59. webscout/Provider/ChatSandbox.py +329 -0
  60. webscout/Provider/ClaudeOnline.py +365 -0
  61. webscout/Provider/Cohere.py +232 -208
  62. webscout/Provider/DeepAI.py +367 -0
  63. webscout/Provider/Deepinfra.py +343 -173
  64. webscout/Provider/EssentialAI.py +217 -0
  65. webscout/Provider/ExaAI.py +274 -261
  66. webscout/Provider/Gemini.py +60 -54
  67. webscout/Provider/GithubChat.py +385 -367
  68. webscout/Provider/Gradient.py +286 -0
  69. webscout/Provider/Groq.py +556 -670
  70. webscout/Provider/HadadXYZ.py +323 -0
  71. webscout/Provider/HeckAI.py +392 -233
  72. webscout/Provider/HuggingFace.py +387 -0
  73. webscout/Provider/IBM.py +340 -0
  74. webscout/Provider/Jadve.py +317 -266
  75. webscout/Provider/K2Think.py +306 -0
  76. webscout/Provider/Koboldai.py +221 -381
  77. webscout/Provider/Netwrck.py +273 -228
  78. webscout/Provider/Nvidia.py +310 -0
  79. webscout/Provider/OPENAI/DeepAI.py +489 -0
  80. webscout/Provider/OPENAI/K2Think.py +423 -0
  81. webscout/Provider/OPENAI/PI.py +463 -0
  82. webscout/Provider/OPENAI/README.md +890 -0
  83. webscout/Provider/OPENAI/TogetherAI.py +405 -0
  84. webscout/Provider/OPENAI/TwoAI.py +255 -0
  85. webscout/Provider/OPENAI/__init__.py +148 -25
  86. webscout/Provider/OPENAI/ai4chat.py +348 -0
  87. webscout/Provider/OPENAI/akashgpt.py +436 -0
  88. webscout/Provider/OPENAI/algion.py +303 -0
  89. webscout/Provider/OPENAI/ayle.py +365 -0
  90. webscout/Provider/OPENAI/base.py +253 -46
  91. webscout/Provider/OPENAI/cerebras.py +296 -0
  92. webscout/Provider/OPENAI/chatgpt.py +514 -193
  93. webscout/Provider/OPENAI/chatsandbox.py +233 -0
  94. webscout/Provider/OPENAI/deepinfra.py +403 -272
  95. webscout/Provider/OPENAI/e2b.py +2370 -1350
  96. webscout/Provider/OPENAI/elmo.py +278 -0
  97. webscout/Provider/OPENAI/exaai.py +186 -138
  98. webscout/Provider/OPENAI/freeassist.py +446 -0
  99. webscout/Provider/OPENAI/gradient.py +448 -0
  100. webscout/Provider/OPENAI/groq.py +380 -0
  101. webscout/Provider/OPENAI/hadadxyz.py +292 -0
  102. webscout/Provider/OPENAI/heckai.py +100 -104
  103. webscout/Provider/OPENAI/huggingface.py +321 -0
  104. webscout/Provider/OPENAI/ibm.py +425 -0
  105. webscout/Provider/OPENAI/llmchat.py +253 -0
  106. webscout/Provider/OPENAI/llmchatco.py +378 -327
  107. webscout/Provider/OPENAI/meta.py +541 -0
  108. webscout/Provider/OPENAI/netwrck.py +110 -84
  109. webscout/Provider/OPENAI/nvidia.py +317 -0
  110. webscout/Provider/OPENAI/oivscode.py +348 -0
  111. webscout/Provider/OPENAI/openrouter.py +328 -0
  112. webscout/Provider/OPENAI/pydantic_imports.py +1 -0
  113. webscout/Provider/OPENAI/sambanova.py +397 -0
  114. webscout/Provider/OPENAI/sonus.py +126 -115
  115. webscout/Provider/OPENAI/textpollinations.py +218 -133
  116. webscout/Provider/OPENAI/toolbaz.py +136 -166
  117. webscout/Provider/OPENAI/typefully.py +419 -0
  118. webscout/Provider/OPENAI/typliai.py +279 -0
  119. webscout/Provider/OPENAI/utils.py +314 -211
  120. webscout/Provider/OPENAI/wisecat.py +103 -125
  121. webscout/Provider/OPENAI/writecream.py +185 -156
  122. webscout/Provider/OPENAI/x0gpt.py +227 -136
  123. webscout/Provider/OPENAI/zenmux.py +380 -0
  124. webscout/Provider/OpenRouter.py +386 -0
  125. webscout/Provider/Openai.py +337 -496
  126. webscout/Provider/PI.py +443 -344
  127. webscout/Provider/QwenLM.py +346 -254
  128. webscout/Provider/STT/__init__.py +28 -0
  129. webscout/Provider/STT/base.py +303 -0
  130. webscout/Provider/STT/elevenlabs.py +264 -0
  131. webscout/Provider/Sambanova.py +317 -0
  132. webscout/Provider/TTI/README.md +69 -0
  133. webscout/Provider/TTI/__init__.py +37 -12
  134. webscout/Provider/TTI/base.py +147 -0
  135. webscout/Provider/TTI/claudeonline.py +393 -0
  136. webscout/Provider/TTI/magicstudio.py +292 -0
  137. webscout/Provider/TTI/miragic.py +180 -0
  138. webscout/Provider/TTI/pollinations.py +331 -0
  139. webscout/Provider/TTI/together.py +334 -0
  140. webscout/Provider/TTI/utils.py +14 -0
  141. webscout/Provider/TTS/README.md +186 -0
  142. webscout/Provider/TTS/__init__.py +43 -7
  143. webscout/Provider/TTS/base.py +523 -0
  144. webscout/Provider/TTS/deepgram.py +286 -156
  145. webscout/Provider/TTS/elevenlabs.py +189 -111
  146. webscout/Provider/TTS/freetts.py +218 -0
  147. webscout/Provider/TTS/murfai.py +288 -113
  148. webscout/Provider/TTS/openai_fm.py +364 -0
  149. webscout/Provider/TTS/parler.py +203 -111
  150. webscout/Provider/TTS/qwen.py +334 -0
  151. webscout/Provider/TTS/sherpa.py +286 -0
  152. webscout/Provider/TTS/speechma.py +693 -180
  153. webscout/Provider/TTS/streamElements.py +275 -333
  154. webscout/Provider/TTS/utils.py +280 -280
  155. webscout/Provider/TextPollinationsAI.py +221 -121
  156. webscout/Provider/TogetherAI.py +450 -0
  157. webscout/Provider/TwoAI.py +309 -199
  158. webscout/Provider/TypliAI.py +311 -0
  159. webscout/Provider/UNFINISHED/ChatHub.py +219 -0
  160. webscout/Provider/{OPENAI/glider.py → UNFINISHED/ChutesAI.py} +160 -145
  161. webscout/Provider/UNFINISHED/GizAI.py +300 -0
  162. webscout/Provider/UNFINISHED/Marcus.py +218 -0
  163. webscout/Provider/UNFINISHED/Qodo.py +481 -0
  164. webscout/Provider/UNFINISHED/XenAI.py +330 -0
  165. webscout/Provider/{Youchat.py → UNFINISHED/Youchat.py} +64 -47
  166. webscout/Provider/UNFINISHED/aihumanizer.py +41 -0
  167. webscout/Provider/UNFINISHED/grammerchecker.py +37 -0
  168. webscout/Provider/UNFINISHED/liner.py +342 -0
  169. webscout/Provider/UNFINISHED/liner_api_request.py +246 -0
  170. webscout/Provider/UNFINISHED/samurai.py +231 -0
  171. webscout/Provider/WiseCat.py +256 -196
  172. webscout/Provider/WrDoChat.py +390 -0
  173. webscout/Provider/__init__.py +115 -198
  174. webscout/Provider/ai4chat.py +181 -202
  175. webscout/Provider/akashgpt.py +330 -342
  176. webscout/Provider/cerebras.py +397 -242
  177. webscout/Provider/cleeai.py +236 -213
  178. webscout/Provider/elmo.py +291 -234
  179. webscout/Provider/geminiapi.py +343 -208
  180. webscout/Provider/julius.py +245 -223
  181. webscout/Provider/learnfastai.py +333 -266
  182. webscout/Provider/llama3mitril.py +230 -180
  183. webscout/Provider/llmchat.py +308 -213
  184. webscout/Provider/llmchatco.py +321 -311
  185. webscout/Provider/meta.py +996 -794
  186. webscout/Provider/oivscode.py +332 -0
  187. webscout/Provider/searchchat.py +316 -293
  188. webscout/Provider/sonus.py +264 -208
  189. webscout/Provider/toolbaz.py +359 -320
  190. webscout/Provider/turboseek.py +332 -219
  191. webscout/Provider/typefully.py +262 -280
  192. webscout/Provider/x0gpt.py +332 -256
  193. webscout/__init__.py +31 -38
  194. webscout/__main__.py +5 -5
  195. webscout/cli.py +585 -293
  196. webscout/client.py +1497 -0
  197. webscout/conversation.py +140 -565
  198. webscout/exceptions.py +383 -339
  199. webscout/litagent/__init__.py +29 -29
  200. webscout/litagent/agent.py +492 -455
  201. webscout/litagent/constants.py +60 -60
  202. webscout/models.py +505 -181
  203. webscout/optimizers.py +32 -378
  204. webscout/prompt_manager.py +376 -274
  205. webscout/sanitize.py +1514 -0
  206. webscout/scout/README.md +452 -0
  207. webscout/scout/__init__.py +8 -8
  208. webscout/scout/core/__init__.py +7 -7
  209. webscout/scout/core/crawler.py +330 -140
  210. webscout/scout/core/scout.py +800 -568
  211. webscout/scout/core/search_result.py +51 -96
  212. webscout/scout/core/text_analyzer.py +64 -63
  213. webscout/scout/core/text_utils.py +412 -277
  214. webscout/scout/core/web_analyzer.py +54 -52
  215. webscout/scout/element.py +872 -460
  216. webscout/scout/parsers/__init__.py +70 -69
  217. webscout/scout/parsers/html5lib_parser.py +182 -172
  218. webscout/scout/parsers/html_parser.py +238 -236
  219. webscout/scout/parsers/lxml_parser.py +203 -178
  220. webscout/scout/utils.py +38 -37
  221. webscout/search/__init__.py +47 -0
  222. webscout/search/base.py +201 -0
  223. webscout/search/bing_main.py +45 -0
  224. webscout/search/brave_main.py +92 -0
  225. webscout/search/duckduckgo_main.py +57 -0
  226. webscout/search/engines/__init__.py +127 -0
  227. webscout/search/engines/bing/__init__.py +15 -0
  228. webscout/search/engines/bing/base.py +35 -0
  229. webscout/search/engines/bing/images.py +114 -0
  230. webscout/search/engines/bing/news.py +96 -0
  231. webscout/search/engines/bing/suggestions.py +36 -0
  232. webscout/search/engines/bing/text.py +109 -0
  233. webscout/search/engines/brave/__init__.py +19 -0
  234. webscout/search/engines/brave/base.py +47 -0
  235. webscout/search/engines/brave/images.py +213 -0
  236. webscout/search/engines/brave/news.py +353 -0
  237. webscout/search/engines/brave/suggestions.py +318 -0
  238. webscout/search/engines/brave/text.py +167 -0
  239. webscout/search/engines/brave/videos.py +364 -0
  240. webscout/search/engines/duckduckgo/__init__.py +25 -0
  241. webscout/search/engines/duckduckgo/answers.py +80 -0
  242. webscout/search/engines/duckduckgo/base.py +189 -0
  243. webscout/search/engines/duckduckgo/images.py +100 -0
  244. webscout/search/engines/duckduckgo/maps.py +183 -0
  245. webscout/search/engines/duckduckgo/news.py +70 -0
  246. webscout/search/engines/duckduckgo/suggestions.py +22 -0
  247. webscout/search/engines/duckduckgo/text.py +221 -0
  248. webscout/search/engines/duckduckgo/translate.py +48 -0
  249. webscout/search/engines/duckduckgo/videos.py +80 -0
  250. webscout/search/engines/duckduckgo/weather.py +84 -0
  251. webscout/search/engines/mojeek.py +61 -0
  252. webscout/search/engines/wikipedia.py +77 -0
  253. webscout/search/engines/yahoo/__init__.py +41 -0
  254. webscout/search/engines/yahoo/answers.py +19 -0
  255. webscout/search/engines/yahoo/base.py +34 -0
  256. webscout/search/engines/yahoo/images.py +323 -0
  257. webscout/search/engines/yahoo/maps.py +19 -0
  258. webscout/search/engines/yahoo/news.py +258 -0
  259. webscout/search/engines/yahoo/suggestions.py +140 -0
  260. webscout/search/engines/yahoo/text.py +273 -0
  261. webscout/search/engines/yahoo/translate.py +19 -0
  262. webscout/search/engines/yahoo/videos.py +302 -0
  263. webscout/search/engines/yahoo/weather.py +220 -0
  264. webscout/search/engines/yandex.py +67 -0
  265. webscout/search/engines/yep/__init__.py +13 -0
  266. webscout/search/engines/yep/base.py +34 -0
  267. webscout/search/engines/yep/images.py +101 -0
  268. webscout/search/engines/yep/suggestions.py +38 -0
  269. webscout/search/engines/yep/text.py +99 -0
  270. webscout/search/http_client.py +172 -0
  271. webscout/search/results.py +141 -0
  272. webscout/search/yahoo_main.py +57 -0
  273. webscout/search/yep_main.py +48 -0
  274. webscout/server/__init__.py +48 -0
  275. webscout/server/config.py +78 -0
  276. webscout/server/exceptions.py +69 -0
  277. webscout/server/providers.py +286 -0
  278. webscout/server/request_models.py +131 -0
  279. webscout/server/request_processing.py +404 -0
  280. webscout/server/routes.py +642 -0
  281. webscout/server/server.py +351 -0
  282. webscout/server/ui_templates.py +1171 -0
  283. webscout/swiftcli/__init__.py +79 -809
  284. webscout/swiftcli/core/__init__.py +7 -0
  285. webscout/swiftcli/core/cli.py +574 -0
  286. webscout/swiftcli/core/context.py +98 -0
  287. webscout/swiftcli/core/group.py +268 -0
  288. webscout/swiftcli/decorators/__init__.py +28 -0
  289. webscout/swiftcli/decorators/command.py +243 -0
  290. webscout/swiftcli/decorators/options.py +247 -0
  291. webscout/swiftcli/decorators/output.py +392 -0
  292. webscout/swiftcli/exceptions.py +21 -0
  293. webscout/swiftcli/plugins/__init__.py +9 -0
  294. webscout/swiftcli/plugins/base.py +134 -0
  295. webscout/swiftcli/plugins/manager.py +269 -0
  296. webscout/swiftcli/utils/__init__.py +58 -0
  297. webscout/swiftcli/utils/formatting.py +251 -0
  298. webscout/swiftcli/utils/parsing.py +368 -0
  299. webscout/update_checker.py +280 -136
  300. webscout/utils.py +28 -14
  301. webscout/version.py +2 -1
  302. webscout/version.py.bak +3 -0
  303. webscout/zeroart/__init__.py +218 -55
  304. webscout/zeroart/base.py +70 -60
  305. webscout/zeroart/effects.py +155 -99
  306. webscout/zeroart/fonts.py +1799 -816
  307. webscout-2026.1.19.dist-info/METADATA +638 -0
  308. webscout-2026.1.19.dist-info/RECORD +312 -0
  309. {webscout-8.2.2.dist-info → webscout-2026.1.19.dist-info}/WHEEL +1 -1
  310. webscout-2026.1.19.dist-info/entry_points.txt +4 -0
  311. webscout-2026.1.19.dist-info/top_level.txt +1 -0
  312. inferno/__init__.py +0 -6
  313. inferno/__main__.py +0 -9
  314. inferno/cli.py +0 -6
  315. webscout/DWEBS.py +0 -477
  316. webscout/Extra/autocoder/__init__.py +0 -9
  317. webscout/Extra/autocoder/autocoder.py +0 -849
  318. webscout/Extra/autocoder/autocoder_utiles.py +0 -332
  319. webscout/LLM.py +0 -442
  320. webscout/Litlogger/__init__.py +0 -67
  321. webscout/Litlogger/core/__init__.py +0 -6
  322. webscout/Litlogger/core/level.py +0 -23
  323. webscout/Litlogger/core/logger.py +0 -165
  324. webscout/Litlogger/handlers/__init__.py +0 -12
  325. webscout/Litlogger/handlers/console.py +0 -33
  326. webscout/Litlogger/handlers/file.py +0 -143
  327. webscout/Litlogger/handlers/network.py +0 -173
  328. webscout/Litlogger/styles/__init__.py +0 -7
  329. webscout/Litlogger/styles/colors.py +0 -249
  330. webscout/Litlogger/styles/formats.py +0 -458
  331. webscout/Litlogger/styles/text.py +0 -87
  332. webscout/Litlogger/utils/__init__.py +0 -6
  333. webscout/Litlogger/utils/detectors.py +0 -153
  334. webscout/Litlogger/utils/formatters.py +0 -200
  335. webscout/Local/__init__.py +0 -12
  336. webscout/Local/__main__.py +0 -9
  337. webscout/Local/api.py +0 -576
  338. webscout/Local/cli.py +0 -516
  339. webscout/Local/config.py +0 -75
  340. webscout/Local/llm.py +0 -287
  341. webscout/Local/model_manager.py +0 -253
  342. webscout/Local/server.py +0 -721
  343. webscout/Local/utils.py +0 -93
  344. webscout/Provider/AI21.py +0 -177
  345. webscout/Provider/AISEARCH/DeepFind.py +0 -250
  346. webscout/Provider/AISEARCH/ISou.py +0 -256
  347. webscout/Provider/AISEARCH/felo_search.py +0 -228
  348. webscout/Provider/AISEARCH/genspark_search.py +0 -208
  349. webscout/Provider/AISEARCH/hika_search.py +0 -194
  350. webscout/Provider/AISEARCH/scira_search.py +0 -324
  351. webscout/Provider/Aitopia.py +0 -292
  352. webscout/Provider/AllenAI.py +0 -413
  353. webscout/Provider/Blackboxai.py +0 -229
  354. webscout/Provider/C4ai.py +0 -432
  355. webscout/Provider/ChatGPTClone.py +0 -226
  356. webscout/Provider/ChatGPTES.py +0 -237
  357. webscout/Provider/ChatGPTGratis.py +0 -194
  358. webscout/Provider/Chatify.py +0 -175
  359. webscout/Provider/Cloudflare.py +0 -273
  360. webscout/Provider/DeepSeek.py +0 -196
  361. webscout/Provider/ElectronHub.py +0 -709
  362. webscout/Provider/ExaChat.py +0 -342
  363. webscout/Provider/Free2GPT.py +0 -241
  364. webscout/Provider/GPTWeb.py +0 -193
  365. webscout/Provider/Glider.py +0 -211
  366. webscout/Provider/HF_space/__init__.py +0 -0
  367. webscout/Provider/HF_space/qwen_qwen2.py +0 -206
  368. webscout/Provider/HuggingFaceChat.py +0 -462
  369. webscout/Provider/Hunyuan.py +0 -272
  370. webscout/Provider/LambdaChat.py +0 -392
  371. webscout/Provider/Llama.py +0 -200
  372. webscout/Provider/Llama3.py +0 -204
  373. webscout/Provider/Marcus.py +0 -148
  374. webscout/Provider/OLLAMA.py +0 -396
  375. webscout/Provider/OPENAI/c4ai.py +0 -367
  376. webscout/Provider/OPENAI/chatgptclone.py +0 -460
  377. webscout/Provider/OPENAI/exachat.py +0 -433
  378. webscout/Provider/OPENAI/freeaichat.py +0 -352
  379. webscout/Provider/OPENAI/opkfc.py +0 -488
  380. webscout/Provider/OPENAI/scirachat.py +0 -463
  381. webscout/Provider/OPENAI/standardinput.py +0 -425
  382. webscout/Provider/OPENAI/typegpt.py +0 -346
  383. webscout/Provider/OPENAI/uncovrAI.py +0 -455
  384. webscout/Provider/OPENAI/venice.py +0 -413
  385. webscout/Provider/OPENAI/yep.py +0 -327
  386. webscout/Provider/OpenGPT.py +0 -199
  387. webscout/Provider/Perplexitylabs.py +0 -415
  388. webscout/Provider/Phind.py +0 -535
  389. webscout/Provider/PizzaGPT.py +0 -198
  390. webscout/Provider/Reka.py +0 -214
  391. webscout/Provider/StandardInput.py +0 -278
  392. webscout/Provider/TTI/AiForce/__init__.py +0 -22
  393. webscout/Provider/TTI/AiForce/async_aiforce.py +0 -224
  394. webscout/Provider/TTI/AiForce/sync_aiforce.py +0 -245
  395. webscout/Provider/TTI/FreeAIPlayground/__init__.py +0 -9
  396. webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +0 -181
  397. webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +0 -180
  398. webscout/Provider/TTI/ImgSys/__init__.py +0 -23
  399. webscout/Provider/TTI/ImgSys/async_imgsys.py +0 -202
  400. webscout/Provider/TTI/ImgSys/sync_imgsys.py +0 -195
  401. webscout/Provider/TTI/MagicStudio/__init__.py +0 -2
  402. webscout/Provider/TTI/MagicStudio/async_magicstudio.py +0 -111
  403. webscout/Provider/TTI/MagicStudio/sync_magicstudio.py +0 -109
  404. webscout/Provider/TTI/Nexra/__init__.py +0 -22
  405. webscout/Provider/TTI/Nexra/async_nexra.py +0 -286
  406. webscout/Provider/TTI/Nexra/sync_nexra.py +0 -258
  407. webscout/Provider/TTI/PollinationsAI/__init__.py +0 -23
  408. webscout/Provider/TTI/PollinationsAI/async_pollinations.py +0 -311
  409. webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +0 -265
  410. webscout/Provider/TTI/aiarta/__init__.py +0 -2
  411. webscout/Provider/TTI/aiarta/async_aiarta.py +0 -482
  412. webscout/Provider/TTI/aiarta/sync_aiarta.py +0 -440
  413. webscout/Provider/TTI/artbit/__init__.py +0 -22
  414. webscout/Provider/TTI/artbit/async_artbit.py +0 -155
  415. webscout/Provider/TTI/artbit/sync_artbit.py +0 -148
  416. webscout/Provider/TTI/fastflux/__init__.py +0 -22
  417. webscout/Provider/TTI/fastflux/async_fastflux.py +0 -261
  418. webscout/Provider/TTI/fastflux/sync_fastflux.py +0 -252
  419. webscout/Provider/TTI/huggingface/__init__.py +0 -22
  420. webscout/Provider/TTI/huggingface/async_huggingface.py +0 -199
  421. webscout/Provider/TTI/huggingface/sync_huggingface.py +0 -195
  422. webscout/Provider/TTI/piclumen/__init__.py +0 -23
  423. webscout/Provider/TTI/piclumen/async_piclumen.py +0 -268
  424. webscout/Provider/TTI/piclumen/sync_piclumen.py +0 -233
  425. webscout/Provider/TTI/pixelmuse/__init__.py +0 -4
  426. webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +0 -249
  427. webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +0 -182
  428. webscout/Provider/TTI/talkai/__init__.py +0 -4
  429. webscout/Provider/TTI/talkai/async_talkai.py +0 -229
  430. webscout/Provider/TTI/talkai/sync_talkai.py +0 -207
  431. webscout/Provider/TTS/gesserit.py +0 -127
  432. webscout/Provider/TeachAnything.py +0 -187
  433. webscout/Provider/Venice.py +0 -219
  434. webscout/Provider/VercelAI.py +0 -234
  435. webscout/Provider/WebSim.py +0 -228
  436. webscout/Provider/Writecream.py +0 -211
  437. webscout/Provider/WritingMate.py +0 -197
  438. webscout/Provider/aimathgpt.py +0 -189
  439. webscout/Provider/askmyai.py +0 -158
  440. webscout/Provider/asksteve.py +0 -203
  441. webscout/Provider/bagoodex.py +0 -145
  442. webscout/Provider/chatglm.py +0 -205
  443. webscout/Provider/copilot.py +0 -428
  444. webscout/Provider/freeaichat.py +0 -271
  445. webscout/Provider/gaurish.py +0 -244
  446. webscout/Provider/geminiprorealtime.py +0 -160
  447. webscout/Provider/granite.py +0 -187
  448. webscout/Provider/hermes.py +0 -219
  449. webscout/Provider/koala.py +0 -268
  450. webscout/Provider/labyrinth.py +0 -340
  451. webscout/Provider/lepton.py +0 -194
  452. webscout/Provider/llamatutor.py +0 -192
  453. webscout/Provider/multichat.py +0 -325
  454. webscout/Provider/promptrefine.py +0 -193
  455. webscout/Provider/scira_chat.py +0 -277
  456. webscout/Provider/scnet.py +0 -187
  457. webscout/Provider/talkai.py +0 -194
  458. webscout/Provider/tutorai.py +0 -252
  459. webscout/Provider/typegpt.py +0 -232
  460. webscout/Provider/uncovr.py +0 -312
  461. webscout/Provider/yep.py +0 -376
  462. webscout/litprinter/__init__.py +0 -59
  463. webscout/scout/core.py +0 -881
  464. webscout/tempid.py +0 -128
  465. webscout/webscout_search.py +0 -1346
  466. webscout/webscout_search_async.py +0 -877
  467. webscout/yep_search.py +0 -297
  468. webscout-8.2.2.dist-info/METADATA +0 -734
  469. webscout-8.2.2.dist-info/RECORD +0 -309
  470. webscout-8.2.2.dist-info/entry_points.txt +0 -5
  471. webscout-8.2.2.dist-info/top_level.txt +0 -3
  472. webstoken/__init__.py +0 -30
  473. webstoken/classifier.py +0 -189
  474. webstoken/keywords.py +0 -216
  475. webstoken/language.py +0 -128
  476. webstoken/ner.py +0 -164
  477. webstoken/normalizer.py +0 -35
  478. webstoken/processor.py +0 -77
  479. webstoken/sentiment.py +0 -206
  480. webstoken/stemmer.py +0 -73
  481. webstoken/tagger.py +0 -60
  482. webstoken/tokenizer.py +0 -158
  483. {webscout-8.2.2.dist-info → webscout-2026.1.19.dist-info/licenses}/LICENSE.md +0 -0
@@ -1,27 +1,36 @@
1
1
  import time
2
2
  import uuid
3
+ from typing import Any, Dict, Generator, List, Optional, Union, cast
4
+
3
5
  import requests
4
- from typing import List, Dict, Optional, Union, Generator, Any
5
6
 
6
- from webscout.litagent import LitAgent
7
- from .base import BaseChat, BaseCompletions, OpenAICompatibleProvider
8
- from .utils import (
7
+ from webscout.Provider.OPENAI.base import (
8
+ BaseChat,
9
+ BaseCompletions,
10
+ OpenAICompatibleProvider,
11
+ SimpleModelList,
12
+ )
13
+ from webscout.Provider.OPENAI.utils import (
9
14
  ChatCompletion,
10
15
  ChatCompletionChunk,
11
- Choice,
12
16
  ChatCompletionMessage,
17
+ Choice,
13
18
  ChoiceDelta,
14
19
  CompletionUsage,
15
- format_prompt
20
+ count_tokens,
21
+ format_prompt,
16
22
  )
17
23
 
24
+ from ...litagent import LitAgent
25
+
18
26
  # ANSI escape codes for formatting
19
27
  BOLD = "\033[1m"
20
28
  RED = "\033[91m"
21
29
  RESET = "\033[0m"
22
30
 
31
+
23
32
  class Completions(BaseCompletions):
24
- def __init__(self, client: 'HeckAI'):
33
+ def __init__(self, client: "HeckAI"):
25
34
  self._client = client
26
35
 
27
36
  def create(
@@ -33,7 +42,9 @@ class Completions(BaseCompletions):
33
42
  stream: bool = False,
34
43
  temperature: Optional[float] = None, # Not used by HeckAI but kept for compatibility
35
44
  top_p: Optional[float] = None, # Not used by HeckAI but kept for compatibility
36
- **kwargs: Any # Not used by HeckAI but kept for compatibility
45
+ timeout: Optional[int] = None,
46
+ proxies: Optional[Dict[str, str]] = None,
47
+ **kwargs: Any, # Not used by HeckAI but kept for compatibility
37
48
  ) -> Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]]:
38
49
  """
39
50
  Creates a model response for the given chat conversation.
@@ -45,26 +56,36 @@ class Completions(BaseCompletions):
45
56
  question = format_prompt(messages, add_special_tokens=True)
46
57
 
47
58
  # Prepare the payload for HeckAI API
59
+ model = self._client.convert_model_name(model)
48
60
  payload = {
49
61
  "model": model,
50
62
  "question": question,
51
63
  "language": self._client.language,
52
64
  "sessionId": self._client.session_id,
53
- "previousQuestion": None, # Not needed when using format_prompt
54
- "previousAnswer": None, # Not needed when using format_prompt
55
- "imgUrls": []
65
+ "previousQuestion": None,
66
+ "previousAnswer": None,
67
+ "imgUrls": [],
68
+ "superSmartMode": False,
56
69
  }
57
70
 
58
71
  request_id = f"chatcmpl-{uuid.uuid4()}"
59
72
  created_time = int(time.time())
60
73
 
61
74
  if stream:
62
- return self._create_stream(request_id, created_time, model, payload)
75
+ return self._create_stream(request_id, created_time, model, payload, timeout, proxies)
63
76
  else:
64
- return self._create_non_stream(request_id, created_time, model, payload)
77
+ return self._create_non_stream(
78
+ request_id, created_time, model, payload, timeout, proxies
79
+ )
65
80
 
66
81
  def _create_stream(
67
- self, request_id: str, created_time: int, model: str, payload: Dict[str, Any]
82
+ self,
83
+ request_id: str,
84
+ created_time: int,
85
+ model: str,
86
+ payload: Dict[str, Any],
87
+ timeout: Optional[int] = None,
88
+ proxies: Optional[Dict[str, str]] = None,
68
89
  ) -> Generator[ChatCompletionChunk, None, None]:
69
90
  try:
70
91
  response = self._client.session.post(
@@ -72,151 +93,113 @@ class Completions(BaseCompletions):
72
93
  headers=self._client.headers,
73
94
  json=payload,
74
95
  stream=True,
75
- timeout=self._client.timeout
96
+ timeout=timeout or self._client.timeout,
97
+ proxies=proxies or getattr(self._client, "proxies", None),
76
98
  )
77
99
  response.raise_for_status()
78
100
 
79
- # Track token usage across chunks
80
- completion_tokens = 0
81
-
82
- streaming_text = ""
101
+ streaming_text = []
83
102
  in_answer = False
84
103
 
85
104
  for line in response.iter_lines(decode_unicode=True):
86
105
  if not line:
87
106
  continue
88
-
89
- # Remove "data: " prefix
90
107
  if line.startswith("data: "):
91
108
  data = line[6:]
92
109
  else:
93
110
  continue
94
-
95
- # Check for control markers
96
111
  if data == "[ANSWER_START]":
97
112
  in_answer = True
98
113
  continue
99
-
100
114
  if data == "[ANSWER_DONE]":
101
115
  in_answer = False
102
116
  continue
103
-
104
- if data == "[RELATE_Q_START]" or data == "[RELATE_Q_DONE]":
117
+ if data.startswith("[") and data.endswith("]"):
105
118
  continue
106
-
107
- # Process content if we're in an answer section
108
119
  if in_answer:
109
- streaming_text += data
110
- completion_tokens += len(data) // 4 # Rough estimate
111
-
112
- # Create a delta object for this chunk
113
- delta = ChoiceDelta(content=data)
120
+ # Fix encoding issues (e.g., emoji) for each chunk
121
+ try:
122
+ data_fixed = data.encode("latin1").decode("utf-8")
123
+ except (UnicodeEncodeError, UnicodeDecodeError):
124
+ data_fixed = data
125
+ streaming_text.append(data_fixed)
126
+ delta = ChoiceDelta(content=data_fixed)
114
127
  choice = Choice(index=0, delta=delta, finish_reason=None)
115
-
116
128
  chunk = ChatCompletionChunk(
117
129
  id=request_id,
118
130
  choices=[choice],
119
131
  created=created_time,
120
132
  model=model,
121
133
  )
122
-
123
134
  yield chunk
124
-
125
- # Store the response for future context
126
- # We don't need to store previous_question/answer as we're using format_prompt
127
- # which handles the conversation formatting
128
-
129
135
  # Final chunk with finish_reason
130
136
  delta = ChoiceDelta(content=None)
131
137
  choice = Choice(index=0, delta=delta, finish_reason="stop")
132
-
133
138
  chunk = ChatCompletionChunk(
134
139
  id=request_id,
135
140
  choices=[choice],
136
141
  created=created_time,
137
142
  model=model,
138
143
  )
139
-
140
144
  yield chunk
141
-
142
145
  except requests.exceptions.RequestException as e:
143
146
  print(f"{RED}Error during HeckAI stream request: {e}{RESET}")
144
147
  raise IOError(f"HeckAI request failed: {e}") from e
145
148
 
146
149
  def _create_non_stream(
147
- self, request_id: str, created_time: int, model: str, payload: Dict[str, Any]
150
+ self,
151
+ request_id: str,
152
+ created_time: int,
153
+ model: str,
154
+ payload: Dict[str, Any],
155
+ timeout: Optional[int] = None,
156
+ proxies: Optional[Dict[str, str]] = None,
148
157
  ) -> ChatCompletion:
149
158
  try:
150
- full_text = ""
151
- streaming_text = ""
159
+ answer_lines = []
152
160
  in_answer = False
153
-
154
161
  response = self._client.session.post(
155
162
  self._client.url,
156
163
  headers=self._client.headers,
157
164
  json=payload,
158
165
  stream=True,
159
- timeout=self._client.timeout
166
+ timeout=timeout or self._client.timeout,
167
+ proxies=proxies or getattr(self._client, "proxies", None),
160
168
  )
161
169
  response.raise_for_status()
162
-
163
170
  for line in response.iter_lines(decode_unicode=True):
164
171
  if not line:
165
172
  continue
166
-
167
- # Remove "data: " prefix
168
173
  if line.startswith("data: "):
169
174
  data = line[6:]
170
175
  else:
171
176
  continue
172
-
173
- # Check for control markers
174
177
  if data == "[ANSWER_START]":
175
178
  in_answer = True
176
179
  continue
177
-
178
180
  if data == "[ANSWER_DONE]":
179
181
  in_answer = False
180
182
  continue
181
-
182
- if data == "[RELATE_Q_START]" or data == "[RELATE_Q_DONE]":
183
+ if data.startswith("[") and data.endswith("]"):
183
184
  continue
184
-
185
- # Process content if we're in an answer section
186
185
  if in_answer:
187
- streaming_text += data
188
-
189
- full_text = streaming_text
190
-
191
- # Store the response for future context
192
- # We don't need to store previous_question/answer as we're using format_prompt
193
- # which handles the conversation formatting
194
-
195
- # Create usage statistics (estimated)
196
- prompt_tokens = len(payload["question"]) // 4
197
- completion_tokens = len(full_text) // 4
186
+ answer_lines.append(data)
187
+ full_text = " ".join(x.strip() for x in answer_lines if x.strip())
188
+ # Fix encoding issues (e.g., emoji)
189
+ try:
190
+ full_text = full_text.encode("latin1").decode("utf-8")
191
+ except (UnicodeEncodeError, UnicodeDecodeError):
192
+ pass
193
+ prompt_tokens = count_tokens(payload.get("question", ""))
194
+ completion_tokens = count_tokens(full_text)
198
195
  total_tokens = prompt_tokens + completion_tokens
199
-
200
196
  usage = CompletionUsage(
201
197
  prompt_tokens=prompt_tokens,
202
198
  completion_tokens=completion_tokens,
203
- total_tokens=total_tokens
204
- )
205
-
206
- # Create the message object
207
- message = ChatCompletionMessage(
208
- role="assistant",
209
- content=full_text
199
+ total_tokens=total_tokens,
210
200
  )
211
-
212
- # Create the choice object
213
- choice = Choice(
214
- index=0,
215
- message=message,
216
- finish_reason="stop"
217
- )
218
-
219
- # Create the completion object
201
+ message = ChatCompletionMessage(role="assistant", content=full_text)
202
+ choice = Choice(index=0, message=message, finish_reason="stop")
220
203
  completion = ChatCompletion(
221
204
  id=request_id,
222
205
  choices=[choice],
@@ -224,17 +207,17 @@ class Completions(BaseCompletions):
224
207
  model=model,
225
208
  usage=usage,
226
209
  )
227
-
228
210
  return completion
229
-
230
211
  except Exception as e:
231
212
  print(f"{RED}Error during HeckAI non-stream request: {e}{RESET}")
232
213
  raise IOError(f"HeckAI request failed: {e}") from e
233
214
 
215
+
234
216
  class Chat(BaseChat):
235
- def __init__(self, client: 'HeckAI'):
217
+ def __init__(self, client: "HeckAI"):
236
218
  self.completions = Completions(client)
237
219
 
220
+
238
221
  class HeckAI(OpenAICompatibleProvider):
239
222
  """
240
223
  OpenAI-compatible client for HeckAI API.
@@ -248,18 +231,20 @@ class HeckAI(OpenAICompatibleProvider):
248
231
  print(response.choices[0].message.content)
249
232
  """
250
233
 
234
+ required_auth = False
251
235
  AVAILABLE_MODELS = [
236
+ "google/gemini-2.5-flash-preview",
252
237
  "deepseek/deepseek-chat",
253
- "openai/gpt-4o-mini",
254
238
  "deepseek/deepseek-r1",
255
- "google/gemini-2.0-flash-001"
239
+ "openai/gpt-4o-mini",
240
+ "openai/gpt-4.1-mini",
241
+ "x-ai/grok-3-mini-beta",
242
+ "meta-llama/llama-4-scout",
243
+ "openai/gpt-5-mini",
244
+ "openai/gpt-5-nano",
256
245
  ]
257
246
 
258
- def __init__(
259
- self,
260
- timeout: int = 30,
261
- language: str = "English"
262
- ):
247
+ def __init__(self, timeout: int = 30, language: str = "English"):
263
248
  """
264
249
  Initialize the HeckAI client.
265
250
 
@@ -275,11 +260,11 @@ class HeckAI(OpenAICompatibleProvider):
275
260
  # Use LitAgent for user-agent
276
261
  agent = LitAgent()
277
262
  self.headers = {
278
- 'User-Agent': agent.random(),
279
- 'Content-Type': 'application/json',
280
- 'Origin': 'https://heck.ai',
281
- 'Referer': 'https://heck.ai/',
282
- 'Connection': 'keep-alive'
263
+ "User-Agent": agent.random(),
264
+ "Content-Type": "application/json",
265
+ "Origin": "https://heck.ai",
266
+ "Referer": "https://heck.ai/",
267
+ "Connection": "keep-alive",
283
268
  }
284
269
 
285
270
  self.session = requests.Session()
@@ -301,9 +286,15 @@ class HeckAI(OpenAICompatibleProvider):
301
286
  return available_model
302
287
 
303
288
  # Default to gemini if no match
304
- print(f"{BOLD}Warning: Model '{model}' not found, using default model 'google/gemini-2.0-flash-001'{RESET}")
289
+ print(
290
+ f"{BOLD}Warning: Model '{model}' not found, using default model 'google/gemini-2.0-flash-001'{RESET}"
291
+ )
305
292
  return "google/gemini-2.0-flash-001"
306
293
 
294
+ @property
295
+ def models(self) -> SimpleModelList:
296
+ return SimpleModelList(type(self).AVAILABLE_MODELS)
297
+
307
298
 
308
299
  # Simple test if run directly
309
300
  if __name__ == "__main__":
@@ -321,10 +312,15 @@ if __name__ == "__main__":
321
312
  {"role": "system", "content": "You are a helpful assistant."},
322
313
  {"role": "user", "content": "Say 'Hello' in one word"},
323
314
  ],
324
- stream=False
315
+ stream=False,
325
316
  )
326
317
 
327
- if response and response.choices and response.choices[0].message.content:
318
+ if (
319
+ isinstance(response, ChatCompletion)
320
+ and response.choices
321
+ and response.choices[0].message
322
+ and response.choices[0].message.content
323
+ ):
328
324
  status = "✓"
329
325
  # Truncate response if too long
330
326
  display_text = response.choices[0].message.content.strip()