Документация API
Мы предоставляем единое OpenAI-совместимое API для ВСЕХ нейросетей, включая OpenAI, Anthropic, Google, DeepSeek и пр.
Для переключения на другую нейросеть достаточно поменять идентификатор модели (Model ID) в запросе API или интерфейсе приложения. В случае, если список моделей жестко прошит в приложении, можно сделать редирект модели в
настройках маппинга пользователя
Доказательство того, что у нас хорошее OpenAI-совместимое API – готовые интеграции с множеством сторонних опенсорс приложений.
Для переключения на другую нейросеть достаточно поменять идентификатор модели (Model ID) в запросе API или интерфейсе приложения. В случае, если список моделей жестко прошит в приложении, можно сделать редирект модели в

Доказательство того, что у нас хорошее OpenAI-совместимое API – готовые интеграции с множеством сторонних опенсорс приложений.
Оглавление документа
Что мы поддерживаем из API?
Мы специализируемся на текстовых нейросетях.
В первую очередь мы поддерживаем только часть OpenAI API, касающуюся текстовых нейросетей – зато для самых разных нейросетей (chat completions).
Также мы поддерживаем
- v1/embeddings – модель для создания текстовых эмбеддингов
- chat completions для vision-нейросетей
- генерации картинок,
- audio/transcriptions (speech to text)
- получение баланса и статуса аккаунта пользователя
- генерации голоса (TTS),
В планах поддержка:
- поискового API (не OpenAI)
Нет планов на поддержку:
- кастомных ассистенты и пр. – но вы можете использовать
наш пример реализации RAG (поиска по документам), если вам нужна такая функциональность.
Мы не поддерживаем
- решения с сайта OpenAI (хотя для них есть аналоги)
Механика доступа по API и URL для подключений
Поддерживается стандартный доступ по API OpenAI – вы можете использовать любые программы для доступа по нему.
Не забудьте указать следующие кастомные параметры – URL точки доступ и имя модели:
URL: https://api.vsegpt.ru/v1/chat/completions
- В зависимости от программы, это может быть https://api.vsegpt.ru/v1 или ещё что-то, см. примеры в
Руководстве по подключению сторонних инструментов
также поддерживается старый URL на другом порту

model: id модели из списка моделей
- Вы можете поменять только ID модели при запросе и перенаправить запрос к Antropic Claude, Google или опенсорс моделям, не меняя остальные поля в запросе. Мы поддерживаем единый интерфейс для всех моделей.
- Допускается указание стандартных идентификаторов gpt-3.5-turbo, gpt-4 – они будут автоматически преобразованы в соответствующие полные ID моделей OpenAI в большинстве случаев.
- Также возможно автоматическое преобразование ваших моделей в новые идентификаторы, если вы настроите маппинг моделей в
Настройках
Важно: при автоматизации следуйте Правилам хорошего бота, чтобы избежать блокировки
Чтобы наше API работало хорошо, мы просим вас придерживаться Правил хорошего бота, иначе мы можем временно ограничить ваш доступ к API
ВАЖНО: процесс отладки вызовов по API в случае, если возникают проблемы
1. Проверка в наших сервисах
Все наши сервисы также используют наше же API для работы.
Поэтому мы настоятельно просим перед тем как писать «Ваше API не работает» проверить, работает ли оно в наших сервисах.
Для текстовых запросов
Если вы делаете обычный (нестриминговый) запрос (с одним ответом), то, пожалуйста
- Зайдите в Сервисы > Чат с o1 (просто этот чат использует нестриминговый вызов, в отличие от обычного чата, где данные выводятся стримингом по мере поступления)
- Выбираете модель model-from-sidebar
- В левой панели выбираете модель, к которой хотите обратиться.
- Запускаете запрос. Если запрос работает – значит, наше API работает.
Если вы делаете стриминговый запрос – просто протестируйте работу модели в нашем обычном чате с нейросетью. Если чат работает – значит, проблема в вашем запросе.
Для других запросов (картинки и пр.)
Используйте соответствующие клиенты из раздела Сервисы.
2. Проверьте на разных моделях
Ваш запрос не работает на конкретной модели или вообще в целом?
- Используйте другую модель для проверки. Обычно постоянно работает openai/gpt-4o-mini
- Посмотрите на страницу Uptime и инциденты (есть в меню) – там можно посмотреть статистику по часто используемым моделям и информацию, нет ли инцидентов с какими-то моделями, мы об этом пишем
- Почитайте информацию о вашей модели на странице Моделей – может, есть какие-то особенности (например, у моделей серии OMF есть холодный старт, и они могут стать доступны в течение после 1 неуспешного запроса)
Также отмечаем, что мы не даем гарантий 100% доступности для любых сетей. Бывают периоды, когда сети просто недоступны, тогда просто надо запастись терпением – если проблема не на нашей стороне, она обычно решается в течение нескольких часов.
3. Получите информацию об ошибке
Без этой информации мы обычно не рассматриваем вопросы в техподдержку.
При запросе кроме кода ошибки (400 и пр.) также возвращается текст ошибки. Нам он нужен, чтобы понять, что произошло – вам, чтобы легче пофиксить проблему.
Ошибки бывают двух типов:
- Если ваш запрос не прошел валидацию в нашем API, то мы вернем 400 или 429 ошибку с описанием. Обычно проблемы простые – закончились средства на счете, нет подписки, невалиден ключ и пр. Этот запрос не будет зарегистрирован в системе.
- Если ваш запрос прошел наше API и ушел поставщику нейросети, то он будет зарегистрирован в системе, его статус и текст ошибки будет доступен в меню Кабинет >
Стоимость последних генераций. Можете использовать его.
4. Обратитесь к отладочной точке доступа, чтобы посмотреть ваш запрос
Иногда запрос формируется во внутренней логике вашего программного обеспечения, и вы не можете понять, что с ним не так.
В таком случае можете отправить запрос к API с другим базовым URL (с другим портом) – https://api.vsegpt.ru:6010/v1/
На этой точке доступа будет логироваться последний запрос.
Чтобы получить информацию о последнем запросе обратитесь к URL:
https://api.vsegpt.ru:6010/v1/latest/call?key=ваш_API_ключ_VseGPT
Это отладочная точка доступа – не используйте её для работы. Запросы на неё можно отсылать не чаще раз в 20 секунд.
Получите последний запрос и сравните его с эталоном – возможно, проблема вам станет понятна.
Пример вызова API (Python, CURL)
ГОТОВЫЕ ПРИМЕРЫ в Google Colab

