Быстрый старт c VseLLM
Начните работу с VseLLM
VseLLM – это единый API для доступа к различным LLM и мультимодальным AI‑моделям без необходимости напрямую работать с зарубежными вендорами. Платформа берёт на себя маршрутизацию запросов, биллинг и стабильность доступа.
- Платёжная система (минимум 1000 ₽)
- Активация купона
- Договор для юрлиц
Пример использования
import openai
client = openai.OpenAI(
api_key="your-api-key",
base_url="https://api.vsellm.ru/v1"
)
response = client.chat.completions.create(
model="openai/gpt-5",
messages=[
{"role": "user", "content": "Привет!"}
]
)
print(response.choices[0].message.content)
Модели
Список доступных моделей и их характеристик. Полный список моделей доступен в каталоге на сайте.
Текстовые модели
Используются для работы с текстом: генерация, анализ, классификация, суммаризация и другие задачи.
import openai
client = openai.OpenAI(
api_key="your-api-key",
base_url="https://api.vsellm.ru/v1"
)
response = client.chat.completions.create(
model="openai/gpt-5",
messages=[
{"role": "user", "content": "Привет!"}
]
)
print(response.choices[0].message.content)
Эмбеддинги
Преобразование текста в числовые векторы для поиска и RAG.
import openai
client = openai.OpenAI(
api_key="your-api-key",
base_url="https://api.vsellm.ru/v1"
)
response = client.embeddings.create(
model="openai/text-embedding-3-small",
input="Текст для векторизации"
)
embedding = response.data[0].embedding
print(f"Embedding dimension: {len(embedding)}")
Аудио
Работа с аудио (Speech-to-Text).
import openai
from pathlib import Path
client = openai.OpenAI(
api_key="your-api-key",
base_url="https://api.vsellm.ru/v1"
)
audio_path = Path("speech.mp3")
with audio_path.open("rb") as audio_file:
response = client.audio.transcriptions.create(
file=audio_file,
model="openai/whisper-1"
)
print("Распознанный текст:")
print(response.text)
Изображения
Генерация изображений по текстовому описанию.
import openai
import base64
import time
from pathlib import Path
client = openai.OpenAI(
api_key="your-api-key",
base_url="https://api.vsellm.ru/v1"
)
model = "MODEL_ID"
prompt = (
"Сгенерируй фотореалистичный цветок оранжевой лилии "
"на зеленом фоне, без текста, формат 1024x1024"
)
size = "1024x1024"
n = 1
quality = "low"
response = client.images.generate(
model=model,
prompt=prompt,
size=size,
n=n,
quality=quality
)
Path("out").mkdir(exist_ok=True)
if not response.data:
raise RuntimeError("В ответе нет изображений")
for i, img in enumerate(response.data, 1):
if not img.b64_json:
continue
raw = base64.b64decode(img.b64_json)
fp = Path("out") / f"Image_{int(time.time())}_{i}.png"
fp.write_bytes(raw)
print("Saved:", fp)
Поддерживаемые размеры изображений
Модель google/gemini-3.1-flash-image-preview поддерживает следующие разрешения:
- 1:1 — 512×512, 1024×1024, 2048×2048, 4096×4096
- 1:4 — 256×1024
- 2:3 — 848×1264, 1696×2528, 3392×5056
- 3:2 — 1264×848, 2528×1696, 5056×3392
- 3:4 — 896×1200, 1792×2400, 3584×4800
- 4:1 — 1024×256
- 4:3 — 1200×896, 2400×1792, 4800×3584
- 4:5 — 464×576, 928×1152, 1856×2304, 3712×4608
- 5:4 — 576×464, 1152×928, 2304×1856, 4608×3712
- 9:16 — 384×688, 768×1376, 1536×2752, 3072×5504
- 16:9 — 688×384, 1376×768, 2752×1536, 5504×3072
- 21:9 — 1584×672, 3168×1344, 6336×2688
Параметры генерации (temperature, top_p, seed)
Для Gemini-моделей изображений вы можете передавать дополнительные параметры через extra_body. Это работает для обоих эндпоинтов — /v1/images/generations и /v1/images/edits. Для OpenAI-моделей (gpt-image-1) эти параметры не поддерживаются.
| Параметр | Тип | По умолч. | Допустимые значения | Описание |
|---|---|---|---|---|
temperature |
float | 1.0 | 0.0 – 2.0 | Параметр масштабирования логитов перед softmax. Чем выше значение, тем более равномерным становится распределение вероятностей токенов, что увеличивает случайность выбора. При 0.0 выбирается токен с максимальной вероятностью (argmax decoding). |
top_p |
float | 1.0 | 0.0 – 1.0 | Nucleus sampling — на каждом шаге выбирается минимальный набор токенов, суммарная вероятность которых превышает p. Затем из этого набора семплируется следующий токен. При 1.0 учитываются все токены, при 0.1 — только самые вероятные. |
seed |
int | — | любое целое | Начальное значение для генератора псевдослучайных чисел (PRNG). При одинаковом seed + прочих равных параметрах последовательность случайных чисел повторяется, что делает генерацию детерминированной. |
Примечание: Рекомендуется изменять только один из параметров — temperature или top_p, но не оба одновременно, так как они влияют на один и тот же механизм семплирования. Для детерминированной генерации используйте seed совместно с temperature=0.0.
response = client.images.generate(
model="google/gemini-3.1-flash-image-preview",
prompt="...",
size="1024x1024",
n=1,
extra_body={
"temperature": 0.8, # float [0.0–2.0] умолч. 1.0 — выше = креативнее
"top_p": 0.9, # float [0.0–1.0] умолч. 1.0 — ядерное семплирование
"seed": 42, # int — seed для PRNG (детерминированность)
},
)
Коды ошибок
Со своей стороны VseLLM никак дополнительно не лимитирует запросы к API, однако у провайдеров существуют свои ограничения. Они отличаются от провайдера к провайдеру, а также от модели к модели.
Создание дополнительных API ключей не влияет на ваши лимиты, так как мы управляем пропускной способностью глобально. Однако для разных моделей действуют разные лимиты, поэтому вы можете распределить нагрузку, если столкнётесь с ограничениями.
Если для вашего проекта необходимы бóльшие лимиты, чем доступны в данный момент, VseLLM может предложить дополнительные решения. Пожалуйста, свяжитесь с нами в этом случае.
Отслеживание использования
Вы можете отслеживать статистику использования и управлять API ключами в соответствующих разделах Личного кабинета.
Коды ошибок
При превышении лимитов API возвращает следующие коды ошибок:
FAQ
Баланс учитывается в рублях. Списание происходит по факту обработки запросов в модели pay-as-you-go — вы платите только за использованные токены.
Да. Вы сами выбираете тариф для каждого запроса, направляя его на соответствующий Base URL.
Для обеспечения стабильности VseLLM использует несколько upstream-провайдеров. В зависимости от маршрута и текущей нагрузки задержка может отличаться.
Основные причины:
- временные проблемы у конкретного провайдера;
- высокая нагрузка;
- автоматическое переключение между источниками.
Рекомендуется использовать fallback-модели.
Да. Ограничения могут устанавливаться на стороне провайдеров и меняться в зависимости от нагрузки.
При высокой нагрузке могут срабатывать ограничения частоты запросов или временная защита источников.
Поведение модели может изменяться из-за:
- обновлений у провайдера;
- смены upstream-источника;
- изменений нагрузки.
VseLLM не модифицирует ответы моделей.
Да. Отдельные модели могут временно отключаться. Для продакшена рекомендуется заранее настраивать fallback-модели.
VseLLM не логирует и не кэширует запросы на своей стороне.
Если конкретный провайдер поддерживает кэширование, ответ может быть отдан из его кэша при повторяющихся запросах в короткий промежуток времени. Это зависит от модели и источника и происходит не всегда.
VseLLM работает со всеми инструментами, использующими OpenAI-совместимый API, включая:
- официальный OpenAI SDK;
- LangChain;
- n8n;
- Msty;
- CLI-клиенты и самописные решения.
Да, при корректных архитектурных ожиданиях.
В продакшене необходимо учитывать:
- вариативность latency;
- возможные таймауты и ошибки;
- временную недоступность отдельных моделей;
- автоматическое переключение между провайдерами.
Кеширование
Sticky credential и кеширование токенов
VseLLM поддерживает два механизма оптимизации запросов — sticky credential (привязка к провайдеру) и кеширование токенов (cached tokens). Эти механизмы позволяют ускорить ответы и снизить стоимость повторяющихся запросов.
Sticky credential
При использовании Responses API с параметром previous_response_id VseLLM запоминает, через какой credential (провайдер) был выполнен первый запрос, и перенаправляет последующие запросы того же диалога на тот же credential. Это гарантирует, что весь диалог обрабатывается одним экземпляром модели.
from openai import OpenAI
client = OpenAI(
api_key="sk-your-key",
base_url="https://api.vsellm.ru/v1"
)
# Шаг 1 — без previous_response_id, round-robin выбирает credential
r1 = client.responses.create(
model="openai/gpt-5",
input="Hello! Tell me a short joke.",
store=True,
user="conv-123",
)
# Шаг 2 — proxy предпочитает credential из r1 (Responses API sticky)
# затем fallback на session-sticky (user="conv-123")
r2 = client.responses.create(
model="openai/gpt-5",
input="Continue our conversation.",
previous_response_id=r1.id, # ← привязка к тому же credential
store=True,
user="conv-123",
)
Как это работает: Когда вы передаёте previous_response_id, VseLLM сохраняет привязку к credential, обработавшему первый запрос. Без previous_response_id выбор credential осуществляется по round-robin среди доступных провайдеров для данной модели.
Кеширование токенов (cached tokens)
Многие модели поддерживают кеширование входных токенов — если вы отправляете повторяющийся контекст (system prompt, историю диалога), провайдер может закешировать его и не пересчитывать заново. Это отражается в поле cached_tokens в ответе API.
ResponseUsage(
input_tokens=259,
input_tokens_details=InputTokensDetails(
cached_tokens=256 # ← 256 токенов из кеша
),
output_tokens=63,
total_tokens=322
)
На что обратить внимание: cached_tokens — это количество токенов, которые были прочитаны из кеша провайдера (кеш на стороне модели). Это не связано с sticky credential — это независимая оптимизация на уровне модели.
Проверка работы кеширования
Чтобы убедиться, что кеширование работает, проверьте поле usage.input_tokens_details.cached_tokens в ответе API. Если значение больше 0 — кеш используется.
r = client.responses.create(
model="openai/gpt-5",
input="Your prompt with repeated context",
store=True,
)
if r.usage and r.usage.input_tokens_details:
cached = r.usage.input_tokens_details.cached_tokens
if cached:
print(f"Кеш использован: {cached} токенов")
else:
print("Кеш не использован")
Рекомендации
Используйте previous_response_id
Для поддержания диалога всегда передавайте previous_response_id — это гарантирует, что модель «помнит» контекст и используется тот же credential.
Повторяйте user для sticky по сессии
Указывайте одинаковый user для всех запросов одного пользователя. Если previous_response_id недоступен (например, первая реплика), VseLLM использует session-sticky по user.
Проверяйте cached_tokens
Следите за полем cached_tokens в usage — если оно больше 0, значит повторяющиеся токены не пересчитываются, что ускоряет ответ.
Store: True для хранения истории
Включайте store=True — это сохраняет историю диалога на сервере и позволяет API корректно выстраивать привязки по previous_response_id.
Vision и отправка файлов
content сообщения пользователя с типом image_url, используя Data URI (Base64) или публичные URL.
VseLLM поддерживает два подхода к отправке файлов. Выберите тот, который подходит вашему сценарию.
/v1/responsesУниверсальный способ для всех провайдеров. Использует типы input_text, input_file (для PDF) и input_image (для картинок).
import requests
import base64
API_KEY = "your-api-key"
with open("document.pdf", "rb") as f:
pdf_b64 = base64.b64encode(f.read()).decode("utf-8")
response = requests.post(
"https://api.vsellm.ru/v1/responses",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
},
json={
"model": "openai/gpt-5.4", # или google/gemini-2.5-pro, anthropic/claude-sonnet-4.5
"input": [
{
"role": "user",
"content": [
{"type": "input_text", "text": "Сделай краткую выжимку из этого документа."},
{
"type": "input_file",
"filename": "document.pdf",
"file_data": f"data:application/pdf;base64,{pdf_b64}"
}
]
}
]
}
)
data = response.json()
if 'output' in data and data['output']:
for item in data['output']:
if 'content' in item:
for c in item['content']:
if c.get('type') == 'output_text':
print(c.get('text'))
import requests
import base64
API_KEY = "your-api-key"
with open("image.png", "rb") as f:
img_b64 = base64.b64encode(f.read()).decode("utf-8")
response = requests.post(
"https://api.vsellm.ru/v1/responses",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
},
json={
"model": "openai/gpt-5.4", # или любая другая vision-модель
"input": [
{
"role": "user",
"content": [
{"type": "input_text", "text": "Опиши, что на этой картинке."},
{
"type": "input_image",
"image_url": f"data:image/png;base64,{img_b64}"
}
]
}
]
}
)
data = response.json()
if 'output' in data and data['output']:
for item in data['output']:
if 'content' in item:
for c in item['content']:
if c.get('type') == 'output_text':
print(c.get('text'))
/v1/chat/completionsСтандартный OpenAI-совместимый эндпоинт. PDF отправляется через image_url с MIME-типом application/pdf (только Gemini, для Claude не работает). Изображения — через стандартный image_url с PNG/JPEG (все модели).
input_file или конвертацию PDF → PNG.
import openai
import base64
client = openai.OpenAI(api_key="your-api-key", base_url="https://api.vsellm.ru/v1")
with open("document.pdf", "rb") as f:
pdf_b64 = base64.b64encode(f.read()).decode("utf-8")
response = client.chat.completions.create(
model="google/gemini-2.5-pro",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "Сделай краткую выжимку из этого документа."},
{
"type": "image_url",
"image_url": {
"url": f"data:application/pdf;base64,{pdf_b64}"
}
}
]
}
]
)
print(response.choices[0].message.content)
import openai
import base64
client = openai.OpenAI(api_key="your-api-key", base_url="https://api.vsellm.ru/v1")
with open("image.png", "rb") as f:
img_b64 = base64.b64encode(f.read()).decode("utf-8")
response = client.chat.completions.create(
model="openai/gpt-5.2", # работает с любой vision-моделью
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "Опиши, что на этой картинке."},
{
"type": "image_url",
"image_url": {
"url": f"data:image/png;base64,{img_b64}"
}
}
]
}
]
)
print(response.choices[0].message.content)
Если ваша модель не поддерживает PDF напрямую в Chat Completions (OpenAI, Claude), конвертируйте страницы в изображения:
/v1/chat/completions поддержка PDF недоступна. Gemini принимает PDF напрямую через image_url с application/pdf. Если PDF не проходит через конкретный клиент, проверьте прямой запрос к API или конвертируйте страницы в изображения.
import openai
import base64
import io
import fitz # pip install pymupdf
from PIL import Image
client = openai.OpenAI(api_key="your-api-key", base_url="https://api.vsellm.ru/v1")
content_blocks = [{"type": "text", "text": "Сделай выжимку из этого PDF."}]
doc = fitz.open("document.pdf")
for page in doc:
pix = page.get_pixmap(dpi=200)
img = Image.frombytes("RGB", (pix.width, pix.height), pix.samples)
buf = io.BytesIO()
img.save(buf, format="PNG")
png_b64 = base64.b64encode(buf.getvalue()).decode("utf-8")
content_blocks.append({
"type": "image_url",
"image_url": {"url": f"data:image/png;base64,{png_b64}"}
})
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": content_blocks}]
)
print(response.choices[0].message.content)
{"type": "file", "file": {...}} не поддерживаются. Используйте input_file (Responses API) или image_url (Chat Completions).Редактирование изображений
Изменение изображений через текстовое описание
VseLLM поддерживает редактирование существующих изображений по текстовому промпту через эндпоинт /v1/images/edits. Вы можете изменять фон, добавлять или удалять объекты, менять стиль изображения.
Доступные модели
Для редактирования изображений поддерживаются следующие модели:
- OpenAI:
openai/gpt-image-1-miniиopenai/gpt-image-1. - Google Gemini:
google/gemini-2.5-flash-image,google/gemini-3-pro-image-previewиgoogle/gemini-3.1-flash-image-preview.
Оба провайдера поддерживают внесение высококачественных правок, включая изменение объектов, работу с фоном и стилизацию. Модели с приставками mini или flash лучше подходят для быстрых массовых правок (так как они дешевле и быстрее), в то время как базовые и pro версии идеальны для сложных творческих задач, где важна высокая детализация.
Формат запроса
Отправьте POST-запрос на /v1/images/edits с multipart/form-data телом. Обязательные поля: image (в формате PNG), prompt (текст изменений) и model. Опционально: mask (PNG-маска: чёрный — область редактирования, белый — сохранить), size (например 1024x1024) и n (количество вариантов).
Для простых задач достаточно указать model, image и prompt — модель сама определит, как применить изменения. Используйте маску, если нужно изменить только конкретную область изображения.
Множественные изображения на входе
Модели Google Gemini поддерживают передачу нескольких изображений на вход через массив. Просто передайте список байтов в поле image:
images = [
Path("img1.png").read_bytes(),
Path("img2.png").read_bytes(),
Path("img3.png").read_bytes(),
]
response = client.images.edit(
model="google/gemini-3.1-flash-image-preview",
image=images,
prompt="Объедини эти изображения в одно",
n=1,
size="1024x1024",
)
Дополнительные параметры (extra_body)
Для Gemini-моделей вы можете передавать temperature [0.0–2.0], top_p [0.0–1.0] и seed через extra_body. Все три параметра работают. Полное описание — в разделе Изображения → Параметры генерации.
response = client.images.edit(
model="google/gemini-3.1-flash-image-preview",
image=image_data,
prompt="Добавь горы на задний план вместо неба",
n=1,
size="1024x1024",
extra_body={
"temperature": 0.7, # работает
"top_p": 0.9, # работает
"seed": 123, # int — seed для PRNG
},
)
Пример кода
import openai
import base64
import time
from pathlib import Path
# Настройка клиента
client = openai.OpenAI(
api_key="your-api-key",
base_url="https://api.vsellm.ru/v1"
)
# Путь к исходному изображению (обязательно PNG)
image_path = "input.png"
# Опционально: маска (PNG, чёрный = прозрачная область, белый = сохранить)
# mask_path = "mask.png"
prompt = "Добавь горы на задний план вместо неба"
# OpenAI модель (сложные правки, высокое качество)
model = "openai/gpt-image-1-mini"
# Или используйте Gemini (быстрее и дешевле для простых задач):
# model = "google/gemini-2.5-flash-image"
n = 1
size = "1024x1024"
with open(image_path, "rb") as f:
image_data = f.read()
# mask_data = open(mask_path, "rb").read() if Path(mask_path).exists() else None
response = client.images.edit(
image=image_data,
prompt=prompt,
model=model,
n=n,
size=size,
# mask=mask_data,
)
# Сохранение результатов
Path("out").mkdir(exist_ok=True)
for i, img in enumerate(response.data, 1):
if img.b64_json:
raw = base64.b64decode(img.b64_json)
fp = Path("out") / f"edit_{int(time.time())}_{i}.png"
fp.write_bytes(raw)
print("Saved:", fp)
elif img.url:
print("URL:", img.url)
Tool Calling (Function Calling)
Через api.vsellm.ru tool calling работает в едином OpenAI-формате для всех моделей. API сам конвертирует вызовы в нативный формат каждого провайдера (Anthropic tools, Google tools и т.д.) и обратно.
Совместимость: openai, google, anthropic, deepseek — поддерживают OpenAI-формат tool calling.
Базовый запрос
from openai import OpenAI
client = OpenAI(
base_url="https://api.vsellm.ru/v1",
api_key="<your-api-key>",
)
response = client.chat.completions.create(
model="openai/gpt-5.1",
messages=[{"role": "user", "content": "What's the weather in Moscow?"}],
tools=[{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather for a city",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "City name"},
"units": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["city"]
}
}
}],
max_tokens=200
)
msg = response.choices[0].message
# Модель может сразу вызвать тул без текста (content == "")
if msg.content:
print("Ответ модели:", msg.content)
# Вызовы функций
if msg.tool_calls:
for tc in msg.tool_calls:
print(tc.function.name, tc.function.arguments)
# {"city":"Moscow"}
Структура тула
| Поле | Описание | Обязательное |
|---|---|---|
type |
Всегда "function" |
да |
function.name |
Имя функции (a-z, A-Z, 0-9, _) | да |
function.description |
Что делает тул — влияет на то, выберет ли модель этот тул | да |
function.parameters |
JSON Schema параметров | да |
Типы тулов (с примерами)
1. Простой тул (одно поле)
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather for a city",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "City name"}
},
"required": ["city"]
}
}
}]
Модель вызовет: get_weather({"city": "Moscow"})
2. Тул с enum
tools = [{
"type": "function",
"function": {
"name": "recommend_movie",
"description": "Recommend a movie based on preferences",
"parameters": {
"type": "object",
"properties": {
"genre": {
"type": "string",
"enum": ["comedy", "drama", "sci-fi", "horror", "action", "documentary"]
},
"min_rating": {"type": "number", "description": "Minimum IMDB rating"},
"language": {"type": "string", "enum": ["any", "russian", "english"]}
},
"required": ["genre"]
}
}
}]
Модель вызовет: recommend_movie({"genre": "sci-fi", "min_rating": 7.5})
3. Тул со вложенными параметрами (nested JSON)
tools = [{
"type": "function",
"function": {
"name": "book_flight",
"description": "Book a flight ticket",
"parameters": {
"type": "object",
"properties": {
"passengers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"},
"has_baggage": {"type": "boolean"}
},
"required": ["name", "age"]
}
},
"flight": {
"type": "object",
"properties": {
"from": {"type": "string"},
"to": {"type": "string"},
"date": {"type": "string"},
"class": {"type": "string", "enum": ["economy", "business", "first"]}
},
"required": ["from", "to", "date"]
}
},
"required": ["passengers", "flight"]
}
}
}]
Модель вызовет:
{
"passengers": [
{"name": "Ivan Ivanov", "age": 35, "has_baggage": true},
{"name": "Maria Ivanova", "age": 30, "has_baggage": false}
],
"flight": {
"from": "Moscow", "to": "Paris",
"date": "2024-06-15", "class": "business"
}
}
4. Поиск в интернете (openai/gpt-5.1 + web_search)
Модель openai/gpt-5.1 поддерживает встроенный поиск через {"type": "web_search"} — реальный поиск в интернете без необходимости реализовывать тул на своей стороне:
from openai import OpenAI
client = OpenAI(
base_url="https://api.vsellm.ru/v1",
api_key="<your-api-key>"
)
response = client.chat.completions.create(
model="openai/gpt-5.1",
messages=[{"role": "user", "content": "Какая цена у Биткоина сегодня?"}],
tools=[{"type": "web_search"}],
max_tokens=300
)
print(response.choices[0].message.content)
# ~$62 500 — реальная цена на момент запроса
Важно: web_search — это встроенный тул openai/gpt-5.1, он не требует реализации на клиенте. Модель сама ищет в интернете и возвращает ответ. Другие модели используют type: "function" — в таком случае выполнение ложится на клиента (см. «Полный цикл» ниже).
Полный цикл: вызов → результат → ответ
import json
from openai import OpenAI
client = OpenAI(base_url="https://api.vsellm.ru/v1", api_key="<key>")
tools = [{
"type": "function",
"function": {
"name": "search_web",
"description": "Search the internet",
"parameters": {
"type": "object", "properties": {"query": {"type": "string"}},
"required": ["query"]
}
}
}]
# Round 1: модель решает вызвать тул
resp1 = client.chat.completions.create(
model="openai/gpt-5.1",
messages=[{"role": "user", "content": "What is the current Bitcoin price?"}],
tools=tools, max_tokens=100
)
msg1 = resp1.choices[0].message
tool_call = msg1.tool_calls[0]
# Round 2: подставляем результат тула
search_result = json.dumps({
"results": [{"title": "BTC price", "snippet": "Bitcoin price today: $108,432"}]
})
resp2 = client.chat.completions.create(
model="openai/gpt-5.1",
messages=[
{"role": "user", "content": "What is the current Bitcoin price?"},
msg1, # сообщение с tool_calls от модели
{
"role": "tool",
"tool_call_id": tool_call.id,
"content": search_result
}
],
tools=tools,
max_tokens=300
)
print(resp2.choices[0].message.content)
# "The current Bitcoin price is approximately $108,432."
Важно: После получения tool_calls от модели, вы должны вызвать функцию на своей стороне, затем отправить результат обратно с role: "tool" и правильным tool_call_id.
Параллельные вызовы (parallel tool calls)
Если модель поддерживает (Gemini, GPT-4+), она может вернуть несколько tool_calls в одном ответе:
resp = client.chat.completions.create(
model="openai/gpt-5.1",
messages=[{"role": "user", "content": "What's the weather and time in London and Tokyo?"}],
tools=[
{"type": "function", "function": {
"name": "get_weather", "description": "Get weather",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]}
}},
{"type": "function", "function": {
"name": "get_time", "description": "Get current time",
"parameters": {"type": "object", "properties": {"timezone": {"type": "string"}}, "required": ["timezone"]}
}}
],
max_tokens=300
)
# В ответе может быть 4 tool_calls:
# get_weather({"city": "London"})
# get_time({"timezone": "Europe/London"})
# get_weather({"city": "Tokyo"})
# get_time({"timezone": "Asia/Tokyo"})
for tc in resp.choices[0].message.tool_calls:
print(tc.function.name, tc.function.arguments)
Стриминг с tool calls
stream = client.chat.completions.create(
model="openai/gpt-5.1",
messages=[{"role": "user", "content": "What's the weather in Rome?"}],
tools=tools,
max_tokens=200,
stream=True
)
tool_calls = {}
for chunk in stream:
if chunk.choices and (d := chunk.choices[0].delta) and d.tool_calls:
for tc in d.tool_calls:
idx = tc.index
if idx not in tool_calls:
tool_calls[idx] = {"name": "", "args": ""}
if tc.function:
if tc.function.name:
tool_calls[idx]["name"] += tc.function.name
if tc.function.arguments:
tool_calls[idx]["args"] += tc.function.arguments
for idx, tc in tool_calls.items():
print(f"[{idx}] {tc['name']}({tc['args']})")
Обработка ошибок тулов
Если тул вернул ошибку, модель корректно обработает ситуацию:
# Round 1: модель вызывает тул
resp1 = client.chat.completions.create(
model="openai/gpt-5.1",
messages=[{"role": "user", "content": "What's the weather in Berlin?"}],
tools=tools, max_tokens=100
)
msg1 = resp1.choices[0].message
tc = msg1.tool_calls[0]
# Round 2: возвращаем ошибку
resp2 = client.chat.completions.create(
model="openai/gpt-5.1",
messages=[
{"role": "user", "content": "What's the weather in Berlin?"},
msg1,
{"role": "tool", "tool_call_id": tc.id,
"content": "ERROR: API rate limit exceeded. Please try again later."}
],
tools=tools, max_tokens=300
)
# Модель вежливо ответит, что сервис временно недоступен
print(resp2.choices[0].message.content)
Правила хорошего тона
description — ключевой параметр
Чем точнее description, тем чаще модель будет выбирать правильный тул. Плохо:
{"description": "Get weather"}
Хорошо:
{"description": "Get current weather for a city, including temperature, humidity, and conditions. Use this for any weather-related questions."}
required — только обязательное
Не включайте в required поля, которые могут быть опциональны. Модель может отказаться вызывать тул, если не может заполнить все required-поля.
Имена функций — без спецсимволов
Только латиница, цифры и _. Без пробелов, дефисов, точек.
Ограничения
- Тул
type: "function"с JSON Schema работает для всех моделей через единый OpenAI-формат - Тулы
code_interpreterиretrieval(OpenAI Assistant API) — не поддерживаются через chat completions
curl пример
curl https://api.vsellm.ru/v1/chat/completions \
-H "Authorization: Bearer <key>" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-5.1",
"messages": [{"role": "user", "content": "What is the weather in Moscow?"}],
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get weather for a city",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"}
},
"required": ["city"]
}
}
}],
"max_tokens": 100
}'
Интеграции
VseLLM работает со всеми инструментами, которые используют OpenAI-совместимый API.
Claude Code
Claude Code — это продвинутый CLI-инструмент для работы с моделями Anthropic. С VseLLM вы можете использовать этот инструмент, направляя запросы через наш единый API.
Установка
Мы рекомендуем использовать npm для установки. Убедитесь, что у вас установлен Node.js.
npm install -g @anthropic-ai/claude-code
Переменные окружения
Для корректной работы с VseLLM вам нужно переопределить адрес API. Claude Code использует стандартные переменные для OpenAI-совместимых эндпоинтов.
export ANTHROPIC_BASE_URL="https://api.vsellm.ru"
export ANTHROPIC_API_KEY="sk-..."
$env:ANTHROPIC_BASE_URL="https://api.vsellm.ru"
$env:ANTHROPIC_API_KEY="sk-..."
Внимание: базовый URL должен быть без /v1 на конце. Claude Code не читает переменную ANTHROPIC_BASE_URL из settings.json, её нужно задавать в консоли перед запуском.
Использование
Запустите инструмент с указанием конкретной модели.
claude --model anthropic/claude-3-7-sonnet-20250219
Обязательно указывайте точное название модели через параметр --model, так как имена моделей по умолчанию могут не совпадать.
Или с конкретным промптом:
claude "Напиши скрипт на Python для парсинга сайтов"
Cursor + VseLLM
Cursor — это самый популярный AI-редактор кода. Подключив его к VseLLM, вы получаете доступ к моделям уровня Pro (Claude 4.5 Sonnet, GPT-5) без ежемесячной подписки, оплачивая только то, что используете.
Откройте Settings
В правом верхнем углу Cursor нажмите на иконку шестеренки ⚙️ (Settings) или используйте комбинацию клавиш Ctrl + Shift + J.
Выберите вкладку Models
В меню настроек перейдите в раздел Models.
Активируйте OpenAI Compatible
Найдите секцию "OpenAI API Key" (иногда она скрыта под "Override OpenAI Base URL").
- Base URL:
https://api.vsellm.ru/v1 - API Key: введите ваш ключ VseLLM (начинается на sk-...)
Добавьте модели
Cursor по умолчанию может не видеть все модели. В разделе "Model Names" нажмите + Add model и вручную добавьте:
openai/gpt-5anthropic/claude-sonnet-4.5google/gemini-3.1-pro-preview
Затем отключите стандартные модели Cursor (gpt-4, gpt-3.5) переключателями, чтобы убедиться, что используются именно ваши настроенные модели.
Частые проблемы
Убедитесь, что вы вставили ключ именно в поле для OpenAI API Key, а не Anthropic или Azure.
Функция Tab (Copilot++) в Cursor работает на их собственных серверах и требует подписки Pro. VseLLM обеспечивает работу Чата (Ctrl+L) и Composer (Ctrl+I).
LangChain
LangChain — это фреймворк для разработки приложений на базе больших языковых моделей. VseLLM легко интегрируется с LangChain.
Установка
pip install langchain-openai
Использование
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
chat = ChatOpenAI(
model="openai/gpt-5",
openai_api_key="sk-...",
openai_api_base="https://api.vsellm.ru/v1"
)
messages = [
SystemMessage(content="Ты - полезный ассистент."),
HumanMessage(content="Как подключить VseLLM к LangChain?")
]
response = chat.invoke(messages)
print(response.content)
n8n
VseLLM предоставляет доступ к Enterprise‑серверу n8n для действующих клиентов.
Активация
Перейдите в раздел «Аккаунт» в Личном кабинете, найдите блок «Сервис n8n» и нажмите «Активировать n8n».
Добавьте ноду AI Agent
В workflow добавьте ноду AI Agent через Node Picker.
Настройка credentials
- Credential Name — VseLLM
- API Key — ваш API ключ
- Base URL —
https://api.vsellm.ru
Примечание: Приглашение в n8n должно быть принято в течение 24 часов.
Gemini CLI
Используйте мощные модели Google Gemini прямо из терминала через VseLLM.
Установка
pip install chatblade
Настройка и запуск
OPENAI_API_KEY="sk-..." \
chatblade --openai-base-url "https://api.vsellm.ru/v1" \
-c "google/gemini-3.1-pro-preview" "Ваш запрос"
При необходимости укажите прокси:
HTTP_PROXY="http://прокси:порт" \
OPENAI_API_KEY="sk-..." \
chatblade --openai-base-url "https://api.vsellm.ru/v1" \
-c "google/gemini-3.1-pro-preview" "Ваш запрос"
Kilo Code
Kilo Code — это VS Code extension и CLI для AI-программирования. Поддерживает OpenAI-совместимые провайдеры.
Установка
Установите расширение из VS Code Marketplace (найдите "Kilo Code") или CLI:
npm install -g @kilocode/cli
Подключение VseLLM
VS Code: Settings → Connect provider → OpenAI Compatible → укажите Base URL, API Key и Model ID.
CLI: запустите с переменными окружения:
OPENAI_API_KEY="sk-..." \
OPENAI_BASE_URL="https://api.vsellm.ru/v1" \
kilo run --model "openai/gpt-5" "запрос"
В некоторых регионах требуется прокси:
HTTP_PROXY="http://прокси:порт" \
OPENAI_API_KEY="sk-..." \
OPENAI_BASE_URL="https://api.vsellm.ru/v1" \
kilo run --model "openai/gpt-5" "запрос"
OpenClaw
Официальная документация OpenClaw: docs.openclaw.ai
OpenClaw — это мощный open-source агент, который завоевал популярность благодаря своей гибкости и способности выполнять сложные задачи автономно.
Установка
curl -fsSL https://openclaw.bot/install.sh | bash -s -- --no-onboard
Зачем
это нужно: OpenClaw написан на Node.js и требует глобальной установки в
систему. Этот единый скрипт автоматически скачает нужную версию среды выполнения
(Node.js v22) и установит сам пакет openclaw, чтобы вы могли вызывать
его из любого места в терминале.
Конфигурация (~/.openclaw/openclaw.json)
Файл конфигурации определяет "мозг" агента. По умолчанию он не создаётся, вам нужно создать его вручную.
Зачем это нужно: Без этого файла OpenClaw не знает, к какой
нейросети подключаться и какой ключ использовать. baseUrl указывает
агенту обращаться к API VseLLM, api: "openai-completions" говорит
использовать стандартный формат запросов, а блок models фиксирует
доступные лимиты контекста.
Вставьте туда следующий рабочий эталон конфигурации:
Строгий парсер JSON: OpenClaw использует сверхстрогую проверку
формата (Zod). apiKey обязана быть прямой строкой. В массиве
models запрещены любые сторонние ключи вроде reasoning
или input. Шаг вправо, шаг влево — и модель отбрасывается,
сбрасывая лимит токенов в дефолтные 4096.
{
"models": {
"mode": "merge",
"providers": {
"custom-api-vsellm-ru": {
"baseUrl": "https://api.vsellm.ru/v1",
"apiKey": "sk-ВАШ_КЛЮЧ",
"api": "openai-completions",
"models": [
{
"id": "deepseek/deepseek-v3.2",
"name": "deepseek/deepseek-v3.2",
"contextWindow": 128000,
"maxTokens": 4096
}
]
}
}
},
"tools": {
"byProvider": {
"custom-api-vsellm-ru": {
"deny": ["*"]
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "custom-api-vsellm-ru/deepseek/deepseek-v3.2"
}
}
}
}
Блок
tools.byProvider.deny: ["*"] жёстко запрещает агенту использовать
встроенные утилиты файловой системы. Это нужно, чтобы бот не уходил в бесконечные
циклы чтения системных файлов (вроде SOUL.md) и общался с вами
напрямую.
Проверка подключения
# Исправление проблем со схемой JSON
openclaw doctor --fix
# Список подхваченных моделей и их контекстное окно
openclaw models list
Зачем
это нужно: Команда doctor проверит ваш свежий файл
openclaw.json на предмет скрытых опечаток в структуре JSON и попытается
их исправить. Команда models list устанавливает тестовое соединение с
VseLLM. Если интеграция прошла успешно, она выдаст таблицу с моделью
deepseek-v3.2 и подтвердит лимит контекста в 128k токенов.
Как общаться с ботом?
Самый простой способ — общаться прямо в терминале:
openclaw tui
Зачем это нужно: Запускает локальную оболочку чата прямо в вашем окне терминала. Это самый быстрый способ протестировать бота, проверить, как он вызывает функции и читает файлы, без необходимости сразу настраивать сторонние мессенджеры.
Также вы
можете привязать агента к Telegram-боту, добавив в корневой конфиг
openclaw.json блок:
{
"channels": {
"telegram": {
"enabled": true,
"botToken": "XXXXXXXXX:YYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
}
}
}
Зачем это нужно: Привязка к Telegram позволяет боту работать в фоновом режиме (если запущен gateway-сервис). Вам больше не нужно держать открытым терминал — вы можете давать агенту задачи с телефона, а он будет автономно кодить и выполнять их на вашем сервере.
Запуск как фоновый сервис (systemd)
Для
серверного деплоя без интерфейса — используйте openclaw gateway через
systemd.
cat > /etc/systemd/system/openclaw.service << 'EOF'
[Unit]
Description=OpenClaw Gateway Service
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/bin/openclaw gateway
Restart=always
RestartSec=10
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now openclaw
Зачем
это нужно: Если запустить бота для Telegram банальной командой
openclaw gateway, то при закрытии SSH-сессии или окна консоли бот
умрёт. Systemd-юнит превращает это в системный фоновый процесс. Бот будет
автоматически стартовать при перезагрузке сервера и подниматься в случае неожиданных
падений благодаря параметру Restart=always.
Важно: Никогда не пытайтесь устанавливать deepseek-r1 в
качестве основного агента для Telegram или чата. R1 — это модель с цепочкой рассуждений
(reasoning model), которая на
стороне OpenRouter/VseLLM обрушит весь шлюз OpenClaw 400 ошибкой при попытке передать ей
встроенные penalty-параметры. Используйте строго V3.2.
Рекомендуемые модели для OpenClaw
Используйте
deepseek/deepseek-v3.2 в качестве основного агента. Это самая стабильная модель,
которая полностью поддерживает Tool Calls, Streaming и Penalty Parameters, встроенные в ядро
OpenClaw.
# Модель ID | Контекст
# deepseek/deepseek-v3.2 | 128k ✅ рекомендуется
# anthropic/claude-sonnet-4.5 | 200k ✅ рекомендуется
# openai/gpt-5 | 128k
# openai/gpt-5-nano | 128k (простые чаты)
# google/gemini-2.5-flash | 1M
# qwen/qwen3-235b-a22b | 128k
Решение возможных проблем
Вызовите дебаг командой openclaw gateway status --deep. Главные причины:
- Конфликт портов (EADDRINUSE): какой-то другой инстанс или софт (например, локальный Ollama) занял нужный порт.
- Падение парсера конфига: проверьте синтаксис
openclaw.jsonчерезopenclaw doctor.
Проверьте статус каналов: openclaw channels status --probe. Если пишет
"connected", но ответов нет — убедитесь, что в Telegram (через BotFather) у бота
выключен Privacy Mode. По умолчанию OpenClaw игнорирует сообщения в группах, если
нет прямого упоминания бота ("mention required").
Проверьте, что вы используете https в Base URL. VseLLM работает
только по защищённому протоколу:
"baseUrl": "https://api.vsellm.ru/v1" ✅
"baseUrl": "http://api.vsellm.ru/v1" ❌
OpenClaw использует крайне строгий парсер формата конфигурации. Если вы добавили в
раздел models нестандартные ключи (например, `"reasoning": false` или
`"input": ["text"]`), валидатор крашнется, отбросит всю вашу кастомную конфигурацию
и откатится на безопасные настройки с лимитом в 4096 токенов.
Решение: уберите всю отсебятину из models, оставьте
строго id, name, contextWindow и
maxTokens. Затем перезагрузите шлюз.
Помечается как Non-fatal — gateway не падает. Это heartbeat или
Telegram-polling в момент нестабильной сети. Ограничьте активные часы:
openclaw config set agents.defaults.heartbeat '{"every":"30m","activeHours":{"start":"08:00","end":"22:00"}}'
Логи без шума: journalctl -u openclaw -f | grep -v "Non-fatal"
OpenClaw перемещает некоторые ключи между версиями. Автоматическое исправление:
openclaw doctor --fix
Для задач, требующих сложной логики (например, написание кода), используйте
deepseek/deepseek-v3.2 или anthropic/claude-sonnet-4.5.
Для простых чатов подойдет openai/gpt-5-nano.
OpenHands
OpenHands (ранее OpenDevin) — это автономный AI-инженер, способный писать код, исправлять баги и деплоить приложения. Используйте VseLLM как мозговой центр для OpenHands.
Установка через CLI (рекомендуется)
# Установка OpenHands
uv tool install openhands --python 3.12
# Запуск с VseLLM
LLM_API_KEY="sk-..." \
LLM_BASE_URL="https://api.vsellm.ru/v1" \
LLM_MODEL="openai/gpt-5" \
openhands serve
Или через Docker
docker run -it --rm --pull=always \
-e LLM_API_KEY="sk-..." \
-e LLM_BASE_URL="https://api.vsellm.ru/v1" \
-e LLM_MODEL="openai/gpt-5" \
-e AGENT_SERVER_IMAGE_REPOSITORY=ghcr.io/openhands/agent-server \
-e AGENT_SERVER_IMAGE_TAG=1.26.0-python \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands:/.openhands \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
docker.openhands.dev/openhands/openhands:1.8
Конфигурация через UI
- Custom Model:
openai/gpt-5 - Base URL:
https://api.vsellm.ru/v1 - API Key: Ваш ключ VseLLM
В настройках UI включите Advanced и укажите кастомную модель и Base URL.
Open WebUI
Open WebUI — это мощный и гибкий веб-интерфейс для работы с LLM. Он предоставляет удобный UI для чата, админ-панель, поддержку нескольких моделей и многое другое. С VseLLM вы получаете доступ к 80+ моделям через единый интерфейс.
Подготовка и запуск Open WebUI
Перед запуском установите Docker Desktop (или Docker Engine) и убедитесь, что Docker запущен:
docker --version
docker ps
Запустите Open WebUI контейнером:
docker run -d -p 3000:8080 \
-e HF_HUB_OFFLINE=1 \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
--name open-webui \
ghcr.io/open-webui/open-webui:main
Проверьте, что контейнер поднялся, затем откройте интерфейс:
docker ps
open http://localhost:3000
Полезные команды: docker logs -f open-webui, docker restart open-webui, docker stop open-webui.
Подключение VseLLM
Откройте http://localhost:3000 в браузере. При первом запуске будет предложено создать админ-аккаунт.
Перейдите в Settings → External Connections и добавьте VseLLM:
- API Base URL:
https://api.vsellm.ru/v1 - API Key: ваш ключ VseLLM (начинается на
sk-...)
https://api.vsellm.ru/v1.
Выбор модели
В левом верхнем углу выберите модель из списка доступных. VseLLM предоставляет модели:
openai/gpt-5— флагманская модельanthropic/claude-sonnet-4.5— Claude 4.5deepseek/deepseek-v3.2— мощная open-source модельgoogle/gemini-2.5-flash— Gemini 2.5- И ещё 80+ моделей!
Админ-панель: В разделе Admin Settings вы можете управлять пользователями, настраивать лимиты и просматривать статистику использования.
Qwen Code
Qwen Code — это AI-ассистент для программирования от Alibaba. Подключив VseLLM, вы получаете доступ к 80+ моделям (GPT-5, Claude 4.5, Gemini, DeepSeek и др.) через единый интерфейс.
Установка
macOS:
brew install qwen-code
Linux:
curl -fsSL https://qwen-code.ai/install.sh | sh
Windows:
winget install qwen-code
Способ 1: Через интерфейс (простой)
Запустите Qwen Code:
qwen
В появившемся окне:
- Выберите OpenAI Compatible
- Введите Base URL:
https://api.vsellm.ru/v1 - Введите ваш API ключ (начинается на
sk-...) - Выберите модель (например,
qwen/qwen3.6-plus)
Qwen Code автоматически создаст конфиг и сохранит его.
Способ 2: Ручная настройка
Создайте или отредактируйте файл ~/.qwen/settings.json:
{
"env": {
"QWEN_CUSTOM_API_KEY_OPENAI_HTTPS_API_VSELLM_RU_V1": "ваш-апи-ключ"
},
"modelProviders": {
"openai": [
{
"id": "qwen/qwen3.6-plus",
"name": "qwen/qwen3.6-plus",
"baseUrl": "https://api.vsellm.ru/v1",
"envKey": "QWEN_CUSTOM_API_KEY_OPENAI_HTTPS_API_VSELLM_RU_V1"
}
]
},
"security": {
"auth": {
"selectedType": "openai"
}
},
"model": {
"name": "qwen/qwen3.6-plus"
},
"$version": 3,
"ide": {
"hasSeenNudge": true
}
}
Замените ваш-апи-ключ на ваш ключ VseLLM (начинается на sk-...).
Запуск
Запустите Qwen Code:
qwen
Hermes
Hermes — это мощный AI-инструмент для работы с кодом прямо в терминале. Вы можете легко подключить VseLLM для использования лучших ИИ-моделей.
Установка Hermes
Установите агент Hermes через терминал:
# macOS (Homebrew)
brew install hermes-agent
# Windows (Winget)
winget install hermes-agent
Первый запуск и настройка
Запустите Hermes командой:
hermes
Следуйте инструкциям интерактивного помощника:
- На вопрос "Run setup now? [Y/n]" ответьте Y.
- Выберите (●) Quick setup — provider, model & messaging (recommended).
- Выберите (○) Custom endpoint (enter URL manually).
- Введите URL:
api.vsellm.ru/v1 - Введите ваш API Key из личного кабинета VseLLM.
Готовность к работе
Hermes готов к использованию с нашими ИИ! Теперь вы можете задавать вопросы и работать с кодом прямо в консоли.
Roo Code
Roo Code — это популярное расширение для VS Code, которое интегрирует AI прямо в ваш редактор. Ранее известный как Roo.
Установка
Найдите Roo Code в маркетплейсе VS Code и установите расширение.
Настройки провайдера
Откройте панель Roo Code (иконка в левом сайдбаре) и перейдите в настройки (шестеренка).
Выберите API Provider: OpenAI Compatible.
Параметры подключения
- Base URL:
https://api.vsellm.ru/v1 - API Key: Ваш ключ (sk-...)
- Model ID:
openai/gpt-5илиanthropic/claude-sonnet-4.5
Ошибка "404 Not Found": Убедитесь, что вы добавили /v1 в конце Base URL: https://api.vsellm.ru/v1
Opencode
Opencode — это современный AI-assistant для разработки с поддержкой множества моделей через единый интерфейс.
Установка
macOS:
brew install opencode
Linux:
curl -fsSL https://opencode.ai/install.sh | bash
Windows:
winget install opencode
Или скачайте последнюю версию с официального сайта.
Настройка конфига
Создайте файл config.json в корне вашего проекта:
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"vsellm": {
"npm": "@ai-sdk/openai-compatible",
"name": "VseLLM",
"options": {
"baseURL": "https://api.vsellm.ru/v1",
"apiKey": "your-api-key"
},
"models": {
"anthropic/claude-sonnet-4": {
"name": "anthropic/claude-sonnet-4"
},
"anthropic/claude-opus-4.1": {
"name": "anthropic/claude-opus-4.1"
},
"openai/gpt-5": {
"name": "openai/gpt-5"
},
"deepseek/deepseek-v3.2": {
"name": "deepseek/deepseek-v3.2"
},
"moonshotai/kimi-k2.5": {
"name": "moonshotai/kimi-k2.5"
}
}
}
}
}
Запуск
Запустите Opencode с вашим конфигом:
opencode --config config.json
Или укажите провайдера и модель:
opencode --provider vsellm --model anthropic/claude-sonnet-4
Доступные модели: VseLLM предоставляет доступ к 80+ моделям включая Anthropic Claude, OpenAI GPT, Google Gemini, DeepSeek, Qwen, Grok и другие.
Kodacode
Kodacode — это AI-ассистент для разработчиков в виде плагина для VS Code и терминального CLI-агента. Используйте модели VseLLM прямо из вашей IDE или терминала.
Установка
Установите CLI глобально через npm:
npm install -g @kodadev/koda-cli
Или установите расширение Kodacode из маркетплейса VS Code.
Настройка провайдера
Для CLI задайте переменные окружения:
export KODA_API_KEY="sk-..."
export KODA_API_BASE="https://api.vsellm.ru/v1"
export KODA_MODEL="openai/gpt-5.1"
Для VS Code откройте Settings → Extensions → Kodacode и укажите те же параметры: API Key, API Base URL и Model.
Запуск
Запустите CLI:
koda -p "Объясни структуру этого проекта"
В VS Code откройте панель Kodacode и начните диалог — все запросы будут обрабатываться через VseLLM.
Универсальная интеграция
VseLLM совместим практически с любым инструментом, который поддерживает OpenAI API и смену Base URL.
https://api.vsellm.ru/v1
Протестированные инструменты
| Инструмент | Тип | Настройка |
|---|---|---|
| LibreChat | Чат-интерфейс | В librechat.yaml укажите endpoint |
| SillyTavern | RP интерфейс | Выберите "OpenAI Compatible" в настройках API |
| Jan.ai | Локальный клиент | Добавьте Custom Model Provider |
| Continue.dev | VS Code Ext | В config.json добавьте провайдера "openai" |
Поддержка
Каналы обращения
Telegram
@aiPoMaN — сервисный аккаунт
Чат сообщества
Общение с другими пользователями
Тикет система
Создание обращений в поддержку
Система тикетов в личном кабинете
Вы также можете создать обращение в поддержку прямо из личного кабинета:
Преимущества тикетов:
- История всех обращений в одном месте
- Возможность прикреплять файлы
- Отслеживание статуса обращения
- Привязка к аккаунту пользователя
Как составить запрос
Важно: Все запросы без указания необходимой информации рассматриваться не будут.
Регламент ответа
Что не входит в поддержку
Примечание: Поддержка не включает консультации по программированию и разработке сторонних интеграций.
Плановые работы
Возможны окна обслуживания; уведомление направляется в Telegram.