3declare(strict_types=1);
5namespace Bitrix\Landing\Copilot\Connector\AI;
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;
15use Bitrix\Landing\Copilot\Generation\GenerationException;
16use Bitrix\Landing\Copilot\Generation\Type\GenerationErrors;
17use Bitrix\Main\ArgumentException;
19use Bitrix\Main\Loader;
20use Bitrix\Main\Localization\Loc;
21use Bitrix\Main\ObjectNotFoundException;
23use Psr\Container\NotFoundExceptionInterface;
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',
71 'MONTHLY' =>
'Monthly',
83 if (Loader::includeModule(
'bitrix24'))
100 $errorCode =
$error->getCode();
103 if ($errorCode === self::ERROR_CODE_LIMIT_BAAS_CLOUD)
105 return self::getLimitMessage(
106 'LANDING_REQUEST_LIMITER_ERROR_BAAS',
107 self::SLIDER_CODES[
'BOOST_COPILOT'],
111 if (str_starts_with($errorCode, self::ERROR_CODE_LIMIT_CLOUD))
114 if (Loader::includeModule(
'baas') && Baas::getInstance()->isAvailable())
116 return self::getLimitMessage(
117 'LANDING_REQUEST_LIMITER_ERROR_PROMO',
118 self::SLIDER_CODES[
'BOOST_COPILOT'],
123 if ($errorCode === self::ERROR_CODE_DAILY)
125 return self::getLimitMessage(
126 'LANDING_REQUEST_LIMITER_ERROR_DAILY',
127 self::SLIDER_CODES[
'DAILY'],
132 if ($errorCode === self::ERROR_CODE_MONTHLY)
134 return self::getLimitMessage(
135 'LANDING_REQUEST_LIMITER_ERROR_MONTHLY',
136 self::SLIDER_CODES[
'MONTHLY'],
153 $customData =
$error->getCustomData();
154 $errorCode =
$error->getCode();
156 if ($errorCode === self::ERROR_CODE_RATE_LIMIT)
159 return self::getLimitMessage(
160 'LANDING_REQUEST_LIMITER_ERROR_RATE',
162 self::HELPDESK_CODES[
'RATE'],
167 isset($customData[
'showSliderWithMsg'])
168 && $errorCode === self::ERROR_CODE_LIMIT_BAAS_CLOUD
172 if ($customData[
'showSliderWithMsg'] ===
true)
174 return self::getLimitMessage(
175 'LANDING_REQUEST_LIMITER_ERROR_BAAS',
176 self::SLIDER_CODES[
'BOOST_COPILOT_BOX'],
181 return self::getLimitMessage(
182 'LANDING_REQUEST_LIMITER_ERROR_MONTHLY',
183 self::SLIDER_CODES[
'REQUEST_BOX'],
188 return self::getLimitMessage(
189 'LANDING_REQUEST_LIMITER_ERROR_PROMO',
190 self::SLIDER_CODES[
'BOOST_COPILOT_BOX'],
203 if (Loader::includeModule(
'bitrix24'))
220 $reservedRequest = (
new LimitControlService())->reserveRequest(
221 new Usage(Context::getFake()),
225 if ($reservedRequest->isSuccess())
230 $typeLimit = $reservedRequest->getTypeLimit();
232 if ($typeLimit === TypeLimit::BAAS)
234 return self::getLimitMessage(
235 'LANDING_REQUEST_LIMITER_ERROR_BAAS',
236 self::SLIDER_CODES[
'BOOST_COPILOT'],
241 if (Loader::includeModule(
'baas') && Baas::getInstance()->isAvailable())
243 return self::getLimitMessage(
244 'LANDING_REQUEST_LIMITER_ERROR_PROMO',
245 self::SLIDER_CODES[
'BOOST_COPILOT'],
249 $promoLimitCode = $reservedRequest->getPromoLimitCode();
251 if ($promoLimitCode === self::PROMO_LIMIT_CODES[
'DAILY'])
253 return self::getLimitMessage(
254 'LANDING_REQUEST_LIMITER_ERROR_DAILY',
255 self::SLIDER_CODES[
'DAILY'],
260 if ($promoLimitCode === self::PROMO_LIMIT_CODES[
'MONTHLY'])
262 return self::getLimitMessage(
263 'LANDING_REQUEST_LIMITER_ERROR_MONTHLY',
264 self::SLIDER_CODES[
'MONTHLY'],
280 $cloudConfiguration =
new Cloud\Configuration();
281 $registrationDto = $cloudConfiguration->getCloudRegistrationData();
282 if (!$registrationDto)
285 return self::getLimitMessage(
'LANDING_REQUEST_LIMITER_ERROR_CLOUD_REGISTRATION',);
290 $reservedBoxRequest = (
new LimitControlBoxService())->isAllowedQuery($requestCount);
297 if (!$reservedBoxRequest)
302 if ($reservedBoxRequest->isSuccess())
307 $limitError = $reservedBoxRequest->getErrorByLimit();
309 if ($limitError === ErrorLimit::RATE_LIMIT)
312 return self::getLimitMessage(
313 'LANDING_REQUEST_LIMITER_ERROR_RATE',
315 self::HELPDESK_CODES[
'RATE'],
319 if ($limitError === ErrorLimit::BAAS_LIMIT)
321 if (Loader::includeModule(
'baas') && Baas::getInstance()->isAvailable())
324 return self::getLimitMessage(
325 'LANDING_REQUEST_LIMITER_ERROR_PROMO',
326 self::SLIDER_CODES[
'BOOST_COPILOT_BOX'],
331 return self::getLimitMessage(
332 'LANDING_REQUEST_LIMITER_ERROR_PROMO',
333 self::SLIDER_CODES[
'BOX'],
337 $typeLimit = $reservedBoxRequest->getTypeLimit();
338 if ($typeLimit === TypeLimit::BAAS)
341 return self::getLimitMessage(
342 'LANDING_REQUEST_LIMITER_ERROR_BAAS',
343 self::SLIDER_CODES[
'BOOST_COPILOT_BOX'],
347 if ($limitError === ErrorLimit::PROMO_LIMIT)
350 return self::getLimitMessage(
351 'LANDING_REQUEST_LIMITER_ERROR_MONTHLY',
352 self::SLIDER_CODES[
'REQUEST_BOX'],
368 private static function getLimitMessage(
370 ?
string $featurePromoterCode =
null,
371 ?
string $helpdeskCode =
null,
374 if ($featurePromoterCode !==
null)
376 return Loc::getMessage($phraseCode, [
377 '#LINK#' =>
"[url=/?FEATURE_PROMOTER={$featurePromoterCode}]",
378 '#/LINK#' =>
'[/url]'
382 if ($helpdeskCode !==
null)
384 $helpUrl = Util::getArticleUrlByCode($helpdeskCode);
386 return Loc::getMessage($phraseCode, [
387 '#HELP#' =>
"[url=$helpUrl]",
388 '#/HELP#' =>
'[/url]'
392 return Loc::getMessage($phraseCode);
const ERROR_CODE_LIMIT_CLOUD
getTextFromCheckCloudLimit(int $requestCount)
getTextFromCheckLimit(int $requestCount)
const ERROR_CODE_LIMIT_BAAS_CLOUD
getTextFromLimitCloudError(Error $error)
const ERROR_CODE_RATE_LIMIT
getTextFromLimitBoxError(Error $error)
getTextFromCheckBoxLimit(int $requestCount)
getTextFromError(Error $error)