webscout 8.2.8__py3-none-any.whl → 8.3__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 (197) hide show
  1. webscout/AIauto.py +34 -16
  2. webscout/AIbase.py +96 -37
  3. webscout/AIutel.py +491 -87
  4. webscout/Bard.py +441 -323
  5. webscout/Extra/GitToolkit/__init__.py +10 -10
  6. webscout/Extra/YTToolkit/ytapi/video.py +232 -232
  7. webscout/Litlogger/README.md +10 -0
  8. webscout/Litlogger/__init__.py +7 -59
  9. webscout/Litlogger/formats.py +4 -0
  10. webscout/Litlogger/handlers.py +103 -0
  11. webscout/Litlogger/levels.py +13 -0
  12. webscout/Litlogger/logger.py +92 -0
  13. webscout/Provider/AISEARCH/Perplexity.py +332 -358
  14. webscout/Provider/AISEARCH/felo_search.py +9 -35
  15. webscout/Provider/AISEARCH/genspark_search.py +30 -56
  16. webscout/Provider/AISEARCH/hika_search.py +4 -16
  17. webscout/Provider/AISEARCH/iask_search.py +410 -436
  18. webscout/Provider/AISEARCH/monica_search.py +4 -30
  19. webscout/Provider/AISEARCH/scira_search.py +6 -32
  20. webscout/Provider/AISEARCH/webpilotai_search.py +38 -64
  21. webscout/Provider/Blackboxai.py +155 -35
  22. webscout/Provider/ChatSandbox.py +2 -1
  23. webscout/Provider/Deepinfra.py +339 -339
  24. webscout/Provider/ExaChat.py +358 -358
  25. webscout/Provider/Gemini.py +169 -169
  26. webscout/Provider/GithubChat.py +1 -2
  27. webscout/Provider/Glider.py +3 -3
  28. webscout/Provider/HeckAI.py +172 -82
  29. webscout/Provider/LambdaChat.py +1 -0
  30. webscout/Provider/MCPCore.py +7 -3
  31. webscout/Provider/OPENAI/BLACKBOXAI.py +421 -139
  32. webscout/Provider/OPENAI/Cloudflare.py +38 -21
  33. webscout/Provider/OPENAI/FalconH1.py +457 -0
  34. webscout/Provider/OPENAI/FreeGemini.py +35 -18
  35. webscout/Provider/OPENAI/NEMOTRON.py +34 -34
  36. webscout/Provider/OPENAI/PI.py +427 -0
  37. webscout/Provider/OPENAI/Qwen3.py +304 -0
  38. webscout/Provider/OPENAI/README.md +952 -1253
  39. webscout/Provider/OPENAI/TwoAI.py +374 -0
  40. webscout/Provider/OPENAI/__init__.py +7 -1
  41. webscout/Provider/OPENAI/ai4chat.py +73 -63
  42. webscout/Provider/OPENAI/api.py +869 -644
  43. webscout/Provider/OPENAI/base.py +2 -0
  44. webscout/Provider/OPENAI/c4ai.py +34 -13
  45. webscout/Provider/OPENAI/chatgpt.py +575 -556
  46. webscout/Provider/OPENAI/chatgptclone.py +512 -487
  47. webscout/Provider/OPENAI/chatsandbox.py +11 -6
  48. webscout/Provider/OPENAI/copilot.py +258 -0
  49. webscout/Provider/OPENAI/deepinfra.py +327 -318
  50. webscout/Provider/OPENAI/e2b.py +140 -104
  51. webscout/Provider/OPENAI/exaai.py +420 -411
  52. webscout/Provider/OPENAI/exachat.py +448 -443
  53. webscout/Provider/OPENAI/flowith.py +7 -3
  54. webscout/Provider/OPENAI/freeaichat.py +12 -8
  55. webscout/Provider/OPENAI/glider.py +15 -8
  56. webscout/Provider/OPENAI/groq.py +5 -2
  57. webscout/Provider/OPENAI/heckai.py +311 -307
  58. webscout/Provider/OPENAI/llmchatco.py +9 -7
  59. webscout/Provider/OPENAI/mcpcore.py +18 -9
  60. webscout/Provider/OPENAI/multichat.py +7 -5
  61. webscout/Provider/OPENAI/netwrck.py +16 -11
  62. webscout/Provider/OPENAI/oivscode.py +290 -0
  63. webscout/Provider/OPENAI/opkfc.py +507 -496
  64. webscout/Provider/OPENAI/pydantic_imports.py +172 -0
  65. webscout/Provider/OPENAI/scirachat.py +29 -17
  66. webscout/Provider/OPENAI/sonus.py +308 -303
  67. webscout/Provider/OPENAI/standardinput.py +442 -433
  68. webscout/Provider/OPENAI/textpollinations.py +18 -11
  69. webscout/Provider/OPENAI/toolbaz.py +419 -413
  70. webscout/Provider/OPENAI/typefully.py +17 -10
  71. webscout/Provider/OPENAI/typegpt.py +21 -11
  72. webscout/Provider/OPENAI/uncovrAI.py +477 -462
  73. webscout/Provider/OPENAI/utils.py +90 -79
  74. webscout/Provider/OPENAI/venice.py +435 -425
  75. webscout/Provider/OPENAI/wisecat.py +387 -381
  76. webscout/Provider/OPENAI/writecream.py +166 -163
  77. webscout/Provider/OPENAI/x0gpt.py +26 -37
  78. webscout/Provider/OPENAI/yep.py +384 -356
  79. webscout/Provider/PI.py +2 -1
  80. webscout/Provider/TTI/README.md +55 -101
  81. webscout/Provider/TTI/__init__.py +4 -9
  82. webscout/Provider/TTI/aiarta.py +365 -0
  83. webscout/Provider/TTI/artbit.py +0 -0
  84. webscout/Provider/TTI/base.py +64 -0
  85. webscout/Provider/TTI/fastflux.py +200 -0
  86. webscout/Provider/TTI/magicstudio.py +201 -0
  87. webscout/Provider/TTI/piclumen.py +203 -0
  88. webscout/Provider/TTI/pixelmuse.py +225 -0
  89. webscout/Provider/TTI/pollinations.py +221 -0
  90. webscout/Provider/TTI/utils.py +11 -0
  91. webscout/Provider/TTS/__init__.py +2 -1
  92. webscout/Provider/TTS/base.py +159 -159
  93. webscout/Provider/TTS/openai_fm.py +129 -0
  94. webscout/Provider/TextPollinationsAI.py +308 -308
  95. webscout/Provider/TwoAI.py +239 -44
  96. webscout/Provider/UNFINISHED/Youchat.py +330 -330
  97. webscout/Provider/UNFINISHED/puterjs.py +635 -0
  98. webscout/Provider/UNFINISHED/test_lmarena.py +119 -119
  99. webscout/Provider/Writecream.py +246 -246
  100. webscout/Provider/__init__.py +2 -2
  101. webscout/Provider/ai4chat.py +33 -8
  102. webscout/Provider/granite.py +41 -6
  103. webscout/Provider/koala.py +169 -169
  104. webscout/Provider/oivscode.py +309 -0
  105. webscout/Provider/samurai.py +3 -2
  106. webscout/Provider/scnet.py +1 -0
  107. webscout/Provider/typegpt.py +3 -3
  108. webscout/Provider/uncovr.py +368 -368
  109. webscout/client.py +70 -0
  110. webscout/litprinter/__init__.py +58 -58
  111. webscout/optimizers.py +419 -419
  112. webscout/scout/README.md +3 -1
  113. webscout/scout/core/crawler.py +134 -64
  114. webscout/scout/core/scout.py +148 -109
  115. webscout/scout/element.py +106 -88
  116. webscout/swiftcli/Readme.md +323 -323
  117. webscout/swiftcli/plugins/manager.py +9 -2
  118. webscout/version.py +1 -1
  119. webscout/zeroart/__init__.py +134 -134
  120. webscout/zeroart/effects.py +100 -100
  121. webscout/zeroart/fonts.py +1238 -1238
  122. {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/METADATA +160 -35
  123. webscout-8.3.dist-info/RECORD +290 -0
  124. {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/WHEEL +1 -1
  125. {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/entry_points.txt +1 -0
  126. webscout/Litlogger/Readme.md +0 -175
  127. webscout/Litlogger/core/__init__.py +0 -6
  128. webscout/Litlogger/core/level.py +0 -23
  129. webscout/Litlogger/core/logger.py +0 -165
  130. webscout/Litlogger/handlers/__init__.py +0 -12
  131. webscout/Litlogger/handlers/console.py +0 -33
  132. webscout/Litlogger/handlers/file.py +0 -143
  133. webscout/Litlogger/handlers/network.py +0 -173
  134. webscout/Litlogger/styles/__init__.py +0 -7
  135. webscout/Litlogger/styles/colors.py +0 -249
  136. webscout/Litlogger/styles/formats.py +0 -458
  137. webscout/Litlogger/styles/text.py +0 -87
  138. webscout/Litlogger/utils/__init__.py +0 -6
  139. webscout/Litlogger/utils/detectors.py +0 -153
  140. webscout/Litlogger/utils/formatters.py +0 -200
  141. webscout/Provider/ChatGPTGratis.py +0 -194
  142. webscout/Provider/TTI/AiForce/README.md +0 -159
  143. webscout/Provider/TTI/AiForce/__init__.py +0 -22
  144. webscout/Provider/TTI/AiForce/async_aiforce.py +0 -224
  145. webscout/Provider/TTI/AiForce/sync_aiforce.py +0 -245
  146. webscout/Provider/TTI/FreeAIPlayground/README.md +0 -99
  147. webscout/Provider/TTI/FreeAIPlayground/__init__.py +0 -9
  148. webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +0 -181
  149. webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +0 -180
  150. webscout/Provider/TTI/ImgSys/README.md +0 -174
  151. webscout/Provider/TTI/ImgSys/__init__.py +0 -23
  152. webscout/Provider/TTI/ImgSys/async_imgsys.py +0 -202
  153. webscout/Provider/TTI/ImgSys/sync_imgsys.py +0 -195
  154. webscout/Provider/TTI/MagicStudio/README.md +0 -101
  155. webscout/Provider/TTI/MagicStudio/__init__.py +0 -2
  156. webscout/Provider/TTI/MagicStudio/async_magicstudio.py +0 -111
  157. webscout/Provider/TTI/MagicStudio/sync_magicstudio.py +0 -109
  158. webscout/Provider/TTI/Nexra/README.md +0 -155
  159. webscout/Provider/TTI/Nexra/__init__.py +0 -22
  160. webscout/Provider/TTI/Nexra/async_nexra.py +0 -286
  161. webscout/Provider/TTI/Nexra/sync_nexra.py +0 -258
  162. webscout/Provider/TTI/PollinationsAI/README.md +0 -146
  163. webscout/Provider/TTI/PollinationsAI/__init__.py +0 -23
  164. webscout/Provider/TTI/PollinationsAI/async_pollinations.py +0 -311
  165. webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +0 -265
  166. webscout/Provider/TTI/aiarta/README.md +0 -134
  167. webscout/Provider/TTI/aiarta/__init__.py +0 -2
  168. webscout/Provider/TTI/aiarta/async_aiarta.py +0 -482
  169. webscout/Provider/TTI/aiarta/sync_aiarta.py +0 -440
  170. webscout/Provider/TTI/artbit/README.md +0 -100
  171. webscout/Provider/TTI/artbit/__init__.py +0 -22
  172. webscout/Provider/TTI/artbit/async_artbit.py +0 -155
  173. webscout/Provider/TTI/artbit/sync_artbit.py +0 -148
  174. webscout/Provider/TTI/fastflux/README.md +0 -129
  175. webscout/Provider/TTI/fastflux/__init__.py +0 -22
  176. webscout/Provider/TTI/fastflux/async_fastflux.py +0 -261
  177. webscout/Provider/TTI/fastflux/sync_fastflux.py +0 -252
  178. webscout/Provider/TTI/huggingface/README.md +0 -114
  179. webscout/Provider/TTI/huggingface/__init__.py +0 -22
  180. webscout/Provider/TTI/huggingface/async_huggingface.py +0 -199
  181. webscout/Provider/TTI/huggingface/sync_huggingface.py +0 -195
  182. webscout/Provider/TTI/piclumen/README.md +0 -161
  183. webscout/Provider/TTI/piclumen/__init__.py +0 -23
  184. webscout/Provider/TTI/piclumen/async_piclumen.py +0 -268
  185. webscout/Provider/TTI/piclumen/sync_piclumen.py +0 -233
  186. webscout/Provider/TTI/pixelmuse/README.md +0 -79
  187. webscout/Provider/TTI/pixelmuse/__init__.py +0 -4
  188. webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +0 -249
  189. webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +0 -182
  190. webscout/Provider/TTI/talkai/README.md +0 -139
  191. webscout/Provider/TTI/talkai/__init__.py +0 -4
  192. webscout/Provider/TTI/talkai/async_talkai.py +0 -229
  193. webscout/Provider/TTI/talkai/sync_talkai.py +0 -207
  194. webscout/Provider/UNFINISHED/oivscode.py +0 -351
  195. webscout-8.2.8.dist-info/RECORD +0 -334
  196. {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/licenses/LICENSE.md +0 -0
  197. {webscout-8.2.8.dist-info → webscout-8.3.dist-info}/top_level.txt +0 -0
@@ -1,169 +1,169 @@
1
- from os import path
2
- from json import load, dumps
3
- import warnings
4
- from typing import Union, Any, Dict
5
-
6
- # Import internal modules and dependencies
7
- from ..AIutel import Optimizers, Conversation, AwesomePrompts, sanitize_stream
8
- from ..AIbase import Provider, AsyncProvider
9
- from ..Bard import Chatbot, Model
10
-
11
- warnings.simplefilter("ignore", category=UserWarning)
12
-
13
- # Define model aliases for easy usage
14
- MODEL_ALIASES: Dict[str, Model] = {
15
- "unspecified": Model.UNSPECIFIED,
16
- "gemini-2.0-flash": Model.G_2_0_FLASH,
17
- "gemini-2.0-flash-thinking": Model.G_2_0_FLASH_THINKING,
18
- "gemini-2.5-pro": Model.G_2_5_PRO,
19
- "gemini-2.0-exp-advanced": Model.G_2_0_EXP_ADVANCED,
20
- "gemini-2.5-exp-advanced": Model.G_2_5_EXP_ADVANCED,
21
- "gemini-2.5-flash": Model.G_2_5_FLASH,
22
- # Add shorter aliases for convenience
23
- "flash": Model.G_2_0_FLASH,
24
- "flash-2.5": Model.G_2_5_FLASH,
25
- "thinking": Model.G_2_0_FLASH_THINKING,
26
- "pro": Model.G_2_5_PRO,
27
- "advanced": Model.G_2_0_EXP_ADVANCED,
28
- "advanced-2.5": Model.G_2_5_EXP_ADVANCED,
29
- }
30
-
31
- # List of available models (friendly names)
32
- AVAILABLE_MODELS = list(MODEL_ALIASES.keys())
33
-
34
- class GEMINI(Provider):
35
- def __init__(
36
- self,
37
- cookie_file: str,
38
- model: str = "flash", # Accepts either a Model enum or a str alias.
39
- proxy: dict = {},
40
- timeout: int = 30,
41
- ):
42
- """
43
- Initializes GEMINI with model support.
44
-
45
- Args:
46
- cookie_file (str): Path to the cookies JSON file.
47
- model (Model or str): Selected model for the session. Can be a Model enum
48
- or a string alias. Available aliases: flash, flash-exp, thinking, thinking-with-apps,
49
- exp-advanced, 2.5-exp-advanced, 2.5-pro, 1.5-flash, 1.5-pro, 1.5-pro-research.
50
- proxy (dict, optional): HTTP request proxy. Defaults to {}.
51
- timeout (int, optional): HTTP request timeout in seconds. Defaults to 30.
52
- """
53
- self.conversation = Conversation(False)
54
-
55
- # Ensure cookie_file existence.
56
- if not isinstance(cookie_file, str):
57
- raise TypeError(f"cookie_file should be of type str, not '{type(cookie_file)}'")
58
- if not path.isfile(cookie_file):
59
- raise Exception(f"{cookie_file} is not a valid file path")
60
-
61
- # If model is provided as alias (str), convert to Model enum.
62
- if isinstance(model, str):
63
- alias = model.lower()
64
- if alias in MODEL_ALIASES:
65
- selected_model = MODEL_ALIASES[alias]
66
- else:
67
- raise Exception(f"Unknown model alias: '{model}'. Available aliases: {', '.join(AVAILABLE_MODELS)}")
68
- elif isinstance(model, Model):
69
- selected_model = model
70
- else:
71
- raise TypeError("model must be a string alias or an instance of Model")
72
-
73
- # Initialize the Chatbot session using the cookie file.
74
- self.session = Chatbot(cookie_file, proxy, timeout, selected_model)
75
- self.last_response = {}
76
- self.__available_optimizers = (
77
- method for method in dir(Optimizers) if callable(getattr(Optimizers, method)) and not method.startswith("__")
78
- )
79
- # Store cookies from Chatbot for later use (e.g. image generation)
80
- self.session_auth1 = self.session.secure_1psid
81
- self.session_auth2 = self.session.secure_1psidts
82
-
83
- def ask(
84
- self,
85
- prompt: str,
86
- stream: bool = False,
87
- raw: bool = False,
88
- optimizer: str = None,
89
- conversationally: bool = False,
90
- ) -> dict:
91
- """Chat with AI.
92
-
93
- Args:
94
- prompt (str): Prompt to be sent.
95
- stream (bool, optional): Flag for streaming response. Defaults to False.
96
- raw (bool, optional): Stream back raw response as received. Defaults to False.
97
- optimizer (str, optional): Prompt optimizer name (e.g., 'code', 'shell_command'). Defaults to None.
98
- conversationally (bool, optional): Chat conversationally when using optimizer. Defaults to False.
99
-
100
- Returns:
101
- dict: Response generated by the underlying Chatbot.
102
- """
103
- conversation_prompt = self.conversation.gen_complete_prompt(prompt)
104
- if optimizer:
105
- if optimizer in self.__available_optimizers:
106
- conversation_prompt = getattr(Optimizers, optimizer)(
107
- conversation_prompt if conversationally else prompt
108
- )
109
- else:
110
- raise Exception(f"Optimizer is not one of {', '.join(self.__available_optimizers)}")
111
-
112
- def for_stream():
113
- response = self.session.ask(prompt)
114
- self.last_response.update(response)
115
- self.conversation.update_chat_history(prompt, self.get_message(self.last_response))
116
- yield dumps(response) if raw else response
117
-
118
- def for_non_stream():
119
- for _ in for_stream():
120
- pass
121
- return self.last_response
122
-
123
- return for_stream() if stream else for_non_stream()
124
-
125
- def chat(
126
- self,
127
- prompt: str,
128
- stream: bool = False,
129
- optimizer: str = None,
130
- conversationally: bool = False,
131
- ) -> str:
132
- """Generate response text.
133
-
134
- Args:
135
- prompt (str): Prompt to be sent.
136
- stream (bool, optional): Flag for streaming response. Defaults to False.
137
- optimizer (str, optional): Prompt optimizer name. Defaults to None.
138
- conversationally (bool, optional): Chat conversationally when using optimizer. Defaults to False.
139
-
140
- Returns:
141
- str: Response generated.
142
- """
143
- def for_stream():
144
- for response in self.ask(prompt, True, optimizer=optimizer, conversationally=conversationally):
145
- yield self.get_message(response)
146
-
147
- def for_non_stream():
148
- return self.get_message(self.ask(prompt, False, optimizer=optimizer, conversationally=conversationally))
149
-
150
- return for_stream() if stream else for_non_stream()
151
-
152
- def get_message(self, response: dict) -> str:
153
- """Retrieves message content from the response.
154
-
155
- Args:
156
- response (dict): Response generated by `self.ask`.
157
-
158
- Returns:
159
- str: Extracted message content.
160
- """
161
- if not isinstance(response, dict):
162
- raise TypeError("Response should be of type dict")
163
- return response["content"]
164
-
165
- def reset(self):
166
- """Reset the current conversation."""
167
- self.session.async_chatbot.conversation_id = ""
168
- self.session.async_chatbot.response_id = ""
169
- self.session.async_chatbot.choice_id = ""
1
+ from os import path
2
+ from json import load, dumps
3
+ import warnings
4
+ from typing import Union, Any, Dict
5
+
6
+ # Import internal modules and dependencies
7
+ from ..AIutel import Optimizers, Conversation, AwesomePrompts, sanitize_stream
8
+ from ..AIbase import Provider, AsyncProvider
9
+ from ..Bard import Chatbot, Model
10
+
11
+ warnings.simplefilter("ignore", category=UserWarning)
12
+
13
+ # Define model aliases for easy usage
14
+ MODEL_ALIASES: Dict[str, Model] = {
15
+ "unspecified": Model.UNSPECIFIED,
16
+ "gemini-2.0-flash": Model.G_2_0_FLASH,
17
+ "gemini-2.0-flash-thinking": Model.G_2_0_FLASH_THINKING,
18
+ "gemini-2.5-pro": Model.G_2_5_PRO,
19
+ "gemini-2.0-exp-advanced": Model.G_2_0_EXP_ADVANCED,
20
+ "gemini-2.5-exp-advanced": Model.G_2_5_EXP_ADVANCED,
21
+ "gemini-2.5-flash": Model.G_2_5_FLASH,
22
+ # Add shorter aliases for convenience
23
+ "flash": Model.G_2_0_FLASH,
24
+ "flash-2.5": Model.G_2_5_FLASH,
25
+ "thinking": Model.G_2_0_FLASH_THINKING,
26
+ "pro": Model.G_2_5_PRO,
27
+ "advanced": Model.G_2_0_EXP_ADVANCED,
28
+ "advanced-2.5": Model.G_2_5_EXP_ADVANCED,
29
+ }
30
+
31
+ # List of available models (friendly names)
32
+ AVAILABLE_MODELS = list(MODEL_ALIASES.keys())
33
+
34
+ class GEMINI(Provider):
35
+ def __init__(
36
+ self,
37
+ cookie_file: str,
38
+ model: str = "flash", # Accepts either a Model enum or a str alias.
39
+ proxy: dict = {},
40
+ timeout: int = 30,
41
+ ):
42
+ """
43
+ Initializes GEMINI with model support.
44
+
45
+ Args:
46
+ cookie_file (str): Path to the cookies JSON file.
47
+ model (Model or str): Selected model for the session. Can be a Model enum
48
+ or a string alias. Available aliases: flash, flash-exp, thinking, thinking-with-apps,
49
+ exp-advanced, 2.5-exp-advanced, 2.5-pro, 1.5-flash, 1.5-pro, 1.5-pro-research.
50
+ proxy (dict, optional): HTTP request proxy. Defaults to {}.
51
+ timeout (int, optional): HTTP request timeout in seconds. Defaults to 30.
52
+ """
53
+ self.conversation = Conversation(False)
54
+
55
+ # Ensure cookie_file existence.
56
+ if not isinstance(cookie_file, str):
57
+ raise TypeError(f"cookie_file should be of type str, not '{type(cookie_file)}'")
58
+ if not path.isfile(cookie_file):
59
+ raise Exception(f"{cookie_file} is not a valid file path")
60
+
61
+ # If model is provided as alias (str), convert to Model enum.
62
+ if isinstance(model, str):
63
+ alias = model.lower()
64
+ if alias in MODEL_ALIASES:
65
+ selected_model = MODEL_ALIASES[alias]
66
+ else:
67
+ raise Exception(f"Unknown model alias: '{model}'. Available aliases: {', '.join(AVAILABLE_MODELS)}")
68
+ elif isinstance(model, Model):
69
+ selected_model = model
70
+ else:
71
+ raise TypeError("model must be a string alias or an instance of Model")
72
+
73
+ # Initialize the Chatbot session using the cookie file.
74
+ self.session = Chatbot(cookie_file, proxy, timeout, selected_model)
75
+ self.last_response = {}
76
+ self.__available_optimizers = (
77
+ method for method in dir(Optimizers) if callable(getattr(Optimizers, method)) and not method.startswith("__")
78
+ )
79
+ # Store cookies from Chatbot for later use (e.g. image generation)
80
+ self.session_auth1 = self.session.secure_1psid
81
+ self.session_auth2 = self.session.secure_1psidts
82
+
83
+ def ask(
84
+ self,
85
+ prompt: str,
86
+ stream: bool = False,
87
+ raw: bool = False,
88
+ optimizer: str = None,
89
+ conversationally: bool = False,
90
+ ) -> dict:
91
+ """Chat with AI.
92
+
93
+ Args:
94
+ prompt (str): Prompt to be sent.
95
+ stream (bool, optional): Flag for streaming response. Defaults to False.
96
+ raw (bool, optional): Stream back raw response as received. Defaults to False.
97
+ optimizer (str, optional): Prompt optimizer name (e.g., 'code', 'shell_command'). Defaults to None.
98
+ conversationally (bool, optional): Chat conversationally when using optimizer. Defaults to False.
99
+
100
+ Returns:
101
+ dict: Response generated by the underlying Chatbot.
102
+ """
103
+ conversation_prompt = self.conversation.gen_complete_prompt(prompt)
104
+ if optimizer:
105
+ if optimizer in self.__available_optimizers:
106
+ conversation_prompt = getattr(Optimizers, optimizer)(
107
+ conversation_prompt if conversationally else prompt
108
+ )
109
+ else:
110
+ raise Exception(f"Optimizer is not one of {', '.join(self.__available_optimizers)}")
111
+
112
+ def for_stream():
113
+ response = self.session.ask(prompt)
114
+ self.last_response.update(response)
115
+ self.conversation.update_chat_history(prompt, self.get_message(self.last_response))
116
+ yield dumps(response) if raw else response
117
+
118
+ def for_non_stream():
119
+ for _ in for_stream():
120
+ pass
121
+ return self.last_response
122
+
123
+ return for_stream() if stream else for_non_stream()
124
+
125
+ def chat(
126
+ self,
127
+ prompt: str,
128
+ stream: bool = False,
129
+ optimizer: str = None,
130
+ conversationally: bool = False,
131
+ ) -> str:
132
+ """Generate response text.
133
+
134
+ Args:
135
+ prompt (str): Prompt to be sent.
136
+ stream (bool, optional): Flag for streaming response. Defaults to False.
137
+ optimizer (str, optional): Prompt optimizer name. Defaults to None.
138
+ conversationally (bool, optional): Chat conversationally when using optimizer. Defaults to False.
139
+
140
+ Returns:
141
+ str: Response generated.
142
+ """
143
+ def for_stream():
144
+ for response in self.ask(prompt, True, optimizer=optimizer, conversationally=conversationally):
145
+ yield self.get_message(response)
146
+
147
+ def for_non_stream():
148
+ return self.get_message(self.ask(prompt, False, optimizer=optimizer, conversationally=conversationally))
149
+
150
+ return for_stream() if stream else for_non_stream()
151
+
152
+ def get_message(self, response: dict) -> str:
153
+ """Retrieves message content from the response.
154
+
155
+ Args:
156
+ response (dict): Response generated by `self.ask`.
157
+
158
+ Returns:
159
+ str: Extracted message content.
160
+ """
161
+ if not isinstance(response, dict):
162
+ raise TypeError("Response should be of type dict")
163
+ return response["content"]
164
+
165
+ def reset(self):
166
+ """Reset the current conversation."""
167
+ self.session.async_chatbot.conversation_id = ""
168
+ self.session.async_chatbot.response_id = ""
169
+ self.session.async_chatbot.choice_id = ""
@@ -25,13 +25,12 @@ class GithubChat(Provider):
25
25
  "claude-3.5-sonnet",
26
26
  "claude-3.7-sonnet",
27
27
  "claude-3.7-sonnet-thought",
28
+ "claude-sonnet-4",
28
29
  "gemini-2.0-flash-001",
29
30
  "gemini-2.5-pro",
30
31
  "gpt-4.1",
31
32
  "o4-mini"
32
33
 
33
-
34
-
35
34
  ]
36
35
 
37
36
  def __init__(
@@ -180,14 +180,14 @@ class GliderAI(Provider):
180
180
  """
181
181
  def for_stream():
182
182
  for response in self.ask(
183
- prompt, True, optimizer=optimizer, conversationally=conversationally
183
+ prompt, stream=True, optimizer=optimizer, conversationally=conversationally
184
184
  ):
185
185
  yield self.get_message(response)
186
186
  def for_non_stream():
187
187
  return self.get_message(
188
188
  self.ask(
189
189
  prompt,
190
- False,
190
+ stream=False,
191
191
  optimizer=optimizer,
192
192
  conversationally=conversationally,
193
193
  )
@@ -222,4 +222,4 @@ if __name__ == "__main__":
222
222
  display_text = "Empty or invalid response"
223
223
  print(f"\r{model:<50} {status:<10} {display_text}")
224
224
  except Exception as e:
225
- print(f"\r{model:<50} {'✗':<10} {str(e)}")
225
+ print(f"\r{model:<50} {'✗':<10} {str(e)}")