Перейти к основному содержимому

Ограничения по скорости

Ограничения на количество запросов — это меры, которые наш API применяет для контроля числа обращений пользователей или клиентов к нашим сервисам в течение определенного периода времени.

Почему у нас есть ограничения на количество запросов?

Ограничения на количество запросов — это общепринятая практика для API, и они вводятся по нескольким причинам:

  • Они помогают защитить API от злоупотреблений или неправильного использования. Например, злоумышленник мог бы наводнить API запросами, пытаясь перегрузить его или вызвать сбои в обслуживании. Устанавливая ограничения на количество запросов, RockAPI может предотвратить такую активность.

  • Ограничения на количество запросов помогают обеспечить справедливый доступ к API для всех. Если один человек или организация делают чрезмерное количество запросов, это может замедлить работу API для всех остальных. Ограничивая количество запросов, которые может сделать один пользователь, RockAPI обеспечивает возможность использования API максимальному числу людей без замедлений.

  • Ограничения на количество запросов помогают RockAPI управлять общей нагрузкой на инфраструктуру. Если количество запросов к API резко возрастет, это может нагрузить серверы и вызвать проблемы с производительностью. Устанавливая ограничения на количество запросов, RockAPI может поддерживать стабильную и качественную работу для всех пользователей.

Как работают ограничения на количество запросов?

Ограничения на количество запросов в нашем API измеряются в основном в RPM (Requests Per Minute — запросов в минуту). Текущий лимит установлен на уровне 100 RPM для стандартных аккаунтов. Если количество запросов превысит 100 в минуту, вы получите код ответа 429.

Мы понимаем, что некоторым пользователям могут потребоваться более высокие лимиты для удовлетворения их конкретных потребностей. Если вы обнаружите, что ваше использование постоянно приближается к стандартному лимиту или превышает его, мы рекомендуем вам обратиться в нашу службу поддержки. Мы готовы помочь вам масштабировать вашу интеграцию и обеспечить необходимую вам мощность.

Для запросов об увеличении ваших лимитов на количество запросов или обсуждения индивидуальных решений, пожалуйста, свяжитесь с нашей службой поддержки по адресу:

https://rockapi.ru/contact.html

Наша команда стремится работать с вами, чтобы найти наилучшее решение для вашего случая использования, сохраняя при этом общую производительность и стабильность нашей API-инфраструктуры.

Снижение количества ошибок

Какие шаги я могу предпринять, чтобы уменьшить их?

В OpenAI Cookbook есть ноутбук на Python, который объясняет, как избежать ошибок ограничения скорости, а также пример Python-скрипта для соблюдения ограничений скорости при пакетной обработке API-запросов.

Вам также следует проявлять осторожность при предоставлении программного доступа, функций массовой обработки и автоматической публикации в социальных сетях - рассмотрите возможность включения этих функций только для доверенных клиентов.

Для защиты от автоматизированного и массового злоупотребления установите лимит использования для отдельных пользователей в рамках указанного временного периода (ежедневно, еженедельно или ежемесячно). Рассмотрите возможность внедрения жесткого ограничения или процесса ручной проверки для пользователей, превышающих лимит.

Повторные попытки с экспоненциальной задержкой

Один из простых способов избежать ошибок ограничения скорости - автоматически повторять запросы со случайной экспоненциальной задержкой. Повторные попытки с экспоненциальной задержкой означают короткий интервал ожидания при возникновении ошибки ограничения скорости, а затем повторение неудавшегося запроса. Если запрос по-прежнему неудачен, длина задержки увеличивается, и процесс повторяется. Это продолжается до тех пор, пока запрос не будет успешным или пока не будет достигнуто максимальное количество повторных попыток. Этот подход имеет множество преимуществ:

  • Автоматические повторные попытки позволяют восстанавливаться от ошибок ограничения скорости без сбоев или потери данных.
  • Экспоненциальная задержка означает, что первые повторные попытки могут быть сделаны быстро, при этом выгода от более длительных задержек, если первые несколько попыток не удаются.
  • Добавление случайного разброса к задержке помогает избежать одновременных повторных попыток.

