Доступность LLM-провайдеров
LLM-провайдеры падают чаще, чем хочется: за последний год Anthropic, OpenAI и OpenRouter ловили продолжительные incidents по нескольку раз. У большинства есть RSS/JSON status-страница, но никто не присылает push в момент инцидента.
Используем активные мониторы Notifly — функция в Yandex Cloud сама раз в минуту дёргает нужный URL и шлёт алёрт через ваш канал.
1. Status-страница провайдера (HTTP)
Заголовок раздела «1. Status-страница провайдера (HTTP)»Большинство 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".
2. Прямой ping реального API endpoint
Заголовок раздела «2. Прямой ping реального API endpoint»Status-страница лагает — самый честный мониторинг это пинг продакшн-endpoint
с дешёвой моделью и max_tokens: 1:
# tiny health-script, удобно завернуть в YC Function с timer-triggerimport 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, очередь, модель).
3. Rate-limit / 429
Заголовок раздела «3. Rate-limit / 429»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-*).
4. RSS/Atom провайдера
Заголовок раздела «4. RSS/Atom провайдера»У статусных страниц есть RSS — каждое объявление об инциденте моментально становится письмом. Заведите Email Inbox, пропустите RSS через любой RSS→Email сервис (или Yandex Forms / Zapier), укажите полученный адрес как «получателя» — и каждое сообщение об инциденте у любимого провайдера будет приходить вам в push с темой инцидента.
Какие провайдеры мониторить
Заголовок раздела «Какие провайдеры мониторить»Минимальный набор для активной соло-разработки с ИИ:
| Сервис | Что проверять |
|---|---|
| OpenAI / Anthropic / Mistral / Google | chat.completions с max_tokens=1 |
| OpenRouter / Together / Groq | то же самое — они часто ломаются раньше первичных провайдеров |
| Cohere / Voyage embeddings | /v1/embed с одним символом |
| Ваш fine-tune endpoint | прямой ping выбранного prompt-а |
| Self-hosted vLLM / Ollama | kind: "http" на /health (без затрат на токены) |