API совместим с OpenAI. Если у вас уже есть код, работающий с OpenAI, поменяйте адрес и ключ — остальное менять не придётся.
Адрес API — https://api.sillis.tech/v1. Ключ выпускается в разделе Ключи и показывается один раз. Готовые конфиги под OpenCode, Pi, Cline, Continue, Aider, Cursor, Zed, Open WebUI, LangChain, LlamaIndex и n8n — на странице Быстрое подключение.
curl https://api.sillis.tech/v1/chat/completions \
-H "Authorization: Bearer $SILLIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "sillis-1.0",
"messages": [{"role": "user", "content": "Привет!"}]
}'from openai import OpenAI
client = OpenAI(
api_key="sk-sillis-…",
base_url="https://api.sillis.tech/v1",
)
response = client.chat.completions.create(
model="sillis-1.0",
messages=[{"role": "user", "content": "Привет!"}],
)
print(response.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.SILLIS_API_KEY,
baseURL: "https://api.sillis.tech/v1",
});
const response = await client.chat.completions.create({
model: "sillis-1.0",
messages: [{ role: "user", content: "Привет!" }],
});
console.log(response.choices[0].message.content);Ключ передаётся заголовком Authorization: Bearer sk-sillis-…. У ключа можно задать месячный лимит расхода, список разрешённых моделей, срок действия и список IP-адресов.
Ключ работает только на сервере. Мы намеренно не открываем CORS: ключ, попавший в браузерный код, виден любому посетителю и тратит ваш баланс. Если нужен доступ из фронтенда — проксируйте запросы через свой бэкенд.
Отзыв ключа действует мгновенно. Мы храним только хеш ключа, поэтому восстановить потерянный ключ не сможем — выпустите новый.
Поддерживаются поля model, messages, temperature, top_p, max_tokens, stop, seed, n, response_format, tools, tool_choice, presence_penalty, frequency_penalty, stream, stream_options. Неизвестные поля отбрасываются.
Обычный SSE, как у OpenAI: передайте stream: true. Токены считаются автоматически, ничего дополнительно указывать не нужно.
stream = client.chat.completions.create(
model="sillis-1.0",
messages=[{"role": "user", "content": "Расскажи о Байкале"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)Хотите видеть расход прямо в потоке — попросите его явно через stream_options={"include_usage": true}, и последний чанк придёт с полем usage.
Если соединение оборвётся, запрос всё равно будет оплачен по объёму того, что мы успели вам отдать. Такое списание помечается в журнале как «оценка».
curl https://api.sillis.tech/v1/embeddings \
-H "Authorization: Bearer $SILLIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "sillis-embed-1.0",
"input": ["первый текст", "второй текст"]
}'Размерность вектора — 1024. Тарифицируется по входным токенам.
curl https://api.sillis.tech/v1/rerank \
-H "Authorization: Bearer $SILLIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "sillis-rerank-1.0",
"query": "как настроить nginx",
"documents": ["конфиг nginx", "рецепт борща"],
"top_n": 2
}'Формат совместим с Cohere: в ответе results с полями index и relevance_score.
curl https://api.sillis.tech/v1/audio/transcriptions \ -H "Authorization: Bearer $SILLIS_API_KEY" \ -F model=sillis-voice-1.0 \ -F file=@запись.mp3 \ -F language=ru
Тарифицируется по длительности аудио, а не по токенам. Максимальный размер файла — 30 МБ.
Отдаёт модели, доступные вашему ключу, в формате OpenAI. В поле sillis у каждой модели лежат класс и рублёвые цены — удобно, чтобы считать бюджет прямо в коде.
curl https://api.sillis.tech/v1/models -H "Authorization: Bearer $SILLIS_API_KEY"
Деньги списываются с общего баланса аккаунта SilliS — того же, с которого будут оплачиваться остальные продукты. Баланс и история операций — в личном кабинете, цены — на странице Модели и цены.
Каждый нестримовый ответ приходит с заголовками:
X-SilliS-Cost: 0.035000 # стоимость этого запроса в рублях X-SilliS-Balance: 987.34 # остаток на балансе X-SilliS-Request-Id: 6f1c… # назовите его в поддержке
У стримов цена известна только после последнего чанка, поэтому в заголовках её нет — смотрите раздел Расход.
Запрос принимается, пока баланс положительный, а списывается по факту. Поэтому последний запрос может увести баланс в небольшой минус — он погасится при первом пополнении.
Формат совпадает с OpenAI, поэтому обработка ошибок в чужих SDK работает как есть.
{
"error": {
"message": "Недостаточно средств на балансе SilliS.",
"type": "insufficient_quota",
"code": "insufficient_balance"
}
}| Код | code | Что случилось |
|---|---|---|
| 401 | invalid_api_key | Ключ неверен, отозван или истёк |
| 402 | insufficient_balance | Баланс исчерпан |
| 402 | key_limit_exceeded | Исчерпан месячный лимит ключа |
| 403 | model_not_allowed | Ключу не разрешена эта модель |
| 403 | ip_not_allowed | Запрос пришёл с адреса вне списка |
| 400 | context_length_exceeded | Запрос не помещается в окно контекста — сократите историю |
| 404 | model_not_found | Такой модели в каталоге нет |
| 404 | model_retired | Модель снята с продажи; в тексте ошибки названа замена |
| 404 | model_unavailable | Модель есть в каталоге, но шлюз её сейчас не отдаёт |
| 429 | rate_limit_exceeded | Слишком часто |
| 429 | upstream_busy | Модель остывает; срок ожидания — в заголовке Retry-After |
| 502 | upstream_error | Шлюз моделей вернул ошибку |
| 504 | upstream_timeout | Модель не ответила вовремя |
rpm_note в GET /account.Нужны другие пределы или отдельная модель — напишите на alex@sillis.tech.