- Базовый пример – вызов gpt-4o-mini
- Работа с большим текстом – поиск по текстовой базе знаний с помощью эмбеддингов (RAG)
Генерация текста (chat/completions)
from openai import OpenAI
client = OpenAI(
api_key="sk-XXXXXXXXXXXXXXXX", # ваш ключ в VseGPT после регистрации
base_url="https://api.vsegpt.ru/v1",
)
prompt = "Напиши последовательно числа от 1 до 10"
messages = []
#messages.append({"role": "system", "content": system_text})
messages.append({"role": "user", "content": prompt})
response_big = client.chat.completions.create(
model="anthropic/claude-3-haiku", # id модели из списка моделей - можно использовать OpenAI, Anthropic и пр. меняя только этот параметр
messages=messages,
temperature=0.7,
n=1,
max_tokens=3000, # максимальное число ВЫХОДНЫХ токенов. Для большинства моделей не должно превышать 4096
extra_headers={ "X-Title": "My App" }, # опционально - передача информация об источнике API-вызова
)
#print("Response BIG:",response_big)
response = response_big.choices[0].message.content
print("Response:",response)
Требуется pip install openai==0.28.1
import openai
openai.api_key = "sk-XXXXXXXXXXXXXXXX" # ваш ключ в VseGPT после регистрации
openai.api_base = "https://api.vsegpt.ru/v1"
prompt = "Напиши последовательно числа от 1 до 10"
messages = []
#messages.append({"role": "system", "content": system_text})
messages.append({"role": "user", "content": prompt})
response_big = openai.ChatCompletion.create(
model="anthropic/claude-instant-v1", # id модели из списка моделей - можно использовать OpenAI, Anthropic и пр. меняя только этот параметр
messages=messages,
temperature=0.7,
n=1,
max_tokens=3000, # максимальное число ВЫХОДНЫХ токенов. Для большинства моделей не должно превышать 4096
headers={ "X-Title": "My App" }, # опционально - передача информация об источнике API-вызова
)
#print("Response BIG:",response_big)
response = response_big["choices"][0]["message"]
print("Response:",response)
curl https://api.vsegpt.ru/v1/chat/completions
-H "Content-Type: application/json"
-H "Authorization: Bearer $VSEGPT_API_KEY"
-d '{
"model": "openai/gpt-3.5-turbo",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Hello!"
}
]
}'
Генерация текста с Web search
Модели Perplexity на нашем сайте поддерживают chat completions с выполнением веб-поиска актуальной информации и возвращением ссылок.
Для деталей обратитесь к:
- Описанию моделей Perplexity в Моделях
- Примеру клиента с поиском (Сервисы > Чат с веб поиском)
- Документации Perplexity –
https://docs.perplexity.ai/api-reference/chat-completions
Получение размышлений в reasoning моделях (o1,R1)
o1 не поддерживает получение размышлений; только ответов
Deepseek R1 дает ответ в одном из полей ответа (reasoning_content):
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "The numbers from 1 to 5 written sequentially are: \n1, 2, 3, 4, 5.",
"reasoning_content": "Okay, let's see. The user wants me to write the numbers from 1 to 5 in order. That sounds straightforward, but I should make sure I do it correctly. Let me start by recalling the sequence of numbers.\n\nFirst, 1 is the starting point. Then comes 2, followed by 3. After that, it's 4 and then 5. Wait, is there any chance I might mix up the order? I don't think so. Numbers from 1 to 5 are pretty basic. Let me count them again in my head to double-check: 1, 2, 3, 4, 5. Yep, that's five numbers, each increasing by one. \n\nHmm, maybe the user wants them listed each on a separate line or separated by commas. The instruction says \"sequentially,\" so probably just one after the other. The example didn't specify formatting, but to be clear, I should present them in a simple sequence. Let me write them out: 1, 2, 3, 4, 5. \n\nWait, but maybe they want each number written out as a word? Like one, two, three, four, five. The original query says \"numbers,\" which could be interpreted either way. But since it's about writing the numbers, not the words, digits are more likely expected. \n\nAlternatively, maybe they want a vertical list. But the example response the assistant is supposed to generate uses commas. Let me check the user's exact request again: \"Write the numbers from 1 to 5 sequentially.\" The key word is \"sequentially,\" which just means in order. So the simplest way is to list them in order separated by commas. \n\nI think that's all. No complications here. Just make sure not to skip any number or repeat any. Let me verify once more: starting at 1, each subsequent number increases by 1 until 5. So 1, then 2, then 3, then 4, then 5. No mistakes there. Alright, ready to present the answer."
},
"logprobs": null,
"finish_reason": "stop"
}
],
Генерация Embedding
from openai import OpenAI
client = OpenAI(
api_key="sk-XXXXXXXXXXXXXXXX", # ваш ключ в VseGPT после регистрации
base_url="https://api.vsegpt.ru/v1",
)
client.embeddings.create(
model="text-embedding-ada-002",
input="The food was delicious and the waiter...",
encoding_format="float"
)
import openai
openai.api_key = "sk-XXXXXXXXXXXXXXXX" # ваш ключ в VseGPT после регистрации
openai.api_base = "https://api.vsegpt.ru/v1"
response_big = openai.Embedding.create(
model="text-embedding-ada-002",
input="function add(a, b) { return a + b; }",
)
print("Response BIG:",response_big)
res = response_big["data"][0]["embedding"]
curl https://api.vsegpt.ru/v1/embeddings
-H "Authorization: Bearer $VSEGPT_API_KEY"
-H "Content-Type: application/json"
-d '{
"input": "The food was delicious and the waiter...",
"model": "text-embedding-ada-002",
"encoding_format": "float"
}'
Embedding в LangChain
В model указывается ID эмбеддингов из списка моделей (по умолчанию 'text-embedding-ada-002', и это будет обработано)
from langchain_openai import OpenAIEmbeddings
model = OpenAIEmbeddings(model="text-embedding-3-large", openai_api_base = "https://api.vsegpt.ru/v1/")
Ссылка на документацию:

