---
name: deepseek-qwen-free-api
description: "DeepSeek и Qwen web2api прокси на mac mini (порты 1718/1719), launchd, cURL-import флоу. Дополнения к [[gemini_web2api_overview]]"
metadata: 
  node_type: memory
  type: project
  originSessionId: d66da292-7e67-41c7-9f4f-d2ff61ffbf08
---

## Что это

Два дополнительных OpenAI-совместимых прокси к веб-чатам, по аналогии с [[gemini_web2api_overview]]:

| Сервис | Порт | launchd | Репа | Auth flow |
|---|---|---|---|---|
| Gemini | 1717 | `com.cebers.gemini-web2api` | Sophomoresty/gemini-web2api | anonymous, прокси SOCKS5 2080 |
| **DeepSeek** | **1718** | `com.cebers.deepseek-free-api` | Fly143/deepseek-free-api | cURL-import + SOCKS5 (WAF блок ASN) |
| **Qwen** | **1719** | `com.cebers.qwen-free-api` | y13sint/FreeQwenApi (Node.js) | JWT-token из cookies, direct без прокси |

## DeepSeek (порт 1718)

`~/Разработки/deepseek-free-api/`, venv 3.12 `~/.venvs/deepseek-free-api/`. FastAPI + curl_cffi + Node.js для PoW WASM solver. **brew install node@26**.

**Auth (cURL-import flow):**
1. Firefox через SOCKS5 на `chat.deepseek.com` (РФ IP получает 202 от AWS WAF; все VPS-ASN тоже зафлажены, проходит только real-browser JS-challenge)
2. После логина: F12 → Network → найти POST `/api/v0/chat/completion` → Copy as cURL
3. `curl -X POST http://127.0.0.1:1718/api/config -d '{"curl":"<cURL>"}'` — импорт
4. **Обязательно** `curl -X PUT http://127.0.0.1:1718/api/proxy -d '{"proxy":"socks5://127.0.0.1:2080"}'` — все исходящие запросы через прокси (WAF режет datacenter, но Firefox JS-challenge даёт cookie которое exempts на время)

**Аккаунт:** `cebersdev1@gmail.com` (login/password в README не храним).

**Модели:** `deepseek-default`, `deepseek-reasoner` (R1 thinking), `deepseek-search`. Context 1M.

**ENV в launchd plist:** `PROXY_PORT=1718`. Прокси и аккаунт сохраняются в `session_store.py` файлах внутри `~/Разработки/deepseek-free-api/`.

**Why cURL re-import может понадобиться:** AWS WAF cookie `aws-waf-token` экспайрится через несколько часов/сутки → curl-import повторно. Скрипт авто-перелогинивается ТОЛЬКО при сохранённом password, но WAF режет login endpoint. Поэтому cURL — основной путь.

## Qwen (порт 1719)

`~/Разработки/FreeQwenApi/`, Node.js (node 26 через brew). Puppeteer + Stealth, но **CAPTCHA Qwen блокирует автоматизированный Chromium** даже с Stealth.

**Auth (JWT extract из браузера):**
1. Firefox через SOCKS5 на `chat.qwen.ai`, логин (Google OAuth работает через NL-прокси; РФ Google блокирует)
2. После логина: F12 → Network → любой запрос к `chat.qwen.ai/api/*` → Copy as cURL
3. Из Cookie вытащить `token=eyJhbGc...` (JWT, exp 30 дней)
4. Записать в `session/tokens.json`: `[{"id":"acc_<ts>","token":"eyJ...","resetAt":null}]` + `session/accounts/<id>/token.txt`
5. Запуск с `SKIP_ACCOUNT_MENU=true PORT=1719`

**Патч в `src/browser/browser.js`:** добавил `process.env.PROXY_SERVER` поддержку для passing `--proxy-server=` в Puppeteer args (нужно если когда-то снова делать interactive Puppeteer-auth). Сам сервис в runtime работает direct без прокси — Qwen не блокирует РФ-IP.

**Модели (25 шт):** `qwen3-max`, `qwen-max-latest`, `qwen-turbo`, `qwen3.5-plus`, `qwen3.5-397b-a17b`, `qwen3-coder-plus`, `qwen3-vl-plus`, `qwq-32b`, `qvq-72b-preview-0310`, `qwen2.5-coder-32b-instruct`, и др.

**JWT exp:** через 30 дней повторить шаги 1-4 (получить новый token из cookies, переписать tokens.json, restart launchd).

## Latency (после установки)

| Сервис | Короткий prompt | Через прокси? |
|---|---|---|
| Gemini Flash | 0.7-2.1s | Да (SOCKS5 NL) |
| DeepSeek default | 1.9s | Да (SOCKS5 NL) |
| Qwen-turbo | 1.4s | Нет (direct из РФ к Alibaba) |

## Команды

