Skip to content

ForgetMeAI/FreeDeepseekAPI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FreeDeepseekAPI

Локальный OpenAI-compatible API proxy для DeepSeek Web Chat

License MIT Node.js 18 plus No npm dependencies OpenAI compatible

Быстрый стартВозможностиПримерыМоделиEndpointsOpen 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.

ForgetMeAI: https://t.me/forgetmeai


Навигация


✨ Что это даёт

  • Использовать 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/ForgetMeAI/FreeDeepseekAPI.git
cd FreeDeepseekAPI
npm run auth
npm start

npm run auth открывает меню авторизации:

  1. выберите пункт 1;
  2. войдите в DeepSeek в отдельном Chrome-профиле;
  3. отправьте короткое сообщение вроде ok;
  4. вернитесь в терминал и нажмите Enter.

npm start показывает меню запуска:

  • 1 — авторизоваться / обновить DeepSeek login
  • 2 — показать модели и статусы
  • 3 — запустить proxy
  • 4 — выйти

Для headless/CI-запуска без меню:

NON_INTERACTIVE=1 npm start
# или
SKIP_ACCOUNT_MENU=1 npm start

По умолчанию сервер слушает:

http://localhost:9655

🪟 Windows запуск

git clone https://github.com/ForgetMeAI/FreeDeepseekAPI.git
cd FreeDeepseekAPI
npm run auth
npm start

Если Chrome установлен нестандартно, явно укажите путь:

$env:CHROME_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe"
npm run auth

Если Chrome не найден, npm run auth теперь печатает готовые инструкции для Windows/macOS/Linux вместо загадочного stack trace.


🐧 Linux / Chromium запуск

git clone https://github.com/ForgetMeAI/FreeDeepseekAPI.git
cd FreeDeepseekAPI
CHROME_PATH=$(which chromium) npm run auth
npm start

Если Chromium называется иначе:

CHROME_PATH=$(which chromium-browser) npm run auth
# или
CHROME_PATH=$(which google-chrome) npm run auth

🖥 VPS / headless запуск

Самый надёжный flow без Chrome на сервере:

  1. На домашнем ПК, где есть GUI/Chrome:
npm run auth
  1. Скопируйте deepseek-auth.json на VPS:
scp deepseek-auth.json user@your-vps:/opt/FreeDeepseekAPI/deepseek-auth.json
  1. На VPS импортируйте/проверьте файл и выставьте безопасные права:
cd /opt/FreeDeepseekAPI
npm run auth:import -- --input ./deepseek-auth.json
npm run doctor -- --offline
  1. Запускайте proxy без интерактивного меню:
NON_INTERACTIVE=1 npm start

Можно импортировать не только готовый deepseek-auth.json, но и browser cookie export:

DEEPSEEK_TOKEN="<token>" npm run auth:import -- --input ./cookies.json

Важно: deepseek-auth.json — это доступ к вашему DeepSeek Web login. Не коммитьте, не публикуйте, храните с правами 0600.


🩺 Diagnostics / doctor

npm run doctor
# без сетевых запросов к DeepSeek:
npm run doctor -- --offline

doctor проверяет:

  • найден ли deepseek-auth.json / DEEPSEEK_AUTH_DIR;
  • валидный ли JSON;
  • есть ли token, cookie, wasmUrl;
  • безопасные ли права файла на macOS/Linux (0600);
  • при обычном запуске — доступен ли DeepSeek PoW endpoint.

Если видите data.biz_data is null, fetch failed, 401/403/429 или Hermes/OpenCode не видит модели — первым делом запускайте npm run doctor.


♻️ Session reuse и сброс чатов

FreeDeepseekAPI не создаёт новый DeepSeek чат на каждый HTTP-запрос без причины. Логика такая:

  • один x-agent-session, session или user → одна DeepSeek chat session;
  • если session id уже есть — proxy переиспользует его и продолжает chain через parent_message_id;
  • auto-reset происходит при TTL, ошибке DeepSeek session или слишком длинной цепочке сообщений;
  • локальная history сохраняется коротким контекстом, чтобы новая DeepSeek session могла продолжить разговор.

Явно задать agent/session:

curl -X POST http://localhost:9655/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "x-agent-session: my-agent" \
  -d '{"model":"deepseek-chat","messages":[{"role":"user","content":"Привет"}]}'

Посмотреть активные sessions:

curl http://localhost:9655/v1/sessions

Сбросить одну session:

curl -X POST "http://localhost:9655/reset-session?agent=my-agent"

Сбросить все sessions:

curl -X POST "http://localhost:9655/reset-session?agent=all"

