webscout 8.2.9__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 (413) hide show
  1. webscout/AIauto.py +524 -251
  2. webscout/AIbase.py +247 -319
  3. webscout/AIutel.py +68 -703
  4. webscout/Bard.py +1072 -1026
  5. webscout/Extra/GitToolkit/__init__.py +10 -10
  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 -375
  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 -44
  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 -118
  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 +403 -232
  35. webscout/Extra/__init__.py +2 -3
  36. webscout/Extra/gguf.py +1298 -684
  37. webscout/Extra/tempmail/README.md +487 -487
  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 +292 -333
  49. webscout/Provider/AISEARCH/README.md +106 -279
  50. webscout/Provider/AISEARCH/__init__.py +16 -9
  51. webscout/Provider/AISEARCH/brave_search.py +298 -0
  52. webscout/Provider/AISEARCH/iask_search.py +357 -410
  53. webscout/Provider/AISEARCH/monica_search.py +200 -220
  54. webscout/Provider/AISEARCH/webpilotai_search.py +242 -255
  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 -342
  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 +467 -340
  64. webscout/Provider/EssentialAI.py +217 -0
  65. webscout/Provider/ExaAI.py +274 -261
  66. webscout/Provider/Gemini.py +175 -169
  67. webscout/Provider/GithubChat.py +385 -369
  68. webscout/Provider/Gradient.py +286 -0
  69. webscout/Provider/Groq.py +556 -801
  70. webscout/Provider/HadadXYZ.py +323 -0
  71. webscout/Provider/HeckAI.py +392 -375
  72. webscout/Provider/HuggingFace.py +387 -0
  73. webscout/Provider/IBM.py +340 -0
  74. webscout/Provider/Jadve.py +317 -291
  75. webscout/Provider/K2Think.py +306 -0
  76. webscout/Provider/Koboldai.py +221 -384
  77. webscout/Provider/Netwrck.py +273 -270
  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 -952
  83. webscout/Provider/OPENAI/TogetherAI.py +405 -0
  84. webscout/Provider/OPENAI/TwoAI.py +255 -357
  85. webscout/Provider/OPENAI/__init__.py +148 -40
  86. webscout/Provider/OPENAI/ai4chat.py +348 -293
  87. webscout/Provider/OPENAI/akashgpt.py +436 -0
  88. webscout/Provider/OPENAI/algion.py +303 -0
  89. webscout/Provider/OPENAI/{exachat.py → ayle.py} +365 -444
  90. webscout/Provider/OPENAI/base.py +253 -249
  91. webscout/Provider/OPENAI/cerebras.py +296 -0
  92. webscout/Provider/OPENAI/chatgpt.py +870 -556
  93. webscout/Provider/OPENAI/chatsandbox.py +233 -173
  94. webscout/Provider/OPENAI/deepinfra.py +403 -322
  95. webscout/Provider/OPENAI/e2b.py +2370 -1414
  96. webscout/Provider/OPENAI/elmo.py +278 -0
  97. webscout/Provider/OPENAI/exaai.py +452 -417
  98. webscout/Provider/OPENAI/freeassist.py +446 -0
  99. webscout/Provider/OPENAI/gradient.py +448 -0
  100. webscout/Provider/OPENAI/groq.py +380 -364
  101. webscout/Provider/OPENAI/hadadxyz.py +292 -0
  102. webscout/Provider/OPENAI/heckai.py +333 -308
  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 -335
  107. webscout/Provider/OPENAI/meta.py +541 -0
  108. webscout/Provider/OPENAI/netwrck.py +374 -357
  109. webscout/Provider/OPENAI/nvidia.py +317 -0
  110. webscout/Provider/OPENAI/oivscode.py +348 -287
  111. webscout/Provider/OPENAI/openrouter.py +328 -0
  112. webscout/Provider/OPENAI/pydantic_imports.py +1 -172
  113. webscout/Provider/OPENAI/sambanova.py +397 -0
  114. webscout/Provider/OPENAI/sonus.py +305 -304
  115. webscout/Provider/OPENAI/textpollinations.py +370 -339
  116. webscout/Provider/OPENAI/toolbaz.py +375 -413
  117. webscout/Provider/OPENAI/typefully.py +419 -355
  118. webscout/Provider/OPENAI/typliai.py +279 -0
  119. webscout/Provider/OPENAI/utils.py +314 -318
  120. webscout/Provider/OPENAI/wisecat.py +359 -387
  121. webscout/Provider/OPENAI/writecream.py +185 -163
  122. webscout/Provider/OPENAI/x0gpt.py +462 -365
  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 -429
  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 -82
  133. webscout/Provider/TTI/__init__.py +37 -7
  134. webscout/Provider/TTI/base.py +147 -64
  135. webscout/Provider/TTI/claudeonline.py +393 -0
  136. webscout/Provider/TTI/magicstudio.py +292 -201
  137. webscout/Provider/TTI/miragic.py +180 -0
  138. webscout/Provider/TTI/pollinations.py +331 -221
  139. webscout/Provider/TTI/together.py +334 -0
  140. webscout/Provider/TTI/utils.py +14 -11
  141. webscout/Provider/TTS/README.md +186 -192
  142. webscout/Provider/TTS/__init__.py +43 -10
  143. webscout/Provider/TTS/base.py +523 -159
  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 -129
  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 -580
  153. webscout/Provider/TTS/streamElements.py +275 -333
  154. webscout/Provider/TTS/utils.py +280 -280
  155. webscout/Provider/TextPollinationsAI.py +331 -308
  156. webscout/Provider/TogetherAI.py +450 -0
  157. webscout/Provider/TwoAI.py +309 -475
  158. webscout/Provider/TypliAI.py +311 -305
  159. webscout/Provider/UNFINISHED/ChatHub.py +219 -209
  160. webscout/Provider/{OPENAI/glider.py → UNFINISHED/ChutesAI.py} +331 -326
  161. webscout/Provider/{GizAI.py → UNFINISHED/GizAI.py} +300 -295
  162. webscout/Provider/{Marcus.py → UNFINISHED/Marcus.py} +218 -198
  163. webscout/Provider/UNFINISHED/Qodo.py +481 -0
  164. webscout/Provider/{MCPCore.py → UNFINISHED/XenAI.py} +330 -315
  165. webscout/Provider/UNFINISHED/Youchat.py +347 -330
  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 -263
  170. webscout/Provider/{samurai.py → UNFINISHED/samurai.py} +231 -224
  171. webscout/Provider/WiseCat.py +256 -233
  172. webscout/Provider/WrDoChat.py +390 -370
  173. webscout/Provider/__init__.py +115 -174
  174. webscout/Provider/ai4chat.py +181 -174
  175. webscout/Provider/akashgpt.py +330 -335
  176. webscout/Provider/cerebras.py +397 -290
  177. webscout/Provider/cleeai.py +236 -213
  178. webscout/Provider/elmo.py +291 -283
  179. webscout/Provider/geminiapi.py +343 -208
  180. webscout/Provider/julius.py +245 -223
  181. webscout/Provider/learnfastai.py +333 -325
  182. webscout/Provider/llama3mitril.py +230 -215
  183. webscout/Provider/llmchat.py +308 -258
  184. webscout/Provider/llmchatco.py +321 -306
  185. webscout/Provider/meta.py +996 -801
  186. webscout/Provider/oivscode.py +332 -309
  187. webscout/Provider/searchchat.py +316 -292
  188. webscout/Provider/sonus.py +264 -258
  189. webscout/Provider/toolbaz.py +359 -353
  190. webscout/Provider/turboseek.py +332 -266
  191. webscout/Provider/typefully.py +262 -202
  192. webscout/Provider/x0gpt.py +332 -299
  193. webscout/__init__.py +31 -39
  194. webscout/__main__.py +5 -5
  195. webscout/cli.py +585 -524
  196. webscout/client.py +1497 -70
  197. webscout/conversation.py +140 -436
  198. webscout/exceptions.py +383 -362
  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 +74 -420
  204. webscout/prompt_manager.py +376 -288
  205. webscout/sanitize.py +1514 -0
  206. webscout/scout/README.md +452 -404
  207. webscout/scout/__init__.py +8 -8
  208. webscout/scout/core/__init__.py +7 -7
  209. webscout/scout/core/crawler.py +330 -210
  210. webscout/scout/core/scout.py +800 -607
  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 -478
  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 -95
  284. webscout/swiftcli/core/__init__.py +7 -7
  285. webscout/swiftcli/core/cli.py +574 -297
  286. webscout/swiftcli/core/context.py +98 -104
  287. webscout/swiftcli/core/group.py +268 -241
  288. webscout/swiftcli/decorators/__init__.py +28 -28
  289. webscout/swiftcli/decorators/command.py +243 -221
  290. webscout/swiftcli/decorators/options.py +247 -220
  291. webscout/swiftcli/decorators/output.py +392 -252
  292. webscout/swiftcli/exceptions.py +21 -21
  293. webscout/swiftcli/plugins/__init__.py +9 -9
  294. webscout/swiftcli/plugins/base.py +134 -135
  295. webscout/swiftcli/plugins/manager.py +269 -269
  296. webscout/swiftcli/utils/__init__.py +58 -59
  297. webscout/swiftcli/utils/formatting.py +251 -252
  298. webscout/swiftcli/utils/parsing.py +368 -267
  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 -135
  304. webscout/zeroart/base.py +70 -66
  305. webscout/zeroart/effects.py +155 -101
  306. webscout/zeroart/fonts.py +1799 -1239
  307. webscout-2026.1.19.dist-info/METADATA +638 -0
  308. webscout-2026.1.19.dist-info/RECORD +312 -0
  309. {webscout-8.2.9.dist-info → webscout-2026.1.19.dist-info}/WHEEL +1 -1
  310. {webscout-8.2.9.dist-info → webscout-2026.1.19.dist-info}/entry_points.txt +1 -1
  311. webscout/DWEBS.py +0 -520
  312. webscout/Extra/Act.md +0 -309
  313. webscout/Extra/GitToolkit/gitapi/README.md +0 -110
  314. webscout/Extra/autocoder/__init__.py +0 -9
  315. webscout/Extra/autocoder/autocoder.py +0 -1105
  316. webscout/Extra/autocoder/autocoder_utiles.py +0 -332
  317. webscout/Extra/gguf.md +0 -430
  318. webscout/Extra/weather.md +0 -281
  319. webscout/Litlogger/README.md +0 -10
  320. webscout/Litlogger/__init__.py +0 -15
  321. webscout/Litlogger/formats.py +0 -4
  322. webscout/Litlogger/handlers.py +0 -103
  323. webscout/Litlogger/levels.py +0 -13
  324. webscout/Litlogger/logger.py +0 -92
  325. webscout/Provider/AI21.py +0 -177
  326. webscout/Provider/AISEARCH/DeepFind.py +0 -254
  327. webscout/Provider/AISEARCH/felo_search.py +0 -202
  328. webscout/Provider/AISEARCH/genspark_search.py +0 -324
  329. webscout/Provider/AISEARCH/hika_search.py +0 -186
  330. webscout/Provider/AISEARCH/scira_search.py +0 -298
  331. webscout/Provider/Aitopia.py +0 -316
  332. webscout/Provider/AllenAI.py +0 -440
  333. webscout/Provider/Blackboxai.py +0 -791
  334. webscout/Provider/ChatGPTClone.py +0 -237
  335. webscout/Provider/ChatGPTGratis.py +0 -194
  336. webscout/Provider/Cloudflare.py +0 -324
  337. webscout/Provider/ExaChat.py +0 -358
  338. webscout/Provider/Flowith.py +0 -217
  339. webscout/Provider/FreeGemini.py +0 -250
  340. webscout/Provider/Glider.py +0 -225
  341. webscout/Provider/HF_space/__init__.py +0 -0
  342. webscout/Provider/HF_space/qwen_qwen2.py +0 -206
  343. webscout/Provider/HuggingFaceChat.py +0 -469
  344. webscout/Provider/Hunyuan.py +0 -283
  345. webscout/Provider/LambdaChat.py +0 -411
  346. webscout/Provider/Llama3.py +0 -259
  347. webscout/Provider/Nemotron.py +0 -218
  348. webscout/Provider/OLLAMA.py +0 -396
  349. webscout/Provider/OPENAI/BLACKBOXAI.py +0 -766
  350. webscout/Provider/OPENAI/Cloudflare.py +0 -378
  351. webscout/Provider/OPENAI/FreeGemini.py +0 -283
  352. webscout/Provider/OPENAI/NEMOTRON.py +0 -232
  353. webscout/Provider/OPENAI/Qwen3.py +0 -283
  354. webscout/Provider/OPENAI/api.py +0 -969
  355. webscout/Provider/OPENAI/c4ai.py +0 -373
  356. webscout/Provider/OPENAI/chatgptclone.py +0 -494
  357. webscout/Provider/OPENAI/copilot.py +0 -242
  358. webscout/Provider/OPENAI/flowith.py +0 -162
  359. webscout/Provider/OPENAI/freeaichat.py +0 -359
  360. webscout/Provider/OPENAI/mcpcore.py +0 -389
  361. webscout/Provider/OPENAI/multichat.py +0 -376
  362. webscout/Provider/OPENAI/opkfc.py +0 -496
  363. webscout/Provider/OPENAI/scirachat.py +0 -477
  364. webscout/Provider/OPENAI/standardinput.py +0 -433
  365. webscout/Provider/OPENAI/typegpt.py +0 -364
  366. webscout/Provider/OPENAI/uncovrAI.py +0 -463
  367. webscout/Provider/OPENAI/venice.py +0 -431
  368. webscout/Provider/OPENAI/yep.py +0 -382
  369. webscout/Provider/OpenGPT.py +0 -209
  370. webscout/Provider/Perplexitylabs.py +0 -415
  371. webscout/Provider/Reka.py +0 -214
  372. webscout/Provider/StandardInput.py +0 -290
  373. webscout/Provider/TTI/aiarta.py +0 -365
  374. webscout/Provider/TTI/artbit.py +0 -0
  375. webscout/Provider/TTI/fastflux.py +0 -200
  376. webscout/Provider/TTI/piclumen.py +0 -203
  377. webscout/Provider/TTI/pixelmuse.py +0 -225
  378. webscout/Provider/TTS/gesserit.py +0 -128
  379. webscout/Provider/TTS/sthir.py +0 -94
  380. webscout/Provider/TeachAnything.py +0 -229
  381. webscout/Provider/UNFINISHED/puterjs.py +0 -635
  382. webscout/Provider/UNFINISHED/test_lmarena.py +0 -119
  383. webscout/Provider/Venice.py +0 -258
  384. webscout/Provider/VercelAI.py +0 -253
  385. webscout/Provider/Writecream.py +0 -246
  386. webscout/Provider/WritingMate.py +0 -269
  387. webscout/Provider/asksteve.py +0 -220
  388. webscout/Provider/chatglm.py +0 -215
  389. webscout/Provider/copilot.py +0 -425
  390. webscout/Provider/freeaichat.py +0 -285
  391. webscout/Provider/granite.py +0 -235
  392. webscout/Provider/hermes.py +0 -266
  393. webscout/Provider/koala.py +0 -170
  394. webscout/Provider/lmarena.py +0 -198
  395. webscout/Provider/multichat.py +0 -364
  396. webscout/Provider/scira_chat.py +0 -299
  397. webscout/Provider/scnet.py +0 -243
  398. webscout/Provider/talkai.py +0 -194
  399. webscout/Provider/typegpt.py +0 -289
  400. webscout/Provider/uncovr.py +0 -368
  401. webscout/Provider/yep.py +0 -389
  402. webscout/litagent/Readme.md +0 -276
  403. webscout/litprinter/__init__.py +0 -59
  404. webscout/swiftcli/Readme.md +0 -323
  405. webscout/tempid.py +0 -128
  406. webscout/webscout_search.py +0 -1184
  407. webscout/webscout_search_async.py +0 -654
  408. webscout/yep_search.py +0 -347
  409. webscout/zeroart/README.md +0 -89
  410. webscout-8.2.9.dist-info/METADATA +0 -1033
  411. webscout-8.2.9.dist-info/RECORD +0 -289
  412. {webscout-8.2.9.dist-info → webscout-2026.1.19.dist-info}/licenses/LICENSE.md +0 -0
  413. {webscout-8.2.9.dist-info → webscout-2026.1.19.dist-info}/top_level.txt +0 -0