Vision-модель (распознавание картинок, OCR) (текст+картинка -> текст)
Внимание: для корректной тарификации стоимости картинок используйте Vision-варианты сетей (начинаются с префикса vis-, у них отдельный раздел в Моделях). Иначе ваш запрос либо не пройдет по причине стоимости, либо будет слишком дорогим.
Вариант с указанием картинки по URL (если картинка не будет найдена, или будет заблокирована, получите ошибку в духе openai.error.InvalidRequestError: Unknown MIME type)
from openai import OpenAI
client = OpenAI(
api_key="sk-XXXXXXXXXXXXXXXX", # ваш ключ в VseGPT после регистрации
base_url="https://api.vsegpt.ru/v1",
)
response = client.chat.completions.create(
model="vis-google/gemini-flash-1.5",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "What you think the person in the image is doing?"},
{
"type": "image_url",
"image_url": "https://img-s-msn-com.akamaized.net/tenant/amp/entityid/AA18Lnc8.img?w=1920&h=1080&q=60&m=2&f=jpg",
},
],
}
],
max_tokens=400,
)
print(response.choices[0])
import openai
openai.api_key = "sk-XXXXXXXXXXXXXXXX" # ваш ключ в VseGPT после регистрации
openai.api_base = "https://api.vsegpt.ru/v1"
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "What you think the person in the image is doing?"},
{
"type": "image_url",
"image_url": "https://img-s-msn-com.akamaized.net/tenant/amp/entityid/AA18Lnc8.img?w=1920&h=1080&q=60&m=2&f=jpg",
},
],
}
]
response_big = openai.ChatCompletion.create(
model="vis-google/gemini-flash-1.5",
messages=messages,
temperature=0.8,
n=1,
max_tokens=300,
)
#print("Response BIG:",response_big)
response = response_big["choices"][0]["message"]
print("Response:",response)
curl https://api.vsegpt.ru/v1/chat/completions
-H "Content-Type: application/json"
-H "Authorization: Bearer $VSEGPT_API_KEY"
-d '{
"model": "vis-google/gemini-flash-1.5",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "What you think the person in the image is doing?"},
{
"type": "image_url",
"image_url": "https://img-s-msn-com.akamaized.net/tenant/amp/entityid/AA18Lnc8.img?w=1920&h=1080&q=60&m=2&f=jpg"
}
]
}
],
"max_tokens": 400
}'
Вариант с загрузкой картинки из локального файла (вариант для openai=0.28.1, для 1.x решается соответствующей заменой функций для передачи картинки)
import openai
import base64
def encode_image(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode("utf-8")
openai.api_key = "sk-XXXXXXXXXXXXXXXX" # ваш ключ в VseGPT после регистрации
openai.api_base = "https://api.vsegpt.ru/v1"
base64_image = encode_image("Einstein.jpg")
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "What you think the person in the image is doing?"},
{
"type": "image_url",
"image_url": f"data:image/jpeg;base64,{base64_image}",
},
],
}
]
response_big = openai.ChatCompletion.create(
model="vis-google/gemini-pro-vision",
messages=messages,
temperature=0.8,
n=1,
max_tokens=300,
)
#print("Response BIG:",response_big)
response = response_big["choices"][0]["message"]
print("Response:",response)
Генерация изображения
from openai import OpenAI
client = OpenAI(
api_key="sk-XXXXXXXXXXXXXXXX", # ваш ключ в VseGPT после регистрации
base_url="https://api.vsegpt.ru/v1",
)
client.images.generate(
model="dall-e-3",
prompt="An astronaut riding the horse on the Moon.",
n=1,
size="1024x1024"
)
import openai
openai.api_key = "sk-XXXXXXXXXXXXXXXX" # ваш ключ в VseGPT после регистрации
openai.api_base = "https://api.vsegpt.ru/v1"
response_big = openai.Image.create(
model="dall-e-2",
prompt="An astronaut riding the horse on the Moon.",
n=1,
size="1024x1024",
quality="standard"
)
print(response_big)
curl https://api.vsegpt.ru/v1/images/generations
-H "Content-Type: application/json"
-H "Authorization: Bearer $VSEGPT_API_KEY"
-d '{
"model": "dall-e-3",
"prompt": "An astronaut riding the horse on the Moon.",
"n": 1,
"size": "1024x1024"
}'
Распознавание речи
from openai import OpenAI
client = OpenAI(
api_key="sk-XXXXXXXXXXXXXXXX", # ваш ключ в VseGPT после регистрации
base_url="https://api.vsegpt.ru/v1",
)
audio_file = open("speech.mp3", "rb")
transcript = client.audio.transcriptions.create(
model = "stt-openai/whisper-1",
response_format="text",
language="ru", # опционально, может быть пустым
file=audio_file
)
import openai
openai.api_key = "sk-XXXXXXXXXXXXXXXX" # ваш ключ в VseGPT после регистрации
openai.api_base = "https://api.vsegpt.ru/v1"
with open("test_rec.mp3", "rb") as audio_file:
transcript = openai.Audio.transcribe(
file = audio_file,
model = "stt-openai/whisper-1",
response_format="text", # опционально, может быть пустым
language="ru",
)
print(transcript.get("text"))
Возможно, также требуется указать response_format, см. примеры на Python
curl https://api.vsegpt.ru/v1/audio/transcriptions
-H "Authorization: Bearer $VSEGPT_API_KEY"
-H "Content-Type: multipart/form-data"
-F file="@/path/to/file/audio.mp3"
-F model="stt-openai/whisper-1"
Генерация речи (Text-to-Speech)
from pathlib import Path
from openai import OpenAI
client = OpenAI(
api_key="sk-XXXXXXXXXXXXXXXX", # ваш ключ в VseGPT после регистрации
base_url="https://api.vsegpt.ru/v1",
)
speech_file_path = Path(__file__).parent / "speech.mp3"
response = client.audio.speech.create(
model="tts-openai/tts-1",
voice="nova", # поддерживаются голоса alloy, echo, fable, onyx, nova и shimmer
input="Сегодня на улице очень жарко, не так ли?",
# response_format="wav" # другой формат, при необходимости
)
response.write_to_file(speech_file_path)
curl https://api.vsegpt.ru/v1/audio/speech
-H "Authorization: Bearer $VSEGPT_API_KEY"
-H "Content-Type: application/json"
-d '{
"model": "tts-1",
"input": "The quick brown fox jumped over the lazy dog.",
"voice": "alloy"
}'
--output speech.mp3
Конвертация документов в текст (utils/extract-text)
import requests
import base64
# Кодируем файл в base64
with open("example.pdf", "rb") as file:
encoded_file = base64.b64encode(file.read()).decode('utf-8')
# Отправляем запрос
response = requests.post(
"https://api.vsegpt.ru/v1/extract_text",
headers = {
"Authorization": "Bearer VSEGPT_API_KEY", # ваш ключ vsegpt
"X-Title": "Doc2Text example" # опционально
},
json={
"encoded_base64_file": encoded_file,
"filename": "example.pdf",
"model": "utils/extract-text-1.0"
}
)
# print(response.text)
response.raise_for_status()
# Получаем результат
print(response.json()["text"])
Генерация видео (Text-to-Video)
Общая логика:
- Сначала идет обращение на /v1/video/generate – ставим задачу на генерацию видео, получаем request_id в ответе.
- Далее каждые 10 секунд (можно больше) обращаемся на /v1/video/status?request_id=<request_id> и api key для получения статуса и URL результата.
- Когда status=COMPLETED, можно получить URL и по нему скачать видео
import requests
import json
import time
from datetime import datetime, timedelta
api_key = "your_vsegpt_api_key"
def generate_and_wait_video(prompt, model_id="txt2vid-kling/standart", aspect_ratio="16:9",
timeout_minutes=20):
base_url = "https://api.vsegpt.ru/v1/video"
# Заголовки запроса для генерации
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
# Тело запроса
payload = {
"model": model_id,
"action": "generate",
"prompt": prompt,
"aspect_ratio": aspect_ratio
}
# Запоминаем время начала генерации
start_time = datetime.now()
# Выполнение POST запроса для генерации
response = requests.post(
url=f"{base_url}/generate",
headers=headers,
json=payload
)
# Проверка статус кода
if response.status_code != 200:
print('ERROR', response.status_code, response.text)
return
# Получение request_id
response_data = response.json()
request_id = response_data.get('request_id')
if not request_id:
raise Exception("Failed to get request_id")
print(f"Generation started with request_id: {request_id}")
print(f"Using model: {model_id}")
print(f"Aspect ratio: {aspect_ratio}")
# Заголовки для проверки статуса
status_headers = {
"Authorization": f"Key {api_key}"
}
# Установка времени окончания ожидания
timeout_time = datetime.now() + timedelta(minutes=timeout_minutes)
# Цикл проверки статуса
while datetime.now() < timeout_time:
# Запрос статуса
status_response = requests.get(
url=f"{base_url}/status?request_id={request_id}",
headers=status_headers
)
status_data = status_response.json()
status = status_data.get('status')
video_url = status_data.get('url')
# Вычисляем прошедшее время
elapsed_time = datetime.now() - start_time
elapsed_minutes = elapsed_time.total_seconds() / 60
print(f"Current status: {status} (Elapsed time: {elapsed_minutes:.1f} minutes)")
if status == 'COMPLETED':
print(f"Video generated successfully!")
print(f"Total generation time: {elapsed_minutes:.1f} minutes")
print(f"Video URL: {video_url}")
return video_url
elif status == 'FAILED':
raise Exception(f"Video generation failed after {elapsed_minutes:.1f} minutes")
# Ждем 10 секунд перед следующей проверкой
time.sleep(10)
# Если вышли из цикла по таймауту
elapsed_time = datetime.now() - start_time
elapsed_minutes = elapsed_time.total_seconds() / 60
raise Exception(f"Timeout after {elapsed_minutes:.1f} minutes")
# Примеры использования
try:
# Использование с указанием конкретной модели
video_url = generate_and_wait_video(
prompt="Panda playing guitar in the middle of Paris.",
model_id="txt2vid-kling/standart",
aspect_ratio="9:16"
)
# Использование с указанием модели и таймаута
# video_url = generate_and_wait_video(
# prompt="Panda playing guitar in the middle of Manhattan.",
# model_id="txt2vid-kling/standart",
# timeout_minutes=30
# )
except Exception as e:
print(f"Error: {e}")
Генерация видео по картинке (Image-to-Video)
Аналогично предыдущему, только надо добавить еще
def encode_image_to_base64(image_file):
"""Кодирует загруженное изображение в base64"""
return base64.b64encode(image_file.read()).decode('utf-8')
# Добавляем в JSON запроса указание картинки
payload["image_url"] = f"data:image/jpeg;base64,{image_base64}"
Генерация музыки (Text-to-Audio)
from pathlib import Path
from openai import OpenAI
client = OpenAI(
api_key="sk-XXXXXXXXXXXXXXXX", # ваш ключ в VseGPT после регистрации
base_url="https://api.vsegpt.ru/v1",
)
response = client.audio.speech.create(
extra_body={
"seconds_total": 10 # число секунд для генерации
},
voice="nova", # не используется, но требуется библиотекой
model="tta-stable/stable-audio",
response_format="wav", # всегда WAV, другие не поддерживаются
input="128 BPM, techno drum music",
)
response.write_to_file(music_wav_file)
curl https://api.vsegpt.ru/v1/audio/speech
-H "Authorization: Bearer $VSEGPT_API_KEY"
-H "Content-Type: application/json"
-d '{
"model": "tta-stable/stable-audio",
"input": "128 BPM, techno drum music",
"seconds_total": 10
}'
--output music.wav
Получение баланса (Python)
Получение баланса должно быть включено в

