惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
C
Cybersecurity and Infrastructure Security Agency CISA
N
News and Events Feed by Topic
C
Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
A
Arctic Wolf
Scott Helme
Scott Helme
P
Palo Alto Networks Blog
S
Schneier on Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tor Project blog
量子位
G
Google Developers Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
B
Blog RSS Feed
NISL@THU
NISL@THU
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
AWS News Blog
AWS News Blog
爱范儿
爱范儿
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
L
LINUX DO - 最新话题
Security Archives - TechRepublic
Security Archives - TechRepublic
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Secure Thoughts
Cloudbric
Cloudbric
aimingoo的专栏
aimingoo的专栏
L
Lohrmann on Cybersecurity
TaoSecurity Blog
TaoSecurity Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Hacker News: Ask HN
Hacker News: Ask HN
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
有赞技术团队
有赞技术团队
S
Security @ Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
G
GRAHAM CLULEY
P
Proofpoint News Feed
V
V2EX
Martin Fowler
Martin Fowler
C
CERT Recently Published Vulnerability Notes
Attack and Defense Labs
Attack and Defense Labs
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Cloudflare Blog
SecWiki News
SecWiki News
罗磊的独立博客
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
小众软件
小众软件
The Last Watchdog
The Last Watchdog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Auto AI Router: высокопроизводительный прокси-роутер для LLM API на Go
MiXaiLL76 · 2026-04-25 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение8 мин

Охват и читатели242

Кейс

Если вы работаете с LLM-провайдерами, то наверняка сталкивались с одной и той же проблемой: у OpenAI лимит 100 RPM на ключ, у Vertex AI — свои квоты на проект, у Anthropic — отдельные ограничения. В итоге приходится держать несколько ключей, балансировать нагрузку вручную, следить, чтобы один заблокированный доступ не уронил всё приложение, и при этом хочется сохранить единый OpenAI-совсместимый эндпоинт для клиентского кода.

Именно для этого и создан Auto AI Router — лёгкий прокси-роутер на Go, который принимает запросы в формате OpenAI API и прозрачно распределяет их между несколькими провайдерами и ключами с балансировкой нагрузки, защитой от банов и контролем RPM-лимитов.

Репозиторий

Документация: auto_ai_router

Зачем ещё один роутер? Почему не LiteLLM?

LiteLLM — отличный инструмент, но он написан на Python и несёт весь соответствующий груз: интерпретатор, GIL, потребление памяти 200–500 МБ даже в простой конфигурации. Для высоконагруженного прокси, где каждые несколько миллисекунд задержки на маршрутизацию имеют значение, это не идеал.

Auto AI Router написан на Go и компилируется в единый статический бинарник. Типичное потребление RAM — десятки мегабайт, старт — меньше секунды. Это делает его удобным для деплоя в сайдкар-контейнерах или на ресурсоограниченных узлах.

Принципиальные отличия:

Аспект

LiteLLM

Auto AI Router

Язык

Python

Go

Бинарник

нет (pip/docker)

один статический бинарник / docker

Потребление RAM

200–500 МБ

~30–80 МБ

Round-robin балансировка

есть

есть, исправлен классический баг распределения

Session-sticky routing

нет

есть (по user, session_id)

Fail2ban per credential

нет

есть (настраиваемые правила по HTTP-кодам)

LiteLLM DB совместимость

нативная

интеграция с БД LiteLLM (PostgreSQL)

Режим прокси-цепочки

нет (есть кривая fallback система)

есть (proxy-credential → другой роутер)

Redis для rate limiting

нет

есть (глобальные счётчики для кластера)

Важный момент: Auto AI Router не заменяет LiteLLM полностью — он не управляет виртуальными ключами, моделями и пользователями через UI. Его задача уже и конкретнее: быть максимально быстрым и надёжным прокси-слоем между вашими приложениями и LLM-провайдерами.

Архитектура

Архитектура

Архитектура

Роутер принимает все запросы в формате OpenAI Chat Completions и конвертирует их в нативный формат нужного провайдера. Для Vertex AI — это Google GenAI SDK, для Anthropic — Messages API, и т.д. Ответы конвертируются обратно в OpenAI-формат.

Основные возможности

1. Multi-provider routing

Один endpoint может обслуживать несколько провайдеров:

  • OpenAI

  • Vertex AI

  • Anthropic

  • Gemini AI Studio

  • Amazon Bedrock

  • Proxy — отправка запроса в другой Auto AI Router

Клиент продолжает работать через OpenAI SDK, а роутер берёт на себя маршрутизацию и конвертацию.

2. Round-robin балансировка между credentials

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

credentials:
  - name: vertex_cred_1
    type: vertex-ai
    project_id: project-a
    credentials_file: sa-a.json
    rpm: 100

  - name: vertex_cred_2
    type: vertex-ai
    project_id: project-b
    credentials_file: sa-b.json
    rpm: 100

models:
  - name: gemini-2.5-flash
    credential: vertex_cred_1
  - name: gemini-2.5-flash
    credential: vertex_cred_2

