Gateway API — OpenAI-compatible доступ к AI-моделям
shkmw.dev Войти
API Gateway

DeepSeek API Gateway

Используйте модели DeepSeek через OpenAI-compatible API endpoint.

Работает с официальным OpenAI SDK. Достаточно заменить base_url и API key.

OpenAI-compatible Streaming Python SDK DeepSeek models Search & Fetch
Python
from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.shkmw.dev/v1",
)

response = client.chat.completions.create(
    model="deepseek-flash",
    messages=[
        {"role": "user", "content": "Hello"}
    ],
)

print(response.choices[0].message.content)

1. Быстрый старт

1

Установите OpenAI SDK

bash
pip install openai
2

Создайте клиент

python
from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.shkmw.dev/v1",
)
3

Отправьте запрос

python
response = client.chat.completions.create(
    model="deepseek-flash",
    messages=[
        {"role": "user", "content": "Hello"}
    ],
)

print(response.choices[0].message.content)

2. Примеры на Python

python
from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.shkmw.dev/v1",
)

response = client.chat.completions.create(
    model="deepseek-flash",
    messages=[
        {"role": "user", "content": "Explain async Python in one paragraph"}
    ],
)

print(response.choices[0].message.content)
python
from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.shkmw.dev/v1",
)

stream = client.chat.completions.create(
    model="deepseek-flash",
    messages=[
        {"role": "user", "content": "Write a short product description"}
    ],
    stream=True,
)

for chunk in stream:
    content = chunk.choices[0].delta.content
    if content:
        print(content, end="")
python
import asyncio
from openai import AsyncOpenAI

client = AsyncOpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.shkmw.dev/v1",
)

async def main():
    response = await client.chat.completions.create(
        model="deepseek-flash",
        messages=[
            {"role": "user", "content": "Say hello"}
        ],
    )
    print(response.choices[0].message.content)

asyncio.run(main())

Модель deepseek-flash принимает изображения вместе с текстом: описать картинку, прочитать текст со скриншота, разобрать график. Можно передать URL или локальный файл как Base64 Data URL. Старое имя deepseek-v4-flash-vision-exp ещё принимается и обслуживается той же моделью.

Вариант 1 — изображение по URL

python
from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.shkmw.dev/v1",
)

response = client.chat.completions.create(
    model="deepseek-flash",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Что изображено на этой картинке?",
                },
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://example.com/image.jpg"
                    },
                },
            ],
        }
    ],
)

print(response.choices[0].message.content)

Вариант 2 — локальный файл через Base64

python
import base64
from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.shkmw.dev/v1",
)

with open("image.jpg", "rb") as f:
    image_base64 = base64.b64encode(f.read()).decode("utf-8")

response = client.chat.completions.create(
    model="deepseek-flash",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Что изображено на этой картинке?",
                },
                {
                    "type": "image_url",
                    "image_url": {
                        "url": f"data:image/jpeg;base64,{image_base64}"
                    },
                },
            ],
        }
    ],
)

print(response.choices[0].message.content)

3. Доступные модели

Модель Для чего
deepseek-flash DeepSeek V4.1 Flash: быстрые запросы, текст и изображения
deepseek-v4-pro DeepSeek V4 Pro: более сильный reasoning. Изображения не принимает

У каждой модели контекст 1 000 000 токенов и потолок ответа 384 000 — это лимиты DeepSeek.

bash
curl https://api.shkmw.dev/v1/models \
  -H "Authorization: Bearer YOUR_API_KEY"

4. API reference

Method Path Описание
GET /v1/models Список доступных моделей
POST /v1/chat/completions Создать chat completion
POST /v1/tools/search Веб-поиск. Не вызывается из chat completions
POST /v1/tools/fetch Страница в Markdown. Не вызывается из chat completions

Auth

http
Authorization: Bearer YOUR_API_KEY

Пример

bash
curl https://api.shkmw.dev/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-flash",
    "messages": [
      {"role": "user", "content": "Hello"}
    ]
  }'

5. Streaming

Укажите stream=True, чтобы получать токены по мере генерации.

python
stream = client.chat.completions.create(
    model="deepseek-flash",
    messages=[
        {"role": "user", "content": "Write a short story"}
    ],
    stream=True,
)

for chunk in stream:
    content = chunk.choices[0].delta.content
    if content:
        print(content, end="")

6. Ошибки

Ошибки приходят в OpenAI-compatible JSON-формате.

