Sandbox-ключи#
Команда /new_test_token [имя] в боте создаёт ключ с префиксом orb_test_….
Главное: такой ключ не дёргает реальные модели и не списывает деньги. Любой запрос возвращает заглушку в OpenAI-совместимом формате.
Зачем#
- Отладить SDK-интеграцию без расходов (запустил CI, прогнал 1000 тестов — $0)
- Проверить error-handling твоего кода без выкручивания моделей
- Smoke-тест в production без использования боевого ключа
Что возвращается#
Запросы к /v1/chat/completions с orb_test_ ключом отдают:
json
{
"id": "chatcmpl-mock-…",
"object": "chat.completion",
"created": 1714291200,
"model": "<твой запрошенный model>",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "[mock] <первое сообщение пользователя, ≤300 символов>"
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 12,
"completion_tokens": 4,
"total_tokens": 16,
"cost": 0
},
"x_mock": true
}
Поле x_mock: true — подсказка тестам, что это заглушка (отсутствует на боевых).
Pong-easter-egg#
Если последнее user-сообщение содержит «ping» — заглушка ответит ровно pong.
Удобно для бинарных smoke-тестов:
python
resp = test_client.chat.completions.create(
model="openai/gpt-4o-mini",
messages=[{"role": "user", "content": "ping"}],
)
assert resp.choices[0].message.content == "pong"
Streaming тоже работает#
"stream": true на тестовом ключе вернёт корректные SSE-кадры (роль, контент
по 6 символов, finish, optional usage, [DONE]) — твой стрим-парсер
проверится на полностью совместимом ответе.
Любая модель#
Sandbox-ключ принимает любое значение model — даже несуществующее.
Это специально, чтобы менять только api_key в существующем коде:
```python client = OpenAI( base_url="https://api.ml-router.su/v1", api_key="orb_test_…", # ← поменяли только эту строку )
дальше всё как обычно — модели любые, ответы — заглушки#
```
Лимиты#
Чтобы sandbox-ключи нельзя было использовать как бесплатный DDoS-вектор:
| Лимит | Значение |
|---|---|
| Per-key RPM | 30 req/min |
| Per-user RPM | 20 req/min (суммарно по всем sandbox-ключам) |
| Per-key daily | 1 000 req/day |
При превышении — 429 rate_limit. Реальное число запросов сегодня
видно в /limits в боте.