Пулы API-ключей
Пулы API-ключей позволяют настроить несколько API-ключей для одного и того же провайдера. Запросы распределяются с помощью weighted round-robin, а система автоматически переключается на другой доступный ключ при достижении лимитов скорости или возникновении сбоев.
Когда использовать
- Сценарии с высокой параллельностью: лимита скорости одного ключа недостаточно; несколько ключей делят между собой нагрузку трафика
- Совместное использование в команде: каждый участник команды использует квоту своего ключа, чтобы распределить расходы
- Объединение бесплатных тарифов: ключи от нескольких бесплатных аккаунтов используются по очереди
- Высокая доступность: когда один ключ выходит из строя, система автоматически переключается на другой, чтобы избежать прерываний
- Разделение теста и production: используйте разные веса, чтобы управлять долей запросов, уходящих на production-ключи и тестовые ключи
Практическое руководство
Добавление API-ключа
- Откройте Settings → Provider Management
- Выберите целевого провайдера (например, OpenAI)
- Найдите раздел API Key Pool
- Нажмите кнопку Add Key
- Заполните информацию:
| Поле | Обязательно | Описание |
|---|---|---|
| API Key | Да | Значение ключа или ссылка на переменную окружения (с префиксом $) |
| Label | Нет | Название для удобной идентификации, например "Production Key #1" или "Test Key" |
| Weight | Нет | 1–100, по умолчанию 1; более высокие значения увеличивают вероятность выбора |
- Нажмите Confirm, чтобы добавить
Настройка веса
- Найдите целевой ключ в списке API-ключей
- Измените значение Weight (1–100)
- Вес определяет относительную вероятность выбора этого ключа
Включение / отключение отдельного ключа
- Найдите целевой ключ в списке API-ключей
- Переключите тумблер Enabled
- Отключенные ключи исключаются из ротации, но их конфигурация сохраняется
Удаление ключа
- Найдите целевой ключ в списке API-ключей
- Нажмите кнопку Delete
- Подтвердите удаление (это действие нельзя отменить)
Справочник конфигурации
| Настройка | Тип | По умолчанию | Диапазон | Описание |
|---|---|---|---|---|
| API Key | String | (empty) | -- | Значение ключа или ссылка $ENV_VAR |
| Label | String | (empty) | -- | Имя примечания для различения ключей |
| Weight | Integer | 1 | 1–100 | Вес для weighted round-robin |
| Enabled | Boolean | true | -- | Участвует ли этот ключ в ротации |
| Order | Integer | 0 | -- | Порядок отображения в списке |
Примечания о поведении
Weighted Round-Robin
Каждый ключ в пуле занимает количество "слотов", пропорциональное его весу. Elftia проходит эти слоты в фиксированной последовательности, распределяя запросы согласно соотношению весов.
Пример распределения весов:
Предположим, есть 3 ключа с весами 3, 2 и 1 (общий вес = 6):
| Ключ | Вес | Доля | Выборов на 6 запросов |
|---|---|---|---|
| Key A | 3 | 50% | 3 |
| Key B | 2 | 33% | 2 |
| Key C | 1 | 17% | 1 |
Порядок ротации: A → A → A → B → B → C → A → A → A → B → ...
Пример с равными весами:
3 ключа, каждый с весом 1 (общий вес = 3), поэтому они чередуются строго: A → B → C → A → B → C → ...
Привязка к сессии
Все запросы в рамках одной чат-сессии привязаны к одному и тому же API-ключу. У этого решения есть две важные причины:
- Кэширование prompt: некоторые провайдеры (например, Anthropic) поддерживают кэширование prompt — последовательные запросы с одним и тем же ключом могут попадать в кэш, значительно снижая задержку и стоимость
- Согласованность: предотвращает сбросы счетчиков лимитов скорости, вызванные частыми переключениями ключей в рамках одного разговора
Привязка сессии переназначается в следующих ситуациях:
- Текущий привязанный ключ отключен или удален
- Текущий привязанный ключ переходит в период cooldown из-за ошибок
- Сессия завершается (закрыта или удалена)
Автоматическое переключение при сбое
Когда запрос сталкивается с ошибкой, пул ключей применяет разные стратегии в зависимости от типа ошибки:
Ограничение скорости (429/529)
При получении ответа HTTP 429 (rate limit) или 529 (service overloaded):
- Текущий ключ переходит в период cooldown
- Система автоматически переключается на следующий доступный ключ в пуле
- Запрос повторяется с новым ключом
Механизм cooldown:
| Последовательные сбои | Длительность cooldown | Формула |
|---|---|---|
| 1-й | 60 секунд | 60s × 2^0 |
| 2-й | 120 секунд | 60s × 2^1 |
| 3-й | 240 секунд | 60s × 2^2 |
| 4-й | 480 секунд | 60s × 2^3 |
| 5-й и далее | 900 секунд (предел) | min(60s × 2^(n-1), 900s) |
Ключ исключается из ротации на период cooldown и автоматически снова становится доступным после его истечения. Успешный запрос сбрасывает счетчик последовательных сбоев для этого ключа.
Ошибка аутентификации (401/403)
При получении ответа HTTP 401 (Unauthorized) или 403 (Forbidden):
- Ключ навсегда отключается (помечается как отключенный в базе данных)
- Система автоматически переключается на следующий доступный ключ
- В UI настроек ключ отображается как отключенный
Это связано с тем, что ошибки аутентификации обычно означают, что сам ключ стал недействительным (истек, отозван или квота исчерпана), и ожидание вряд ли восстановит его работоспособность.
Блок-схема переключения при сбое
Request sent
|
v
Use session-bound key
|
+---> Success ---> Reset cooldown counter ---> Return response
|
+---> 429/529 (rate limited)
| |
| v
| Current key enters cooldown
| (starts at 60s, exponential backoff, cap at 15 minutes)
| |
| v
| Any other available keys in the pool?
| | |
| Yes No
| | |
| v v
| Switch to new key Request fails, return error
| Rebind session (all keys unavailable)
| |
| v
| Retry with new key
|
+---> 401/403 (authentication failure)
|
v
Permanently disable this key
|
v
Any other available keys in the pool?
| |
Yes No
| |
v v
Switch to new key Request fails, return error
Rebind session
Связь между пулом ключей и API-ключом уровня провайдера
- Когда для провайдера настроены и API-ключ уровня провайдера (поле
api_keyв конфигурации Provider), и пул ключей, приоритет имеет пул ключей - Если пул ключей пуст (нет записей), используется API-ключ уровня провайдера
- Для возможностей балансировки нагрузки и переключения при сбоях рекомендуется использовать пул ключей вместо API-ключа уровня провайдера
Устранение неполадок
| Проблема | Возможная причина | Решение |
|---|---|---|
| Все ключи находятся в cooldown; запросы завершаются ошибкой | Все ключи одновременно достигли лимитов скорости | Дождитесь окончания cooldown (до 15 минут) или добавьте больше ключей, чтобы расширить емкость пула |
| Ключ никогда не выбирается | Вес равен 0 или у других ключей намного более высокие веса | Проверьте настройки веса; убедитесь, что вес не меньше 1 |
| Ключ автоматически отключен | Была получена ошибка аутентификации 401/403 | Проверьте, не истек ли ключ и не был ли он отозван; проверьте статус ключа на сайте провайдера, затем вручную включите его после устранения проблемы |
| Пул настроен правильно, но запросы все равно используют старый ключ | Привязка сессии закреплена за старым ключом | Начните новую чат-сессию или дождитесь, пока старый ключ перейдет в cooldown, чтобы система автоматически выполнила перепривязку |
| Добавленный ключ не начинает действовать сразу | Кэш ключей не обновлен | Сохраните конфигурацию и повторите попытку; система обновляет кэш автоматически |
| Ключ из переменной окружения не удается разрешить | Имя переменной неверно или не задано | Убедитесь, что имя переменной после $ точно совпадает с заданным в системе, включая регистр |
| Cooldown слишком долгий | Экспоненциальная задержка после нескольких последовательных попаданий в rate limit | Снизьте частоту запросов или добавьте больше ключей, чтобы распределить нагрузку. Максимальный cooldown — 15 минут |
| Ключ переключился внутри той же сессии | Исходный привязанный ключ перешел в cooldown или был отключен | Это ожидаемое поведение; система автоматически выбирает лучший доступный ключ |
Связанные страницы
- Обзор LLM-провайдеров - Понять общую архитектуру системы провайдеров
- Добавление провайдера - Настроить базовую информацию провайдера и API-ключ
- Пользовательские endpoints - Сервисы локального развертывания обычно не требуют пула ключей
- Параметры модели - Настроить параметры генерации модели