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,413 +1,375 @@
1
- import time
2
- import uuid
3
- import base64
4
- import json
5
- import random
6
- import string
7
- import re
8
- import cloudscraper
9
- from datetime import datetime
10
- from typing import List, Dict, Optional, Union, Generator, Any
11
-
12
- from webscout.litagent import LitAgent
13
- from .base import BaseChat, BaseCompletions, OpenAICompatibleProvider
14
- from .utils import (
15
- ChatCompletion,
16
- ChatCompletionChunk,
17
- Choice,
18
- ChatCompletionMessage,
19
- ChoiceDelta,
20
- CompletionUsage,
21
- format_prompt,
22
- get_system_prompt
23
- )
24
-
25
- # ANSI escape codes for formatting
26
- BOLD = "\033[1m"
27
- RED = "\033[91m"
28
- RESET = "\033[0m"
29
-
30
- class Completions(BaseCompletions):
31
- def __init__(self, client: 'Toolbaz'):
32
- self._client = client
33
-
34
- def create(
35
- self,
36
- *,
37
- model: str,
38
- messages: List[Dict[str, str]],
39
- max_tokens: Optional[int] = None,
40
- stream: bool = False,
41
- temperature: Optional[float] = None,
42
- top_p: Optional[float] = None,
43
- **kwargs: Any
44
- ) -> Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]]:
45
- """
46
- Creates a model response for the given chat conversation.
47
- Mimics openai.chat.completions.create
48
- """
49
- # Format the messages using the format_prompt utility
50
- formatted_prompt = format_prompt(messages, add_special_tokens=True, do_continue=True)
51
-
52
- # Get authentication token
53
- auth = self._client.get_auth()
54
- if not auth:
55
- raise IOError("Failed to authenticate with Toolbaz API")
56
-
57
- # Prepare the request data
58
- data = {
59
- "text": formatted_prompt,
60
- "capcha": auth["token"],
61
- "model": model,
62
- "session_id": auth["session_id"]
63
- }
64
-
65
- # Generate a unique request ID
66
- request_id = f"chatcmpl-{uuid.uuid4().hex}"
67
- created_time = int(time.time())
68
-
69
- # Handle streaming response
70
- if stream:
71
- return self._handle_streaming_response(request_id, created_time, model, data)
72
- else:
73
- return self._handle_non_streaming_response(request_id, created_time, model, data)
74
-
75
- def _handle_streaming_response(
76
- self,
77
- request_id: str,
78
- created_time: int,
79
- model: str,
80
- data: Dict[str, Any]
81
- ) -> Generator[ChatCompletionChunk, None, None]:
82
- """Handle streaming response from Toolbaz API"""
83
- try:
84
- resp = self._client.session.post(
85
- "https://data.toolbaz.com/writing.php",
86
- data=data,
87
- stream=True,
88
- proxies=self._client.proxies,
89
- timeout=self._client.timeout
90
- )
91
- resp.raise_for_status()
92
-
93
- buffer = ""
94
- tag_start = "[model:"
95
- streaming_text = ""
96
-
97
- for chunk in resp.iter_content(chunk_size=1):
98
- if chunk:
99
- text = chunk.decode(errors="ignore")
100
- buffer += text
101
-
102
- # Remove all complete [model: ...] tags in buffer
103
- while True:
104
- match = re.search(r"\[model:.*?\]", buffer)
105
- if not match:
106
- break
107
- buffer = buffer[:match.start()] + buffer[match.end():]
108
-
109
- # Only yield up to the last possible start of a tag
110
- last_tag = buffer.rfind(tag_start)
111
- if last_tag == -1 or last_tag + len(tag_start) > len(buffer):
112
- if buffer:
113
- streaming_text += buffer
114
-
115
- # Create the delta object
116
- delta = ChoiceDelta(
117
- content=buffer,
118
- role="assistant"
119
- )
120
-
121
- # Create the choice object
122
- choice = Choice(
123
- index=0,
124
- delta=delta,
125
- finish_reason=None
126
- )
127
-
128
- # Create the chunk object
129
- chunk = ChatCompletionChunk(
130
- id=request_id,
131
- choices=[choice],
132
- created=created_time,
133
- model=model
134
- )
135
-
136
- yield chunk
137
- buffer = ""
138
- else:
139
- if buffer[:last_tag]:
140
- streaming_text += buffer[:last_tag]
141
-
142
- # Create the delta object
143
- delta = ChoiceDelta(
144
- content=buffer[:last_tag],
145
- role="assistant"
146
- )
147
-
148
- # Create the choice object
149
- choice = Choice(
150
- index=0,
151
- delta=delta,
152
- finish_reason=None
153
- )
154
-
155
- # Create the chunk object
156
- chunk = ChatCompletionChunk(
157
- id=request_id,
158
- choices=[choice],
159
- created=created_time,
160
- model=model
161
- )
162
-
163
- yield chunk
164
- buffer = buffer[last_tag:]
165
-
166
- # Remove any remaining [model: ...] tag in the buffer
167
- buffer = re.sub(r"\[model:.*?\]", "", buffer)
168
- if buffer:
169
- # Create the delta object
170
- delta = ChoiceDelta(
171
- content=buffer,
172
- role="assistant"
173
- )
174
-
175
- # Create the choice object
176
- choice = Choice(
177
- index=0,
178
- delta=delta,
179
- finish_reason="stop"
180
- )
181
-
182
- # Create the chunk object
183
- chunk = ChatCompletionChunk(
184
- id=request_id,
185
- choices=[choice],
186
- created=created_time,
187
- model=model
188
- )
189
-
190
- yield chunk
191
-
192
- # Final chunk with finish_reason
193
- delta = ChoiceDelta(
194
- content=None,
195
- role=None
196
- )
197
-
198
- choice = Choice(
199
- index=0,
200
- delta=delta,
201
- finish_reason="stop"
202
- )
203
-
204
- chunk = ChatCompletionChunk(
205
- id=request_id,
206
- choices=[choice],
207
- created=created_time,
208
- model=model
209
- )
210
-
211
- yield chunk
212
-
213
- except Exception as e:
214
- print(f"{RED}Error during Toolbaz streaming request: {e}{RESET}")
215
- raise IOError(f"Toolbaz streaming request failed: {e}") from e
216
-
217
- def _handle_non_streaming_response(
218
- self,
219
- request_id: str,
220
- created_time: int,
221
- model: str,
222
- data: Dict[str, Any]
223
- ) -> ChatCompletion:
224
- """Handle non-streaming response from Toolbaz API"""
225
- try:
226
- resp = self._client.session.post(
227
- "https://data.toolbaz.com/writing.php",
228
- data=data,
229
- proxies=self._client.proxies,
230
- timeout=self._client.timeout
231
- )
232
- resp.raise_for_status()
233
-
234
- text = resp.text
235
- # Remove [model: ...] tags
236
- text = re.sub(r"\[model:.*?\]", "", text)
237
-
238
- # Create the message object
239
- message = ChatCompletionMessage(
240
- role="assistant",
241
- content=text
242
- )
243
-
244
- # Create the choice object
245
- choice = Choice(
246
- index=0,
247
- message=message,
248
- finish_reason="stop"
249
- )
250
-
251
- # Usage data is not provided by this API in a standard way, set to 0
252
- usage = CompletionUsage(prompt_tokens=0, completion_tokens=0, total_tokens=0)
253
-
254
- # Create the completion object
255
- completion = ChatCompletion(
256
- id=request_id,
257
- choices=[choice],
258
- created=created_time,
259
- model=model,
260
- usage=usage
261
- )
262
-
263
- return completion
264
-
265
- except Exception as e:
266
- print(f"{RED}Error during Toolbaz non-stream request: {e}{RESET}")
267
- raise IOError(f"Toolbaz request failed: {e}") from e
268
-
269
- class Chat(BaseChat):
270
- def __init__(self, client: 'Toolbaz'):
271
- self.completions = Completions(client)
272
-
273
- class Toolbaz(OpenAICompatibleProvider):
274
- """
275
- OpenAI-compatible client for Toolbaz API.
276
-
277
- Usage:
278
- client = Toolbaz()
279
- response = client.chat.completions.create(
280
- model="gemini-2.0-flash",
281
- messages=[{"role": "user", "content": "Hello!"}]
282
- )
283
- print(response.choices[0].message.content)
284
- """
285
-
286
- AVAILABLE_MODELS = [
287
- "gemini-2.5-flash",
288
- "gemini-2.0-flash-thinking",
289
- "gemini-2.0-flash",
290
- "gemini-1.5-flash",
291
- "o3-mini",
292
- "gpt-4o-latest",
293
- "gpt-4o",
294
- "deepseek-r1",
295
- "Llama-4-Maverick",
296
- "Llama-4-Scout",
297
- "Llama-3.3-70B",
298
- "Qwen2.5-72B",
299
- "Qwen2-72B",
300
- "grok-2-1212",
301
- "grok-3-beta",
302
- "toolbaz_v3.5_pro",
303
- "toolbaz_v3",
304
- "mixtral_8x22b",
305
- "L3-70B-Euryale-v2.1",
306
- "midnight-rose",
307
- "unity",
308
- "unfiltered_x"
309
- ]
310
-
311
- def __init__(
312
- self,
313
- api_key: Optional[str] = None, # Not used but kept for compatibility
314
- timeout: int = 30,
315
- proxies: dict = {},
316
- browser: str = "chrome"
317
- ):
318
- """
319
- Initialize the Toolbaz client.
320
-
321
- Args:
322
- api_key: Not used but kept for compatibility with OpenAI interface
323
- timeout: Request timeout in seconds
324
- proxies: Proxy configuration for requests
325
- browser: Browser name for LitAgent to generate User-Agent
326
- """
327
- self.timeout = timeout
328
- self.proxies = proxies
329
-
330
- # Initialize session with cloudscraper
331
- self.session = cloudscraper.create_scraper()
332
-
333
- # Set up headers
334
- self.session.headers.update({
335
- "user-agent": LitAgent().generate_fingerprint(browser=browser)["user_agent"],
336
- "accept": "*/*",
337
- "accept-language": "en-US",
338
- "cache-control": "no-cache",
339
- "connection": "keep-alive",
340
- "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
341
- "origin": "https://toolbaz.com",
342
- "pragma": "no-cache",
343
- "referer": "https://toolbaz.com/",
344
- "sec-fetch-mode": "cors"
345
- })
346
-
347
- # Initialize chat property
348
- self.chat = Chat(self)
349
-
350
- def random_string(self, length):
351
- """Generate a random string of specified length"""
352
- return ''.join(random.choices(string.ascii_letters + string.digits, k=length))
353
-
354
- def generate_token(self):
355
- """Generate authentication token for Toolbaz API"""
356
- payload = {
357
- "bR6wF": {
358
- "nV5kP": self.session.headers.get("user-agent"),
359
- "lQ9jX": "en-US",
360
- "sD2zR": "431x958",
361
- "tY4hL": time.tzname[0] if time.tzname else "UTC",
362
- "pL8mC": "Linux armv81",
363
- "cQ3vD": datetime.now().year,
364
- "hK7jN": datetime.now().hour
365
- },
366
- "uT4bX": {
367
- "mM9wZ": [],
368
- "kP8jY": []
369
- },
370
- "tuTcS": int(time.time()),
371
- "tDfxy": None,
372
- "RtyJt": str(uuid.uuid4())
373
- }
374
- return "d8TW0v" + base64.b64encode(json.dumps(payload).encode()).decode()
375
-
376
- def get_auth(self):
377
- """Get authentication credentials for Toolbaz API"""
378
- try:
379
- session_id = self.random_string(36)
380
- token = self.generate_token()
381
- data = {
382
- "session_id": session_id,
383
- "token": token
384
- }
385
- resp = self.session.post("https://data.toolbaz.com/token.php", data=data)
386
- resp.raise_for_status()
387
- result = resp.json()
388
- if result.get("success"):
389
- return {"token": result["token"], "session_id": session_id}
390
- return None
391
- except Exception as e:
392
- print(f"{RED}Error getting Toolbaz authentication: {e}{RESET}")
393
- return None
394
-
395
- @property
396
- def models(self):
397
- class _ModelList:
398
- def list(inner_self):
399
- return type(self).AVAILABLE_MODELS
400
- return _ModelList()
401
-
402
- # Example usage
403
- if __name__ == "__main__":
404
- # Test the provider
405
- client = Toolbaz()
406
- response = client.chat.completions.create(
407
- model="gemini-2.0-flash",
408
- messages=[
409
- {"role": "system", "content": "You are a helpful assistant."},
410
- {"role": "user", "content": "Hello! How are you today?"}
411
- ]
412
- )
413
- print(response.choices[0].message.content)
1
+ import base64
2
+ import json
3
+ import random
4
+ import re
5
+ import string
6
+ import time
7
+ import uuid
8
+ from datetime import datetime
9
+ from typing import Any, Dict, Generator, List, Optional, Union
10
+
11
+ from curl_cffi.requests import Session
12
+
13
+ from webscout.litagent import LitAgent
14
+ from webscout.Provider.OPENAI.base import (
15
+ BaseChat,
16
+ BaseCompletions,
17
+ OpenAICompatibleProvider,
18
+ SimpleModelList,
19
+ )
20
+ from webscout.Provider.OPENAI.utils import (
21
+ ChatCompletion,
22
+ ChatCompletionChunk,
23
+ ChatCompletionMessage,
24
+ Choice,
25
+ ChoiceDelta,
26
+ CompletionUsage,
27
+ format_prompt,
28
+ )
29
+
30
+ # ANSI escape codes for formatting
31
+ BOLD = "\033[1m"
32
+ RED = "\033[91m"
33
+ RESET = "\033[0m"
34
+
35
+
36
+ class Completions(BaseCompletions):
37
+ def __init__(self, client: "Toolbaz"):
38
+ self._client = client
39
+
40
+ def create(
41
+ self,
42
+ *,
43
+ model: str,
44
+ messages: List[Dict[str, str]],
45
+ max_tokens: Optional[int] = None,
46
+ stream: bool = False,
47
+ temperature: Optional[float] = None,
48
+ top_p: Optional[float] = None,
49
+ timeout: Optional[int] = None,
50
+ proxies: Optional[Dict[str, str]] = None,
51
+ **kwargs: Any,
52
+ ) -> Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]]:
53
+ """
54
+ Creates a model response for the given chat conversation.
55
+ Mimics openai.chat.completions.create
56
+ """
57
+ # Format the messages using the format_prompt utility
58
+ formatted_prompt = format_prompt(messages, add_special_tokens=True, do_continue=True)
59
+
60
+ # Get authentication token
61
+ auth = self._client.get_auth()
62
+ if not auth:
63
+ raise IOError("Failed to authenticate with Toolbaz API")
64
+
65
+ # Prepare the request data
66
+ data = {
67
+ "text": formatted_prompt,
68
+ "capcha": auth["token"],
69
+ "model": model,
70
+ "session_id": auth["session_id"],
71
+ }
72
+
73
+ # Generate a unique request ID
74
+ request_id = f"chatcmpl-{uuid.uuid4().hex}"
75
+ created_time = int(time.time())
76
+
77
+ # Handle streaming response
78
+ if stream:
79
+ return self._handle_streaming_response(
80
+ request_id, created_time, model, data, timeout, proxies
81
+ )
82
+ else:
83
+ return self._handle_non_streaming_response(
84
+ request_id, created_time, model, data, timeout, proxies
85
+ )
86
+
87
+ def _handle_streaming_response(
88
+ self,
89
+ request_id: str,
90
+ created_time: int,
91
+ model: str,
92
+ data: Dict[str, Any],
93
+ timeout: Optional[int] = None,
94
+ proxies: Optional[Dict[str, str]] = None,
95
+ ) -> Generator[ChatCompletionChunk, None, None]:
96
+ """Handle streaming response from Toolbaz API"""
97
+ try:
98
+ resp = self._client.session.post(
99
+ "https://data.toolbaz.com/writing.php",
100
+ data=data,
101
+ stream=True,
102
+ timeout=timeout or self._client.timeout,
103
+ impersonate="chrome110",
104
+ )
105
+ resp.raise_for_status()
106
+
107
+ buffer = ""
108
+ tag_start = "[model:"
109
+ streaming_text = ""
110
+
111
+ for chunk in resp.iter_content(chunk_size=1):
112
+ if chunk:
113
+ text = chunk.decode(errors="ignore")
114
+ buffer += text
115
+
116
+ # Remove all complete [model: ...] tags in buffer
117
+ while True:
118
+ match = re.search(r"\[model:.*?\]", buffer)
119
+ if not match:
120
+ break
121
+ buffer = buffer[: match.start()] + buffer[match.end() :]
122
+
123
+ # Only yield up to the last possible start of a tag
124
+ last_tag = buffer.rfind(tag_start)
125
+ if last_tag == -1 or last_tag + len(tag_start) > len(buffer):
126
+ if buffer:
127
+ streaming_text += buffer
128
+
129
+ # Create the delta object
130
+ delta = ChoiceDelta(content=buffer, role="assistant")
131
+
132
+ # Create the choice object
133
+ choice = Choice(index=0, delta=delta, finish_reason=None)
134
+
135
+ # Create the chunk object
136
+ chunk = ChatCompletionChunk(
137
+ id=request_id, choices=[choice], created=created_time, model=model
138
+ )
139
+
140
+ yield chunk
141
+ buffer = ""
142
+ else:
143
+ if buffer[:last_tag]:
144
+ streaming_text += buffer[:last_tag]
145
+
146
+ # Create the delta object
147
+ delta = ChoiceDelta(content=buffer[:last_tag], role="assistant")
148
+
149
+ # Create the choice object
150
+ choice = Choice(index=0, delta=delta, finish_reason=None)
151
+
152
+ # Create the chunk object
153
+ chunk = ChatCompletionChunk(
154
+ id=request_id, choices=[choice], created=created_time, model=model
155
+ )
156
+
157
+ yield chunk
158
+ buffer = buffer[last_tag:]
159
+
160
+ # Remove any remaining [model: ...] tag in the buffer
161
+ buffer = re.sub(r"\[model:.*?\]", "", buffer)
162
+ if buffer:
163
+ # Create the delta object
164
+ delta = ChoiceDelta(content=buffer, role="assistant")
165
+
166
+ # Create the choice object
167
+ choice = Choice(index=0, delta=delta, finish_reason="stop")
168
+
169
+ # Create the chunk object
170
+ chunk = ChatCompletionChunk(
171
+ id=request_id, choices=[choice], created=created_time, model=model
172
+ )
173
+
174
+ yield chunk
175
+
176
+ # Final chunk with finish_reason
177
+ delta = ChoiceDelta(content=None, role=None)
178
+
179
+ choice = Choice(index=0, delta=delta, finish_reason="stop")
180
+
181
+ chunk = ChatCompletionChunk(
182
+ id=request_id, choices=[choice], created=created_time, model=model
183
+ )
184
+
185
+ yield chunk
186
+
187
+ except Exception as e:
188
+ print(f"{RED}Error during Toolbaz streaming request: {e}{RESET}")
189
+ raise IOError(f"Toolbaz streaming request failed: {e}") from e
190
+
191
+ def _handle_non_streaming_response(
192
+ self,
193
+ request_id: str,
194
+ created_time: int,
195
+ model: str,
196
+ data: Dict[str, Any],
197
+ timeout: Optional[int] = None,
198
+ proxies: Optional[Dict[str, str]] = None,
199
+ ) -> ChatCompletion:
200
+ """Handle non-streaming response from Toolbaz API"""
201
+ try:
202
+ resp = self._client.session.post(
203
+ "https://data.toolbaz.com/writing.php",
204
+ data=data,
205
+ timeout=timeout or self._client.timeout,
206
+ impersonate="chrome110",
207
+ )
208
+ resp.raise_for_status()
209
+
210
+ text = resp.text
211
+ # Remove [model: ...] tags
212
+ text = re.sub(r"\[model:.*?\]", "", text)
213
+
214
+ # Create the message object
215
+ message = ChatCompletionMessage(role="assistant", content=text)
216
+
217
+ # Create the choice object
218
+ choice = Choice(index=0, message=message, finish_reason="stop")
219
+
220
+ # Usage data is not provided by this API in a standard way, set to 0
221
+ usage = CompletionUsage(prompt_tokens=0, completion_tokens=0, total_tokens=0)
222
+
223
+ # Create the completion object
224
+ completion = ChatCompletion(
225
+ id=request_id, choices=[choice], created=created_time, model=model, usage=usage
226
+ )
227
+
228
+ return completion
229
+
230
+ except Exception as e:
231
+ print(f"{RED}Error during Toolbaz non-stream request: {e}{RESET}")
232
+ raise IOError(f"Toolbaz request failed: {e}") from e
233
+
234
+
235
+ class Chat(BaseChat):
236
+ def __init__(self, client: "Toolbaz"):
237
+ self.completions = Completions(client)
238
+
239
+
240
+ class Toolbaz(OpenAICompatibleProvider):
241
+ """
242
+ OpenAI-compatible client for Toolbaz API.
243
+
244
+ Usage:
245
+ client = Toolbaz()
246
+ response = client.chat.completions.create(
247
+ model="gemini-2.0-flash",
248
+ messages=[{"role": "user", "content": "Hello!"}]
249
+ )
250
+ print(response.choices[0].message.content)
251
+ """
252
+
253
+ required_auth = False
254
+ AVAILABLE_MODELS = [
255
+ "gemini-2.5-flash",
256
+ "gemini-2.5-pro",
257
+ "gemini-2.0-flash-thinking",
258
+ "gemini-2.0-flash",
259
+ "claude-sonnet-4",
260
+ "gpt-5",
261
+ "gpt-5.2",
262
+ "gpt-oss-120b",
263
+ "o3-mini",
264
+ "gpt-4o-latest",
265
+ "grok-4-fast",
266
+ "grok-4.1-fast",
267
+ "toolbaz-v4.5-fast",
268
+ "toolbaz_v4",
269
+ "toolbaz_v3.5_pro",
270
+ "deepseek-r1",
271
+ "deepseek-v3.1",
272
+ "deepseek-v3",
273
+ "Llama-4-Maverick",
274
+ "Llama-3.3-70B",
275
+ "mixtral_8x22b",
276
+ "L3-70B-Euryale-v2.1",
277
+ "midnight-rose",
278
+ "unfiltered_x",
279
+ ]
280
+
281
+ def __init__(self, timeout: int = 30, proxies: dict = {}, browser: str = "chrome"):
282
+ """
283
+ Initialize the Toolbaz client.
284
+
285
+ Args:
286
+ api_key: Not used but kept for compatibility with OpenAI interface
287
+ timeout: Request timeout in seconds
288
+ proxies: Proxy configuration for requests
289
+ browser: Browser name for LitAgent to generate User-Agent
290
+ """
291
+ self.timeout = timeout
292
+ self.proxies = proxies
293
+
294
+ # Initialize session with curl_cffi
295
+ self.session = Session()
296
+
297
+ # Set up headers
298
+ self.session.headers.update(
299
+ {
300
+ **LitAgent().generate_fingerprint(browser=browser),
301
+ "pragma": "no-cache",
302
+ "referer": "https://toolbaz.com/",
303
+ }
304
+ )
305
+
306
+ # Set proxies if provided
307
+ if proxies:
308
+ self.session.proxies.update(proxies)
309
+
310
+ # Initialize chat property
311
+ self.chat = Chat(self)
312
+
313
+ def random_string(self, length):
314
+ """Generate a random string of specified length"""
315
+ return "".join(random.choices(string.ascii_letters + string.digits, k=length))
316
+
317
+ def generate_token(self):
318
+ """Generate authentication token for Toolbaz API"""
319
+ payload = {
320
+ "bR6wF": {
321
+ "nV5kP": self.session.headers.get("user-agent"),
322
+ "lQ9jX": "en-US",
323
+ "sD2zR": "431x958",
324
+ "tY4hL": time.tzname[0] if time.tzname else "UTC",
325
+ "pL8mC": "Linux armv81",
326
+ "cQ3vD": datetime.now().year,
327
+ "hK7jN": datetime.now().hour,
328
+ },
329
+ "uT4bX": {"mM9wZ": [], "kP8jY": []},
330
+ "tuTcS": int(time.time()),
331
+ "tDfxy": None,
332
+ "RtyJt": str(uuid.uuid4()),
333
+ }
334
+ return "d8TW0v" + base64.b64encode(json.dumps(payload).encode()).decode()
335
+
336
+ def get_auth(self):
337
+ """Get authentication credentials for Toolbaz API"""
338
+ try:
339
+ session_id = self.random_string(36)
340
+ token = self.generate_token()
341
+ data = {"session_id": session_id, "token": token}
342
+ resp = self.session.post(
343
+ "https://data.toolbaz.com/token.php",
344
+ data=data,
345
+ impersonate="chrome110",
346
+ )
347
+ resp.raise_for_status()
348
+ result = resp.json()
349
+ if result.get("success"):
350
+ return {"token": result["token"], "session_id": session_id}
351
+ return None
352
+ except Exception as e:
353
+ print(f"{RED}Error getting Toolbaz authentication: {e}{RESET}")
354
+ return None
355
+
356
+ @property
357
+ def models(self) -> SimpleModelList:
358
+ return SimpleModelList(type(self).AVAILABLE_MODELS)
359
+
360
+
361
+ # Example usage
362
+ if __name__ == "__main__":
363
+ # Test the provider
364
+ client = Toolbaz()
365
+ response = client.chat.completions.create(
366
+ model="gemini-2.0-flash",
367
+ messages=[
368
+ {"role": "system", "content": "You are a helpful assistant."},
369
+ {"role": "user", "content": "Hello! How are you today?"},
370
+ ],
371
+ )
372
+ if isinstance(response, ChatCompletion):
373
+ message = response.choices[0].message
374
+ if message:
375
+ print(message.content)