Почему чаты всё равно появляются в DeepSeek Web: proxy работает через внутренний Web Chat API, а DeepSeek хранит реальные chat sessions у себя. Это нормально для web-proxy. Задача session reuse — не плодить новые чаты без необходимости и аккуратно сбрасываться только когда chain протух/сломался.


👥 Multi-account pool

Можно подключить несколько auth-файлов. Правильная модель: sticky account per agent/session — proxy не переключает аккаунт внутри живой DeepSeek-сессии. Если аккаунт получил 401/403/429 и ушёл в cooldown, session безопасно сбрасывается и новый запрос может перейти на другой доступный аккаунт.

Вариант 1 — директория с auth-файлами:

mkdir -p accounts
cp deepseek-auth-main.json accounts/main.json
cp deepseek-auth-backup.json accounts/backup.json
chmod 600 accounts/*.json
DEEPSEEK_AUTH_DIR=./accounts NON_INTERACTIVE=1 npm start

Вариант 2 — список файлов:

DEEPSEEK_AUTH_PATH="./accounts/main.json,./accounts/backup.json" NON_INTERACTIVE=1 npm start

Как работает pool:

  • новый agent/session получает доступный аккаунт round-robin;
  • выбранный аккаунт закрепляется за session (sticky);
  • при 401, 403, 429 аккаунт уходит в cooldown;
  • если sticky-аккаунт session ушёл в cooldown, старая DeepSeek-сессия сбрасывается, чтобы не долбить rate-limited/expired аккаунт;
  • статус аккаунтов виден в /health без путей к auth-файлам и без имён файлов;
  • auth-файлы должны храниться с правами 0600.

Настроить cooldown:

DEEPSEEK_ACCOUNT_COOLDOWN_MS=600000 npm start

🔑 Идеи для консольной авторизации

Парольный flow из PR #3 можно делать, но безопаснее не хранить пароль и не делать это дефолтом. Нормальная реализация:

  1. npm run auth:console спрашивает email/телефон и пароль через hidden prompt.
  2. Пароль держится только в памяти процесса, не пишется в файлы/logs/history.
  3. Скрипт повторяет Web login flow через fetch/CDP: получает captcha/verify challenge, отдаёт человеку ссылку/код, ждёт подтверждение.
  4. После успешного login сохраняется только deepseek-auth.json стандартного формата.
  5. Если DeepSeek просит captcha/2FA — скрипт честно говорит “открой ссылку, пройди проверку, нажми Enter”, а не пытается обходить защиту.
  6. Для VPS лучше режим auth:console --no-save-password --output deepseek-auth.json.

Минимальный безопасный MVP: console auth только интерактивный, без env-пароля. Допустимый automation-вариант: DEEPSEEK_EMAIL=... npm run auth:console, но пароль всё равно вводится hidden prompt.


✅ Проверка работы

curl http://localhost:9655/
curl http://localhost:9655/v1/models
curl http://localhost:9655/v1/model-capabilities

Если всё ок, /health вернёт статус сервера, список поддерживаемых aliases и config_ready: true.


🧪 Примеры запросов

Chat Completions

curl -X POST http://localhost:9655/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-chat",
    "messages": [{"role": "user", "content": "Привет! Ответь одной фразой."}],
    "stream": false
  }'

Reasoning

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 отдельно.

Web search

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
  }'

Streaming

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
  }'

Anthropic Messages API

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-chat

OpenAI Responses API

curl -X POST http://localhost:9655/v1/responses \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-chat",
    "input": "Ответь ровно OK",
    "stream": false
  }'

Tool calling

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.

Рабочие aliases

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.


🔌 Endpoints

Method Path Назначение
GET / или /health статус proxy
GET /v1/models список рабочих OpenAI-compatible aliases
GET /v1/model-capabilities полный маппинг aliases, real model, capabilities
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

🖥 Open WebUI

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 test

Live smoke-тесты против запущенного локального proxy:

BASE_URL=http://127.0.0.1:9655 MODEL=deepseek-chat npm run test:live

📌 Статус проекта

FreeDeepseekAPI — экспериментальный web-chat proxy для локального использования и интеграций. Он зависит от текущего контракта DeepSeek Web Chat, поэтому при изменениях на стороне DeepSeek может потребоваться обновление auth/session logic или model mapping.

Если что-то перестало работать:

  1. обновите логин через npm run auth;
  2. проверьте /v1/model-capabilities;
  3. повторите запрос на свежей сессии;
  4. если проблема сохраняется — вероятно, DeepSeek изменил внутренний Web API.

ForgetMeAI · Telegram

About

Локальный API-прокси для DeepSeek Web Chat с поддержкой OpenAI/Anthropic API, streaming, tool calling, Responses API и Open WebUI

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors