Установите OpenAI SDK
pip install openai
Используйте модели DeepSeek через OpenAI-compatible API endpoint.
Работает с официальным OpenAI SDK. Достаточно заменить base_url и API
key.
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)
pip install openai
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)
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)
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="")
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
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
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)
| Модель | Для чего |
|---|---|
| deepseek-flash | DeepSeek V4.1 Flash: быстрые запросы, текст и изображения |
| deepseek-v4-pro | DeepSeek V4 Pro: более сильный reasoning. Изображения не принимает |
У каждой модели контекст 1 000 000 токенов и потолок ответа 384 000 — это лимиты DeepSeek.
curl https://api.shkmw.dev/v1/models \
-H "Authorization: Bearer YOUR_API_KEY"
| Method | Path | Описание |
|---|---|---|
| GET | /v1/models | Список доступных моделей |
| POST | /v1/chat/completions | Создать chat completion |
| POST | /v1/tools/search | Веб-поиск. Не вызывается из chat completions |
| POST | /v1/tools/fetch | Страница в Markdown. Не вызывается из chat completions |
Authorization: Bearer YOUR_API_KEY
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"}
]
}'
Укажите stream=True, чтобы получать токены по мере генерации.
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="")
Ошибки приходят в OpenAI-compatible 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 | Оценка входа больше контекста. Сократите историю или список инструментов |
Harness, Cursor и Claude Code подключаются как OpenAI-compatible провайдер:
base URL https://api.shkmw.dev/v1 и ключ из профиля. Контекст и
лимит ответа подхватываются из /v1/models, вручную их задавать не нужно.
Текст запросов и ответов по умолчанию не сохраняется.
Запросы могут ограничиваться балансом, rate limits и доступностью моделей. Usage и биллинг обрабатывает gateway автоматически.
Это независимый gateway-сервис, DeepSeek используется как upstream-провайдер.
Два отдельных метода: поиск страниц и загрузка одной страницы в 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.
| Поле | Обязательно | Описание |
|---|---|---|
| query | да | Запрос, 1–128 символов. Можно site:, lang:, кавычки |
| count | нет | Сколько результатов вернуть, от 1 до 50. По умолчанию 10 |
| need_content | нет | Если true, в content попадает текст страницы. Иначе поле пустое |
| ori_question | нет | Исходный вопрос пользователя, до 128 символов |
| localization | нет | IP-адрес для локализации выдачи |
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"])
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, включая оценку и карточку сайта.
{
"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
}
]
}
url обязателен: HTTP или HTTPS, не длиннее 8192 символов, с хостом
и без логина/пароля в адресе. Страницу скачивает DeepSeek и возвращает Markdown.
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"])
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/"}'
{
"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 | Таймаут. Повтор сам по себе не списывает неудачную попытку |
Стоимость использования API в рублях. Цены указаны за 1M токенов.
| Модель | Период | Input cache hit | Input cache miss | Output |
|---|---|---|---|---|
| Загрузка тарифов… | ||||
Input cache hit — входные токены, которые попали в кэш модели.
Input cache miss — входные токены, которые не попали в кэш.
Output — токены, сгенерированные моделью в ответе.
Итоговое списание зависит от фактического usage, который возвращает API.