Files
knowledge-base/snippets/omniroute-models-audit.md

127 lines
6.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
date: 2026-05-06
type: snippet
tags: [omniroute, claude, opus, smoke-test, audit, lxc-132]
---
# OmniRoute — аудит живости моделей (smoke-test)
Каталог OmniRoute (`/v1/models`) перечисляет все модели, **подключенные** к провайдерам, но это не значит что они живые. Реальная проверка — пинг через `/v1/chat/completions` с `max_tokens: 10`. Пригождается каждые 1-2 недели или после `npm install omniroute@latest` чтобы убедиться что важные источники Opus/Sonnet не отвалились.
См. также: [[../decisions/2026-05-06-openclaw-opus-4-7-via-max-cliproxy]] — последний полный аудит и результаты.
## Где живёт OmniRoute
| Артефакт | Путь / адрес |
|----------|--------------|
| LXC | 132, hostname `code-server`, IP `10.0.0.179` |
| Service | `systemctl status omniroute` |
| Cmd | `/usr/bin/node /root/.npm/_npx/cb5891f90ae65d14/node_modules/omniroute/app/server.js` |
| EnvFile | `/root/OmniRoute/.env` |
| Repo | `/root/OmniRoute/` (Git) |
| Storage | `/root/.omniroute/storage.sqlite` |
| Local API | `http://localhost:20128` (порт из `.env` PORT=20128) |
| Public | `https://ai.dttb.ru` (через NPM, требует Bearer) |
## Получить API key
```bash
sshpass -p '1qaz!QAZ' ssh root@10.0.0.179 \
"sqlite3 /root/.omniroute/storage.sqlite \"SELECT id, key, name FROM api_keys;\""
```
Использовать `name=test-key` для тестов чтобы не задеть production `claw`.
## Список моделей
```bash
KEY='<key-из-sqlite>'
sshpass -p '1qaz!QAZ' ssh root@10.0.0.179 \
"curl -s -H 'Authorization: Bearer $KEY' http://localhost:20128/v1/models"
```
Парсинг с фильтром по подстроке (например все `opus`):
```bash
... | python3 -c '
import sys, json
d = json.load(sys.stdin)
models = d.get("data", d) if isinstance(d, dict) else d
for m in models:
if "opus" in m["id"].lower():
print(m["id"])
'
```
## Smoke test одной модели
```bash
KEY='<api-key>'
MODEL='cc/claude-opus-4-7'
curl -s --max-time 30 -X POST http://localhost:20128/v1/chat/completions \
-H "Authorization: Bearer $KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "'$MODEL'",
"messages": [{"role":"user","content":"Reply only: ok"}],
"max_tokens": 10,
"stream": false
}' | python3 -m json.tool
```
Ожидание `choices[0].message.content` = `"ok"` (или похожее короткое). Если streaming возвращается даже при `stream:false` — это чистый прокси-bypass от Claude Code OAuth, тоже норм.
## Batch smoke test нескольких моделей
```bash
sshpass -p '1qaz!QAZ' ssh root@10.0.0.179 "
KEY='<api-key>'
URL='http://localhost:20128/v1/chat/completions'
for model in 'cc/claude-opus-4-7' 'cc/claude-opus-4-6' 'claude/claude-opus-4-7' 'kr/claude-opus-4.6' 'gh/claude-opus-4.6' 'antigravity/claude-opus-4-6-thinking'; do
echo '--- '\$model' ---'
curl -s --max-time 25 -X POST \"\$URL\" \\
-H \"Authorization: Bearer \$KEY\" \\
-H 'Content-Type: application/json' \\
-d '{\"model\":\"'\$model'\",\"messages\":[{\"role\":\"user\",\"content\":\"Reply ok\"}],\"max_tokens\":10}' \\
| head -c 350
echo ''
done
"
```
## Как читать ошибки
| Сообщение | Что значит | Как чинить |
|-----------|------------|-----------|
| `Unauthorized` / `Missing API key` | Нет Bearer header или ключ отозван | Достать новый из `api_keys` |
| `[400]: The requested model is not available for integrator "vscode-chat"` | MS GitHub Copilot integrator не отдаёт эту модель | Использовать другой источник; проверить какие модели MS сейчас выдаёт (в самом сообщении список Available) |
| `[400]: The requested model is not supported` | OmniRoute шлёт ID который провайдер не понимает (часто `4.6` vs `4-6`) | Баг mapping в OmniRoute → `npm install omniroute@latest` или вручную писать поддерживаемый ID |
| `[400]: Invalid model. Please select a different model` | Провайдер (Kiro/Kilo) не выдаёт эту модель в их каталоге | Использовать другую модель этого провайдера (у Kiro есть только Sonnet) |
| `Missing Google projectId for Antigravity account. Please reconnect OAuth in Providers → Antigravity` | OAuth-сессия Google Antigravity без активного Cloud Code project | Зайти на [antigravity.google](https://antigravity.google), создать project, OmniRoute Dashboard → Providers → Antigravity → Reconnect |
| Empty response | Провайдер не отвечает / dead | Проверить аккаунт/ключ провайдера в OmniRoute Dashboard |
| `401` от Anthropic | CLIProxy OAuth протух (Claude Code session) | OmniRoute Dashboard → Providers → Claude → Reconnect |
## Логи OmniRoute
```bash
sshpass -p '1qaz!QAZ' ssh root@10.0.0.179 "journalctl -u omniroute --since '1 hour ago' --no-pager | tail -50"
```
Ключевые маркеры в логах:
- `[USAGE] <PROVIDER>` — фактические вызовы (KIRO, CC, CLAUDE, ANTIGRAVITY...)
- `model fallback decision` — failover включился
- `Account quota exceeded` — pool аккаунта провайдера исчерпан
- `circuit breaker open` — провайдер временно отключён OmniRoute из-за серии ошибок
- `MEMORY_EXTRACTION` — Memory Tool через OmniRoute
## Известные «вечные» гнилые модели (на 2026-05-06)
Не тратить на них тесты, пока OmniRoute не обновится:
- `gh/claude-opus-4.6` — MS убрала из integrator scope
- `gh/claude-opus-4.7`баг ID mapping
- `kr/claude-opus-*` / `kiro/claude-opus-*` — Kiro Opus не выдаёт в принципе
- `kc/anthropic/*` / `kilocode/anthropic/*` — провайдеры мёртвы / не настроены
- `antigravity/claude-opus-4-6-thinking` — пока OAuth projectId не подключен