Обратите внимание, что неудачные запросы также учитываются в вашем лимите в минуту, поэтому непрерывная повторная отправка запроса не будет работать.

Ниже приведены несколько примеров решений для Python, использующих экспоненциальную задержку.

Пример 1: Использование библиотеки Tenacity

Tenacity - это лицензированная по Apache 2.0 многоцелевая библиотека для повторных попыток, написанная на Python, чтобы упростить задачу добавления поведения повторных попыток к чему угодно. Чтобы добавить экспоненциальную задержку к вашим запросам, вы можете использовать декоратор tenacity.retry. В приведенном ниже примере используется функция tenacity.wait_random_exponential для добавления случайной экспоненциальной задержки к запросу.

from openai import OpenAI
client = OpenAI(
api_key='$ROCKAPI_API_KEY',
base_url='https://api.rockapi.ru/openai/v1'
)

from tenacity import (
retry,
stop_after_attempt,
wait_random_exponential,
) # для экспоненциальной задержки

@retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6))
def completion_with_backoff(**kwargs):
return client.completions.create(**kwargs)

completion_with_backoff(model="gpt-4o-mini", prompt="Жили-были,")

Обратите внимание, что библиотека Tenacity является сторонним инструментом, и OpenAI не гарантирует ее надежности или безопасности.

Пример 2: Использование библиотеки backoff

Еще одна библиотека на Python, предоставляющая декораторы функций для задержки и повторных попыток - это backoff:

import backoff 
import openai
from openai import OpenAI
client = OpenAI(
api_key='$ROCKAPI_API_KEY',
base_url='https://api.rockapi.ru/openai/v1'
)

@backoff.on_exception(backoff.expo, openai.RateLimitError)
def completions_with_backoff(**kwargs):
return client.completions.create(**kwargs)

completions_with_backoff(model="gpt-4o-mini", prompt="Жили-были,")

Как и Tenacity, библиотека backoff является сторонним инструментом, и OpenAI не гарантирует ее надежности или безопасности.

Пример 3: Ручная реализация экспоненциальной задержки

Если вы не хотите использовать сторонние библиотеки, вы можете реализовать собственную логику задержки, следуя этому примеру:

# импортируем необходимые библиотеки

import random
import time

import openai
from openai import OpenAI
client = OpenAI(
api_key='$ROCKAPI_API_KEY',
base_url='https://api.rockapi.ru/openai/v1'
)

# определяем декоратор для повторных попыток

def retry_with_exponential_backoff(
func,
initial_delay: float = 1,
exponential_base: float = 2,
jitter: bool = True,
max_retries: int = 10,
errors: tuple = (openai.RateLimitError,),
):
"""Повторная попытка выполнения функции с экспоненциальной задержкой."""

def wrapper(*args, **kwargs):
# Инициализируем переменные
num_retries = 0
delay = initial_delay

# Цикл до получения успешного ответа или достижения максимального числа попыток или возникновения исключения
while True:
try:
return func(*args, **kwargs)

# Повторяем попытку при возникновении определенных ошибок
except errors as e:
# Увеличиваем счетчик попыток
num_retries += 1

# Проверяем, достигнуто ли максимальное количество попыток
if num_retries > max_retries:
raise Exception(
f"Превышено максимальное количество попыток ({max_retries})."
)

# Увеличиваем задержку
delay *= exponential_base * (1 + jitter * random.random())

# Ждем заданное время
time.sleep(delay)

# Вызываем исключения для любых ошибок, не указанных в списке
except Exception as e:
raise e

return wrapper

@retry_with_exponential_backoff
def completions_with_backoff(**kwargs):
return client.completions.create(**kwargs)

Снова отметим, что OpenAI не гарантирует безопасность или эффективность этого решения, но это может быть хорошей отправной точкой для создания вашего собственного решения.

Снизьте max_tokens до соответствия размеру ваших завершений

Ваш лимит скорости рассчитывается как максимальное значение из max_tokens и оценочного количества токенов на основе количества символов в вашем запросе. Попробуйте установить значение max_tokens как можно ближе к ожидаемому размеру ответа.