```bash
# Status
launchctl list | grep -E "gemini-web2api|deepseek-free-api|qwen-free-api"

# Restart
launchctl unload/load -w ~/Library/LaunchAgents/com.cebers.<service>.plist

# Logs
tail -f ~/Разработки/{gemini-web2api,deepseek-free-api,FreeQwenApi}/logs/launchd.err.log

# Smoke tests
curl -s -X POST http://127.0.0.1:1717/v1/chat/completions -d '{"model":"gemini-3.5-flash","messages":[{"role":"user","content":"hi"}]}'
curl -s -X POST http://127.0.0.1:1718/v1/chat/completions -d '{"model":"deepseek-default","messages":[{"role":"user","content":"hi"}]}'
curl -s -X POST http://127.0.0.1:1719/api/chat/completions -d '{"model":"qwen-turbo","messages":[{"role":"user","content":"hi"}]}'
```

## Эндпоинт-различия

- Gemini и DeepSeek: `/v1/chat/completions` (OpenAI канон)
- **Qwen: `/api/chat/completions`** (не `/v1/...`, иначе 404). Запасной `/api/chat` без OpenAI-обёртки.

## Firefox-профиль для cURL-import

`~/Library/Application Support/Firefox/Profiles/gemini-web2api.dedicated` (несмотря на имя — общий для всех трёх). SOCKS5 127.0.0.1:2080, prefs в `user.js` + `prefs.js`. Запуск:

```bash
/Applications/Firefox.app/Contents/MacOS/firefox --no-remote \
  --profile "$HOME/Library/Application Support/Firefox/Profiles/gemini-web2api.dedicated" \
  "https://chat.deepseek.com/"  # или другая цель
```

`--no-remote` обязателен, иначе Firefox реюзит default-профиль.

## Восстановление 2026-06-14 (DeepSeek ✅ / Qwen ⛔ WAF)

**DeepSeek :1718 — ПОЧИНЕН** (commit 0c99490 в `~/Разработки/deepseek-free-api`). Симптом: `/v1/chat/completions` → 500 `TypeError: cannot unpack non-iterable NoneType` (proxy.py chat), `/v1/models` пуст. Причина — НЕ протухший токен, а **структурный баг**: конфиг переехал в `{accounts:[...]}`, а `_discover_models()` читал несуществующий top-level `token` → пустой Bearer → discovery падал → `get_models()` пуст → unpack None. Фикс: (1) `chat()` — `model_info` дефолтит в `(False,False,1048576,1048576)` вместо краха → **чат расцеплён с discovery-эндпоинтом** (это и вернуло чат); (2) `_discover_models()` берёт креды из `config_manager.get_next_account()` + `build_request_headers` + `impersonate="chrome120"`. После фикса чат отдаёт ответ (~2.3с), сам токен/cookie живы. `/v1/models` всё ещё пуст (settings-эндпоинт за WAF), но это косметика — чат с явным именем модели работает, в т.ч. через CebersResearch :20130 (`research/deepseek-chat` → валидный JSON 2.3с).

**Qwen :1719 — ЗАБЛОКИРОВАН Alibaba WAF, восстановление НЕ удалось (2026-06-14, глубокая проверка).** Что выяснено:
- JWT валиден (≈27 дн), сеть до chat.qwen.ai ОК. `qwen_autologin.py` (`~/Разработки/CebersResearch/scripts/`, venv `~/.venvs/qwen-autologin`, профиль `~/.config/qwen-autologin-profile`, creds `~/.codex/qwen_creds.env`) логинится БЕЗ капчи (persistent-профиль уже авторизован, login-капчи НЕТ) и обновляет token в `FreeQwenApi/session/tokens.json`. Свежий токен НЕ помог.
- `POST /api/v2/chats/new`: голый curl → `CF_APP_WAF` challenge-страница; **из самого авторизованного Playwright-браузера (профиль с ПОЛНЫМ набором WAF-cookie: acw_tc/aliyungf_tc/cna/ssxmod_itna(2)/x-ap/xlly_s/tfstk/isg/token) тот же fetch ВИСНЕТ (таймаут 12с)**.
- **Вывод (решающий):** ни валидный JWT, ни полный cookie-jar, ни правильный браузерный fingerprint не дают пройти — Alibaba WAF требует **per-request signed token**, который генерит in-page WAF-SDK Qwen (тип bx-v/x-request-id); голый fetch (и голый HTTP FreeQwenApi) блокируется/держится. **Капча-решатель zemlya (OpenCV puzzle-slider + drag) тут НЕ применим — слайдера нет, это подпись запроса, а не картинка.** Восстановление = реверс request-signing Qwen (глубоко, хрупко, движущаяся цель). **Решение: НЕ тянуть Qwen; для независимого бесплатного бэкенда хватает восстановленного DeepSeek.**

## Авто-подъём сессии + диверсификация (2026-06-14, вечер)