В этом примере gemini-2.5-flash получает уже не 100 RPM, а 200 RPM суммарно. Запросы будут чередоваться между vertex_cred_1 и vertex_cred_2.

Отдельный момент — корректная реализация round-robin при пропуске ключей. Если креды временно забанен или упираются в лимит, роутер не “залипает” на первом доступном, а сохраняет честное чередование между оставшимися.

3. Fail2ban для credentials

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

fail2ban:
  max_attempts: 3
  ban_duration: permanent
  error_codes: [401, 403, 429, 500, 502, 503, 504]
  error_code_rules:
    - code: 429
      max_attempts: 5
      ban_duration: 5m

Например:

  • 429 — временный бан на 5 минут;

  • 401 или 403 — повод навсегда убрать credential из ротации;

  • 5xx — можно трактовать как временную деградацию upstream.

За счёт этого один проблемный ключ не ломает всю систему.

Пример отслеживания блокировок ключей

Пример отслеживания блокировок ключей

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

4. Session-sticky routing

WIP - находится на стадии клиентского тестирования

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

Проблема в том, что обычный round-robin разрушает такую привязку.

Решение — session-sticky routing. Роутер запоминает, какой кред уже обслуживал конкретную сессию, и направляет следующие запросы туда же.

response = client.chat.completions.create(
    model="gemini-2.5-flash",
    messages=[...],
    user="conversation-id-123",
)

Достаточно передать стабильный идентификатор сессии, например через user.

Сценарий

Без sticky

С sticky

Запрос 1 (10 000 токенов)

cred_A, полная стоимость

cred_A, полная стоимость

Запрос 2 (10 200 токенов)

cred_B, полная стоимость

cred_A, 200 новых токенов

Запрос 3 (10 400 токенов)

cred_A, полная стоимость

cred_A, 200 новых токенов

Для длинных контекстов экономия достигает 80–90%.

Источники session_id поддерживаются по приоритету: extra_body.litellm_session_id, extra_body.chat_id, extra_body.session_id, session_id, user, safety_identifier, prompt_cache_key.

Важно, что привязка записывается только после успешного завершения запроса. Если запрос завершился ошибкой, sticky-связка не фиксируется, и следующий запрос снова пойдёт через обычный выбор доступного ключа.

5. Двухуровневый rate limiting

Лимиты задаются сразу на двух уровнях:

  • Per-credential — RPM и TPM для конкретного ключа;

  • Per-model — RPM и TPM для конкретной модели.

credentials:
  - name: openai_main
    rpm: 200
    tpm: 100000

models:
  - name: gpt-4o
    credential: openai_main
    rpm: 100
    tpm: 50000

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

Это позволяет гибко настраивать поведение: например, ограничивать конкретную модель сильнее, чем весь ключ целиком.

Мониторинг TPM

Мониторинг TPM

Благодаря логике Ai-router проекты способы держать нагрузку до нескольких десятков миллионов TPM без ошибок или необходимости поиска дорогостоящих энтерпрайз-решений от провайдеров.

6. Redis для распределённого rate limiting

На одной инстанции локальных счётчиков достаточно. Но при горизонтальном масштабировании появляются проблемы: каждая реплика видит только свою часть трафика, и лимиты перестают быть глобальными.

С Redis лимиты становятся глобальными — все реплики делят единый счётчик:

redis:
  enabled: true
  addresses:
    - "valkey:6379"
  force_single_client: true

Реализовано через Lua-скрипты на стороне Redis: sliding window в sorted set, атомарная проверка всех 4 счётчиков (credential RPM + credential TPM + model RPM + model TPM) в одном вызове без TOCTOU-гонок.

7. Proxy chains

Можно настроить fallback на другой Auto AI Router:

credentials:
  - name: proxy_backup
    type: proxy
    base_url: http://backup-router.internal:8080
    api_key: sk-remote-master-key
    is_fallback: true

При недоступности всех primary-кредентиалов трафик автоматически уходит на резервный роутер. Статистика с удалённого /health синхронизируется каждые 30 секунд.

8. Поддержка Vertex AI, Anthropic и других провайдеров

Для OpenAI запросы идут почти напрямую. Для остальных провайдеров роутер берёт на себя адаптацию OpenAI-совместимого формата к нативному API. Например, для Vertex AI он поддерживает мультимодальность, streaming через SSE, tools, structured output на основе JSON Schema, thinking/reasoning для Gemini, генерацию изображений и маппинг reasoning_effort из OpenAI- и Anthropic-форматов.

# Чтобы включить thinking на Gemini 2.5 Flash,
# достаточно передать стандартный параметр
response = client.chat.completions.create(
    model="gemini-2.5-flash",
    messages=[...],
    reasoning_effort="high",
)

Это позволяет использовать один и тот же OpenAI-совместимый клиентский интерфейс поверх разных провайдеров без переписывания интеграции.

9. Responses API

