webscout 8.2.7__py3-none-any.whl → 8.2.8__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.

Potentially problematic release.


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

Files changed (323) hide show
  1. webscout/AIauto.py +1 -1
  2. webscout/AIutel.py +298 -249
  3. webscout/Extra/Act.md +309 -0
  4. webscout/Extra/GitToolkit/__init__.py +10 -0
  5. webscout/Extra/GitToolkit/gitapi/README.md +110 -0
  6. webscout/Extra/GitToolkit/gitapi/__init__.py +12 -0
  7. webscout/Extra/GitToolkit/gitapi/repository.py +195 -0
  8. webscout/Extra/GitToolkit/gitapi/user.py +96 -0
  9. webscout/Extra/GitToolkit/gitapi/utils.py +62 -0
  10. webscout/Extra/YTToolkit/README.md +375 -0
  11. webscout/Extra/YTToolkit/YTdownloader.py +957 -0
  12. webscout/Extra/YTToolkit/__init__.py +3 -0
  13. webscout/Extra/YTToolkit/transcriber.py +476 -0
  14. webscout/Extra/YTToolkit/ytapi/README.md +44 -0
  15. webscout/Extra/YTToolkit/ytapi/__init__.py +6 -0
  16. webscout/Extra/YTToolkit/ytapi/channel.py +307 -0
  17. webscout/Extra/YTToolkit/ytapi/errors.py +13 -0
  18. webscout/Extra/YTToolkit/ytapi/extras.py +118 -0
  19. webscout/Extra/YTToolkit/ytapi/https.py +88 -0
  20. webscout/Extra/YTToolkit/ytapi/patterns.py +61 -0
  21. webscout/Extra/YTToolkit/ytapi/playlist.py +59 -0
  22. webscout/Extra/YTToolkit/ytapi/pool.py +8 -0
  23. webscout/Extra/YTToolkit/ytapi/query.py +40 -0
  24. webscout/Extra/YTToolkit/ytapi/stream.py +63 -0
  25. webscout/Extra/YTToolkit/ytapi/utils.py +62 -0
  26. webscout/Extra/YTToolkit/ytapi/video.py +232 -0
  27. webscout/Extra/__init__.py +7 -0
  28. webscout/Extra/autocoder/__init__.py +9 -0
  29. webscout/Extra/autocoder/autocoder.py +1105 -0
  30. webscout/Extra/autocoder/autocoder_utiles.py +332 -0
  31. webscout/Extra/gguf.md +430 -0
  32. webscout/Extra/gguf.py +684 -0
  33. webscout/Extra/tempmail/README.md +488 -0
  34. webscout/Extra/tempmail/__init__.py +28 -0
  35. webscout/Extra/tempmail/async_utils.py +141 -0
  36. webscout/Extra/tempmail/base.py +161 -0
  37. webscout/Extra/tempmail/cli.py +187 -0
  38. webscout/Extra/tempmail/emailnator.py +84 -0
  39. webscout/Extra/tempmail/mail_tm.py +361 -0
  40. webscout/Extra/tempmail/temp_mail_io.py +292 -0
  41. webscout/Extra/weather.md +281 -0
  42. webscout/Extra/weather.py +194 -0
  43. webscout/Extra/weather_ascii.py +76 -0
  44. webscout/Litlogger/Readme.md +175 -0
  45. webscout/Litlogger/__init__.py +67 -0
  46. webscout/Litlogger/core/__init__.py +6 -0
  47. webscout/Litlogger/core/level.py +23 -0
  48. webscout/Litlogger/core/logger.py +165 -0
  49. webscout/Litlogger/handlers/__init__.py +12 -0
  50. webscout/Litlogger/handlers/console.py +33 -0
  51. webscout/Litlogger/handlers/file.py +143 -0
  52. webscout/Litlogger/handlers/network.py +173 -0
  53. webscout/Litlogger/styles/__init__.py +7 -0
  54. webscout/Litlogger/styles/colors.py +249 -0
  55. webscout/Litlogger/styles/formats.py +458 -0
  56. webscout/Litlogger/styles/text.py +87 -0
  57. webscout/Litlogger/utils/__init__.py +6 -0
  58. webscout/Litlogger/utils/detectors.py +153 -0
  59. webscout/Litlogger/utils/formatters.py +200 -0
  60. webscout/Provider/AI21.py +177 -0
  61. webscout/Provider/AISEARCH/DeepFind.py +254 -0
  62. webscout/Provider/AISEARCH/Perplexity.py +359 -0
  63. webscout/Provider/AISEARCH/README.md +279 -0
  64. webscout/Provider/AISEARCH/__init__.py +9 -0
  65. webscout/Provider/AISEARCH/felo_search.py +228 -0
  66. webscout/Provider/AISEARCH/genspark_search.py +350 -0
  67. webscout/Provider/AISEARCH/hika_search.py +198 -0
  68. webscout/Provider/AISEARCH/iask_search.py +436 -0
  69. webscout/Provider/AISEARCH/monica_search.py +246 -0
  70. webscout/Provider/AISEARCH/scira_search.py +324 -0
  71. webscout/Provider/AISEARCH/webpilotai_search.py +281 -0
  72. webscout/Provider/Aitopia.py +316 -0
  73. webscout/Provider/AllenAI.py +440 -0
  74. webscout/Provider/Andi.py +228 -0
  75. webscout/Provider/Blackboxai.py +673 -0
  76. webscout/Provider/ChatGPTClone.py +237 -0
  77. webscout/Provider/ChatGPTGratis.py +194 -0
  78. webscout/Provider/ChatSandbox.py +342 -0
  79. webscout/Provider/Cloudflare.py +324 -0
  80. webscout/Provider/Cohere.py +208 -0
  81. webscout/Provider/Deepinfra.py +340 -0
  82. webscout/Provider/ExaAI.py +261 -0
  83. webscout/Provider/ExaChat.py +358 -0
  84. webscout/Provider/Flowith.py +217 -0
  85. webscout/Provider/FreeGemini.py +250 -0
  86. webscout/Provider/Gemini.py +169 -0
  87. webscout/Provider/GithubChat.py +370 -0
  88. webscout/Provider/GizAI.py +295 -0
  89. webscout/Provider/Glider.py +225 -0
  90. webscout/Provider/Groq.py +801 -0
  91. webscout/Provider/HF_space/__init__.py +0 -0
  92. webscout/Provider/HF_space/qwen_qwen2.py +206 -0
  93. webscout/Provider/HeckAI.py +285 -0
  94. webscout/Provider/HuggingFaceChat.py +469 -0
  95. webscout/Provider/Hunyuan.py +283 -0
  96. webscout/Provider/Jadve.py +291 -0
  97. webscout/Provider/Koboldai.py +384 -0
  98. webscout/Provider/LambdaChat.py +411 -0
  99. webscout/Provider/Llama3.py +259 -0
  100. webscout/Provider/MCPCore.py +315 -0
  101. webscout/Provider/Marcus.py +198 -0
  102. webscout/Provider/Nemotron.py +218 -0
  103. webscout/Provider/Netwrck.py +270 -0
  104. webscout/Provider/OLLAMA.py +396 -0
  105. webscout/Provider/OPENAI/BLACKBOXAI.py +735 -0
  106. webscout/Provider/OPENAI/Cloudflare.py +378 -0
  107. webscout/Provider/OPENAI/FreeGemini.py +282 -0
  108. webscout/Provider/OPENAI/NEMOTRON.py +244 -0
  109. webscout/Provider/OPENAI/README.md +1253 -0
  110. webscout/Provider/OPENAI/__init__.py +36 -0
  111. webscout/Provider/OPENAI/ai4chat.py +293 -0
  112. webscout/Provider/OPENAI/api.py +810 -0
  113. webscout/Provider/OPENAI/base.py +249 -0
  114. webscout/Provider/OPENAI/c4ai.py +373 -0
  115. webscout/Provider/OPENAI/chatgpt.py +556 -0
  116. webscout/Provider/OPENAI/chatgptclone.py +488 -0
  117. webscout/Provider/OPENAI/chatsandbox.py +172 -0
  118. webscout/Provider/OPENAI/deepinfra.py +319 -0
  119. webscout/Provider/OPENAI/e2b.py +1356 -0
  120. webscout/Provider/OPENAI/exaai.py +411 -0
  121. webscout/Provider/OPENAI/exachat.py +443 -0
  122. webscout/Provider/OPENAI/flowith.py +162 -0
  123. webscout/Provider/OPENAI/freeaichat.py +359 -0
  124. webscout/Provider/OPENAI/glider.py +323 -0
  125. webscout/Provider/OPENAI/groq.py +361 -0
  126. webscout/Provider/OPENAI/heckai.py +307 -0
  127. webscout/Provider/OPENAI/llmchatco.py +335 -0
  128. webscout/Provider/OPENAI/mcpcore.py +383 -0
  129. webscout/Provider/OPENAI/multichat.py +376 -0
  130. webscout/Provider/OPENAI/netwrck.py +356 -0
  131. webscout/Provider/OPENAI/opkfc.py +496 -0
  132. webscout/Provider/OPENAI/scirachat.py +471 -0
  133. webscout/Provider/OPENAI/sonus.py +303 -0
  134. webscout/Provider/OPENAI/standardinput.py +433 -0
  135. webscout/Provider/OPENAI/textpollinations.py +339 -0
  136. webscout/Provider/OPENAI/toolbaz.py +413 -0
  137. webscout/Provider/OPENAI/typefully.py +355 -0
  138. webscout/Provider/OPENAI/typegpt.py +358 -0
  139. webscout/Provider/OPENAI/uncovrAI.py +462 -0
  140. webscout/Provider/OPENAI/utils.py +307 -0
  141. webscout/Provider/OPENAI/venice.py +425 -0
  142. webscout/Provider/OPENAI/wisecat.py +381 -0
  143. webscout/Provider/OPENAI/writecream.py +163 -0
  144. webscout/Provider/OPENAI/x0gpt.py +378 -0
  145. webscout/Provider/OPENAI/yep.py +356 -0
  146. webscout/Provider/OpenGPT.py +209 -0
  147. webscout/Provider/Openai.py +496 -0
  148. webscout/Provider/PI.py +429 -0
  149. webscout/Provider/Perplexitylabs.py +415 -0
  150. webscout/Provider/QwenLM.py +254 -0
  151. webscout/Provider/Reka.py +214 -0
  152. webscout/Provider/StandardInput.py +290 -0
  153. webscout/Provider/TTI/AiForce/README.md +159 -0
  154. webscout/Provider/TTI/AiForce/__init__.py +22 -0
  155. webscout/Provider/TTI/AiForce/async_aiforce.py +224 -0
  156. webscout/Provider/TTI/AiForce/sync_aiforce.py +245 -0
  157. webscout/Provider/TTI/FreeAIPlayground/README.md +99 -0
  158. webscout/Provider/TTI/FreeAIPlayground/__init__.py +9 -0
  159. webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +181 -0
  160. webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +180 -0
  161. webscout/Provider/TTI/ImgSys/README.md +174 -0
  162. webscout/Provider/TTI/ImgSys/__init__.py +23 -0
  163. webscout/Provider/TTI/ImgSys/async_imgsys.py +202 -0
  164. webscout/Provider/TTI/ImgSys/sync_imgsys.py +195 -0
  165. webscout/Provider/TTI/MagicStudio/README.md +101 -0
  166. webscout/Provider/TTI/MagicStudio/__init__.py +2 -0
  167. webscout/Provider/TTI/MagicStudio/async_magicstudio.py +111 -0
  168. webscout/Provider/TTI/MagicStudio/sync_magicstudio.py +109 -0
  169. webscout/Provider/TTI/Nexra/README.md +155 -0
  170. webscout/Provider/TTI/Nexra/__init__.py +22 -0
  171. webscout/Provider/TTI/Nexra/async_nexra.py +286 -0
  172. webscout/Provider/TTI/Nexra/sync_nexra.py +258 -0
  173. webscout/Provider/TTI/PollinationsAI/README.md +146 -0
  174. webscout/Provider/TTI/PollinationsAI/__init__.py +23 -0
  175. webscout/Provider/TTI/PollinationsAI/async_pollinations.py +311 -0
  176. webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +265 -0
  177. webscout/Provider/TTI/README.md +128 -0
  178. webscout/Provider/TTI/__init__.py +12 -0
  179. webscout/Provider/TTI/aiarta/README.md +134 -0
  180. webscout/Provider/TTI/aiarta/__init__.py +2 -0
  181. webscout/Provider/TTI/aiarta/async_aiarta.py +482 -0
  182. webscout/Provider/TTI/aiarta/sync_aiarta.py +440 -0
  183. webscout/Provider/TTI/artbit/README.md +100 -0
  184. webscout/Provider/TTI/artbit/__init__.py +22 -0
  185. webscout/Provider/TTI/artbit/async_artbit.py +155 -0
  186. webscout/Provider/TTI/artbit/sync_artbit.py +148 -0
  187. webscout/Provider/TTI/fastflux/README.md +129 -0
  188. webscout/Provider/TTI/fastflux/__init__.py +22 -0
  189. webscout/Provider/TTI/fastflux/async_fastflux.py +261 -0
  190. webscout/Provider/TTI/fastflux/sync_fastflux.py +252 -0
  191. webscout/Provider/TTI/huggingface/README.md +114 -0
  192. webscout/Provider/TTI/huggingface/__init__.py +22 -0
  193. webscout/Provider/TTI/huggingface/async_huggingface.py +199 -0
  194. webscout/Provider/TTI/huggingface/sync_huggingface.py +195 -0
  195. webscout/Provider/TTI/piclumen/README.md +161 -0
  196. webscout/Provider/TTI/piclumen/__init__.py +23 -0
  197. webscout/Provider/TTI/piclumen/async_piclumen.py +268 -0
  198. webscout/Provider/TTI/piclumen/sync_piclumen.py +233 -0
  199. webscout/Provider/TTI/pixelmuse/README.md +79 -0
  200. webscout/Provider/TTI/pixelmuse/__init__.py +4 -0
  201. webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +249 -0
  202. webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +182 -0
  203. webscout/Provider/TTI/talkai/README.md +139 -0
  204. webscout/Provider/TTI/talkai/__init__.py +4 -0
  205. webscout/Provider/TTI/talkai/async_talkai.py +229 -0
  206. webscout/Provider/TTI/talkai/sync_talkai.py +207 -0
  207. webscout/Provider/TTS/README.md +192 -0
  208. webscout/Provider/TTS/__init__.py +9 -0
  209. webscout/Provider/TTS/base.py +159 -0
  210. webscout/Provider/TTS/deepgram.py +156 -0
  211. webscout/Provider/TTS/elevenlabs.py +111 -0
  212. webscout/Provider/TTS/gesserit.py +128 -0
  213. webscout/Provider/TTS/murfai.py +113 -0
  214. webscout/Provider/TTS/parler.py +111 -0
  215. webscout/Provider/TTS/speechma.py +580 -0
  216. webscout/Provider/TTS/sthir.py +94 -0
  217. webscout/Provider/TTS/streamElements.py +333 -0
  218. webscout/Provider/TTS/utils.py +280 -0
  219. webscout/Provider/TeachAnything.py +229 -0
  220. webscout/Provider/TextPollinationsAI.py +308 -0
  221. webscout/Provider/TwoAI.py +280 -0
  222. webscout/Provider/TypliAI.py +305 -0
  223. webscout/Provider/UNFINISHED/ChatHub.py +209 -0
  224. webscout/Provider/UNFINISHED/Youchat.py +330 -0
  225. webscout/Provider/UNFINISHED/liner_api_request.py +263 -0
  226. webscout/Provider/UNFINISHED/oivscode.py +351 -0
  227. webscout/Provider/UNFINISHED/test_lmarena.py +119 -0
  228. webscout/Provider/Venice.py +258 -0
  229. webscout/Provider/VercelAI.py +253 -0
  230. webscout/Provider/WiseCat.py +233 -0
  231. webscout/Provider/WrDoChat.py +370 -0
  232. webscout/Provider/Writecream.py +246 -0
  233. webscout/Provider/WritingMate.py +269 -0
  234. webscout/Provider/__init__.py +172 -0
  235. webscout/Provider/ai4chat.py +149 -0
  236. webscout/Provider/akashgpt.py +335 -0
  237. webscout/Provider/asksteve.py +220 -0
  238. webscout/Provider/cerebras.py +290 -0
  239. webscout/Provider/chatglm.py +215 -0
  240. webscout/Provider/cleeai.py +213 -0
  241. webscout/Provider/copilot.py +425 -0
  242. webscout/Provider/elmo.py +283 -0
  243. webscout/Provider/freeaichat.py +285 -0
  244. webscout/Provider/geminiapi.py +208 -0
  245. webscout/Provider/granite.py +235 -0
  246. webscout/Provider/hermes.py +266 -0
  247. webscout/Provider/julius.py +223 -0
  248. webscout/Provider/koala.py +170 -0
  249. webscout/Provider/learnfastai.py +325 -0
  250. webscout/Provider/llama3mitril.py +215 -0
  251. webscout/Provider/llmchat.py +258 -0
  252. webscout/Provider/llmchatco.py +306 -0
  253. webscout/Provider/lmarena.py +198 -0
  254. webscout/Provider/meta.py +801 -0
  255. webscout/Provider/multichat.py +364 -0
  256. webscout/Provider/samurai.py +223 -0
  257. webscout/Provider/scira_chat.py +299 -0
  258. webscout/Provider/scnet.py +243 -0
  259. webscout/Provider/searchchat.py +292 -0
  260. webscout/Provider/sonus.py +258 -0
  261. webscout/Provider/talkai.py +194 -0
  262. webscout/Provider/toolbaz.py +353 -0
  263. webscout/Provider/turboseek.py +266 -0
  264. webscout/Provider/typefully.py +202 -0
  265. webscout/Provider/typegpt.py +289 -0
  266. webscout/Provider/uncovr.py +368 -0
  267. webscout/Provider/x0gpt.py +299 -0
  268. webscout/Provider/yep.py +389 -0
  269. webscout/__init__.py +4 -2
  270. webscout/cli.py +3 -28
  271. webscout/conversation.py +35 -35
  272. webscout/litagent/Readme.md +276 -0
  273. webscout/litagent/__init__.py +29 -0
  274. webscout/litagent/agent.py +455 -0
  275. webscout/litagent/constants.py +60 -0
  276. webscout/litprinter/__init__.py +59 -0
  277. webscout/scout/README.md +402 -0
  278. webscout/scout/__init__.py +8 -0
  279. webscout/scout/core/__init__.py +7 -0
  280. webscout/scout/core/crawler.py +140 -0
  281. webscout/scout/core/scout.py +568 -0
  282. webscout/scout/core/search_result.py +96 -0
  283. webscout/scout/core/text_analyzer.py +63 -0
  284. webscout/scout/core/text_utils.py +277 -0
  285. webscout/scout/core/web_analyzer.py +52 -0
  286. webscout/scout/element.py +460 -0
  287. webscout/scout/parsers/__init__.py +69 -0
  288. webscout/scout/parsers/html5lib_parser.py +172 -0
  289. webscout/scout/parsers/html_parser.py +236 -0
  290. webscout/scout/parsers/lxml_parser.py +178 -0
  291. webscout/scout/utils.py +37 -0
  292. webscout/swiftcli/Readme.md +323 -0
  293. webscout/swiftcli/__init__.py +95 -0
  294. webscout/swiftcli/core/__init__.py +7 -0
  295. webscout/swiftcli/core/cli.py +297 -0
  296. webscout/swiftcli/core/context.py +104 -0
  297. webscout/swiftcli/core/group.py +241 -0
  298. webscout/swiftcli/decorators/__init__.py +28 -0
  299. webscout/swiftcli/decorators/command.py +221 -0
  300. webscout/swiftcli/decorators/options.py +220 -0
  301. webscout/swiftcli/decorators/output.py +252 -0
  302. webscout/swiftcli/exceptions.py +21 -0
  303. webscout/swiftcli/plugins/__init__.py +9 -0
  304. webscout/swiftcli/plugins/base.py +135 -0
  305. webscout/swiftcli/plugins/manager.py +262 -0
  306. webscout/swiftcli/utils/__init__.py +59 -0
  307. webscout/swiftcli/utils/formatting.py +252 -0
  308. webscout/swiftcli/utils/parsing.py +267 -0
  309. webscout/version.py +1 -1
  310. webscout/webscout_search.py +2 -182
  311. webscout/webscout_search_async.py +1 -179
  312. webscout/zeroart/README.md +89 -0
  313. webscout/zeroart/__init__.py +135 -0
  314. webscout/zeroart/base.py +66 -0
  315. webscout/zeroart/effects.py +101 -0
  316. webscout/zeroart/fonts.py +1239 -0
  317. {webscout-8.2.7.dist-info → webscout-8.2.8.dist-info}/METADATA +115 -60
  318. webscout-8.2.8.dist-info/RECORD +334 -0
  319. {webscout-8.2.7.dist-info → webscout-8.2.8.dist-info}/WHEEL +1 -1
  320. webscout-8.2.7.dist-info/RECORD +0 -26
  321. {webscout-8.2.7.dist-info → webscout-8.2.8.dist-info}/entry_points.txt +0 -0
  322. {webscout-8.2.7.dist-info → webscout-8.2.8.dist-info}/licenses/LICENSE.md +0 -0
  323. {webscout-8.2.7.dist-info → webscout-8.2.8.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,36 @@
1
+ # This file marks the directory as a Python package.
2
+ from .deepinfra import *
3
+ from .glider import *
4
+ from .chatgptclone import *
5
+ from .x0gpt import *
6
+ from .wisecat import *
7
+ from .venice import *
8
+ from .exaai import *
9
+ from .typegpt import *
10
+ from .scirachat import *
11
+ from .freeaichat import *
12
+ from .llmchatco import *
13
+ from .yep import * # Add YEPCHAT
14
+ from .heckai import *
15
+ from .sonus import *
16
+ from .exachat import *
17
+ from .netwrck import *
18
+ from .standardinput import *
19
+ from .writecream import *
20
+ from .toolbaz import *
21
+ from .uncovrAI import *
22
+ from .opkfc import *
23
+ from .chatgpt import *
24
+ from .textpollinations import *
25
+ from .typefully import * # Add TypefullyAI
26
+ from .e2b import *
27
+ from .multichat import * # Add MultiChatAI
28
+ from .ai4chat import * # Add AI4Chat
29
+ from .mcpcore import *
30
+ from .flowith import *
31
+ from .chatsandbox import *
32
+ from .c4ai import *
33
+ from .flowith import *
34
+ from .Cloudflare import *
35
+ from .NEMOTRON import *
36
+ from .BLACKBOXAI import *
@@ -0,0 +1,293 @@
1
+ import time
2
+ import uuid
3
+ import urllib.parse
4
+ from curl_cffi.requests import Session, RequestsError
5
+ from typing import List, Dict, Optional, Union, Generator, Any
6
+
7
+ # Import base classes and utility structures
8
+ from .base import OpenAICompatibleProvider, BaseChat, BaseCompletions
9
+ from .utils import (
10
+ ChatCompletionChunk, ChatCompletion, Choice, ChoiceDelta,
11
+ ChatCompletionMessage, CompletionUsage
12
+ )
13
+
14
+ # --- AI4Chat Client ---
15
+
16
+ class Completions(BaseCompletions):
17
+ def __init__(self, client: 'AI4Chat'):
18
+ self._client = client
19
+
20
+ def create(
21
+ self,
22
+ *,
23
+ model: str,
24
+ messages: List[Dict[str, str]],
25
+ max_tokens: Optional[int] = None,
26
+ stream: bool = False,
27
+ temperature: Optional[float] = None,
28
+ top_p: Optional[float] = None,
29
+ **kwargs: Any
30
+ ) -> Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]]:
31
+ """
32
+ Creates a model response for the given chat conversation.
33
+ Mimics openai.chat.completions.create
34
+ """
35
+ # Use the format_prompt utility to format the conversation
36
+ from .utils import format_prompt
37
+
38
+ # Format the messages into a single string
39
+ conversation_prompt = format_prompt(messages, add_special_tokens=True, include_system=True)
40
+
41
+ # Set up request parameters
42
+ country_param = kwargs.get("country", self._client.country)
43
+ user_id_param = kwargs.get("user_id", self._client.user_id)
44
+
45
+ # Generate request ID and timestamp
46
+ request_id = f"chatcmpl-{uuid.uuid4()}"
47
+ created_time = int(time.time())
48
+
49
+ # AI4Chat doesn't support streaming, so we'll simulate it if requested
50
+ if stream:
51
+ return self._create_stream(request_id, created_time, model, conversation_prompt, country_param, user_id_param)
52
+ else:
53
+ return self._create_non_stream(request_id, created_time, model, conversation_prompt, country_param, user_id_param)
54
+
55
+ def _create_stream(
56
+ self, request_id: str, created_time: int, model: str,
57
+ conversation_prompt: str, country: str, user_id: str
58
+ ) -> Generator[ChatCompletionChunk, None, None]:
59
+ """Simulate streaming by breaking up the full response."""
60
+ try:
61
+ # Get the full response first
62
+ full_response = self._get_ai4chat_response(conversation_prompt, country, user_id)
63
+
64
+ # Break it into chunks for simulated streaming
65
+ words = full_response.split()
66
+ chunk_size = max(1, len(words) // 10) # Divide into ~10 chunks
67
+
68
+ # Track token usage
69
+ prompt_tokens = len(conversation_prompt.split())
70
+ completion_tokens = 0
71
+
72
+ # Stream chunks
73
+ for i in range(0, len(words), chunk_size):
74
+ chunk_text = " ".join(words[i:i+chunk_size])
75
+ completion_tokens += len(chunk_text.split())
76
+
77
+ # Create the delta object
78
+ delta = ChoiceDelta(
79
+ content=chunk_text,
80
+ role="assistant",
81
+ tool_calls=None
82
+ )
83
+
84
+ # Create the choice object
85
+ choice = Choice(
86
+ index=0,
87
+ delta=delta,
88
+ finish_reason=None,
89
+ logprobs=None
90
+ )
91
+
92
+ # Create the chunk object
93
+ chunk = ChatCompletionChunk(
94
+ id=request_id,
95
+ choices=[choice],
96
+ created=created_time,
97
+ model=model,
98
+ system_fingerprint=None
99
+ )
100
+
101
+ yield chunk
102
+
103
+ # Final chunk with finish_reason="stop"
104
+ delta = ChoiceDelta(
105
+ content=None,
106
+ role=None,
107
+ tool_calls=None
108
+ )
109
+
110
+ choice = Choice(
111
+ index=0,
112
+ delta=delta,
113
+ finish_reason="stop",
114
+ logprobs=None
115
+ )
116
+
117
+ chunk = ChatCompletionChunk(
118
+ id=request_id,
119
+ choices=[choice],
120
+ created=created_time,
121
+ model=model,
122
+ system_fingerprint=None
123
+ )
124
+
125
+ yield chunk
126
+
127
+ except RequestsError as e:
128
+ print(f"Error during AI4Chat stream request: {e}")
129
+ raise IOError(f"AI4Chat request failed: {e}") from e
130
+ except Exception as e:
131
+ print(f"Unexpected error during AI4Chat stream request: {e}")
132
+ raise IOError(f"AI4Chat request failed: {e}") from e
133
+
134
+ def _create_non_stream(
135
+ self, request_id: str, created_time: int, model: str,
136
+ conversation_prompt: str, country: str, user_id: str
137
+ ) -> ChatCompletion:
138
+ """Get a complete response from AI4Chat."""
139
+ try:
140
+ # Get the full response
141
+ full_response = self._get_ai4chat_response(conversation_prompt, country, user_id)
142
+
143
+ # Estimate token counts
144
+ prompt_tokens = len(conversation_prompt.split())
145
+ completion_tokens = len(full_response.split())
146
+ total_tokens = prompt_tokens + completion_tokens
147
+
148
+ # Create the message object
149
+ message = ChatCompletionMessage(
150
+ role="assistant",
151
+ content=full_response
152
+ )
153
+
154
+ # Create the choice object
155
+ choice = Choice(
156
+ index=0,
157
+ message=message,
158
+ finish_reason="stop"
159
+ )
160
+
161
+ # Create the usage object
162
+ usage = CompletionUsage(
163
+ prompt_tokens=prompt_tokens,
164
+ completion_tokens=completion_tokens,
165
+ total_tokens=total_tokens
166
+ )
167
+
168
+ # Create the completion object
169
+ completion = ChatCompletion(
170
+ id=request_id,
171
+ choices=[choice],
172
+ created=created_time,
173
+ model=model,
174
+ usage=usage,
175
+ )
176
+
177
+ return completion
178
+
179
+ except RequestsError as e:
180
+ print(f"Error during AI4Chat non-stream request: {e}")
181
+ raise IOError(f"AI4Chat request failed: {e}") from e
182
+ except Exception as e:
183
+ print(f"Unexpected error during AI4Chat non-stream request: {e}")
184
+ raise IOError(f"AI4Chat request failed: {e}") from e
185
+
186
+ def _get_ai4chat_response(self, prompt: str, country: str, user_id: str) -> str:
187
+ """Make the actual API request to AI4Chat."""
188
+ # URL encode parameters
189
+ encoded_text = urllib.parse.quote(prompt)
190
+ encoded_country = urllib.parse.quote(country)
191
+ encoded_user_id = urllib.parse.quote(user_id)
192
+
193
+ # Construct the API URL
194
+ url = f"{self._client.api_endpoint}?text={encoded_text}&country={encoded_country}&user_id={encoded_user_id}"
195
+
196
+ # Make the request
197
+ try:
198
+ response = self._client.session.get(url, headers=self._client.headers, timeout=self._client.timeout)
199
+ response.raise_for_status()
200
+ except RequestsError as e:
201
+ raise IOError(f"Failed to generate response: {e}")
202
+
203
+ # Process the response text
204
+ response_text = response.text
205
+
206
+ # Remove surrounding quotes if present
207
+ if response_text.startswith('"'):
208
+ response_text = response_text[1:]
209
+ if response_text.endswith('"'):
210
+ response_text = response_text[:-1]
211
+
212
+ # Replace escaped newlines
213
+ response_text = response_text.replace('\\n', '\n').replace('\\n\\n', '\n\n')
214
+
215
+ return response_text
216
+
217
+ class Chat(BaseChat):
218
+ def __init__(self, client: 'AI4Chat'):
219
+ self.completions = Completions(client)
220
+
221
+ class AI4Chat(OpenAICompatibleProvider):
222
+ """
223
+ OpenAI-compatible client for AI4Chat API.
224
+
225
+ Usage:
226
+ client = AI4Chat()
227
+ response = client.chat.completions.create(
228
+ model="default",
229
+ messages=[{"role": "user", "content": "Hello!"}]
230
+ )
231
+ print(response.choices[0].message.content)
232
+ """
233
+
234
+ AVAILABLE_MODELS = ["default"]
235
+
236
+ def __init__(
237
+ self,
238
+ timeout: int = 30,
239
+ proxies: dict = {},
240
+ system_prompt: str = "You are a helpful and informative AI assistant.",
241
+ country: str = "Asia",
242
+ user_id: str = "usersmjb2oaz7y"
243
+ ):
244
+ """
245
+ Initialize the AI4Chat client.
246
+
247
+ Args:
248
+ timeout: Request timeout in seconds
249
+ proxies: Optional proxy configuration
250
+ system_prompt: System prompt to guide the AI's behavior
251
+ country: Country parameter for API
252
+ user_id: User ID for API
253
+ """
254
+ self.timeout = timeout
255
+ self.proxies = proxies
256
+ self.system_prompt = system_prompt
257
+ self.country = country
258
+ self.user_id = user_id
259
+
260
+ # API endpoint
261
+ self.api_endpoint = "https://yw85opafq6.execute-api.us-east-1.amazonaws.com/default/boss_mode_15aug"
262
+
263
+ # Initialize session
264
+ self.session = Session(timeout=timeout, proxies=proxies)
265
+
266
+ # Set headers
267
+ self.headers = {
268
+ "Accept": "*/*",
269
+ "Accept-Language": "id-ID,id;q=0.9",
270
+ "Origin": "https://www.ai4chat.co",
271
+ "Priority": "u=1, i",
272
+ "Referer": "https://www.ai4chat.co/",
273
+ "Sec-CH-UA": '"Chromium";v="131", "Not_A Brand";v="24", "Microsoft Edge Simulate";v="131", "Lemur";v="131"',
274
+ "Sec-CH-UA-Mobile": "?1",
275
+ "Sec-CH-UA-Platform": '"Android"',
276
+ "Sec-Fetch-Dest": "empty",
277
+ "Sec-Fetch-Mode": "cors",
278
+ "Sec-Fetch-Site": "cross-site",
279
+ "User-Agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36"
280
+ }
281
+
282
+ # Update session headers
283
+ self.session.headers.update(self.headers)
284
+
285
+ # Initialize chat interface
286
+ self.chat = Chat(self)
287
+
288
+ @property
289
+ def models(self):
290
+ class _ModelList:
291
+ def list(inner_self):
292
+ return type(self).AVAILABLE_MODELS
293
+ return _ModelList()