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
@@ -0,0 +1,172 @@
1
+ from pydantic import (
2
+ # dataclasses
3
+ dataclasses,
4
+ # functional validators
5
+ field_validator,
6
+ model_validator,
7
+ AfterValidator,
8
+ BeforeValidator,
9
+ PlainValidator,
10
+ WrapValidator,
11
+ SkipValidation,
12
+ InstanceOf,
13
+ ModelWrapValidatorHandler,
14
+ # JSON Schema
15
+ WithJsonSchema,
16
+ # deprecated V1 functional validators
17
+ root_validator,
18
+ validator,
19
+ # functional serializers
20
+ field_serializer,
21
+ model_serializer,
22
+ PlainSerializer,
23
+ SerializeAsAny,
24
+ WrapSerializer,
25
+ # config
26
+ ConfigDict,
27
+ with_config,
28
+ # deprecated V1 config
29
+ BaseConfig,
30
+ Extra,
31
+ # validate_call
32
+ validate_call,
33
+ # errors
34
+ PydanticErrorCodes,
35
+ PydanticUserError,
36
+ PydanticSchemaGenerationError,
37
+ PydanticImportError,
38
+ PydanticUndefinedAnnotation,
39
+ PydanticInvalidForJsonSchema,
40
+ PydanticForbiddenQualifier,
41
+ # fields
42
+ Field,
43
+ computed_field,
44
+ PrivateAttr,
45
+ # alias
46
+ AliasChoices,
47
+ AliasGenerator,
48
+ AliasPath,
49
+ # main
50
+ BaseModel,
51
+ create_model,
52
+ # network
53
+ AnyUrl,
54
+ AnyHttpUrl,
55
+ FileUrl,
56
+ HttpUrl,
57
+ FtpUrl,
58
+ WebsocketUrl,
59
+ AnyWebsocketUrl,
60
+ UrlConstraints,
61
+ EmailStr,
62
+ NameEmail,
63
+ IPvAnyAddress,
64
+ IPvAnyInterface,
65
+ IPvAnyNetwork,
66
+ PostgresDsn,
67
+ CockroachDsn,
68
+ AmqpDsn,
69
+ RedisDsn,
70
+ MongoDsn,
71
+ KafkaDsn,
72
+ NatsDsn,
73
+ MySQLDsn,
74
+ MariaDBDsn,
75
+ ClickHouseDsn,
76
+ SnowflakeDsn,
77
+ validate_email,
78
+ # root_model
79
+ RootModel,
80
+ # deprecated tools
81
+ parse_obj_as,
82
+ schema_of,
83
+ schema_json_of,
84
+ # types
85
+ Strict,
86
+ StrictStr,
87
+ conbytes,
88
+ conlist,
89
+ conset,
90
+ confrozenset,
91
+ constr,
92
+ StringConstraints,
93
+ ImportString,
94
+ conint,
95
+ PositiveInt,
96
+ NegativeInt,
97
+ NonNegativeInt,
98
+ NonPositiveInt,
99
+ confloat,
100
+ PositiveFloat,
101
+ NegativeFloat,
102
+ NonNegativeFloat,
103
+ NonPositiveFloat,
104
+ FiniteFloat,
105
+ condecimal,
106
+ condate,
107
+ UUID1,
108
+ UUID3,
109
+ UUID4,
110
+ UUID5,
111
+ UUID6,
112
+ UUID7,
113
+ UUID8,
114
+ FilePath,
115
+ DirectoryPath,
116
+ NewPath,
117
+ Json,
118
+ Secret,
119
+ SecretStr,
120
+ SecretBytes,
121
+ SocketPath,
122
+ StrictBool,
123
+ StrictBytes,
124
+ StrictInt,
125
+ StrictFloat,
126
+ PaymentCardNumber,
127
+ ByteSize,
128
+ PastDate,
129
+ FutureDate,
130
+ PastDatetime,
131
+ FutureDatetime,
132
+ AwareDatetime,
133
+ NaiveDatetime,
134
+ AllowInfNan,
135
+ EncoderProtocol,
136
+ EncodedBytes,
137
+ EncodedStr,
138
+ Base64Encoder,
139
+ Base64Bytes,
140
+ Base64Str,
141
+ Base64UrlBytes,
142
+ Base64UrlStr,
143
+ GetPydanticSchema,
144
+ Tag,
145
+ Discriminator,
146
+ JsonValue,
147
+ FailFast,
148
+ # type_adapter
149
+ TypeAdapter,
150
+ # version
151
+ __version__,
152
+ VERSION,
153
+ # warnings
154
+ PydanticDeprecatedSince20,
155
+ PydanticDeprecatedSince26,
156
+ PydanticDeprecatedSince29,
157
+ PydanticDeprecatedSince210,
158
+ PydanticDeprecatedSince211,
159
+ PydanticDeprecationWarning,
160
+ PydanticExperimentalWarning,
161
+ # annotated handlers
162
+ GetCoreSchemaHandler,
163
+ GetJsonSchemaHandler,
164
+ # pydantic_core
165
+ ValidationError,
166
+ ValidationInfo,
167
+ SerializationInfo,
168
+ ValidatorFunctionWrapHandler,
169
+ FieldSerializationInfo,
170
+ SerializerFunctionWrapHandler,
171
+ OnErrorOmit,
172
+ )
@@ -9,7 +9,7 @@ from typing import List, Dict, Optional, Union, Generator, Any
9
9
  from .base import OpenAICompatibleProvider, BaseChat, BaseCompletions