Роутер поддерживает и OpenAI Responses API на endpoint /v1/responses:

  • конвертирует input в messages и обратно; (для моделей, у которых нет официальной поддержки Responses API)

  • поддерживает multi-turn через previous_response_id;

  • хранит историю в bbolt или Redis;

  • может использовать сохранённый credential для продолжения той же цепочки запросов.

r1 = client.responses.create(
    model="gpt-4o",
    input="Привет! Я работаю над проектом на Go.",
    store=True,
    user="conv-123",
)

r2 = client.responses.create(
    model="gpt-4o",
    input="Расскажи о горутинах.",
    previous_response_id=r1.id,
    store=True,
    user="conv-123",
)

10. Интеграция с LiteLLM DB

Если у вас уже развёрнут LiteLLM с PostgreSQL — роутер может:

  • Валидировать API-ключи через таблицу LiteLLM_VerificationToken

  • Логировать расходы в LiteLLM_SpendLogs с батчевой записью

  • Агрегировать дневные расходы по пользователям, командам

litellm_db:
  enabled: true
  database_url: "os.environ/LITELLM_DATABASE_URL"
  log_batch_size: 100
  log_flush_interval: 5s

Это позволяет использовать Auto AI Router как высокопроизводительный прокси-слой поверх существующей LiteLLM-инфраструктуры, не мигрируя всю систему.

Мониторинг

Пример визуализации ДБ по Heath

Пример визуализации ДБ по Heath

Роутер предоставляет несколько способов наблюдения за состоянием системы:

  • /health — JSON со статусом credentials, моделей и удалённых proxy;

  • /vhealth — HTML-страница для быстрого визуального осмотра;

  • /metrics — Prometheus-метрики.

monitoring:
  prometheus_enabled: true

Пример Grafana-дашборда можно построить на метриках:

  • auto_ai_router_credential_rpm_current — загрузка креда

  • auto_ai_router_credential_banned — 1 = кред забанен

  • auto_ai_router_requests_duration_seconds — распределение задержки (latency distribution)

Средняя задержка по креду в Grafana

Средняя задержка по креду в Grafana

Быстрый старт

Docker

docker run -p 8080:8080 \
  -v $(pwd)/config.yaml:/app/config.yaml \
  ghcr.io/mixaill76/auto_ai_router:latest

Минимальный config.yaml

server:
  port: 8080
  master_key: "sk-your-master-key"

credentials:
  - name: openai_main
    type: openai
    api_key: "os.environ/OPENAI_API_KEY"
    base_url: "https://api.openai.com"
    rpm: 100
    tpm: 50000

models:
  - name: gpt-4o
    credential: openai_main

Запрос через OpenAI SDK

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8080/v1",
    api_key="sk-your-master-key",
)

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}],
)

Для клиентского кода меняются только base_url и api_key.

Безопасность

Безопасность — ещё один важный аргумент в пользу Auto AI Router. Для прокси-слоя, через который проходят ключи, лимиты и маршрутизация запросов, безопасность — базовое требование. У Auto AI Router здесь есть понятное преимущество: это более узкий и простой по устройству инструмент, чем крупные универсальные решения. А значит, его легче проверять, изолировать внутри инфраструктуры, ограничивать сетевой доступ и использовать строго по назначению — как слой маршрутизации ключей и запросов, без лишних интерфейсов и дополнительной логики.

Из последних проблем с LiteLLM

Из последних проблем с LiteLLM

На этом фоне показателен недавний инцидент вокруг LiteLLM, а также другие случаи, связанные с раскрытием чувствительных данных через эндпоинты и логи. Это не означает, что большие инструменты “плохие”, но хорошо показывает общий принцип: чем уже зона ответственности компонента, тем проще сделать его безопасным и держать под контролем.

  • Секреты в конфиге через os.environ/VAR_NAME — ключи не хранятся в файлах

  • Аутентификация по master key через Authorization: Bearer header

  • Дополнительно: валидация по токенам LiteLLM DB

  • /health, /vhealth, /metrics — без аутентификации (для мониторинга)

Итоги

Auto AI Router решает прикладную задачу: принять OpenAI-совместимый запрос и надёжно доставить его до нужного LLM-провайдера, даже если у вас несколько ключей, несколько поставщиков и разные ограничения по rate limit.

Он особенно полезен, если:

  • у вас несколько доступов для одного или нескольких LLM-провайдеров;

  • нужен единый OpenAI-совместимый эндпоинт без переписывания клиентского кода;

  • важны отказоустойчивость и автоматическое исключение проблемных ключей;

  • хочется использовать кэширование запросов эффективнее за счёт session-sticky routing;

  • уже есть LiteLLM DB, но нужен более лёгкий и быстрый прокси-слой.

При этом Auto AI Router не пытается заменить LiteLLM как систему управления доступом, моделями и пользователями. Это более узкий инструмент: быстрый маршрутизатор и прокси для LLM API.

Репозиторий: github.com/MiXaiLL76/auto_ai_router

Документация: auto_ai_router