Также в настройках можно указать лимит средств, после которого API будет возвращать состояние 1 – yellow, предупреждение о возможно недостаточном количестве средств.
Возвращаемые данные:
{
"status":"ok", # общий статус запроса
"data":{
"credits":"10.752448", # остаток на балансе
"subscription_status":"ok", # статус подписки (должен быть ok - это означает, что подписка работает)
"subscription_end":"2024-05-02 00:08:02" # формальное время окончания подписки, МСК
"user_status":1, # статус пользователя 0 - green, 1 - yellow (меньше средств, чем указано в настройках), 2 - red (аккаунт неработоспособен).
"user_status_text":"Less than 500 credits on account. " # в случае, если status не 0 - причина.
}}
В принципе, достаточно отслеживать, чтобы user_status все время был 0. При любых ошибках и проблемах информация будет передана в поле user_status_text.
Пример запроса на Python
import requests
import json
response = requests.get(
url="https://api.vsegpt.ru/v1/balance",
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
},
)
# print(response.text)
if response.status_code == 200:
response_big = json.loads(response.text)
if response_big.get("status") == "ok":
credits = float(response_big.get("data").get("credits"))
else:
raise response_big.get("reason") # reason of error
else:
raise ValueError(str(response.status_code) + ": " + response.text)
Получение информации о доступных моделях
Обратитесь к URL

