Подключите приложение к нашему API. Нужны клиентский ключ, адрес сервиса и идентификатор модели.
Клиентские ключи работают с адресом вашего сервиса, а не напрямую с сайтом поставщика.
https://deep.mir19.ru/v1https://deep.mir19.ru/v1. Запросы отправляются только на этот адрес.Передавайте ключ на своём сервере в заголовке Authorization. Не вставляйте его в публичный JavaScript.
Authorization: Bearer $SERVICE_API_KEYПримеры предназначены для запуска на вашей стороне. Они не выполняются на этой странице.
curl https://deep.mir19.ru/v1/chat/completions \
-H "Authorization: Bearer $SERVICE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-flash",
"messages": [
{"role": "user", "content": "Привет! Расскажи о себе."}
],
"max_tokens": 1024
}'# Python: запускать на своём сервере, не в браузере.
import json
import os
import urllib.request
base_url = os.environ["SERVICE_BASE_URL"].rstrip("/")
api_key = os.environ["SERVICE_API_KEY"]
payload = {
"model": "deepseek-flash",
"messages": [{"role": "user", "content": "Привет!"}],
"max_tokens": 1024,
}
request = urllib.request.Request(
base_url + "/chat/completions",
data=json.dumps(payload).encode("utf-8"),
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
},
method="POST",
)
with urllib.request.urlopen(request, timeout=120) as response:
result = json.load(response)
print(result["choices"][0]["message"]["content"])// Node.js: только сервер. Не отправляйте ключ во frontend.
const baseURL = process.env.SERVICE_BASE_URL?.replace(/\/$/, "");
const apiKey = process.env.SERVICE_API_KEY;
if (!baseURL || !apiKey) throw new Error("Задайте переменные окружения");
const response = await fetch(`${baseURL}/chat/completions`, {
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "deepseek-flash",
messages: [{ role: "user", content: "Привет!" }],
max_tokens: 1024,
}),
signal: AbortSignal.timeout(120000),
});
if (!response.ok) throw new Error(`API: HTTP ${response.status}`);
const result = await response.json();
console.log(result.choices[0].message.content);После настройки реального сервера прочитайте текст в choices[0].message.content. Поле usage содержит фактические токены, а не списание из вашего пакета.
Если писать код не хочется, тот же пакет можно расходовать прямо в чате: бот @deepmir19bot работает на вашем ключе, а не на отдельном тарифе.
привет или /start.sk-… — тот же, что и для API. Ключ никому не пересылайте: кто его знает, тот расходует ваш пакет.| Команда | Что делает |
|---|---|
/help | Краткая справка |
/reset | Начать новый диалог: контекст переписки очищается, среда и память сохраняются |
/token sk-… | Заменить ключ (например, после покупки нового пакета) — среда и память остаются |
/status | Состояние среды и остаток пакета |
/support | Обращение в поддержку: вопрос увидят операторы сервиса, ответ придёт в этот же чат |
Приватность. У каждого клиента отдельная изолированная среда: диалоги, файлы и память не видны другим клиентам и не смешиваются с ними.
Расход. Сообщения бота списываются из вашего пакета по тем же ставкам, что и запросы к API. Остаток и историю смотрите в кабинете.
Продление. Купите новый пакет и пришлите его ключ прямо в чат бота — он погасит ключ сам, объём прибавится к вашему остатку, среда и настройки сохранятся. Так же можно погасить ключ в кабинете, в блоке «Продление новым ключом».
Поддержка. Напишите /support ваш вопрос прямо в чате бота: обращение увидит оператор, ответ придёт в этот же чат. К сообщению можно приложить скриншот, а детали дописать реплаем на сообщение об обращении.
Если бот недоступен — напишите в чат на сайте (кнопка в правом нижнем углу любой страницы) или в разделе поддержки.
Кроме обычного диалога ассистент работает с файлами и делает готовые документы. Достаточно попросить словами — специальных команд не нужно.
| Что нужно | Что делает ассистент |
|---|---|
| Документы | Создаёт и правит файлы Word, Excel, PDF и презентации: сметы, таблицы, отчёты, коммерческие предложения |
| Сканы и фото | Распознаёт текст с фотографии или скана документа (русский и английский) и отдаёт результат текстом или таблицей |
| Голос | Принимает голосовые сообщения и может отвечать голосом |
| Видео | Разбирает видео по ссылке: субтитры, расшифровка, краткое содержание |
| Схемы и графики | Строит схемы, диаграммы, графики, инфографику и макеты для презентаций |
| Напоминания | Ставит регулярные задачи и напоминания: «каждый день в 9 присылай сводку» |
| Исследование | Ищет информацию в интернете, разбирает статьи и страницы, следит за ценами и новостями конкурентов |
| Код и Git | Помогает с кодом, разбирает репозитории, готовит pull request и ревью |
Доступны deepseek-flash и deepseek-v4-pro. Точный список для вашего доступа возвращает GET /v1/models.
Обычный вход, кешированный вход и выход умножаются на отдельные коэффициенты модели и периода. Фактический usage не подменяется этими значениями.
Для согласованного серверного API передайте "stream": true. При реализации обязательно обработайте разрыв соединения и окончательные данные об использовании.
Ниже — как отвечает сервис. Тело ошибки объясняет причину и содержит безопасный идентификатор запроса. За неудачный запрос списание не производится.
| HTTP | Причина | Действие |
|---|---|---|
| 400 | Некорректный запрос | Проверьте поля |
| 401 | Ключ не принят | Проверьте ключ и адрес |
| 402 | Объём пакета исчерпан или остатка не хватает на запрос | Проверьте остаток, при исчерпании — пополните |
| 403 | Модель или доступ запрещены | Проверьте разрешения |
| 429 | Превышено число одновременных запросов | Повторите запрос позже |
| 502 | Поставщик модели недоступен | Повторите позже, списание не производится |
| 503 | Временная недоступность | Проверьте статус |
Разрешённые модели и объём задаются условиями вашего пакета. Действующие пакеты — бессрочные: объём расчётных токенов не сгорает по календарю, отсчёт идёт с первого платного запроса. Не считайте несколько ключей дополнительным балансом.
Пределы запроса соответствуют официальному DeepSeek: длина контекста — до 1 000 000 токенов, максимум выхода — 384 000 токенов на запрос (по умолчанию 4096, если max_tokens не указан). Лимита частоты у нас нет — так же, как в оригинальном DeepSeek: счётчика «запросов в минуту» на ключ не существует, ограничивать себя искусственно не нужно. Одновременность считается не на ключ, а на весь аккаунт поставщика: при исчерпании его ёмкости (2 500 одновременных запросов для Flash и 500 для V4-Pro) запрос вернётся с 429 и заголовком Retry-After — повторите позже, списание за отклонённый запрос не производится. Каждый ключ получает у поставщика отдельный user_id, поэтому кеш и проверки одного покупателя не пересекаются с другими. Остаток и разрешённые модели показывает проверка ключа.
Не передавайте ключ в URL, чат поддержки, скриншоты и общедоступный репозиторий. Для разбора ошибки достаточно номера заказа и безопасного ID запроса.
Остаток можно смотреть из своих скриптов, не заходя в кабинет. Запрос бесплатный: объём не расходуется.
curl -H "Authorization: Bearer sk-…" https://deep.mir19.ru/v1/balance| Поле ответа | Что означает |
|---|---|
available_units | Сколько расчётных токенов осталось — это число показывает кабинет |
consumed_units | Сколько уже израсходовано с начала пакета |
granted_units | Сколько начислено по вашему пакету |
available_atoms | Точный внутренний остаток (1 расчётный токен = 150 атомов) |
is_available | true, если по ключу можно отправлять запросы |
models | Модели, доступные именно по вашему ключу |
expires_at | Срок пакета; null — пакет бессрочный |
Наш адрес совместим с OpenAI API, поэтому подходит любой клиент, который умеет «OpenAI Compatible». Ниже — проверенные настройки для популярных программ. Общие значения одинаковы везде:
| Параметр | Значение |
|---|---|
| Базовый адрес (Base URL) | https://deep.mir19.ru/v1 |
| Ключ доступа | ваш ключ вида sk-… (35 знаков) |
| Заголовок авторизации | Authorization: Bearer sk-… — принимаем также x-api-key |
| Модели | deepseek-flash (быстрая и дешёвая), deepseek-v4-pro (сильнее на сложных задачах) |
| Кодировка | UTF-8, без VPN: адрес работает напрямую из России |
https://deep.mir19.ru/v1, API Key — ваш ключ, Model ID — deepseek-flash (или deepseek-v4-pro).deepseek-portal, Display Name — любое, Provider API — OpenAI Compatible.https://deep.mir19.ru/v1, API Key — ваш ключ, Model ID — deepseek-flash.deepseek-flash, Name — DeepSeek Flash, Url — https://deep.mir19.ru/v1.Создайте файл ~/.config/opencode/config.json:
{
"$schema": "https://opencode.ai/config.json",
"model": "deepseek/deepseek-flash",
"provider": {
"deepseek": {
"npm": "@ai-sdk/openai-compatible",
"name": "DeepSeek API",
"options": {
"baseURL": "https://deep.mir19.ru/v1",
"apiKey": "ваш ключ sk-…"
},
"models": {
"deepseek-flash": { "id": "deepseek-flash", "name": "DeepSeek Flash" },
"deepseek-v4-pro": { "id": "deepseek-v4-pro", "name": "DeepSeek V4 Pro" }
}
}
}
}Запуск: opencode — или разово: opencode run "вопрос" --model deepseek/deepseek-flash.
deepseek-portal, Display name — DeepSeek API, Base URL — https://deep.mir19.ru/v1.deepseek-flash, Model display name — любое.DeepSeek API, API Mode — OpenAI API Compatible, API Key — ваш ключ, API Host — https://deep.mir19.ru/v1.deepseek-flash и сохраните. Если сеть мобильная капризная — включите «Improve Network Compatibility».Наш шлюз обслуживает Chat Completions. В ~/.codex/config.toml укажите адрес и режим wire_api = "chat":
model = "deepseek-v4-pro"
model_provider = "deepseek"
[model_providers.deepseek]
name = "DeepSeek API"
base_url = "https://deep.mir19.ru/v1"
wire_api = "chat"
env_key = "DEEPSEEK_API_KEY"Ключ в окружении: export DEEPSEEK_API_KEY="sk-…" — затем codex "ваш вопрос".
wire_api = "responses"), которого у нас нет — мы отдаём Chat Completions. Если ваша версия поддерживает только Responses, работайте через Cline, Opencode или свой скрипт.Файл ~/.kimi-code/config.toml:
default_model = "deepseek-v4-pro"
[providers.deepseek]
name = "DeepSeek API"
type = "openai"
base_url = "https://deep.mir19.ru/v1"
api_key = "ваш ключ sk-…"
[models."deepseek-v4-pro"]
provider = "deepseek"
model = "deepseek-v4-pro"
max_context_size = 1000000
[models."deepseek-flash"]
provider = "deepseek"
model = "deepseek-flash"
max_context_size = 1000000Файл ~/.pi/agent/models.json (и его копия в ~/.pi/models.json):
{
"providers": {
"deepseek": {
"baseUrl": "https://deep.mir19.ru/v1",
"api": "openai-completions",
"apiKey": "ваш ключ sk-…",
"models": [
{ "id": "deepseek-flash", "name": "DeepSeek Flash" },
{ "id": "deepseek-v4-pro", "name": "DeepSeek V4 Pro" }
]
}
}
}Проверка и запуск: pi --list-models, затем pi --provider deepseek --model deepseek-flash "вопрос".
Если вы ставите Hermes Agent, подключите наш адрес как свой источник модели:
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bashhermes model → Custom endpoint → адрес https://deep.mir19.ru/v1, ключ sk-…, модель deepseek-v4-pro, режим совместимости Chat Completions.hermes -z "проверка связи".Или вручную в ~/.hermes/config.yaml:
model_provider: custom
custom_provider:
base_url: "https://deep.mir19.ru/v1"
api_key: "ваш ключ sk-…"
model: "deepseek-v4-pro"
context_window: 1000000Подходит официальный SDK OpenAI — достаточно подменить адрес:
from openai import OpenAI
client = OpenAI(
base_url="https://deep.mir19.ru/v1",
api_key="sk-…", # ваш ключ
)
answer = client.chat.completions.create(
model="deepseek-flash",
messages=[{"role": "user", "content": "Привет!"}],
max_tokens=300, # модель сначала «думает»: 200–300 и больше
)
print(answer.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://deep.mir19.ru/v1",
apiKey: "sk-…", // ваш ключ
});
const answer = await client.chat.completions.create({
model: "deepseek-flash",
messages: [{ role: "user", content: "Привет!" }],
max_tokens: 300,
});
console.log(answer.choices[0].message.content);Модели поддерживают function calling в стандарте OpenAI: описания инструментов уходят в поле tools, а вызов возвращается структурой tool_calls — и в обычном ответе, и в потоке.
choices[0].message.tool_calls[] — имя функции и аргументы в JSON.choices[0].delta.tool_calls[], аргументы набираются по частям.reasoning_content, отправлять его обратно не нужно — шлюз подставит сам.tool_calls перед отдачей клиенту.import json
from openai import OpenAI
client = OpenAI(base_url="https://deep.mir19.ru/v1", api_key="sk-…")
tools = [{"type": "function", "function": {
"name": "get_weather",
"description": "Погода в городе",
"parameters": {"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]}}}]
messages = [{"role": "user", "content": "Какая погода в Красноярске?"}]
answer = client.chat.completions.create(model="deepseek-flash", messages=messages, tools=tools)
message = answer.choices[0].message
messages.append(message)
for call in message.tool_calls or []:
result = get_weather(**json.loads(call.function.arguments)) # ваша функция
messages.append({"role": "tool", "tool_call_id": call.id,
"content": json.dumps(result, ensure_ascii=False)})
final = client.chat.completions.create(model="deepseek-flash", messages=messages, tools=tools)
print(final.choices[0].message.content)tool_choice: auto и none. Значение required модель не поддерживает — вернётся понятная ошибка 400. Параллельные вызовы в одном ответе поддерживаются (parallel_tool_calls). Описания инструментов уходят поставщику в каждом запросе и входят в расход входа, поэтому компактные схемы дешевле.Hermes Agent подключает наш адрес как обычного OpenAI-совместимого провайдера — секцией custom_providers в файле конфигурации профиля. Переустановка агента не нужна: добавляете блок и перезапускаете шлюз профиля.
Ключ выдаётся в формате sk-… (35 знаков). Проверьте, что он принят и пакет доступен:
curl -H "Authorization: Bearer sk-ваш-ключ" https://deep.mir19.ru/v1/balanceОтвет:
{
"object": "balance",
"is_available": true,
"available_units": "15001000.6",
"consumed_units": "2959.4",
"granted_units": "15003960",
"available_atoms": 2250150000,
"unit": "расчётный токен",
"models": ["deepseek-flash", "deepseek-v4-pro"],
"expires_at": null
}Важны is_available: true, остаток available_units и нужная модель в списке models.
~/.hermes/profiles/<профиль>/config.yaml
~/.hermes/config.yaml # профиль по умолчаниюЕсли профилей несколько (например, несколько ботов на одном сервере), правьте тот, в котором должна появиться модель: у каждого профиля своя конфигурация и свой шлюз.
В конец файла (или в существующую секцию, если она уже есть):
model:
default: deepseek-flash
provider: custom:deepseek-mir19
custom_providers:
- name: deepseek-mir19
base_url: https://deep.mir19.ru/v1
api_key: sk-ваш-ключ
model: deepseek-flash
context_length: 1000000name — идентификатор провайдера внутри Hermes: в списке моделей он показывается как custom:deepseek-mir19.provider: custom:<name> — формат именно такой, с префиксом custom: и тем же именем, что в custom_providers.model — точное имя нашей модели: deepseek-flash или deepseek-v4-pro. Суффиксы вида «(1)» из интерфейсов в конфиг не переносятся.context_length — окно контекста (у нас 1 000 000). Поле context_window эта версия Hermes не читает, смысла в нём нет.600.hermes --profile <профиль> gateway restart
# если профиль работает под systemd:
systemctl restart hermes-gateway-<профиль>Быстрая проверка из терминала — без сессии и истории:
hermes --profile <профиль> -m deepseek-flash --provider custom:deepseek-mir19 -z "привет"Если модель ответила — интеграция рабочая. В чате: /new (свежая сессия), затем /model → deepseek-mir19 → deepseek-flash и любое сообщение.
Модель переключается командой /model — править конфигурацию и перезапускать бота не нужно. В Telegram и Discord команда открывает выбор кнопками (сначала провайдер, затем модель), в остальных каналах печатает список текстом.
/model — открыть выбор модели для текущего диалога./model deepseek-v4-pro — переключить на эту модель (действует на сессию)./model deepseek-flash --once — только на следующий ответ, дальше вернётся прежняя./model deepseek-v4-pro --global — записать выбор в config.yaml: сохранится и после /new, и после перезапуска бота./model --provider custom:deep-mir19 — сменить провайдера (в среде клиентского бота шлюз называется custom:deep-mir19; в своём профиле Hermes — имя из вашего блока custom_providers)./model --refresh — заново запросить список доступных моделей у шлюза (/v1/models).Доступные имена — deepseek-flash и deepseek-v4-pro. Ответ 404 model_not_allowed значит, что модель написана иначе или не входит в ваш пакет; сверьте имя в /v1/models.
tool_calls; если модель всё же напишет вызов текстом своей внутренней разметкой, шлюз сам приведёт его к tool_calls. Возвращать reasoning_content при обратном вызове не нужно — шлюз подставляет его сам.У каждого профиля Hermes своя конфигурация, свой шлюз и своя история. Ключ заводите отдельный на каждого бота — так расход по каждому будет виден в кабинете отдельно.
# список профилей и их конфигураций
hermes profile list
# настройки нужного профиля (профиль по умолчанию — ~/.hermes/config.yaml,
# остальные — ~/.hermes/profiles/<профиль>/config.yaml)
hermes --profile <профиль> config set model.default deepseek-v4-pro
hermes --profile <профиль> config set model.provider custom:deepseek-mir19
# список провайдеров задаётся одной строкой JSON
hermes --profile <профиль> config set custom_providers '[{"name":"deepseek-mir19","base_url":"https://deep.mir19.ru/v1","api_key":"${DEEP_MIR19_KEY}","model":"deepseek-v4-pro","context_length":1000000}]'
# проверка до перезапуска бота
hermes --profile <профиль> -z "привет"Если проверка ответила моделью — конфигурация верна, остаётся перезапустить шлюз профиля (шаг 4).
Ключ можно не писать в конфиг открытым текстом: положите его в .env профиля и сошлитесь на переменную.
# ~/.hermes/profiles/<профиль>/.env (права 600)
DEEP_MIR19_KEY=sk-ваш-ключ
# config.yaml
custom_providers:
- name: deepseek-mir19
base_url: https://deep.mir19.ru/v1
api_key: ${DEEP_MIR19_KEY}
model: deepseek-v4-pro
context_length: 1000000Частая история: бот работал на другом поставщике и замолчал — тот вернул 429 rate_limit_error и исчерпал квоту. Наш адрес можно сделать основным, а прежнего поставщика оставить резервом:
model:
default: deepseek-v4-pro
provider: custom:deepseek-mir19
fallback: <ваша-прежняя-модель>Hermes возьмёт нашу модель первой, а к резервной обратится только при недоступности нашей. После правки — перезапуск шлюза профиля.
wire_api = "responses", работать не будет (см. раздел про Codex выше).tool_choice: поддерживаются auto и none; значение required модель не поддерживает — вернётся понятная ошибка 400.max_tokens меньше ~200 ответ может прийти пустым: бюджет расходуется на размышление модели. Ставьте 300 и больше.content у шага с вызовом инструмента шлюз приводит к принимаемому виду./new) — так в истории не остаётся сообщений, собранных под другую модель.max_tokens не указан.deepseek-flash и 500 для deepseek-v4-pro: это потолок аккаунта поставщика, справочное значение.Retry-After, списание не производится.api_key записан целиком, без обрезки.available_units запросом /v1/balance.max_tokens больше допустимого предела.deepseek-flash и deepseek-v4-pro.Retry-After, конфиг менять не нужно.provider не совпадает с name в custom_providers либо правлен не тот профиль.systemctl restart hermes-gateway-<профиль>); изнутри самого агента команда намеренно блокируется.api_key попала маска вместо ключа. Так бывает, если ключ читали командой, вывод которой маскируется (например cat в CI или в чате бота): вставьте ключ из файла целиком.| Ответ | Причина | Что делать |
|---|---|---|
401 invalid_api_key | Ключ не передан, отозван или отключён | Проверьте заголовок Authorization: Bearer sk-… без лишних пробелов |
402 insufficient_credits | Оплаченный объём израсходован или не хватает на запрос | Уменьшите max_tokens либо пополните пакет: остаток виден в кабинете и в /v1/balance |
404 model_not_allowed | Модель не входит в ваш пакет или написана иначе | Сверьте имя с /v1/models: deepseek-flash, deepseek-v4-pro |
400 max_tokens_too_large | Запрошен выход больше потолка — 393 216 токенов; в поле max_tokens значение пишется без разделителей: 393216 | Уменьшите max_tokens (обычно достаточно 4096) |
| Пустой текст ответа | Модель потратила весь лимит на внутреннее рассуждение | Поднимите max_tokens до 200–300 и выше |
429 | Перегрузка на стороне поставщика | Повторите запрос через пару секунд: списания за отказ нет |
| Ответ обрывается | Тело запроса слишком большое либо поток прервала сеть | Держите тело до 32 МБ, включите повтор в клиенте |