API LeafNet AI
API полностью совместим с форматом OpenAI Chat Completions. Любая библиотека или программа, которая умеет работать с OpenAI, заработает с нами — поменяй только адрес и ключ.
| Базовый адрес | https://ai.leafnet.su/v1 |
| Эндпоинты | POST /chat/completions · GET /models |
| Ключ | создаётся в личном кабинете |
- Открой бота и нажми «Старт» — получишь бесплатные запросы.
- Войди на сайт через Telegram и создай ключ в кабинете.
- Подставь ключ и адрес в свой код — готово.
Авторизация
Передавай ключ в заголовке Authorization:
Authorization: Bearer lf-xxxxxxxxxxxxxxxx
Ключ показывается один раз при создании — сохрани его. Если ключ утёк, удали его в кабинете и создай новый.
Chat Completions
POST https://ai.leafnet.su/v1/chat/completions
# pip install openai from openai import OpenAI client = OpenAI(base_url="https://ai.leafnet.su/v1", api_key="lf-...") resp = client.chat.completions.create( model="gpt-mini", messages=[ {"role": "system", "content": "Ты — полезный помощник."}, {"role": "user", "content": "Придумай 3 названия для кофейни"}, ], temperature=0.7, ) print(resp.choices[0].message.content) print(resp.usage) # сколько токенов ушло
// npm i openai import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://ai.leafnet.su/v1", apiKey: "lf-..." }); const resp = await client.chat.completions.create({ model: "gpt-mini", messages: [{ role: "user", content: "Придумай 3 названия для кофейни" }], }); console.log(resp.choices[0].message.content);
curl https://ai.leafnet.su/v1/chat/completions \ -H "Authorization: Bearer lf-..." \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-mini", "messages": [{"role": "user", "content": "Придумай 3 названия для кофейни"}] }'
Поддерживаются параметры: messages, temperature, top_p, max_tokens (не больше 4096), stop, stream, response_format, tools / tool_choice, seed, presence_penalty, frequency_penalty.
Стриминг
Передай "stream": true — ответ придёт кусочками в формате Server-Sent Events, как у OpenAI.
stream = client.chat.completions.create(
model="claude",
messages=[{"role": "user", "content": "Напиши стих про осень"}],
stream=True,
)
for chunk in stream:
if chunk.choices:
print(chunk.choices[0].delta.content or "", end="", flush=True)Картинки на вход
Модели с поддержкой зрения принимают изображения ссылкой или в base64:
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Что на фото?"},
{"type": "image_url", "image_url": {"url": "https://example.com/cat.jpg"}},
],
}]Модели и цены
В поле model можно передать короткое имя из таблицы. Актуальный список — GET /v1/models.
| model | Название | Фото | Цена за 1000 токенов |
|---|---|---|---|
gpt-mini | GPT-4o mini | да | 0.05 запроса |
gemini | Gemini 2.5 Flash | да | 0.15 запроса |
deepseek | DeepSeek V3 | — | 0.1 запроса |
gpt | GPT-4o | да | 0.6 запроса |
claude | Claude Sonnet | да | 0.8 запроса |
Оплата
Баланс общий для бота и API. После каждого запроса списывается (входные + выходные токены) / 1000 × цена модели. Дробные части копятся и списываются, когда набирается целый запрос.
Пополнить баланс можно в боте за Telegram Stars: команда /buy. Расход по каждому запросу виден в кабинете.
Ошибки и лимиты
| Код | Что значит |
|---|---|
401 | Нет ключа или ключ неверный/удалён |
402 | Закончился баланс — пополни в боте |
400 | Неизвестная модель или неправильный запрос |
429 | Больше 60 запросов в минуту на ключ или модель перегружена |
502 | Провайдер модели временно недоступен — попробуй позже |
Ошибки возвращаются в формате OpenAI: {"error": {"message": "...", "code": "..."}}. За неуспешные запросы деньги не списываются.