Сторонние библиотеки и примеры на других языках (CURL, NodeJS)
Примеры для других языков программирования + CURL
Библиотека для работы с VseGPT для Go
Решение от одного из наших пользователей:

Внимание: мы не являемся официальным разработчиком и не даем никаких гарантий по данной библиотеке
Опенсорс примеры
Как сделать сервис «Вопросы по файлу»
Варианта 2:
1. Текстовая часть вашего файла помещается в контекст нейросети (например, gpt-4o-mini имеет контекст 128000 токенов).
В таком случае мы рекомендуем (следуя рекомендациям Antropic, создателей Claude) добавлять всю текстовую часть вашего файла в запрос к нейросети
Условно код выглядит так (в article подставьте текстовую часть вашего DOCX или PDF файла):
context_prompt = f"""Here's an article:\n\n<article>
{article}\n\n</article>\n\n"""
context_message = {"role": "system", "content": context_prompt}
question_message = {"role": "user", "content": "Напиши краткое содержание данной статьи"}
Таким же образом работает и наш сервис «Вопросы по файлу» – см. готовый пример ниже
Чтобы получить текстовое содержимое вашего файла, вы можете использовать локальную конвертацию или воспользоваться нашей моделью utils/extract-text.
2. Файл (и база знаний) слишком большие и не помещаются в контекст.
Тогда обратитесь к разделу Демо: RAG – там есть пример, основанный на embedding, который показывает, как добавлять потенциально релевантные части вашего файла в контекст запроса к нейросети.
Демо: аналог сервиса «Вопросы по файлу»
import time
import requests
import base64
VSEGPT_KEY = "sk-or-..."
# ---------------- Получаем текст файла ----------------
# Кодируем файл в base64
with open("example.pdf", "rb") as file:
encoded_file = base64.b64encode(file.read()).decode('utf-8')
# Отправляем запрос
response = requests.post(
"https://api.vsegpt.ru/v1/extract_text",
headers = {
"Authorization": f"Bearer {VSEGPT_KEY}",
"X-Title": "File analysis demo"
},
json={
"encoded_base64_file": encoded_file,
"filename": "example.pdf",
"model": "utils/extract-text-1.0"
}
)
if response.status_code != 200:
print("Ошибка вызова: ", response.status_code, response.text)
raise ValueError("")
# Получаем результат
article = response.json()["text"]
print("Текст файла:", article)
# ---------------- Задаем вопрос по файлу ----------------
# Ждем 1 секунду - VseGPT не позволяет посылать запросы чаще (чаще можно только на тарифе FAST)
print("Ждем 1 секунду...")
time.sleep(1.0)
# Формируем сообщения
question = "Напиши вкратце, о чем эта статья"
print("Вопрос:", question)
context_prompt = f"""Here's an article:\n\n<article>
{article}\n\n</article>\n\n"""
context_message = {"role": "system", "content": context_prompt}
question_message = {"role": "user", "content": question}
# Подготовка данных для запроса
headers = {
"X-Title": "File analysis demo",
"Authorization": f"Bearer {VSEGPT_KEY}",
"Content-Type": "application/json"
}
data = {
"model": "openai/gpt-4o-mini",
"messages": [context_message, question_message]
}
# Выполнение POST запроса
response = requests.post(
"https://api.vsegpt.ru/v1/chat/completions",
headers=headers,
json=data
)
# Обработка ответа
response_data = response.json()
msg = response_data["choices"][0]["message"]["content"]
print("Ответ:", msg)
Демо: RAG (поиск по базе знаний / серии документов с помощью эмбеддингов и векторной базы данных)
Вопрос: «Расстояние от Земли до Солнца?»
Ответ: «Расстояние от Земли до Солнца составляет приблизительно 149,6 миллионов километров, что примерно равно астрономической единице.» (на основе данных файла Sun.txt)
Ответ: «Расстояние от Земли до Солнца составляет приблизительно 149,6 миллионов километров, что примерно равно астрономической единице.» (на основе данных файла Sun.txt)
RAG – набор методов, направленных на то, чтобы
– а) выбирать из больших серий документов куски текста, соответствующих запросу пользователя
– б) добавлять эти релевантные куски в запрос к нейросети – чтобы нейросеть отвечала, исходя из реальной информации из документов.
Применяется в случае, когда у вас есть МНОГО документов, не влезающих в контекст и когда надо по ним отвечать на запросы пользователя.
Ниже приведен пример реализации с помощью векторной базы данных FAISS (работает на CPU, т.е. везде) и API VseGPT:

Демо: телеграм-бот, отвечающий на вопросы

Опенсорс: телеграм-бот Киберникто
Готовый к работе сложный телеграм-бот с множеством разных приемов для обработки входных сообщений.
Не демонстрационный
Поддерживается сторонним разработчиком, не VseGPT

Ошибки API и их обработка
Общие принципы
Ошибка передается как код HTTP-запроса, а также во внутреннем JSON.
Общие принципы обработки кодов:
- 200 – все ОК
- 4xx – что-то не ОК
- 504 – (EDGE_FUNCTION_INVOCATION_TIMEOUT) – сервер не смог ответить в нужное время. Попробуйте тупо переотправить запрос повторно. (Редко бывают периоды, когда сервера перегружены и таких ошибок бывает до 10%)
- 500 – ошибка сервера. Либо у нас всё плохо (маловероятно), либо вы некорректно сформировали запрос по API (очень вероятно)
Вебчат: Failed to fetch
Иногда вебчат не возвращает ошибку, а просто говорит Failed to fetch – что часто означает недоступность сервера API.
Пути решения:
1. Проверить, повторяется ли ошибка на другой модели. Если нет – значит, временная проблема именно с этой моделью; переключитесь пока на другую.
2. Проверьте, выключен ли VPN (наиболее частый случай). Часто коннект к VPN не пропускает запросы из вебчата.
3. Проверьте, повторяется ли ошибка в других браузерах (Chrome, Firefox). Если другие браузеры работают – значит, по каким-то причинам этот браузер или какое-то расширение не пропускают запросы.
Ошибка 400 (большинство обычных ошибок)
Основной код ошибки от нас.
Ошибка:
Решение: такое возникает, когда ваш запрос превышает возможности обработки модели (выходит за размер её контекста).
Варианты решения:
- если вы долго ведете чат – начните новый чат! Чтобы нейросеть понимала контекст разговора, при запросе обрабатываются ВСЕ предыдущие сообщения чата как входные данные. Поэтому, если вы начинаете НОВУЮ ТЕМУ разговора, начинайте НОВЫЙ чат без истории диалога – это сэкономит вам массу средств.
- или перейдите на другую модель с более большим размером контекста
Ошибка:
Решение: max_tokens (число токенов ожидаемой для генерации) для данной модели не может быть таким большим (даже если контекст у модели большой). Поменяйте его в настройках API-запроса или в чате
Общее правило: сумма запроса + ожидаемый ответ не должны быть больше контекста модели.
Ошибка: User with this API key not found
Решение: вы указали неверный или старый ключ API; пользователь с таким ключом не найден. Возьмите ваш ключ на https://vsegpt.ru/User/API
Ошибка: «Seems you use original OpenAI API key. This key will not work on this site; you need VseGPT API Key, you can get your own here: https://vsegpt.ru/User/API
Решение: вы используете оригинальный ключ API вместо нашего. Зайдите на https://vsegpt.ru/User/API и получите наш ключ.
Ошибка: This model is not available on your subscription plan. Please, upgrade your subscription plan to use it. Subscription plans: https://vsegpt.ru/Docs/Tariffs
Решение: Данная модель не доступна на вашем тарифном плане – измените тарифный план, чтобы получить к ней доступ. Список тарифных планов: https://vsegpt.ru/Docs/Tariffs
Ошибка:
Решение: ошибка показывает, что ожидаемая стоимость запроса на данную модель превышает средства на вашем аккаунте. Пополните баланс или переключитесь на другую модель.
Ошибка:
Решение: ошибка показывает, что ожидаемая стоимость запроса на данную модель превышает пользовательский лимит на 1 запрос на вашем аккаунте. Если вы по-прежнему хотите провести запрос, вы можете настроить ваш лимит по ссылке https://vsegpt.ru/User/SettingsModels
Ошибка 403
Ваш запрос был заблокирован из-за того, что он нарушает политику ToS модерации выбранной модели по какой-то тематике. Вам надо отредактировать его, чтобы он не нарушал, либо использовать модель без модерации.
Ошибка 429
Вы отправляете запросы слишком часто. Допускается отправка запросов с одного аккаунта не чаще 1 раза в 2 секунды (на тарифе FAST – больше)
(Также подобное поведение может быть у вышестоящих провайдеров для отдельных сетей с ограничением числа запросов в секунду)
Ошибка 500, 502 (EDGE_FUNCTION_INVOCATION_FAILED или INTERNAL_SERVER_ERROR или пусто)
Два варианта:
- Сервер временно недоступен, какие-то проблемы у нас (маловероятно)
- Вы некорректно отправляете API запрос. EDGE_FUNCTION_INVOCATION_FAILED возвращает наш вышестоящий провайдер, означает, что с вызовом API что-то не так, но что именно, сказать невозможно. Попробуйте отладить API-запрос.
Ошибка 504 (EDGE_FUNCTION_INVOCATION_TIMEOUT)
Она же: EDGE_FUNCTION_INVOCATION_TIMEOUT с разными комментариями
Означает, что вышестоящий провайдер (у которого мы берем доступ) не может обработать запрос из-за таймаута (т.е. скорее всего перегружены сервера с моделями или другая проблема)
Решается на стороне вышестоящего провайдера, вам ничего делать не нужно.
Если вы находитесь в чате – просто перегенерируйте сообщение, чаще всего запрос пройдет.
Если по API – то отправьте запрос повторно, чаще всего запрос пройдет.
Особенности реализации
Поддерживаемые endpoints
– chat/completions
– models (для получения информации о моделях)
– embeddings
– images/generations
– audio/transcriptions
Поддержка function calls (УСТАРЕЛО)
С 20 августа функциональность function calls, как
устаревшая версия tool calls, больше не работает. Пожалуйста, используйте tool calls для реализации.
Для поддержания совместимости введена одна модель openai/gpt-4o-2024–08–06-function-call, которая поддерживает вызовы function call. Модель не поддерживает стриминг и тарифицируется потокенно по результатам запроса.

Для поддержания совместимости введена одна модель openai/gpt-4o-2024–08–06-function-call, которая поддерживает вызовы function call. Модель не поддерживает стриминг и тарифицируется потокенно по результатам запроса.
У нас добавлена поддержка function calling вызовов OpenAI – в том числе для части опенсорс моделей!


Такой вызов просит OpenAI модель вывести json, соответствующий одной из предложенных функций. Например, можно подать на вход функцию get_current_weather – и выходом модели будет json get_current_weather с параметрами, соответствующими текущему пользовательскому текстовому запросу (см. примеры по ссылке)
Поддерживаются модели:
- OpenAI openai/gpt-3.5-turbo, gpt4, и, возможно другие (ответ будет в элементе function_call)
- jondurbin/airoboros-l2–70b (ответ будет в элементе content)
Также на практике и множество других моделей поддерживают function calls (Claude и пр.), но их поддержка не задекларирована, так что используйте на свой страх и риск. У автора работали anthropic/claude-instant-v1, openchat/openchat-7b, gryphe/mythomax-L2–13b и пр.
Пример вызова:
#
prompt = "What is the weather like in Boston?"
messages = []
#messages.append({"role": "system", "content": system_text})
messages.append({"role": "user", "content": prompt})
response = openai.ChatCompletion.create(
model="openai/gpt-3.5-turbo",
# model="jondurbin/airoboros-l2-70b",
messages =messages,
temperature=0.9,
n=1,
max_tokens = 1500,
stream=stream,
functions=[
{
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"]
}
}
]
)
Поддержка tools (РЕКОМЕНДУЕТСЯ, поддерживаются и другие модели при записи tools в OpenAI-формате)
Аналогично предыдущему.
Tool calls поддерживается моделями, у которых есть бедж tools в списке моделей – их более 20, включая опенсорс модели. Вы можете зайти в список моделей по новизне, и отфильтровать модели по слову tools.
У не OpenAI-моделей могут быть незначительные несовестимости с форматом, но наши базовые тесты показывают совместимость.
У не OpenAI-моделей могут быть незначительные несовестимости с форматом, но наши базовые тесты показывают совместимость.
Пример вызова:
#
prompt = "What is the weather like in Boston?"
messages = []
#messages.append({"role": "system", "content": system_text})
messages.append({"role": "user", "content": prompt})
response = openai.ChatCompletion.create(
model="openai/gpt-3.5-turbo",
messages =messages,
temperature=0.1,
n=1,
max_tokens = 1500,
stream=False,
tool_choice="auto",
tools = [{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["location"],
},
},
}
]
)
Поддержка structured outputs (РЕКОМЕНДУЕТСЯ, поддерживаются и другие модели при записи в OpenAI-формате)
Аналогично предыдущему.
Structured outputs поддерживается моделями, у которых есть бедж structured-outputs в списке моделей – включая опенсорс модели. Вы можете зайти в список моделей по новизне, и отфильтровать модели по слову structured-outputs.
У не OpenAI-моделей могут быть незначительные несовестимости с форматом, но наши базовые тесты показывают совместимость.
У не OpenAI-моделей могут быть незначительные несовестимости с форматом, но наши базовые тесты показывают совместимость.
Для ознакомления рекомендуем ознакомиться со статьей:

