Локальный OpenAI-compatible API proxy для DeepSeek Web Chat
Быстрый старт • Возможности • Примеры • Модели • Endpoints • Open WebUI
FreeDeepseekAPI поднимает локальный API-сервер для DeepSeek Web Chat (chat.deepseek.com) и позволяет подключать DeepSeek Web к Open WebUI, LiteLLM, Hermes, Claude Code, OpenAI SDK-style клиентам и другим OpenAI-compatible инструментам.
Проект работает через ваш обычный залогиненный аккаунт DeepSeek в отдельном Chrome-профиле. Локальный сервер принимает API-запросы, а дальше сам ходит в DeepSeek Web через сохранённую browser-сессию.
⚠️ Это экспериментальный web-chat proxy. DeepSeek может менять внутренний Web API без предупреждения. Для production-кейсов надёжнее официальный платный API DeepSeek.
- Что это даёт
- Возможности
- Быстрый старт
- Проверка работы
- Примеры запросов
- Модели
- Endpoints
- Open WebUI
- Обновить логин
- Статус проекта
- Использовать DeepSeek Web как локальный API endpoint.
- Подключать DeepSeek к Open WebUI и другим OpenAI-compatible клиентам.
- Получать обычные JSON-ответы или streaming SSE.
- Использовать reasoning-модели с отдельным
reasoning_content. - Работать с Anthropic Messages API shim для Claude Code / Anthropic SDK.
- Использовать OpenAI Responses API shim для новых OpenAI/Codex-style клиентов.
- Держать отдельные web-сессии для разных агентов/users.
- OpenAI-compatible API:
POST /v1/chat/completions - Anthropic-compatible shim:
POST /v1/messages - OpenAI Responses shim:
POST /v1/responses - Streaming: SSE chunks и обычные non-stream JSON-ответы
- Reasoning output: отдельный
reasoning_contentдля thinking-моделей - Tool calling: парсинг OpenAI tools, Anthropic tools и Responses function tools
- Model capabilities:
GET /v1/model-capabilitiesс alias → real web mode - Agent sessions: отдельная DeepSeek-сессия на
user/ agent id - Session recovery: авто-сброс устаревших chains/sessions
- Zero dependencies: Node.js 18+, без npm-зависимостей
git clone https://github.com/operatorpuar/FreeDeepseekAPI.git
cd FreeDeepseekAPI
npm run auth
npm startnpm run auth открывает меню авторизации:
- выберите пункт
1; - войдите в DeepSeek в отдельном Chrome-профиле;
- отправьте короткое сообщение вроде
ok; - вернитесь в терминал и нажмите Enter.
npm start показывает меню запуска:
1— авторизоваться / обновить DeepSeek login2— показать модели и статусы3— запустить proxy4— выйти
Для headless/CI-запуска без меню:
NON_INTERACTIVE=1 npm start
# или
SKIP_ACCOUNT_MENU=1 npm startПо умолчанию сервер слушает:
http://localhost:9655
curl http://localhost:9655/
curl http://localhost:9655/v1/models
curl http://localhost:9655/v1/model-capabilitiesЕсли всё ок, /health вернёт статус сервера, список поддерживаемых aliases и config_ready: true.
curl -X POST http://localhost:9655/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-chat",
"messages": [{"role": "user", "content": "Привет! Ответь одной фразой."}],
"stream": false
}'curl -X POST http://localhost:9655/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-reasoner",
"messages": [{"role": "user", "content": "Реши коротко: почему небо голубое?"}],
"stream": false
}'Для reasoning-моделей API отдаёт цепочку размышления отдельно от финального ответа:
- non-stream:
choices[0].message.reasoning_content - stream:
choices[0].delta.reasoning_content - usage:
usage.completion_tokens_details.reasoning_tokens
reasoning_tokens — приблизительная оценка по извлечённому DeepSeek Web THINK-тексту, потому что web stream не отдаёт официальный token usage по reasoning отдельно.
curl -X POST http://localhost:9655/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-chat-search",
"messages": [{"role": "user", "content": "Найди свежий факт про DeepSeek и ответь кратко."}],
"stream": false
}'curl -N -X POST http://localhost:9655/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-chat",
"messages": [{"role": "user", "content": "Напиши короткую шутку."}],
"stream": true
}'curl -X POST http://localhost:9655/v1/messages \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-chat",
"max_tokens": 512,
"messages": [{"role": "user", "content": "Ответь ровно OK"}],
"stream": false
}'Для Claude Code можно указывать backend напрямую:
export ANTHROPIC_BASE_URL="http://127.0.0.1:9655"
export ANTHROPIC_AUTH_TOKEN="dummy-key"
export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1
claude --model deepseek-chatcurl -X POST http://localhost:9655/v1/responses \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-chat",
"input": "Ответь ровно OK",
"stream": false
}'FreeDeepseekAPI принимает:
- OpenAI
tools; - Anthropic
tools; - Responses API function tools.
Прокси просит DeepSeek вернуть строгий JSON tool call, но также умеет парсить fallback-форматы:
TOOL_CALL:- fenced JSON
<tool_call>...</tool_call>
GET /v1/models возвращает только aliases, которые сейчас проверены и работают через этот proxy.
| Alias | Web mode | Reasoning | Web search | Комментарий |
|---|---|---|---|---|
deepseek-chat |
Быстрый / default |
нет | нет | базовый chat |
deepseek-v3 |
Быстрый / default |
нет | нет | совместимый alias |
deepseek-default |
Быстрый / default |
нет | нет | совместимый alias |
deepseek-reasoner |
Быстрый / default |
да | нет | thinking_enabled=true |
deepseek-r1 |
Быстрый / default |
да | нет | R1-compatible alias |
deepseek-chat-search |
Быстрый / default |
нет | да | web search |
deepseek-default-search |
Быстрый / default |
нет | да | web search alias |
deepseek-reasoner-search |
Быстрый / default |
да | да | reasoning + search |
deepseek-r1-search |
Быстрый / default |
да | да | R1-compatible + search |
deepseek-expert |
Эксперт / expert |
нет | нет | Expert mode |
deepseek-v4-pro |
Эксперт / expert |
да | нет | Expert + reasoning |
Полный маппинг:
curl http://localhost:9655/v1/model-capabilitiesПо официальной странице DeepSeek V4 Preview deepseek-chat и deepseek-reasoner сейчас route'ятся в deepseek-v4-flash non-thinking/thinking. В самом chat.deepseek.com direct stream точное имя чекпойнта не отдаётся (model: ""), поэтому proxy фиксирует одновременно web-режим (default / Быстрый) и актуальную официальную маршрутизацию (DeepSeek-V4-Flash).
Текущий вывод DeepSeek Web remote config показывает такие web-режимы:
default/ UIБыстрый— работает; поддерживаетthinking_enabledиsearch_enabled.expert/ UIЭксперт— работает через актуальный web-контракт (x-client-version=2.0.0) и поддерживаетthinking_enabled. В/v1/modelsвыдаютсяdeepseek-expertбез reasoning иdeepseek-v4-proкак Expert + reasoning.vision/ UIРаспознавание— виден в remote config, но сейчас direct Web API возвращаетbackend_err_by_model(Vision is temporarily unavailable). Поэтомуdeepseek-visionскрыт из/v1/models.
Search для Expert по remote config недоступен, поэтому deepseek-expert-search остаётся unsupported.
| Method | Path | Назначение |
|---|---|---|
GET |
/ или /health |
статус proxy |
GET |
/v1/models |
список рабочих OpenAI-compatible aliases |
GET |
/v1/model-capabilities |
полный маппинг aliases, real model, capabilities |
GET |
/v1/accounts |
статус пула аккаунтов (health, rate limits) |
POST |
/v1/accounts/reload |
горячая перезагрузка аккаунтов без рестарта |
POST |
/v1/chat/completions |
OpenAI-compatible Chat Completions |
POST |
/v1/messages |
Anthropic Messages API shim |
POST |
/v1/responses |
OpenAI Responses API shim |
GET |
/v1/sessions |
активные локальные agent sessions |
POST |
/reset-session?agent=<id> |
сбросить одну session |
POST |
/reset-session?agent=all |
сбросить все sessions |
Прокси поддерживает работу с несколькими DeepSeek-аккаунтами одновременно с round-robin балансировкой.
Способ 1: через меню (рекомендуется)
npm run auth
# Выбрать пункт 2 — «Добавить новый аккаунт»
# Ввести имя аккаунта (например: work, personal, bot1)
# Залогиниться в открывшемся ChromeСпособ 2: через CLI
# Добавить именованный аккаунт
npm run auth -- --add work
npm run auth -- --add personal
npm run auth -- --add bot1Способ 3: вручную
Положите JSON-файлы в директорию accounts/:
accounts/
├── work.json
├── personal.json
└── bot1.jsonКаждый файл — стандартный формат auth:
{
"name": "work",
"token": "YOUR_TOKEN",
"hif_dliq": "",
"hif_leim": "",
"cookie": "ds_session_id=...; smidV2=...",
"wasmUrl": "https://fe-static.deepseek.com/chat/static/sha3_wasm_bg.7b9ca65ddd.wasm"
}Способ 4: accounts.json
Массив аккаунтов в одном файле (см. accounts.example.json).
accounts/*.json— отдельные файлы (наивысший приоритет)accounts.json— массив аккаунтовdeepseek-auth.json— legacy одиночный аккаунт (fallback)
Дубликаты (по token) автоматически исключаются.
- Round-robin между доступными аккаунтами
- Rate limit: до 30 запросов/мин на аккаунт (настраивается через
ACCOUNT_RATE_LIMIT) - Cooldown: 60 сек при ошибке (401/403/500) — аккаунт временно исключается
- Автовосстановление: после cooldown аккаунт возвращается в пул
# Статус всех аккаунтов
curl http://localhost:9655/v1/accounts
# Горячая перезагрузка (добавили новый аккаунт без рестарта)
curl -X POST http://localhost:9655/v1/accounts/reload| Переменная | По умолчанию | Описание |
|---|---|---|
DEEPSEEK_ACCOUNTS_DIR |
./accounts |
Директория с JSON-файлами аккаунтов |
DEEPSEEK_ACCOUNTS_PATH |
./accounts.json |
Путь к массиву аккаунтов |
DEEPSEEK_AUTH_PATH |
./deepseek-auth.json |
Legacy одиночный аккаунт |
ACCOUNT_RATE_LIMIT |
30 |
Макс. запросов на аккаунт в минуту |
DEEPSEEK_ACCOUNT_NAME |
— | Имя аккаунта при авторизации (для npm run deepseek:auth) |
Base URL для Open WebUI в Docker:
http://host.docker.internal:9655/v1
Для локального запуска без Docker:
http://localhost:9655/v1
API key можно указать любой: proxy сам ходит в DeepSeek Web через сохранённую browser-сессию.
npm run auth
npm startЕсли DeepSeek начал отвечать 401, 403 или просит новый PoW/session — повторите npm run auth и обновите сохранённую browser-сессию.
Локальные файлы авторизации не должны попадать в GitHub:
deepseek-auth.json.chrome-profile-deepseek/.env
Они уже добавлены в .gitignore.
Синтаксическая проверка проекта:
npm testLive smoke-тесты против запущенного локального proxy:
BASE_URL=http://127.0.0.1:9655 MODEL=deepseek-chat npm run test:liveFreeDeepseekAPI — экспериментальный web-chat proxy для локального использования и интеграций. Он зависит от текущего контракта DeepSeek Web Chat, поэтому при изменениях на стороне DeepSeek может потребоваться обновление auth/session logic или model mapping.
Если что-то перестало работать:
- обновите логин через
npm run auth; - проверьте
/v1/model-capabilities; - повторите запрос на свежей сессии;
- если проблема сохраняется — вероятно, DeepSeek изменил внутренний Web API.