RU ▾
Получить API-ключ

Локальная LLM OpenAI API: Локальный LLM OpenAI API: Запуск локально, переключение на хостинг

Локальная LLM OpenAI API — это сервер моделей на вашем компьютере, отвечающий на те же HTTP-запросы, которые отправляют OpenAI SDK. Поскольку формат запросов общий, код, написанный для него, работает и с хостинговым эндпоинтом; на этой странице показано, что переносится, а что нет.

Обновлено

Настольный компьютер и облачный сервер, соединенные одним кабелем через коммутатор, показывающие локальные и хостинговые эндпоинты языковых моделей.

Ключевые моменты

Что означает эта фраза

Люди используют «локальная языковая модель OpenAI API» для двух связанных вещей. Первое — это языковая модель, которую вы запускаете самостоятельно на ноутбуке или домашнем сервере, которая слушает локальный порт и использует формат чата OpenAI. Второе — это привычка писать приложение против этого формата, чтобы модель можно было заменить.

Формат — это простой контракт. Ваше приложение отправляет тело JSON с именем model и списком messages, каждая с ролью system, user или assistant. Сервер отвечает объектом JSON, содержащим сгенерированное сообщение, или потоком небольших фрагментов, если вы запросили потоковую передачу. Официальные SDK для Python и JavaScript оборачивают это, и они позволяют переопределить базовый URL, что и является ключевым моментом.

Многие локальные инструменты предоставляют этот контракт. Ollama, LM Studio, сервер llama.cpp и vLLM предлагают маршрут в стиле OpenAI. Хостинговые сервисы тоже, поэтому те же двадцать строк клиентского кода могут работать с обоими. Эндпоинт на этом сайте — один из хостинговых. Он принимает POST /v1/chat/completions и GET /v1/models, и доступен по адресу https://api.onekeyllmapi.com/v1.

Локальное против хостинга: с первого взгляда

Ни один из вариантов не лучше другого в целом. Они обменивают контроль на усилия. Таблица указывает на различия, которые справедливы для категории в целом, а не для какого-либо конкретного продукта.

ВопросЛокальный инструментХостинговый API в стиле OpenAI
Куда идут промптыОстаются на вашем компьютереПередача данных к провайдеру по HTTPS
ОборудованиеВы предоставляете GPU или CPU и памятьНичего с вашей стороны
Размер моделиОграничено вашей памятьюЧто обслуживает провайдер
Модель ценообразованияОборудование и питаниеЗа токен, из предоплаченного баланса здесь
ДоступностьПока включен ваш компьютерСервер всегда включен, общие лимиты
НастройкаУстановить, скачать веса, настроитьСоздать ключ, установить базовый URL

Если ваши данные никогда не должны покидать компьютер, которым вы управляете, локальный запуск выигрывает, а хостинг — неверный инструмент. Если вам нужна более крупная модель, чем позволяет ваше оборудование, или бот, доступный из многих мест, выигрывает хостинг. Распространенная настройка включает оба варианта и выбирает их для каждой задачи.

Переключение клиента с локального на хостинг

Если ваш код уже общается с локальным инструментом, переезд требует трех значений. Все остальное, включая то, как вы формируете сообщения и читаете потоковые фрагменты, остается прежним.

  1. Базовый URL. Используйте https://api.onekeyllmapi.com/v1 вместо вашего локального адреса.
  2. API-ключ. Локальные серверы часто игнорируют ключ. Хостинговый требует его как Authorization: Bearer <key>, и SDK отправляет его за вас.
  3. Идентификатор модели. Локальные имена — это то, что вы скачали. Здесь идентификатор — uncensored.

Удобный способ сохранить гибкость — читать все три значения из переменных окружения, чтобы один файл работал в обоих местах.

import os
from openai import OpenAI

client = OpenAI(
    base_url=os.environ.get("LLM_BASE_URL", "https://api.onekeyllmapi.com/v1"),
    api_key=os.environ.get("LLM_API_KEY", "YOUR_KEY"),
)
MODEL = os.environ.get("LLM_MODEL", "uncensored")

models = client.models.list()
print([m.id for m in models.data])

resp = client.chat.completions.create(
    model=MODEL,
    messages=[
        {"role": "system", "content": "Answer in two sentences."},
        {"role": "user", "content": "Why do OpenAI-style endpoints make switching models easy?"},
    ],
    temperature=0.5,
)
print(resp.choices[0].message.content)

Тот же вызов из командной строки, полезный для быстрого теста:

curl https://api.onekeyllmapi.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "uncensored", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 20}'

С Node паттерн идентичен:

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: process.env.LLM_BASE_URL ?? "https://api.onekeyllmapi.com/v1",
  apiKey: process.env.LLM_API_KEY,
});

const res = await client.chat.completions.create({
  model: process.env.LLM_MODEL ?? "uncensored",
  messages: [{ role: "user", content: "Name three uses for JSON mode." }],
});
console.log(res.choices[0].message.content);

Что покрывает OpenAI-совместимость и что не покрывает

Совместимость означает, что сетевой формат совпадает. Это не обещает, что все функции, предлагаемые оригинальным сервисом, присутствуют. Перед миграцией реального приложения проверьте каждый из этих пунктов на целевом сервере.

Что поддерживает этот API

  • Chat completions на POST /v1/chat/completions и список моделей на GET /v1/models.
  • Потоковая передача через серверные события (SSE) с stream: true, с отчетом об использовании в конце потока.
  • Вызов функций через tools и tool_choice, потоковая передача tool_calls и отправка результатов как сообщения role: "tool".
  • JSON-режим через response_format: {"type": "json_object"}.
  • Параметры сэмплирования: temperature, top_p, stop, seed и параметры штрафов передаются дальше.

Что он не делает

  • Нет генерации изображений, аудио или видео. Это только текст.
  • Нет эндпоинта для векторных представлений и нет дообучения. Если ваше приложение создает векторный индекс, вам нужен отдельный источник векторных представлений.
  • Только одна модель. Модель — это модель с открытыми весами, запущенная независимым провайдером. Это не официальный API какого-либо крупного поставщика, и это не роутер между поставщиками, поэтому вы не можете выбирать между семействами моделей, изменяя идентификатор.

Локальные инструменты иногда отличаются в другую сторону: локальный сервер может предоставлять маршрут эмбеддингов или позволять загружать несколько моделей, а размер контекста — это то, что вы настроите. Читайте документацию целевого сервера для каждого пункта и ведите короткий список функций, которые действительно использует ваше приложение. В документации быстрого старта показаны поля запроса полностью.

Различия в контексте, лимитах и стоимости

Три числа меняются, когда вы покидаете локальный сервер. Первое — это окно. Длина контекста локального инструмента — это настройка, связанная с вашей памятью. Здесь она фиксирована на уровне 100 000 токенов, общих для промпта и завершения, и max_tokens необязателен. Второе — это параллельные запросы. Ваша собственная машина может быть в очереди любой глубины, но полный ключ здесь позволяет 8 параллельных запросов и 300 в минуту, а пробный ключ — 2 и 60. Третье — это счет.

Хостинг стоит $0,15 за 1 млн входных токенов и $0,50 за 1 млн выходных токенов, оплата по факту из предоплаченного баланса. Разберем ежедневную задачу как пример: суммаризатор обрабатывает 400 документов в день, каждый на 3000 входных токенов и 300 выходных. Входные данные: 400 x 3000 = 1 200 000 токенов, что стоит 1,2 x $0,15 = $0,18. Выходные данные: 400 x 300 = 120 000 токенов, что стоит 0,12 x $0,50 = $0,06. Итого за день $0,24, а за 30-дневный месяц — $7,20. Сравните это со стоимостью питания GPU и самой карты, прежде чем принимать решение.

При превышении лимита API возвращает HTTP 429 с кодом rate_limited или concurrency. При кратковременной перегрузке добавляется заголовок Retry-After: 5. Сохраните логику повторных попыток с ожиданием. Запросы, которые завершились ошибкой или были отклонены, не тарифицируются. Баланс не сгорает, поэтому месяц простоя ничего не стоит.

Потоковый запрос удерживает слот параллельных запросов до конца потока, поэтому закрывайте потоки, чтение которых вы прекратили. Пополнения начинаются от $20; уровни и бонусы указаны на странице цен.

Отладка, когда переключение работает некорректно

Большинство сбоев при миграции сводится к нескольким причинам. Пройдитесь по ним в этом порядке.

  • Ошибки 404 или ошибки соединения. К базовому URL, вероятно, не хватает суффикса /v1 или там лишний путь. Используйте его точно так же, как https://api.onekeyllmapi.com/v1.
  • Ошибки аутентификации. Ключ отсутствует или передан в неверном заголовке. Формат: Authorization: Bearer <key>. Пользователям SDK следует убедиться, что переменная окружения действительно загрузилась.
  • Модель не найдена. В вашей конфигурации всё ещё указано старое локальное имя модели. Вызовите GET /v1/models и используйте ID, который она возвращает, а именно uncensored.
  • 429 при высокой нагрузке. Вы превысили лимит в 8 параллельных запросов или 300 в минуту для полного ключа. Добавьте очередь или семафор.
  • Кажется, что параметр игнорируется. Проверьте, что он входит в список передаваемых полей, указанных выше, и сравните поведение с фиксированным seed и низкой температурой.

Каждый ответ включает заголовок X-Request-Id. Записывайте его рядом со своим идентификатором запроса, чтобы при необходимости можно было отследить причину плохого ответа. Если вы запускаете трафик в продакшене и хотите измерять качество со временем, вам будет полезна статья на сайте LLM Observability: Myths vs Facts. Также стоит сохранять заголовки ответа X-Balance-USD, X-RateLimit-Limit-Requests и X-RateLimit-Limit-Concurrency.

Попробовать без обязательств

Самый дешёвый способ проверить, что ваш код корректно переносится, — запустить его один раз. Создайте аккаунт через Google или по email и паролю, затем получите пробный баланс $0,50 на странице API-ключа. Это занимает один клик, не требует привязки карты, доступно один раз на человека и действует 7 дней. Получите ключ на странице API-ключа, установите три переменные окружения из предыдущего раздела и запустите существующий набор тестов.

Если тесты прошли успешно и использование укладывается в ваш бюджет, пополните баланс от $20 с помощью карты (Visa, Mastercard, Apple Pay, Google Pay) или криптовалюты (USDT в сети TRC20, USDC в сети Base). Промпты не используются для обучения. Модель настроена так, чтобы отвечать без отказов в контенте для законного использования взрослыми, с одним фиксированным правилом: никакого сексуального контента с участием несовершеннолетних.

Вопросы и ответы

Могу ли я запустить локальную LLM с OpenAI-совместимым API?

Да. Такие инструменты, как Ollama, LM Studio, сервер llama.cpp и vLLM могут предоставлять эндпоинты в стиле OpenAI, и вы можете направить SDK OpenAI на этот локальный адрес.

Что мне изменить, чтобы перенести приложение на этот хостинг API?

Три значения: базовый URL, API-ключ и ID модели. В данном случае это базовый URL, показанный в примерах, ключ Bearer из вашего аккаунта и ID модели uncensored.

Поддерживает ли этот API эмбеддинги или генерацию изображений?

Нет. Это только текст с chat completions, потоковой передачей, вызовом функций и JSON-режимом. Для эмбеддингов или изображений используйте отдельный сервис.

Является ли это официальным API поставщика модели?

Нет. Он обслуживает одну модель с открытыми весами, запущенную независимым провайдером, и не является маршрутизатором между поставщиками.

До вашего ключа — всего одна форма

Создайте аккаунт, скопируйте ключ, измените базовый URL. Это вся настройка.