**Авто-relogin DeepSeek (две правки, в `~/Разработки/CebersResearch/scripts/`, dir НЕ git → правки live + `.bak`):**
1. `watch.sh` R7-классификатор: был `if AUTH.search(err) and not TIMEOUT` → ловил только AUTH-ошибки, а **пустой ответ (`ok=False`, но `error=""`) пролетал мимо** → relogin не запускался. Стало `if not TIMEOUT.search(err)` → пустой контент И auth-ошибки → relogin (таймауты по-прежнему пропускаем). Теперь watchdog авто-перелогинивает deepseek/qwen на пустой ответ (cooldown 30 мин, deep-probe каждые ~30 мин). `deep_probe.py` уже метит пустой как `ok=False` (`"ok": bool(content)`), просто без error-строки — отсюда и был слепой зон.
2. `deepseek_autologin.py` `launch_persistent_context` → добавлен `proxy={"server":"socks5://127.0.0.1:2080"}`. Причина: рантайм deepseek-free-api шлёт чат через SOCKS5 (NL), а автологин-браузер ходил DIRECT → `aws-waf-token` (IP-bound) либо не выдавался, либо был для чужого IP → WAF soft-block (HTTP200 пусто). После фикса браузер ходит через тот же :2080 → cookies 3→4, строка 257→515 символов, **warning `no aws-waf-token` ИСЧЕЗ** (токен теперь захватывается).

**⚠️ Но в тот вечер DeepSeek ВСЁ РАВНО отдавал пусто** даже со свежим aws-waf-token — server-side soft-block аккаунта/IP (вечер/регион/rate). Т.е. плюмбинг авто-recovery исправен (заработает когда upstream здоров), но вечерний empty не лечится нашими силами. Проверить пользу aws-waf-token — когда upstream оживёт.

**Диверсификация спорт-консенсуса (delor, commits 1626efb/dcafcd7):** voter#3 = `Chain(siliconflow/gpt-oss-120b → research/deepseek-chat @ :20130)`, voter#4 = `Chain(gemini-cli/flash-lite → gemini-web2api gemini-3.5-flash @ :1717)`. Оба — независимые бесплатные бэкенды, грациозный fallthrough. Клиент `delor/models/cebers_research.py` (OpenAI-стиль; `api_key=""`→без Bearer для anonymous gemini-web). gemini-web2api :1717 модели: gemini-3.5-flash/-thinking, gemini-3.1-pro, gemini-flash-lite.

**ГЛАВНЫЙ ВЫВОД (важно для будущих сессий):** в вечерние часы/из РФ ВСЕ бесплатные web-прокси (deepseek, qwen-WAF, gemini-web) коллективно отдают пусто/блок — «безотказно» из free НЕДОСТИЖИМО, сколько ни диверсифицируй. Плюмбинг (cross-provider цепочки + кворум-монитор + авто-relogin) максимизирует uptime, но единственный реальный рычаг failure-proof+качество — дешёвый ПЛАТНЫЙ API-якорь одним голосом (юзер пока отказывался).

## Qwen ВЫКЛЮЧЕН НАВСЕГДА (2026-07-02)

**Инцидент:** com.cebers.qwen-free-api (заведомо мёртвый с 2026-06-14, см. выше) месяц крутился под KeepAlive: 3 вкладки puppeteer-Chrome заклинило на ~95% CPU × 16 дней, RSS вырос до **4.7 ГБ**, своп mini забит 7.8/9 ГБ — это и был ответ на «что ест оперативку». Рестарт памяти помог, но чат так и не работал (ProtocolError внутри страницы — WAF).

**Ретирован в 3 местах (все с .bak-qwen-retire-20260702):**
1. `launchctl bootout + disable com.cebers.qwen-free-api` — сервис выгружен и не стартует после ребута (plist оставлен).
2. `CebersResearch/scripts/watch.sh` — qwen-relogin блок под `if false` (иначе вотчдог гонял бы Playwright-браузер каждые 10 мин по вечному down).
3. `CebersResearch/main.py` — qwen убран из UPSTREAM_PROBES, JWT-чек = None (иначе gateway вечно degraded, а после протухания JWT ~12.07 — вечно critical). После рестарта `/healthz?detail=1` = **ok** (gemini+deepseek).

НЕ тронуто: модели `research/qwen-*` и fallback deepseek→qwen в main.py остались (фейлятся сквозняком, цепочки переживают). Реанимировать Qwen = реверс per-request подписи WAF — не делать.

## Каскад выбора при отказе

При выборе LLM для прикладной задачи: [[omniroute_cloud_bus]] :20127 первый — он быстрее и стабильнее (но юзер заметил что Qwen/DeepSeek провайдеры там часто отлетают). web2api прокси — fallback для cases когда нужны именно эти конкретные модели (deepseek-reasoner, qwen3-max-thinking и т.п.) или OmniRoute провайдеры лежат.
