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

Доступность LLM-провайдеров

LLM-провайдеры падают чаще, чем хочется: за последний год Anthropic, OpenAI и OpenRouter ловили продолжительные incidents по нескольку раз. У большинства есть RSS/JSON status-страница, но никто не присылает push в момент инцидента.

Используем активные мониторы Notifly — функция в Yandex Cloud сама раз в минуту дёргает нужный URL и шлёт алёрт через ваш канал.

Большинство SaaS отдаёт JSON по https://status.<vendor>.com/api/v2/status.json (совместимо с Statuspage.io). При нормальной работе там status.indicator == "none".

Самое простое — мониторить сам факт 200 OK на коротком endpoint:

{
"kind": "http",
"target": "https://status.anthropic.com/api/v2/status.json",
"intervalSec": 60,
"timeoutSec": 5,
"expectedStatus": 200,
"consecutiveFails": 3,
"alertMessage": "status.anthropic.com не отвечает",
"recoveryMessage": "Anthropic снова отвечает"
}

Это покрывает случаи «status-страница лежит», но не ловит «статус is не green». Для второго проще написать маленькую cloud-функцию, которая раз в минуту читает JSON и шлёт POST /message при indicator != "none".

Status-страница лагает — самый честный мониторинг это пинг продакшн-endpoint с дешёвой моделью и max_tokens: 1:

# tiny health-script, удобно завернуть в YC Function с timer-trigger
import os, time, requests, anthropic
c = anthropic.Anthropic()
t0 = time.time()
try:
c.messages.create(
model="claude-haiku-4-5",
max_tokens=1,
messages=[{"role": "user", "content": "ping"}],
)
latency = time.time() - t0
if latency > 5:
notify("⏱️ Anthropic latency", f"{latency:.1f}s на дешёвом запросе", 7)
except Exception as e:
notify("❌ Anthropic API", f"{type(e).__name__}: {e}", 9)
def notify(title, msg, prio):
requests.post(
f"{os.environ['NOTIFLY_URL']}/message",
params={"token": os.environ["NOTIFLY_TOKEN"]},
json={"title": title, "message": msg, "priority": prio},
timeout=5,
)

Стоимость на Haiku — десятые доли цента в день, а покрытие — реальное end-to-end (DNS, TLS, очередь, модель).

Rate-limit обычно не «факт инцидента», а сигнал «у вас цикл в коде или вы выкатили обновление с агрессивным fan-out». Стоит алёртить отдельно от 5xx:

try:
resp = client.messages.create(...)
except anthropic.RateLimitError as e:
headers = getattr(e, "response", None) and e.response.headers or {}
retry = headers.get("retry-after", "?")
notify(
"🚦 Anthropic rate-limit",
f"429 пришёл. Retry-After={retry}s\nТекущая модель: {model}\n"
f"Endpoint: {e.request.url if e.request else '?'}",
priority=8,
)
raise

Дополните этот блок для всех провайдеров, которые используете (OpenAI: openai.RateLimitError, OpenRouter: HTTP 429 с X-RateLimit-*).

У статусных страниц есть RSS — каждое объявление об инциденте моментально становится письмом. Заведите Email Inbox, пропустите RSS через любой RSS→Email сервис (или Yandex Forms / Zapier), укажите полученный адрес как «получателя» — и каждое сообщение об инциденте у любимого провайдера будет приходить вам в push с темой инцидента.

Минимальный набор для активной соло-разработки с ИИ:

СервисЧто проверять
OpenAI / Anthropic / Mistral / Googlechat.completions с max_tokens=1
OpenRouter / Together / Groqто же самое — они часто ломаются раньше первичных провайдеров
Cohere / Voyage embeddings/v1/embed с одним символом
Ваш fine-tune endpointпрямой ping выбранного prompt-а
Self-hosted vLLM / Ollamakind: "http" на /health (без затрат на токены)