10
10
  from .utils import (
11
11
  ChatCompletionChunk, ChatCompletion, Choice, ChoiceDelta,
12
- ChatCompletionMessage, CompletionUsage, get_system_prompt
12
+ ChatCompletionMessage, CompletionUsage, get_system_prompt, count_tokens
13
13
  )
14
14
 
15
15
  # Attempt to import LitAgent, fallback if not available
@@ -45,6 +45,8 @@ class Completions(BaseCompletions):
45
45
  stream: bool = False,
46
46
  temperature: Optional[float] = None,
47
47
  top_p: Optional[float] = None,
48
+ timeout: Optional[int] = None,
49
+ proxies: Optional[Dict[str, str]] = None,
48
50
  **kwargs: Any
49
51
  ) -> Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]]:
50
52
  """
@@ -75,19 +77,20 @@ class Completions(BaseCompletions):
75
77
  created_time = int(time.time())
76
78
 
77
79
  if stream:
78
- return self._create_stream(request_id, created_time, model, payload)
80
+ return self._create_stream(request_id, created_time, model, payload, timeout, proxies)
79
81
  else:
80
- return self._create_non_stream(request_id, created_time, model, payload)
82
+ return self._create_non_stream(request_id, created_time, model, payload, timeout, proxies)
81
83
 
82
84
  def _create_stream(
83
- self, request_id: str, created_time: int, model: str, payload: Dict[str, Any]
85
+ self, request_id: str, created_time: int, model: str, payload: Dict[str, Any], timeout: Optional[int] = None, proxies: Optional[Dict[str, str]] = None
84
86
  ) -> Generator[ChatCompletionChunk, None, None]:
85
87
  try:
86
88
  response = self._client.session.post(
87
89
  self._client.api_endpoint,
88
90
  json=payload,
89
91
  stream=True,
90
- timeout=self._client.timeout
92
+ timeout=timeout or self._client.timeout,
93
+ proxies=proxies or getattr(self._client, "proxies", None)
91
94
  )
92
95
 
93
96
  # Handle non-200 responses
@@ -100,7 +103,8 @@ class Completions(BaseCompletions):
100
103
  self._client.api_endpoint,
101
104
  json=payload,
102
105
  stream=True,
103
- timeout=self._client.timeout
106
+ timeout=timeout or self._client.timeout,
107
+ proxies=proxies or getattr(self._client, "proxies", None)
104
108
  )
105
109
  if not response.ok:
106
110
  raise IOError(
@@ -118,7 +122,7 @@ class Completions(BaseCompletions):
118
122
  total_tokens = 0
119
123
 
120
124
  # Estimate prompt tokens based on message length
121
- prompt_tokens = len(payload.get("messages", [{}])[0].get("content", "").split())
125
+ prompt_tokens = count_tokens(payload.get("messages", [{}])[0].get("content", ""))
122
126
 
123
127
  for line in response.iter_lines():
124
128
  if not line:
@@ -135,8 +139,8 @@ class Completions(BaseCompletions):
135
139
  # Format the content (replace escaped newlines)
136
140
  content = self._client.format_text(content)
137
141
 
138
- # Update token counts
139
- completion_tokens += 1
142
+ # Update token counts using count_tokens
143
+ completion_tokens += count_tokens(content)
140
144
  total_tokens = prompt_tokens + completion_tokens
141
145
 
142
146
  # Create the delta object
@@ -163,8 +167,11 @@ class Completions(BaseCompletions):
163
167
  system_fingerprint=None
164
168
  )
165
169
 
166
- # Convert to dict for proper formatting
167
- chunk_dict = chunk.to_dict()
170
+ # Convert chunk to dict using Pydantic's API
171
+ if hasattr(chunk, "model_dump"):
172
+ chunk_dict = chunk.model_dump(exclude_none=True)
173
+ else:
174
+ chunk_dict = chunk.dict(exclude_none=True)
168
175
 
169
176
  # Add usage information to match OpenAI format
170
177
  usage_dict = {
@@ -204,7 +211,10 @@ class Completions(BaseCompletions):
204
211
  system_fingerprint=None
205
212
  )
206
213
 
207
- chunk_dict = chunk.to_dict()
214
+ if hasattr(chunk, "model_dump"):
215
+ chunk_dict = chunk.model_dump(exclude_none=True)
216
+ else:
217
+ chunk_dict = chunk.dict(exclude_none=True)
208
218
  chunk_dict["usage"] = {
209
219
  "prompt_tokens": prompt_tokens,
210
220
  "completion_tokens": completion_tokens,
@@ -219,13 +229,14 @@ class Completions(BaseCompletions):
219
229
  raise IOError(f"SciraChat request failed: {e}") from e
220
230
 
221
231
  def _create_non_stream(
222
- self, request_id: str, created_time: int, model: str, payload: Dict[str, Any]
232
+ self, request_id: str, created_time: int, model: str, payload: Dict[str, Any], timeout: Optional[int] = None, proxies: Optional[Dict[str, str]] = None
223
233
  ) -> ChatCompletion:
224
234
  try:
225
235
  response = self._client.session.post(
226
236
  self._client.api_endpoint,
227
237
  json=payload,
228
- timeout=self._client.timeout
238
+ timeout=timeout or self._client.timeout,
239
+ proxies=proxies or getattr(self._client, "proxies", None)
229
240
  )
230
241
 
231
242
  # Handle non-200 responses
@@ -237,7 +248,8 @@ class Completions(BaseCompletions):
237
248
  response = self._client.session.post(
238
249
  self._client.api_endpoint,
239
250
  json=payload,
240
- timeout=self._client.timeout
251
+ timeout=timeout or self._client.timeout,
252
+ proxies=proxies or getattr(self._client, "proxies", None)
241
253
  )
242
254
  if not response.ok:
243
255
  raise IOError(
@@ -268,8 +280,8 @@ class Completions(BaseCompletions):
268
280
  full_response = self._client.format_text(full_response)
269
281
 
270
282
  # Estimate token counts
271
- prompt_tokens = len(payload.get("messages", [{}])[0].get("content", "").split())
272
- completion_tokens = len(full_response.split())
283
+ prompt_tokens = count_tokens(payload.get("messages", [{}])[0].get("content", ""))
284
+ completion_tokens = count_tokens(full_response)
273
285
  total_tokens = prompt_tokens + completion_tokens
274
286
 
275
287
  # Create the message object