Базовый пример
def test_structured_outputs(model:str) -> dict:
math_tutor_prompt = '''
You are a helpful math tutor. You will be provided with a math problem,
and your goal will be to output a step by step solution, along with a final answer.
For each step, just provide the output as an equation use the explanation field to detail the reasoning.
'''
prompt = "There are equation 'x+3=8'. Find the integer 'x'"
messages = []
messages.append({"role": "system", "content": math_tutor_prompt})
messages.append({"role": "user", "content": prompt})
response = openai.ChatCompletion.create(
headers={
"X-Title": "Test structured outputs"
},
model=model,
messages=messages,
temperature=0.1,
n=1,
max_tokens=500,
response_format={
"type": "json_schema",
"json_schema": {
"name": "math_reasoning",
"schema": {
"type": "object",
"properties": {
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"explanation": {"type": "string"},
"output": {"type": "string"}
},
"required": ["explanation", "output"],
"additionalProperties": False
}
},
"final_answer": {"type": "integer"}
},
"required": ["steps", "final_answer"],
"additionalProperties": False
},
"strict": True
}
}
)
print("Response:", response)
response1 = response["choices"][0]["message"] # будет содержать content, в котором нужный JSON со структурой
# response_text: str = str(response1).strip()
return response1
n=1
При генерации на сервисе, как правило, мы НЕ позволяем генерировать сразу несколько вариантов текста или изображений – это усложняет управление моделями.
Поэтому при запросе принудительно устанавливается n=1 для числа генераций.
Неуказанные max_tokens в chat/completions
Согласно стандарту, вам нужно указывать max_tokens в запросе. max_tokens определяет максимальное количество токенов ответа модели.
Но на практике ряд endpoint, в том числе часть наших провайдеров позволяют его не указывать. Это позволяет не заморачиваться с расчетом размера контекста модели и пр. – однако при этом могут возникать странные проблемы (например, была история с генерацией в ответе 250к пробелов от модели Google – просто потому, что не был указан max_tokens, а модель сама не остановила генерацию)
Мы считаем, что указывать max_tokens крайне желательно, но выбор остается за вами. Настроить поведение API при отсутствующем max_tokens можно на