@@ -1,791 +0,0 @@
1
- import requests
2
- import random
3
- import string
4
- import base64
5
- from datetime import datetime, timedelta
6
- from typing import Any, Dict, Union, Generator, List
7
- from webscout.AIutel import Optimizers, Conversation, AwesomePrompts
8
- from webscout.AIbase import Provider
9
- from webscout import exceptions
10
- from webscout.litagent import LitAgent
11
- def to_data_uri(image_data):
12
- """Convert image data to a data URI format"""
13
- if isinstance(image_data, str):
14
- # Assume it's already a data URI
15
- return image_data
16
-
17
- # Encode binary data to base64
18
- encoded = base64.b64encode(image_data).decode('utf-8')
19
-
20
- # Determine MIME type (simplified)
21
- mime_type = "image/jpeg" # Default
22
- if image_data.startswith(b'\x89PNG'):
23
- mime_type = "image/png"
24
- elif image_data.startswith(b'\xff\xd8'):
25
- mime_type = "image/jpeg"
26
- elif image_data.startswith(b'GIF'):
27
- mime_type = "image/gif"
28
-
29
- return f"data:{mime_type};base64,{encoded}"
30
-
31
-
32
- class BLACKBOXAI(Provider):
33
- """
34
- BlackboxAI provider for interacting with the Blackbox API.
35
- Supports synchronous operations with multiple models.
36
- """
37
- url = "https://www.blackbox.ai"
38
- api_endpoint = "https://www.blackbox.ai/api/chat"
39
-
40
-
41
- # Default model (remains the same as per original class)
42
- default_model = "GPT-4.1"
43
- default_vision_model = default_model
44
-
45
- # New OpenRouter models list
46
- openrouter_models = [
47
- "Deepcoder 14B Preview",
48
- "DeepHermes 3 Llama 3 8B Preview",
49
- "DeepSeek R1 Zero",
50
- "Dolphin3.0 Mistral 24B",
51
- "Dolphin3.0 R1 Mistral 24B",
52
- "Flash 3",
53
- "Gemini 2.0 Flash Experimental",
54
- "Gemma 2 9B",
55
- "Gemma 3 12B",
56
- "Gemma 3 1B",
57
- "Gemma 3 27B",
58
- "Gemma 3 4B",
59
- "Kimi VL A3B Thinking",
60
- "Llama 3.1 8B Instruct",
61
- "Llama 3.1 Nemotron Ultra 253B v1",
62
- "Llama 3.2 11B Vision Instruct",
63
- "Llama 3.2 1B Instruct",
64
- "Llama 3.2 3B Instruct",
65
- "Llama 3.3 70B Instruct",
66
- "Llama 3.3 Nemotron Super 49B v1",
67
- "Llama 4 Maverick",
68
- "Llama 4 Scout",
69
- "Mistral 7B Instruct",
70
- "Mistral Nemo",
71
- "Mistral Small 3",
72
- "Mistral Small 3.1 24B",
73
- "Molmo 7B D",
74
- "Moonlight 16B A3B Instruct",
75
- "Qwen2.5 72B Instruct",
76
- "Qwen2.5 7B Instruct",
77
- "Qwen2.5 Coder 32B Instruct",
78
- "Qwen2.5 VL 32B Instruct",
79
- "Qwen2.5 VL 3B Instruct",
80
- "Qwen2.5 VL 72B Instruct",
81
- "Qwen2.5-VL 7B Instruct",
82
- "Qwerky 72B",
83
- "QwQ 32B",
84
- "QwQ 32B Preview",
85
- "QwQ 32B RpR v1",
86
- "R1",
87
- "R1 Distill Llama 70B",
88
- "R1 Distill Qwen 14B",
89
- "R1 Distill Qwen 32B",
90
- ]
91
-
92
- # New base models list
93
- models = [
94
- default_model,
95
- "o3-mini",
96
- "gpt-4.1-nano",
97
- "Claude Opus 4", # Added Claude Opus 4
98
- "Claude Sonnet 4", # Added Claude Sonnet 4
99
- "Claude-sonnet-3.7",
100
- "Claude-sonnet-3.5",
101
- "Grok 3", # Added Grok 3
102
- "Gemini 2.5 Pro", # Added Gemini 2.5 Pro
103
- "UI-TARS 72B", # Added UI-TARS 72B
104
- "DeepSeek-R1",
105
- "Mistral-Small-24B-Instruct-2501",
106
- *openrouter_models,
107
- # Trending agent modes (names)
108
- 'Python Agent', 'HTML Agent', 'Builder Agent', 'Java Agent', 'JavaScript Agent',
109
- 'React Agent', 'Android Agent', 'Flutter Agent', 'Next.js Agent', 'AngularJS Agent',
110
- 'Swift Agent', 'MongoDB Agent', 'PyTorch Agent', 'Xcode Agent', 'Azure Agent',
111
- 'Bitbucket Agent', 'DigitalOcean Agent', 'Docker Agent', 'Electron Agent',
112
- 'Erlang Agent', 'FastAPI Agent', 'Firebase Agent', 'Flask Agent', 'Git Agent',
113
- 'Gitlab Agent', 'Go Agent', 'Godot Agent', 'Google Cloud Agent', 'Heroku Agent'
114
- ]
115
-
116
- # Models that support vision capabilities
117
- vision_models = [default_vision_model, 'o3-mini', "Llama 3.2 11B Vision Instruct", "Gemini 2.5 Pro", "Claude Sonnet 4", "Claude Opus 4", "UI-TARS 72B"] # Added Llama vision, Gemini 2.5 Pro, Claude Sonnet 4, Claude Opus 4, and UI-TARS 72B
118
-
119
- # Models that can be directly selected by users
120
- userSelectedModel = ['o3-mini', 'Claude Opus 4', 'Claude Sonnet 4', 'Claude-sonnet-3.7', 'Claude-sonnet-3.5', 'Grok 3', 'Gemini 2.5 Pro', 'UI-TARS 72B', 'DeepSeek-R1', 'Mistral-Small-24B-Instruct-2501'] + openrouter_models
121
-
122
- # Agent mode configurations
123
- agentMode = {
124
- # OpenRouter Free
125
- 'Deepcoder 14B Preview': {'mode': True, 'id': "agentica-org/deepcoder-14b-preview:free", 'name': "Deepcoder 14B Preview"},
126
- 'DeepHermes 3 Llama 3 8B Preview': {'mode': True, 'id': "nousresearch/deephermes-3-llama-3-8b-preview:free", 'name': "DeepHermes 3 Llama 3 8B Preview"},
127
- 'DeepSeek R1 Zero': {'mode': True, 'id': "deepseek/deepseek-r1-zero:free", 'name': "DeepSeek R1 Zero"},
128
- 'Dolphin3.0 Mistral 24B': {'mode': True, 'id': "cognitivecomputations/dolphin3.0-mistral-24b:free", 'name': "Dolphin3.0 Mistral 24B"},
129
- 'Dolphin3.0 R1 Mistral 24B': {'mode': True, 'id': "cognitivecomputations/dolphin3.0-r1-mistral-24b:free", 'name': "Dolphin3.0 R1 Mistral 24B"},
130
- 'Flash 3': {'mode': True, 'id': "rekaai/reka-flash-3:free", 'name': "Flash 3"},
131
- 'Gemini 2.0 Flash Experimental': {'mode': True, 'id': "google/gemini-2.0-flash-exp:free", 'name': "Gemini 2.0 Flash Experimental"},
132
- 'Gemma 2 9B': {'mode': True, 'id': "google/gemma-2-9b-it:free", 'name': "Gemma 2 9B"},
133
- 'Gemma 3 12B': {'mode': True, 'id': "google/gemma-3-12b-it:free", 'name': "Gemma 3 12B"},
134
- 'Gemma 3 1B': {'mode': True, 'id': "google/gemma-3-1b-it:free", 'name': "Gemma 3 1B"},
135
- 'Gemma 3 27B': {'mode': True, 'id': "google/gemma-3-27b-it:free", 'name': "Gemma 3 27B"},
136
- 'Gemma 3 4B': {'mode': True, 'id': "google/gemma-3-4b-it:free", 'name': "Gemma 3 4B"},
137
- 'Kimi VL A3B Thinking': {'mode': True, 'id': "moonshotai/kimi-vl-a3b-thinking:free", 'name': "Kimi VL A3B Thinking"},
138
- 'Llama 3.1 8B Instruct': {'mode': True, 'id': "meta-llama/llama-3.1-8b-instruct:free", 'name': "Llama 3.1 8B Instruct"},
139
- 'Llama 3.1 Nemotron Ultra 253B v1': {'mode': True, 'id': "nvidia/llama-3.1-nemotron-ultra-253b-v1:free", 'name': "Llama 3.1 Nemotron Ultra 253B v1"},
140
- 'Llama 3.2 11B Vision Instruct': {'mode': True, 'id': "meta-llama/llama-3.2-11b-vision-instruct:free", 'name': "Llama 3.2 11B Vision Instruct"},
141
- 'Llama 3.2 1B Instruct': {'mode': True, 'id': "meta-llama/llama-3.2-1b-instruct:free", 'name': "Llama 3.2 1B Instruct"},
142
- 'Llama 3.2 3B Instruct': {'mode': True, 'id': "meta-llama/llama-3.2-3b-instruct:free", 'name': "Llama 3.2 3B Instruct"},
143
- 'Llama 3.3 70B Instruct': {'mode': True, 'id': "meta-llama/llama-3.3-70b-instruct:free", 'name': "Llama 3.3 70B Instruct"},
144
- 'Llama 3.3 Nemotron Super 49B v1': {'mode': True, 'id': "nvidia/llama-3.3-nemotron-super-49b-v1:free", 'name': "Llama 3.3 Nemotron Super 49B v1"},
145
- 'Llama 4 Maverick': {'mode': True, 'id': "meta-llama/llama-4-maverick:free", 'name': "Llama 4 Maverick"},
146
- 'Llama 4 Scout': {'mode': True, 'id': "meta-llama/llama-4-scout:free", 'name': "Llama 4 Scout"},
147
- 'Mistral 7B Instruct': {'mode': True, 'id': "mistralai/mistral-7b-instruct:free", 'name': "Mistral 7B Instruct"},
148
- 'Mistral Nemo': {'mode': True, 'id': "mistralai/mistral-nemo:free", 'name': "Mistral Nemo"},
149
- 'Mistral Small 3': {'mode': True, 'id': "mistralai/mistral-small-24b-instruct-2501:free", 'name': "Mistral Small 3"}, # Matches Mistral-Small-24B-Instruct-2501
150
- 'Mistral Small 3.1 24B': {'mode': True, 'id': "mistralai/mistral-small-3.1-24b-instruct:free", 'name': "Mistral Small 3.1 24B"},
151
- 'Molmo 7B D': {'mode': True, 'id': "allenai/molmo-7b-d:free", 'name': "Molmo 7B D"},
152
- 'Moonlight 16B A3B Instruct': {'mode': True, 'id': "moonshotai/moonlight-16b-a3b-instruct:free", 'name': "Moonlight 16B A3B Instruct"},
153
- 'Qwen2.5 72B Instruct': {'mode': True, 'id': "qwen/qwen-2.5-72b-instruct:free", 'name': "Qwen2.5 72B Instruct"},
154
- 'Qwen2.5 7B Instruct': {'mode': True, 'id': "qwen/qwen-2.5-7b-instruct:free", 'name': "Qwen2.5 7B Instruct"},
155
- 'Qwen2.5 Coder 32B Instruct': {'mode': True, 'id': "qwen/qwen-2.5-coder-32b-instruct:free", 'name': "Qwen2.5 Coder 32B Instruct"},
156
- 'Qwen2.5 VL 32B Instruct': {'mode': True, 'id': "qwen/qwen2.5-vl-32b-instruct:free", 'name': "Qwen2.5 VL 32B Instruct"},
157
- 'Qwen2.5 VL 3B Instruct': {'mode': True, 'id': "qwen/qwen2.5-vl-3b-instruct:free", 'name': "Qwen2.5 VL 3B Instruct"},
158
- 'Qwen2.5 VL 72B Instruct': {'mode': True, 'id': "qwen/qwen2.5-vl-72b-instruct:free", 'name': "Qwen2.5 VL 72B Instruct"},
159
- 'Qwen2.5-VL 7B Instruct': {'mode': True, 'id': "qwen/qwen-2.5-vl-7b-instruct:free", 'name': "Qwen2.5-VL 7B Instruct"},
160
- 'Qwerky 72B': {'mode': True, 'id': "featherless/qwerky-72b:free", 'name': "Qwerky 72B"},
161
- 'QwQ 32B': {'mode': True, 'id': "qwen/qwq-32b:free", 'name': "QwQ 32B"},
162
- 'QwQ 32B Preview': {'mode': True, 'id': "qwen/qwq-32b-preview:free", 'name': "QwQ 32B Preview"},
163
- 'QwQ 32B RpR v1': {'mode': True, 'id': "arliai/qwq-32b-arliai-rpr-v1:free", 'name': "QwQ 32B RpR v1"},
164
- 'R1': {'mode': True, 'id': "deepseek/deepseek-r1:free", 'name': "R1"}, # Matches DeepSeek-R1
165
- 'R1 Distill Llama 70B': {'mode': True, 'id': "deepseek/deepseek-r1-distill-llama-70b:free", 'name': "R1 Distill Llama 70B"},
166
- 'R1 Distill Qwen 14B': {'mode': True, 'id': "deepseek/deepseek-r1-distill-qwen-14b:free", 'name': "R1 Distill Qwen 14B"},
167
- 'R1 Distill Qwen 32B': {'mode': True, 'id': "deepseek/deepseek-r1-distill-qwen-32b:free", 'name': "R1 Distill Qwen 32B"},
168
- # Default models from the new list
169
- 'Claude Opus 4': {'mode': True, 'id': "anthropic/claude-opus-4", 'name': "Claude Opus 4"},
170
- 'Claude Sonnet 4': {'mode': True, 'id': "anthropic/claude-sonnet-4", 'name': "Claude Sonnet 4"},
171
- 'Claude-sonnet-3.7': {'mode': True, 'id': "Claude-sonnet-3.7", 'name': "Claude-sonnet-3.7"},
172
- 'Claude-sonnet-3.5': {'mode': True, 'id': "Claude-sonnet-3.5", 'name': "Claude-sonnet-3.5"},
173
- 'Grok 3': {'mode': True, 'id': "x-ai/grok-3-beta", 'name': "Grok 3"},
174
- 'Gemini 2.5 Pro': {'mode': True, 'id': "google/gemini-2.5-pro-preview-03-25", 'name': "Gemini 2.5 Pro"},
175
- 'UI-TARS 72B': {'mode': True, 'id': "bytedance-research/ui-tars-72b:free", 'name': "UI-TARS 72B"},
176
- 'DeepSeek-R1': {'mode': True, 'id': "deepseek-reasoner", 'name': "DeepSeek-R1"}, # This is 'R1' in openrouter, but 'DeepSeek-R1' in base models
177
- 'Mistral-Small-24B-Instruct-2501': {'mode': True, 'id': "mistralai/Mistral-Small-24B-Instruct-2501", 'name': "Mistral-Small-24B-Instruct-2501"},
178
- # Add default_model if it's not covered and has an agent mode
179
- default_model: {'mode': True, 'id': "openai/gpt-4.1", 'name': default_model}, # Assuming GPT-4.1 is agent-compatible
180
- 'o3-mini': {'mode': True, 'id': "o3-mini", 'name': "o3-mini"}, # Assuming o3-mini is agent-compatible
181
- 'gpt-4.1-nano': {'mode': True, 'id': "gpt-4.1-nano", 'name': "gpt-4.1-nano"}, # Assuming gpt-4.1-nano is agent-compatible
182
- }
183
-
184
- # Trending agent modes
185
- trendingAgentMode = {
186
- 'Python Agent': {'mode': True, 'id': "python"},
187
- 'HTML Agent': {'mode': True, 'id': "html"},
188
- 'Builder Agent': {'mode': True, 'id': "builder"},
189
- 'Java Agent': {'mode': True, 'id': "java"},
190
- 'JavaScript Agent': {'mode': True, 'id': "javascript"},
191
- 'React Agent': {'mode': True, 'id': "react"},
192
- 'Android Agent': {'mode': True, 'id': "android"},
193
- 'Flutter Agent': {'mode': True, 'id': "flutter"},
194
- 'Next.js Agent': {'mode': True, 'id': "next.js"},
195
- 'AngularJS Agent': {'mode': True, 'id': "angularjs"},
196
- 'Swift Agent': {'mode': True, 'id': "swift"},
197
- 'MongoDB Agent': {'mode': True, 'id': "mongodb"},
198
- 'PyTorch Agent': {'mode': True, 'id': "pytorch"},
199
- 'Xcode Agent': {'mode': True, 'id': "xcode"},
200
- 'Azure Agent': {'mode': True, 'id': "azure"},
201
- 'Bitbucket Agent': {'mode': True, 'id': "bitbucket"},
202
- 'DigitalOcean Agent': {'mode': True, 'id': "digitalocean"},
203
- 'Docker Agent': {'mode': True, 'id': "docker"},
204
- 'Electron Agent': {'mode': True, 'id': "electron"},
205
- 'Erlang Agent': {'mode': True, 'id': "erlang"},
206
- 'FastAPI Agent': {'mode': True, 'id': "fastapi"},
207
- 'Firebase Agent': {'mode': True, 'id': "firebase"},
208
- 'Flask Agent': {'mode': True, 'id': "flask"},
209
- 'Git Agent': {'mode': True, 'id': "git"},
210
- 'Gitlab Agent': {'mode': True, 'id': "gitlab"},
211
- 'Go Agent': {'mode': True, 'id': "go"},
212
- 'Godot Agent': {'mode': True, 'id': "godot"},
213
- 'Google Cloud Agent': {'mode': True, 'id': "googlecloud"},
214
- 'Heroku Agent': {'mode': True, 'id': "heroku"},
215
- }
216
-
217
- # Complete list of all models (for authorized users) - used for AVAILABLE_MODELS
218
- _all_models = list(dict.fromkeys([
219
- *models, # Includes default_model, o3-mini, etc., and openrouter_models and agent names
220
- *list(agentMode.keys()), # Ensure all agentMode keys are included
221
- *list(trendingAgentMode.keys()) # Ensure all trendingAgentMode keys are included
222
- ]))
223
-
224
- AVAILABLE_MODELS = {name: name for name in _all_models}
225
- # Update AVAILABLE_MODELS to use names from agentMode if available
226
- for model_name_key in agentMode:
227
- if model_name_key in AVAILABLE_MODELS: # Check if the key from agentMode is in _all_models
228
- AVAILABLE_MODELS[model_name_key] = agentMode[model_name_key].get('name', model_name_key)
229
-
230
-
231
- # Model aliases for easier reference
232
- model_aliases = {
233
- "gpt-4": default_model, # default_model is "GPT-4.1"
234
- "gpt-4.1": default_model,
235
- "gpt-4o": default_model, # Defaulting to GPT-4.1 as per previous logic if specific GPT-4o handling isn't defined elsewhere
236
- "gpt-4o-mini": default_model, # Defaulting
237
- "claude-opus-4": "Claude Opus 4",
238
- "claude-4-opus": "Claude Opus 4",
239
- "claude-sonnet-4": "Claude Sonnet 4",
240
- "claude-4-sonnet": "Claude Sonnet 4",
241
- "claude-3.7-sonnet": "Claude-sonnet-3.7",
242
- "claude-3.5-sonnet": "Claude-sonnet-3.5",
243
- "grok-3": "Grok 3",
244
- "grok3": "Grok 3",
245
- "gemini-2.5-pro": "Gemini 2.5 Pro",
246
- "gemini-2.5": "Gemini 2.5 Pro",
247
- "ui-tars-72b": "UI-TARS 72B",
248
- "ui-tars": "UI-TARS 72B",
249
- # "deepseek-r1": "DeepSeek-R1", # This is in base models, maps to R1 or DeepSeek R1 Zero in agentMode
250
- #
251
- "deepcoder-14b": "Deepcoder 14B Preview",
252
- "deephermes-3-8b": "DeepHermes 3 Llama 3 8B Preview",
253
- "deepseek-r1-zero": "DeepSeek R1 Zero",
254
- "deepseek-r1": "R1", # Alias for R1 (which is deepseek/deepseek-r1:free)
255
- "dolphin-3.0-24b": "Dolphin3.0 Mistral 24B",
256
- "dolphin-3.0-r1-24b": "Dolphin3.0 R1 Mistral 24B",
257
- "reka-flash": "Flash 3",
258
- "gemini-2.0-flash": "Gemini 2.0 Flash Experimental",
259
- "gemma-2-9b": "Gemma 2 9B",
260
- "gemma-3-12b": "Gemma 3 12B",
261
- "gemma-3-1b": "Gemma 3 1B",
262
- "gemma-3-27b": "Gemma 3 27B",
263
- "gemma-3-4b": "Gemma 3 4B",
264
- "kimi-vl-a3b-thinking": "Kimi VL A3B Thinking",
265
- "llama-3.1-8b": "Llama 3.1 8B Instruct",
266
- "nemotron-253b": "Llama 3.1 Nemotron Ultra 253B v1",
267
- "llama-3.2-11b": "Llama 3.2 11B Vision Instruct",
268
- "llama-3.2-1b": "Llama 3.2 1B Instruct",
269
- "llama-3.2-3b": "Llama 3.2 3B Instruct",
270
- "llama-3.3-70b": "Llama 3.3 70B Instruct",
271
- "nemotron-49b": "Llama 3.3 Nemotron Super 49B v1",
272
- "llama-4-maverick": "Llama 4 Maverick",
273
- "llama-4-scout": "Llama 4 Scout",
274
- "mistral-7b": "Mistral 7B Instruct",
275
- "mistral-nemo": "Mistral Nemo",
276
- "mistral-small-24b": "Mistral Small 3", # Alias for "Mistral Small 3"
277
- "mistral-small-24b-instruct-2501": "Mistral-Small-24B-Instruct-2501", # Specific name
278
- "mistral-small-3.1-24b": "Mistral Small 3.1 24B",
279
- "molmo-7b": "Molmo 7B D",
280
- "moonlight-16b": "Moonlight 16B A3B Instruct",
281
- "qwen-2.5-72b": "Qwen2.5 72B Instruct",
282
- "qwen-2.5-7b": "Qwen2.5 7B Instruct",
283
- "qwen-2.5-coder-32b": "Qwen2.5 Coder 32B Instruct",
284
- "qwen-2.5-vl-32b": "Qwen2.5 VL 32B Instruct",
285
- "qwen-2.5-vl-3b": "Qwen2.5 VL 3B Instruct",
286
- "qwen-2.5-vl-72b": "Qwen2.5 VL 72B Instruct",
287
- "qwen-2.5-vl-7b": "Qwen2.5-VL 7B Instruct",
288
- "qwerky-72b": "Qwerky 72B",
289
- "qwq-32b": "QwQ 32B",
290
- "qwq-32b-preview": "QwQ 32B Preview",
291
- "qwq-32b-arliai": "QwQ 32B RpR v1",
292
- "deepseek-r1-distill-llama-70b": "R1 Distill Llama 70B",
293
- "deepseek-r1-distill-qwen-14b": "R1 Distill Qwen 14B",
294
- "deepseek-r1-distill-qwen-32b": "R1 Distill Qwen 32B",
295
- }
296
-
297
- def __init__(
298
- self,
299
- is_conversation: bool = True,
300
- max_tokens: int = 8000,
301
- timeout: int = 30,
302
- intro: str = None,
303
- filepath: str = None,
304
- update_file: bool = True,
305
- proxies: dict = {},
306
- history_offset: int = 10250,
307
- act: str = None,
308
- model: str = "gpt-4.1",
309
- system_message: str = "You are a helpful AI assistant."
310
- ):
311
- """Initialize BlackboxAI with enhanced configuration options."""
312
- self.session = requests.Session()
313
- self.max_tokens_to_sample = max_tokens
314
- self.is_conversation = is_conversation
315
- self.timeout = timeout
316
- self.last_response = {}
317
- self.model = self.get_model(model)
318
- self.system_message = system_message
319
-
320
- self.headers = {
321
- "Content-Type": "application/json",
322
- "Accept": "*/*",
323
- }
324
- self.cookies = {
325
- 'cfzs_amplitude': self.generate_id(32),
326
- 'cfz_amplitude': self.generate_id(32),
327
- '__cf_bm': self.generate_id(32),
328
- }
329
-
330
- self.__available_optimizers = [
331
- method for method in dir(Optimizers)
332
- if callable(getattr(Optimizers, method)) and not method.startswith("__")
333
- ]
334
-
335
- Conversation.intro = (
336
- AwesomePrompts().get_act(
337
- act, raise_not_found=True, default=None, case_insensitive=True
338
- )
339
- if act
340
- else intro or Conversation.intro
341
- )
342
-
343
- self.conversation = Conversation(
344
- is_conversation, self.max_tokens_to_sample, filepath, update_file
345
- )
346
- self.conversation.history_offset = history_offset
347
- self.session.proxies = proxies
348
-
349
- @classmethod
350
- def get_model(cls, model: str) -> str:
351
- """Resolve model name from alias"""
352
- # Convert to lowercase for case-insensitive matching
353
- model_lower = model.lower()
354
-
355
- # Check aliases (case-insensitive)
356
- for alias, target in cls.model_aliases.items():
357
- if model_lower == alias.lower():
358
- model = target
359
- break
360
-
361
- # Check available models (case-insensitive)
362
- for available_model, target in cls.AVAILABLE_MODELS.items():
363
- if model_lower == available_model.lower() or model == target:
364
- return target
365
-
366
- # If we get here, the model wasn't found
367
- raise ValueError(f"Unknown model: {model}. Available models: {', '.join(cls.AVAILABLE_MODELS)}")
368
-
369
- @classmethod
370
- def generate_session(cls, email: str = None, id_length: int = 21, days_ahead: int = 30) -> dict:
371
- """
372
- Generate a dynamic session with proper ID and expiry format using a specific email.
373
- Uses a large hardcoded list of names and domains for diversity.
374
-
375
- Args:
376
- email: The email to use for this session (optional, will be generated if not provided)
377
- id_length: Length of the numeric ID (default: 21)
378
- days_ahead: Number of days ahead for expiry (default: 30)
379
-
380
- Returns:
381
- dict: A session dictionary with user information and expiry
382
- """
383
- # Large list of first and last names
384
- first_names = [
385
- "Alex", "Jordan", "Taylor", "Morgan", "Casey", "Riley", "Avery", "Quinn", "Skyler", "Dakota",
386
- "Jamie", "Cameron", "Drew", "Harper", "Peyton", "Reese", "Rowan", "Sawyer", "Shawn", "Terry",
387
- "Robin", "Kendall", "Finley", "Blake", "Charlie", "Emerson", "Hayden", "Jesse", "Kai", "Lane",
388
- "Logan", "Marley", "Micah", "Parker", "Phoenix", "Remy", "Rory", "Sage", "Shiloh", "Spencer",
389
- "Sydney", "Tatum", "Teagan", "Tristan", "Val", "Winter", "Zion", "Bailey", "Brett", "Case",
390
- "Corey", "Devon", "Eden", "Ellis", "Frankie", "Gray", "Indigo", "Jaden", "Jules", "Justice",
391
- "Kieran", "Lake", "Lennon", "Linden", "Luca", "Milan", "Monroe", "Oakley", "Perry", "Quincy",
392
- "Reagan", "Reed", "Rene", "River", "Robin", "Sasha", "Shane", "Shawn", "Sky", "Sterling",
393
- "Storm", "Toby", "Vesper", "Wren", "Zane", "Zuri", "Ainsley", "Arden", "Aspen", "Blaine", "Briar",
394
- "Campbell", "Cleo", "Cruz", "Dallas", "Darby", "Denver", "Echo", "Emery", "Everest", "Hollis",
395
- "Indy", "Joss", "Karsen", "Kit", "Laken", "Linden", "Lyle", "Marlow", "Merritt", "Nico", "Onyx",
396
- "Pax", "Peyton", "Quill", "Raleigh", "Reeve", "Ridley", "Rio", "Rylan", "Sailor", "Scout", "Shia",
397
- "Sonny", "Story", "Tanner", "Tate", "Tegan", "Tiernan", "True", "Vaughn", "Wynn", "Zephyr",
398
- # Add more names as needed for diversity
399
- ]
400
- last_names = [
401
- "Smith", "Johnson", "Williams", "Brown", "Jones", "Miller", "Davis", "Garcia", "Rodriguez", "Wilson",
402
- "Martinez", "Anderson", "Taylor", "Thomas", "Hernandez", "Moore", "Martin", "Jackson", "Thompson", "White",
403
- "Lopez", "Lee", "Gonzalez", "Harris", "Clark", "Lewis", "Robinson", "Walker", "Perez", "Hall",
404
- "Young", "Allen", "Sanchez", "Wright", "King", "Scott", "Green", "Baker", "AdAMS", "Nelson",
405
- "Carter", "Mitchell", "Perez", "Roberts", "Turner", "Phillips", "Campbell", "Parker", "Evans", "Edwards",
406
- "Collins", "Stewart", "Sanchez", "Morris", "Rogers", "Reed", "Cook", "Morgan", "Bell", "Murphy",
407
- "Bailey", "Rivera", "Cooper", "Richardson", "Cox", "Howard", "Ward", "Torres", "Peterson", "Gray",
408
- "Ramirez", "James", "Watson", "Brooks", "Kelly", "Sanders", "Price", "Bennett", "Wood", "Barnes",
409
- "Ross", "Henderson", "Coleman", "Jenkins", "Perry", "Powell", "Long", "Patterson", "Hughes", "Flores",
410
- "Washington", "Butler", "Simmons", "Foster", "Gonzales", "Bryant", "Alexander", "Russell", "Griffin", "Diaz",
411
- # Add more last names as needed
412
- ]
413
- # Large list of fake domains
414
- fake_domains = [
415
- "example.com", "mailinator.com", "fakemail.com", "tempmail.net", "yopmail.com", "testmail.org", "maildrop.cc",
416
- "inboxkitten.com", "guerrillamail.com", "sharklasers.com", "mailnesia.com", "dispostable.com", "getnada.com",
417
- "10minutemail.com", "throwawaymail.com", "mailcatch.com", "spambog.com", "mintemail.com", "mail-temp.com",
418
- "fakeinbox.com", "mytrashmail.com", "trashmail.com", "mailnull.com", "spamgourmet.com", "mailhazard.com",
419
- "mailbox52.ga", "mailpoof.com", "mailtothis.com", "nowmymail.com", "mailimate.com", "mailboxy.fun",
420
- "mailbolt.net", "mailblip.com", "mailbucket.org", "mailchimp.biz", "mailclark.ai", "maildog.info",
421
- "maildrop.cc", "maildu.de", "maileater.com", "mailexpire.com", "mailforspam.com", "mailfreeonline.com",
422
- "mailhub24.com", "mailimate.com", "mailin8r.com", "mailinator.net", "mailismagic.com", "mailjunk.cf",
423
- "mailmate.com", "mailme24.com", "mailmoat.com", "mailnator.com", "mailnesia.com", "mailnull.com",
424
- "mailpick.biz", "mailrock.biz", "mailsac.com", "mailseal.de", "mailtemp.net", "mailtothis.com",
425
- "mailtrash.net", "mailtv.net", "mailup.net", "mailwire.net", "mailzilla.com", "meltmail.com",
426
- "moakt.com", "my10minutemail.com", "mytemp.email", "neomailbox.com", "nospamfor.us", "objectmail.com",
427
- "oneoffemail.com", "owlpic.com", "pookmail.com", "proxymail.eu", "rcpt.at", "sharklasers.com",
428
- "smellfear.com", "sogetthis.com", "spam4.me", "spamavert.com", "spambob.com", "spambog.com",
429
- "spambox.us", "spamcannon.com", "spamday.com", "spamex.com", "spamfree24.com", "spamgourmet.com",
430
- "spamhole.com", "spaminator.de", "spamkill.info", "spaml.com", "spammotel.com", "spamobox.com",
431
- "spamspot.com", "superrito.com", "teleworm.us", "temp-mail.org", "temp-mail.ru", "tempail.com",
432
- "tempe-mail.com", "tempemail.co.za", "tempinbox.com", "tempmail.eu", "tempmail.net", "tempmail.us",
433
- "tempomail.fr", "temporaryemail.net", "thankyou2010.com", "thisisnotmyrealemail.com", "throwam.com",
434
- "throwawayemailaddress.com", "trash-mail.com", "trash2009.com", "trashdevil.com", "trashemail.de",
435
- "trashmail.at", "trashmail.com", "trashmail.me", "trashmail.net", "trashymail.com", "trbvm.com",
436
- "yepmail.net", "yopmail.com", "zoemail.net"
437
- # Add more as needed
438
- ]
439
- name = f"{random.choice(first_names)} {random.choice(last_names)}"
440
- if not email:
441
- domain = random.choice(fake_domains)
442
- email = f"{name.lower().replace(' ','.')}{random.randint(1,9999)}@{domain}"
443
-
444
- # Generate numeric ID - using Google-like ID format
445
- numeric_id = ''.join(random.choice('0123456789') for _ in range(id_length))
446
-
447
- # Generate future expiry date
448
- future_date = datetime.now() + timedelta(days=days_ahead)
449
- expiry = future_date.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
450
-
451
- # Generate random image ID for the new URL format
452
- chars = string.ascii_letters + string.digits + "-"
453
- random_img_id = ''.join(random.choice(chars) for _ in range(48))
454
- image_url = f"https://lh3.googleusercontent.com/a/ACg8oc{random_img_id}=s96-c"
455
-
456
- return {
457
- "user": {
458
- "name": name,
459
- "email": email,
460
- "image": image_url,
461
- "id": numeric_id
462
- },
463
- "expires": expiry,
464
- "isNewUser": False
465
- }
466
-
467
- @classmethod
468
- def generate_id(cls, length: int = 7) -> str:
469
- """Generate a random ID of specified length"""
470
- chars = string.ascii_letters + string.digits
471
- return ''.join(random.choice(chars) for _ in range(length))
472
-
473
- def _make_request(
474
- self,
475
- messages: List[Dict[str, str]],
476
- stream: bool = False,
477
- temperature: float = None,
478
- top_p: float = None,
479
- max_tokens: int = None,
480
- media: List = None
481
- ) -> Generator[str, None, None]:
482
- """Make synchronous request to BlackboxAI API."""
483
- # Generate a chat ID for this conversation
484
- chat_id = self.generate_id()
485
-
486
- # Format messages for the API
487
- current_messages = []
488
- for i, msg in enumerate(messages):
489
- msg_id = chat_id if i == 0 and msg["role"] == "user" else self.generate_id()
490
- current_msg = {
491
- "id": msg_id,
492
- "content": msg["content"],
493
- "role": msg["role"]
494
- }
495
- current_messages.append(current_msg)
496
-
497
- # Add image data if provided
498
- if media:
499
- current_messages[-1]['data'] = {
500
- "imagesData": [
501
- {
502
- "filePath": f"/{image_name}",
503
- "contents": to_data_uri(image)
504
- } for image, image_name in media
505
- ],
506
- "fileText": "",
507
- "title": ""
508
- }
509
-
510
- # Generate a random email for the session
511
- chars = string.ascii_lowercase + string.digits
512
- random_team = ''.join(random.choice(chars) for _ in range(8))
513
- # Use a random domain from the fake_domains set for the request email
514
- fake_domains = [
515
- "example.com", "mailinator.com", "fakemail.com", "tempmail.net", "yopmail.com", "testmail.org", "maildrop.cc",
516
- "inboxkitten.com", "guerrillamail.com", "sharklasers.com", "mailnesia.com", "dispostable.com", "getnada.com",
517
- "10minutemail.com", "throwawaymail.com", "mailcatch.com", "spambog.com", "mintemail.com", "mail-temp.com",
518
- "fakeinbox.com", "mytrashmail.com", "trashmail.com", "mailnull.com", "spamgourmet.com", "mailhazard.com",
519
- "mailbox52.ga", "mailpoof.com", "mailtothis.com", "nowmymail.com", "mailimate.com", "mailboxy.fun",
520
- "mailbolt.net", "mailblip.com", "mailbucket.org", "mailchimp.biz", "mailclark.ai", "maildog.info",
521
- "maildrop.cc", "maildu.de", "maileater.com", "mailexpire.com", "mailforspam.com", "mailfreeonline.com",
522
- "mailhub24.com", "mailimate.com", "mailin8r.com", "mailinator.net", "mailismagic.com", "mailjunk.cf",
523
- "mailmate.com", "mailme24.com", "mailmoat.com", "mailnator.com", "mailnesia.com", "mailnull.com",
524
- "mailpick.biz", "mailrock.biz", "mailsac.com", "mailseal.de", "mailtemp.net", "mailtothis.com",
525
- "mailtrash.net", "mailtv.net", "mailup.net", "mailwire.net", "mailzilla.com", "meltmail.com",
526
- "moakt.com", "my10minutemail.com", "mytemp.email", "neomailbox.com", "nospamfor.us", "objectmail.com",
527
- "oneoffemail.com", "owlpic.com", "pookmail.com", "proxymail.eu", "rcpt.at", "sharklasers.com",
528
- "smellfear.com", "sogetthis.com", "spam4.me", "spamavert.com", "spambob.com", "spambog.com",
529
- "spambox.us", "spamcannon.com", "spamday.com", "spamex.com", "spamfree24.com", "spamgourmet.com",
530
- "spamhole.com", "spaminator.de", "spamkill.info", "spaml.com", "spammotel.com", "spamobox.com",
531
- "spamspot.com", "superrito.com", "teleworm.us", "temp-mail.org", "temp-mail.ru", "tempail.com",
532
- "tempe-mail.com", "tempemail.co.za", "tempinbox.com", "tempmail.eu", "tempmail.net", "tempmail.us",
533
- "tempomail.fr", "temporaryemail.net", "thankyou2010.com", "thisisnotmyrealemail.com", "throwam.com",
534
- "throwawayemailaddress.com", "trash-mail.com", "trash2009.com", "trashdevil.com", "trashemail.de",
535
- "trashmail.at", "trashmail.com", "trashmail.me", "trashmail.net", "trashymail.com", "trbvm.com",
536
- "yepmail.net", "yopmail.com", "zoemail.net"
537
- # Add more as needed
538
- ]
539
- domain = random.choice(fake_domains)
540
- request_email = f"{random_team}@{domain}"
541
-
542
- # Generate a session with the email
543
- session_data = self.generate_session(request_email)
544
-
545
- # Prepare the request data based on the working example
546
- data = {
547
- "messages": current_messages,
548
- "agentMode": self.agentMode.get(self.model, {}) if self.model in self.agentMode else {},
549
- "id": chat_id,
550
- "previewToken": None,
551
- "userId": None,
552
- "codeModelMode": True,
553
- "trendingAgentMode": {},
554
- "isMicMode": False,
555
- "userSystemPrompt": self.system_message,
556
- "maxTokens": max_tokens or self.max_tokens_to_sample,
557
- "playgroundTopP": top_p,
558
- "playgroundTemperature": temperature,
559
- "isChromeExt": False,
560
- "githubToken": "",
561
- "clickedAnswer2": False,
562
- "clickedAnswer3": False,
563
- "clickedForceWebSearch": False,
564
- "visitFromDelta": False,
565
- "isMemoryEnabled": False,
566
- "mobileClient": False,
567
- "userSelectedModel": self.model if self.model in self.userSelectedModel else None,
568
- "validated": "00f37b34-a166-4efb-bce5-1312d87f2f94", # Using a fixed validated value from the example
569
- "imageGenerationMode": False,
570
- "webSearchModePrompt": False,
571
- "deepSearchMode": False,
572
- "designerMode": False,
573
- "domains": None,
574
- "vscodeClient": False,
575
- "codeInterpreterMode": False,
576
- "customProfile": {
577
- "name": "",
578
- "occupation": "",
579
- "traits": [],
580
- "additionalInfo": "",
581
- "enableNewChats": False
582
- },
583
- "webSearchModeOption": {
584
- "autoMode": True,
585
- "webMode": False,
586
- "offlineMode": False
587
- },
588
- "session": session_data,
589
- "isPremium": True,
590
- "subscriptionCache": {
591
- "status": "PREMIUM",
592
- "customerId": "cus_" + ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(14)),
593
- "expiryTimestamp": int((datetime.now() + timedelta(days=30)).timestamp()),
594
- "lastChecked": int(datetime.now().timestamp() * 1000),
595
- "isTrialSubscription": True
596
- },
597
- "beastMode": False,
598
- "reasoningMode": False,
599
- "designerMode": False,
600
- "workspaceId": ""
601
- }
602
-
603
- # Use LitAgent to generate a realistic browser fingerprint for headers
604
- agent = LitAgent()
605
- fingerprint = agent.generate_fingerprint("chrome")
606
- headers = {
607
- 'accept': fingerprint['accept'],
608
- 'accept-encoding': 'gzip, deflate, br, zstd',
609
- 'accept-language': fingerprint['accept_language'],
610
- 'content-type': 'application/json',
611
- 'origin': 'https://www.blackbox.ai',
612
- 'referer': 'https://www.blackbox.ai/',
613
- 'sec-ch-ua': fingerprint['sec_ch_ua'],
614
- 'sec-ch-ua-mobile': '?0',
615
- 'sec-ch-ua-platform': f'"{fingerprint["platform"]}"',
616
- 'sec-fetch-dest': 'empty',
617
- 'sec-fetch-mode': 'cors',
618
- 'sec-fetch-site': 'same-origin',
619
- 'user-agent': fingerprint['user_agent']
620
- }
621
-
622
- try:
623
- response = self.session.post(
624
- self.api_endpoint,
625
- json=data,
626
- headers=headers,
627
- stream=stream,
628
- timeout=self.timeout
629
- )
630
-
631
- if not response.ok:
632
- error_msg = f"API request failed: {response.status_code} - {response.text}"
633
-
634
- # Check for service suspension
635
- if response.status_code == 503 and "service has been suspended" in response.text.lower():
636
- error_msg = "BlackboxAI service has been suspended by its owner. Please try again later or use a different provider."
637
-
638
- # Check for API endpoint issues
639
- if response.status_code == 403 and "replace" in response.text.lower() and "api.blackbox.ai" in response.text:
640
- error_msg = "BlackboxAI API endpoint issue. Please check the API endpoint configuration."
641
-
642
- raise exceptions.FailedToGenerateResponseError(error_msg)
643
-
644
- if stream:
645
- buffer = ""
646
- chunk_size = 32
647
- for chunk in response.iter_content(chunk_size=chunk_size):
648
- if not chunk:
649
- continue
650
- text = chunk.decode(errors="ignore")
651
- buffer += text
652
- while len(buffer) >= chunk_size:
653
- out = buffer[:chunk_size]
654
- buffer = buffer[chunk_size:]
655
- if out.strip():
656
- yield out
657
- if buffer.strip():
658
- yield buffer
659
- else:
660
- response_text = response.text
661
- if "You have reached your request limit for the hour" in response_text:
662
- raise exceptions.RatelimitE("Rate limit exceeded")
663
- yield response_text
664
-
665
- except requests.exceptions.RequestException as e:
666
- raise exceptions.ProviderConnectionError(f"Connection error: {str(e)}")
667
-
668
- def ask(
669
- self,
670
- prompt: str,
671
- stream: bool = False,
672
- temperature: float = None,
673
- top_p: float = None,
674
- max_tokens: int = None,
675
- optimizer: str = None,
676
- conversationally: bool = False,
677
- media: List = None
678
- ) -> Union[Dict[str, str], Generator[Dict[str, str], None, None]]:
679
- """Send a prompt to BlackboxAI API and return the response."""
680
- conversation_prompt = self.conversation.gen_complete_prompt(prompt)
681
- if optimizer:
682
- if optimizer in self.__available_optimizers:
683
- conversation_prompt = getattr(Optimizers, optimizer)(
684
- conversation_prompt if conversationally else prompt
685
- )
686
- else:
687
- raise ValueError(f"Optimizer is not one of {self.__available_optimizers}")
688
-
689
- messages = [
690
- {"role": "system", "content": self.system_message},
691
- {"role": "user", "content": conversation_prompt}
692
- ]
693
-
694
- def for_stream():
695
- for text in self._make_request(
696
- messages,
697
- stream=True,
698
- temperature=temperature,
699
- top_p=top_p,
700
- max_tokens=max_tokens,
701
- media=media
702
- ):
703
- yield {"text": text}
704
-
705
- def for_non_stream():
706
- response_text = next(self._make_request(
707
- messages,
708
- stream=False,
709
- temperature=temperature,
710
- top_p=top_p,
711
- max_tokens=max_tokens,
712
- media=media
713
- ))
714
- self.last_response = {"text": response_text}
715
- return self.last_response
716
-
717
- return for_stream() if stream else for_non_stream()
718
-
719
- def chat(
720
- self,
721
- prompt: str,
722
- stream: bool = False,
723
- temperature: float = None,
724
- top_p: float = None,
725
- max_tokens: int = None,
726
- optimizer: str = None,
727
- conversationally: bool = False,
728
- media: List = None
729
- ) -> Union[str, Generator[str, None, None]]:
730
- """Generate response as string."""
731
-
732
- def for_stream():
733
- for response in self.ask(
734
- prompt,
735
- stream=True,
736
- temperature=temperature,
737
- top_p=top_p,
738
- max_tokens=max_tokens,
739
- optimizer=optimizer,
740
- conversationally=conversationally,
741
- media=media
742
- ):
743
- yield self.get_message(response)
744
-
745
- def for_non_stream():
746
- return self.get_message(
747
- self.ask(
748
- prompt,
749
- stream=False,
750
- temperature=temperature,
751
- top_p=top_p,
752
- max_tokens=max_tokens,
753
- optimizer=optimizer,
754
- conversationally=conversationally,
755
- media=media
756
- )
757
- )
758
-
759
- return for_stream() if stream else for_non_stream()
760
-
761
- def get_message(self, response: Dict[str, Any]) -> str:
762
- """Extract message from response dictionary."""
763
- assert isinstance(response, dict), "Response should be of dict data-type only"
764
- return response["text"].replace('\\n', '\n').replace('\\n\\n', '\n\n')
765
-
766
- if __name__ == "__main__":
767
- # print("-" * 80)
768
- # print(f"{'Model':<50} {'Status':<10} {'Response'}")
769
- # print("-" * 80)
770
-
771
- # for model in BLACKBOXAI.AVAILABLE_MODELS:
772
- # try:
773
- # test_ai = BLACKBOXAI(model=model, timeout=60)
774
- # response = test_ai.chat("Say 'Hello' in one word")
775
- # response_text = response
776
-
777
- # if response_text and len(response_text.strip()) > 0:
778
- # status = "✓"
779
- # # Truncate response if too long
780
- # display_text = response_text.strip()[:50] + "..." if len(response_text.strip()) > 50 else response_text.strip()
781
- # else:
782
- # status = "✗"
783
- # display_text = "Empty or invalid response"
784
- # print(f"{model:<50} {status:<10} {display_text}")
785
- # except Exception as e:
786
- # print(f"{model:<50} {'✗':<10} {str(e)}")
787
-
788
- ai = BLACKBOXAI(model="gpt-4.1", timeout=60)
789
- response = ai.chat("tell me about humans", stream=True)
790
- for line in response:
791
- print(line, end="", flush=True)