Лимиты
Потолки, по которым меряется вызов, что получает упёршийся в потолок вызов и как просят о более высоком.
С чем выпускается ключ
Ключ выпускается с двумя потолками, и вызов обязан быть ниже обоих. Чтобы их получить, ничего не включают, в запросе о них не просят, и у только что выпущенного ключа они уже есть.
У организации та же пара потолков, и вызов меряется сначала по организации, потом по ключу — умолчание организации это десять ключей, то есть 200 запросов в секунду и 5 000 000 токенов в минуту. Это не сумма того, что разрешено ключам: выпуск одиннадцатого ключа его не поднимает. Поэтому вызов может уверенно укладываться в оба потолка своего ключа и всё равно получить отказ по любому из организационных, из-за трафика других ключей: тихий ключ упирается в секунду организации так же легко, как в её минуту.
Считаются потолки порознь и по разным часам — один по секунде, другой по минуте, — поэтому нагрузка может свободно укладываться в потолок запросов и всё равно выходить за потолок токенов. Именно так ведут себя несколько очень крупных вызовов в секунду, и именно это застаёт врасплох: со стороны счётчика запросов всё в порядке.
Что происходит на потолке
Вызов, который вышел бы за любой из потолков, отклоняется, а не встаёт в очередь: статус — 429, а type в конверте — rate_limit_error. Отказ решается до того, как вызов доходит до провайдера, поэтому наверху его не видят.
Потолок запросов можно считать по мере их прихода. Потолок токенов — нет: сколько будет стоить вызов, неизвестно, пока на него не ответили. Поэтому платформа оценивает токены вызова до отправки наверх и относит на минуту оценку, а затем сверяет её с фактическим потреблением, о котором сообщает ответ. Там, где сверка доходит, в минуте лежит настоящая величина, а не догадка, и серия вызовов, оказавшихся заметно дешевле своих оценок, оставляет место за собой. Два случая заканчиваются иначе, и оба сделаны намеренно. Коррекция наводится ровно на ту минуту, на которую вызов был отнесён, поэтому, когда последующий вызов уже увёл счётчик в новую минуту, исправлять нечего: та минута больше не то, на чём стоит счётчик. Уводит его не истечение времени, а именно следующий вызов. И два счётчика уходят вперёд независимо, так что коррекция может дойти до одного и не найти ничего на другом. Оценка действительно остаётся во втором случае: операция, которая не сообщает токенов вовсе, остаётся с тем, что на неё отнесли: генерация изображений считается в изображениях, а не в токенах, и коррекция к нулю вернула бы всю оценку обратно — эта поверхность перестала бы стоить хоть что-то против потолка.
Стриминг арифметику не меняет: начавшийся поток — это уже посчитанный вызов. Подсчёт токенов в неё не входит вовсе: эта операция не зовёт провайдера и не тратит квоту — тем она и удобна перед крупным запросом.
Перед повтором на 429 отступайте, удлиняйте паузу с каждой попыткой и ограничивайте их число.
Как просить о большем
Повышение — это разговор, а не настройка. Ни один из потолков не правится в консоли, и ни один член запроса не просит о более высоком: напишите в поддержку, описав трафик, который нужно пропускать, — его форму, а не только пик, — и потолки на вашем ключе поднимут.