json
{
  "error": {
    "message": "Invalid API key",
    "type": "authentication_error",
    "code": "invalid_api_key"
  }
}
Code Значение
invalid_api_key Отсутствует или неверный API key
model_not_supported Запрошенная модель недоступна
insufficient_balance Недостаточно средств на балансе
rate_limit_exceeded Слишком много запросов
upstream_error Провайдер модели вернул ошибку
input_too_large Оценка входа больше контекста. Сократите историю или список инструментов

7. Лимиты и заметки

Агентские клиенты

Harness, Cursor и Claude Code подключаются как OpenAI-compatible провайдер: base URL https://api.shkmw.dev/v1 и ключ из профиля. Контекст и лимит ответа подхватываются из /v1/models, вручную их задавать не нужно.

Промпты по умолчанию не логируются

Текст запросов и ответов по умолчанию не сохраняется.

Доступ по usage

Запросы могут ограничиваться балансом, rate limits и доступностью моделей. Usage и биллинг обрабатывает gateway автоматически.

Не аффилированы с DeepSeek

Это независимый gateway-сервис, DeepSeek используется как upstream-провайдер.

8. Web Search & Fetch API

Два отдельных метода: поиск страниц и загрузка одной страницы в Markdown. Они не подключаются к /v1/chat/completions сами. Нужен тот же API-ключ SHKMW, свой ключ DeepSeek не требуется.

Метод Что делает Успешный запрос
Web Search POST /v1/tools/search 0,15 ₽
Web Fetch POST /v1/tools/fetch 0,15 ₽

Списание только за HTTP 200 с полезным результатом: у Search непустой results, у Fetch непустой content. Пустая выдача, ошибка и таймаут бесплатны. Число результатов count цену не меняет. Официальное описание методов: DeepSeek Search & Fetch.

Search

Поле Обязательно Описание
query да Запрос, 1–128 символов. Можно site:, lang:, кавычки
count нет Сколько результатов вернуть, от 1 до 50. По умолчанию 10
need_content нет Если true, в content попадает текст страницы. Иначе поле пустое
ori_question нет Исходный вопрос пользователя, до 128 символов
localization нет IP-адрес для локализации выдачи
python
import requests

response = requests.post(
    "https://api.shkmw.dev/v1/tools/search",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
        "query": "Новости искусственного интеллекта",
        "count": 5,
        "need_content": True,
    },
    timeout=30,
)
response.raise_for_status()
for item in response.json()["results"]:
    print(item["title"])
    print(item["url"])
    print(item["summary"])
bash
curl https://api.shkmw.dev/v1/tools/search \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "DeepSeek API",
    "count": 5,
    "need_content": true
  }'

Ответ сохраняет поля DeepSeek, включая оценку и карточку сайта.

json
{
  "results": [
    {
      "rerank_score": 2.4,
      "title": "DeepSeek V4 model released",
      "url": "https://example.com/deepseek-v4",
      "snippet": "Короткий фрагмент для интерфейса",
      "summary": "Более длинное описание для модели",
      "content": "Текст страницы, если need_content=true",
      "site_name": "Example News",
      "site_icon": "https://example.com/favicon.ico",
      "date": "2026-06-01T00:00:00+00:00",
      "authority": 3
    }
  ]
}

Fetch

url обязателен: HTTP или HTTPS, не длиннее 8192 символов, с хостом и без логина/пароля в адресе. Страницу скачивает DeepSeek и возвращает Markdown.

python
import requests

response = requests.post(
    "https://api.shkmw.dev/v1/tools/fetch",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={"url": "https://api-docs.deepseek.com/guides/search/"},
    timeout=30,
)
response.raise_for_status()
page = response.json()
print(page["title"])
print(page["content"])
bash
curl https://api.shkmw.dev/v1/tools/fetch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://api-docs.deepseek.com/guides/search/"}'
json
{
  "title": "Example article",
  "content": "# Example article\n\nArticle content."
}

Ошибки инструментов

HTTP Когда
400 Неверный запрос: пустой query, count вне 1–50, плохой URL
401 Нет или неверен ключ SHKMW
402 Не хватает баланса на стоимость запроса
403 Fetch отклонён политикой безопасности upstream
404 Страницу не удалось прочитать
429 Слишком много Search или Fetch запросов
504 Таймаут. Повтор сам по себе не списывает неудачную попытку

Gateway API pricing

Стоимость использования API в рублях. Цены указаны за 1M токенов.

Модель Период Input cache hit Input cache miss Output
Загрузка тарифов…

Input cache hit — входные токены, которые попали в кэш модели.
Input cache miss — входные токены, которые не попали в кэш.
Output — токены, сгенерированные моделью в ответе.

Итоговое списание зависит от фактического usage, который возвращает API.