1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
RequestLimiter.php
См. документацию.
1<?php
2
3declare(strict_types=1);
4
5namespace Bitrix\Landing\Copilot\Connector\AI;
6
7use Bitrix\AI\Cloud;
8use Bitrix\AI\Context;
9use Bitrix\AI\Limiter\Enums\TypeLimit;
10use Bitrix\AI\Limiter\LimitControlService;
11use Bitrix\AI\Limiter\LimitControlBoxService;
12use Bitrix\AI\Limiter\Usage;
13use Bitrix\AI\Limiter\Enums\ErrorLimit;
14use Bitrix\Baas\Baas;
15use Bitrix\Landing\Copilot\Generation\GenerationException;
16use Bitrix\Landing\Copilot\Generation\Type\GenerationErrors;
17use Bitrix\Main\ArgumentException;
18use Bitrix\Main\Error;
19use Bitrix\Main\Loader;
20use Bitrix\Main\Localization\Loc;
21use Bitrix\Main\ObjectNotFoundException;
22use Bitrix\UI\Util;
23use Psr\Container\NotFoundExceptionInterface;
24
33{
35 protected const ERROR_CODE_LIMIT_CLOUD = 'LIMIT_IS_EXCEEDED';
37 protected const ERROR_CODE_LIMIT_BAAS_CLOUD = 'LIMIT_IS_EXCEEDED_BAAS';
38 protected const ERROR_CODE_RATE_LIMIT = 'RATE_LIMIT';
39 protected const ERROR_CODE_DAILY = 'LIMIT_IS_EXCEEDED_DAILY';
40 protected const ERROR_CODE_MONTHLY = 'LIMIT_IS_EXCEEDED_MONTHLY';
41
46 protected const SLIDER_CODES = [
47 'BOOST_COPILOT' => 'limit_boost_copilot',
48 'DAILY' => 'limit_copilot_max_number_daily_requests',
49 'MONTHLY' => 'limit_copilot_requests',
50 'BOOST_COPILOT_BOX' => 'limit_boost_copilot_box',
51 'REQUEST_BOX' => 'limit_copilot_requests_box',
52 'BOX' => 'limit_copilot_box',
53 ];
54
59 protected const HELPDESK_CODES = [
60 'RATE' => '24736310',
61 ];
62
69 protected const PROMO_LIMIT_CODES = [
70 'DAILY' => 'Daily',
71 'MONTHLY' => 'Monthly',
72 ];
73
81 public function getTextFromError(Error $error): ?string
82 {
83 if (Loader::includeModule('bitrix24'))
84 {
85 return $this->getTextFromLimitCloudError($error);
86 }
87
88 return $this->getTextFromLimitBoxError($error);
89 }
90
98 protected function getTextFromLimitCloudError(Error $error): ?string
99 {
100 $errorCode = $error->getCode();
101
102 //right 2 in board
103 if ($errorCode === self::ERROR_CODE_LIMIT_BAAS_CLOUD)
104 {
105 return self::getLimitMessage(
106 'LANDING_REQUEST_LIMITER_ERROR_BAAS',
107 self::SLIDER_CODES['BOOST_COPILOT'],
108 );
109 }
110
111 if (str_starts_with($errorCode, self::ERROR_CODE_LIMIT_CLOUD))
112 {
113 //right 1 in board
114 if (Loader::includeModule('baas') && Baas::getInstance()->isAvailable())
115 {
116 return self::getLimitMessage(
117 'LANDING_REQUEST_LIMITER_ERROR_PROMO',
118 self::SLIDER_CODES['BOOST_COPILOT'],
119 );
120 }
121
122 //left 1 in board
123 if ($errorCode === self::ERROR_CODE_DAILY)
124 {
125 return self::getLimitMessage(
126 'LANDING_REQUEST_LIMITER_ERROR_DAILY',
127 self::SLIDER_CODES['DAILY'],
128 );
129 }
130
131 //left 2 in board
132 if ($errorCode === self::ERROR_CODE_MONTHLY)
133 {
134 return self::getLimitMessage(
135 'LANDING_REQUEST_LIMITER_ERROR_MONTHLY',
136 self::SLIDER_CODES['MONTHLY'],
137 );
138 }
139 }
140
141 return null;
142 }
143
151 protected function getTextFromLimitBoxError(Error $error): string
152 {
153 $customData = $error->getCustomData();
154 $errorCode = $error->getCode();
155
156 if ($errorCode === self::ERROR_CODE_RATE_LIMIT)
157 {
158 //top in board
159 return self::getLimitMessage(
160 'LANDING_REQUEST_LIMITER_ERROR_RATE',
161 null,
162 self::HELPDESK_CODES['RATE'],
163 );
164 }
165
166 if (
167 isset($customData['showSliderWithMsg'])
168 && $errorCode === self::ERROR_CODE_LIMIT_BAAS_CLOUD
169 )
170 {
171 //right 2 in board
172 if ($customData['showSliderWithMsg'] === true)
173 {
174 return self::getLimitMessage(
175 'LANDING_REQUEST_LIMITER_ERROR_BAAS',
176 self::SLIDER_CODES['BOOST_COPILOT_BOX'],
177 );
178 }
179
180 //left 1 in board
181 return self::getLimitMessage(
182 'LANDING_REQUEST_LIMITER_ERROR_MONTHLY',
183 self::SLIDER_CODES['REQUEST_BOX'],
184 );
185 }
186
187 //right 1 in board
188 return self::getLimitMessage(
189 'LANDING_REQUEST_LIMITER_ERROR_PROMO',
190 self::SLIDER_CODES['BOOST_COPILOT_BOX'],
191 );
192 }
193
201 public function getTextFromCheckLimit(int $requestCount): ?string
202 {
203 if (Loader::includeModule('bitrix24'))
204 {
205 return $this->getTextFromCheckCloudLimit($requestCount);
206 }
207
208 return $this->getTextFromCheckBoxLimit($requestCount);
209 }
210
218 protected function getTextFromCheckCloudLimit(int $requestCount): ?string
219 {
220 $reservedRequest = (new LimitControlService())->reserveRequest(
221 new Usage(Context::getFake()),
222 $requestCount
223 );
224
225 if ($reservedRequest->isSuccess())
226 {
227 return null;
228 }
229
230 $typeLimit = $reservedRequest->getTypeLimit();
231 //right 2 in board
232 if ($typeLimit === TypeLimit::BAAS)
233 {
234 return self::getLimitMessage(
235 'LANDING_REQUEST_LIMITER_ERROR_BAAS',
236 self::SLIDER_CODES['BOOST_COPILOT'],
237 );
238 }
239
240 //right 1 in board
241 if (Loader::includeModule('baas') && Baas::getInstance()->isAvailable())
242 {
243 return self::getLimitMessage(
244 'LANDING_REQUEST_LIMITER_ERROR_PROMO',
245 self::SLIDER_CODES['BOOST_COPILOT'],
246 );
247 }
248
249 $promoLimitCode = $reservedRequest->getPromoLimitCode();
250 //left 1 in board
251 if ($promoLimitCode === self::PROMO_LIMIT_CODES['DAILY'])
252 {
253 return self::getLimitMessage(
254 'LANDING_REQUEST_LIMITER_ERROR_DAILY',
255 self::SLIDER_CODES['DAILY'],
256 );
257 }
258
259 //left 2 in board
260 if ($promoLimitCode === self::PROMO_LIMIT_CODES['MONTHLY'])
261 {
262 return self::getLimitMessage(
263 'LANDING_REQUEST_LIMITER_ERROR_MONTHLY',
264 self::SLIDER_CODES['MONTHLY'],
265 );
266 }
267
268 return null;
269 }
270
278 protected function getTextFromCheckBoxLimit(int $requestCount): ?string
279 {
280 $cloudConfiguration = new Cloud\Configuration();
281 $registrationDto = $cloudConfiguration->getCloudRegistrationData();
282 if (!$registrationDto)
283 {
284 //top in board
285 return self::getLimitMessage('LANDING_REQUEST_LIMITER_ERROR_CLOUD_REGISTRATION',);
286 }
287
288 try
289 {
290 $reservedBoxRequest = (new LimitControlBoxService())->isAllowedQuery($requestCount);
291 }
292 catch (ArgumentException | ObjectNotFoundException | NotFoundExceptionInterface $e)
293 {
294 throw new GenerationException(GenerationErrors::notSendRequest);
295 }
296
297 if (!$reservedBoxRequest)
298 {
299 throw new GenerationException(GenerationErrors::notSendRequest);
300 }
301
302 if ($reservedBoxRequest->isSuccess())
303 {
304 return null;
305 }
306
307 $limitError = $reservedBoxRequest->getErrorByLimit();
308
309 if ($limitError === ErrorLimit::RATE_LIMIT)
310 {
311 //top in board
312 return self::getLimitMessage(
313 'LANDING_REQUEST_LIMITER_ERROR_RATE',
314 null,
315 self::HELPDESK_CODES['RATE'],
316 );
317 }
318
319 if ($limitError === ErrorLimit::BAAS_LIMIT)
320 {
321 if (Loader::includeModule('baas') && Baas::getInstance()->isAvailable())
322 {
323 //right 1 in board
324 return self::getLimitMessage(
325 'LANDING_REQUEST_LIMITER_ERROR_PROMO',
326 self::SLIDER_CODES['BOOST_COPILOT_BOX'],
327 );
328 }
329
330 //right 3 in board
331 return self::getLimitMessage(
332 'LANDING_REQUEST_LIMITER_ERROR_PROMO',
333 self::SLIDER_CODES['BOX'],
334 );
335 }
336
337 $typeLimit = $reservedBoxRequest->getTypeLimit();
338 if ($typeLimit === TypeLimit::BAAS)
339 {
340 //right 2 in board
341 return self::getLimitMessage(
342 'LANDING_REQUEST_LIMITER_ERROR_BAAS',
343 self::SLIDER_CODES['BOOST_COPILOT_BOX'],
344 );
345 }
346
347 if ($limitError === ErrorLimit::PROMO_LIMIT)
348 {
349 //left 1 in board
350 return self::getLimitMessage(
351 'LANDING_REQUEST_LIMITER_ERROR_MONTHLY',
352 self::SLIDER_CODES['REQUEST_BOX'],
353 );
354 }
355
356 return null;
357 }
358
368 private static function getLimitMessage(
369 string $phraseCode,
370 ?string $featurePromoterCode = null,
371 ?string $helpdeskCode = null,
372 ): string
373 {
374 if ($featurePromoterCode !== null)
375 {
376 return Loc::getMessage($phraseCode, [
377 '#LINK#' => "[url=/?FEATURE_PROMOTER={$featurePromoterCode}]",
378 '#/LINK#' => '[/url]'
379 ]);
380 }
381
382 if ($helpdeskCode !== null)
383 {
384 $helpUrl = Util::getArticleUrlByCode($helpdeskCode);
385
386 return Loc::getMessage($phraseCode, [
387 '#HELP#' => "[url=$helpUrl]",
388 '#/HELP#' => '[/url]'
389 ]);
390 }
391
392 return Loc::getMessage($phraseCode);
393 }
394}
getTextFromCheckCloudLimit(int $requestCount)
Определения RequestLimiter.php:218
getTextFromCheckLimit(int $requestCount)
Определения RequestLimiter.php:201
getTextFromCheckBoxLimit(int $requestCount)
Определения RequestLimiter.php:278
Определения error.php:15
$error
Определения subscription_card_product.php:20