---
name: cebersresearch-deepseek-restore-pending
description: CebersResearch — DeepSeek web2api ВОССТАНОВЛЕН (2026-07-13); фикс дрейфа заголовков/did + FreeModel удалён
metadata: 
  node_type: memory
  type: project
  originSessionId: bec80f54-b944-4b3d-b98e-48e98f0f3e05
---

**СТАТУС: ВОССТАНОВЛЕН 2026-07-13.** DeepSeek web2api `deepseek-free-api` :1718 снова primary-синтезатор в [[cebersresearch_overview]]. 8 моделей, chat/search/reasoner живые напрямую и через gateway (`research/deepseek-chat`→deepseek-default, `research/deepseek-search`, `research/deepseek-reasoner`).

**Как восстановил без вывода токена в чат:** ssh-туннель MacBook→мини (`-L 21718:127.0.0.1:1718`), затем из залогиненного браузера chat.deepseek.com `fetch('http://127.0.0.1:21718/api/config',{POST, body:{curl}})` — токен из `localStorage.userToken.value` ушёл прямо в конфиг прокси, не через транскрипт (CORS у прокси `*`). Синтетический curl: `curl 'https://chat.deepseek.com/api/v0/chat/completion' -H 'authorization: Bearer <tok>' --data-raw '{"session_id":"<uuid>"}'` (parse_curl берёт token из Bearer, session_id регэкспом из body). Это санкц. паттерн «pipe, not echo».

**ДВА ФИКСА ДРЕЙФА DeepSeek-веба (proxy.py, бэкапы .bak-hdrfix-*/.bak-ver-*):**
1. **client-заголовки.** `build_request_headers` строил хедеры из `account.headers`; тонкий curl-импорт нёс только authorization → в completion не уходил `x-client-version` → ошибка `unsupported_client_by_model` «Update to the latest version». Фикс: `setdefault` x-client-version=**2.2.0** (было 2.0.2), x-client-platform=web, x-client-bundle-id=com.deepseek.chat, x-client-locale=ru, x-client-timezone-offset=10800. Реальную версию снял XHR/fetch-перехватом в браузере.
2. **did в discovery.** `_discover_models` бил `client/settings?scope=model` без `did` → `biz_data:null` → `'NoneType' has no attribute get` → пустой список моделей. Фикс: `MODEL_CONFIG_URL + "&did="+uuid4()`. did НЕ валидируется против токена (проверил рандомным).

**ГРАБЛЯ round-robin:** в пуле висел старый несогласованный аккаунт (label `curl_import_RCQUFbRT` но token `QuxJdFIP`) — отдавал ПУСТОЙ content через раз. Вычистил `config.json` до одного консистентного (label-суффикс == token[:8]). `scripts`-нет, чистил `purge_stale_acct.py`. Правило: label `curl_import_<token[:8]>` должен совпадать с токеном, иначе аккаунт мёртв.

**FreeModel УДАЛЁН** (пул $300 исчерпан). Вычищен из main.py: константы, MODELS (gpt-5.5/gpt-5.4-mini), DEEPSEEK_FALLBACK, DEPTH_CONFIG.synth_model, `_do_synthesis` (теперь DeepSeek→Qwen→GigaChat-Ultra), auth. Бэкап main.py.bak-pre-rmfreemodel-*.

**Режимы:** V3=`deepseek-default`/gw`deepseek-chat`, R1=`deepseek-reasoner` (content+reasoning_content), Поиск=`deepseek-search` (web+даёт актуальную дату), expert/vision тоже открыты.

**Антифлап тайла (2026-07-13):** тайл флапал running↔degraded ~90-150мин (спам). Причина: egress/xray :2080 краткие блипы → curl_cffi TLS `invalid library`/`Connection closed abruptly` в discovery → синхронный `/v1/models` (health-URL) блокировался >5с → degraded → глобальный auto_restart (threshold 3) слал SIGTERM (launchctl exit -15) → рестарт → running. Рестарт внешний блип не чинит = чистый churn. Фикс: (1) `get_models` неблокирующий — stale-кэш мгновенно, discovery в фоне (`_bg_discover` daemon-thread; cold-start одна синхр. попытка); (2) тайлу `auto_restart:{enabled:false}` (как [[cebersresearch_gigachat_web]]). Проверено: форс-stale→GET 1.4мс/200. Бэкап proxy.py.bak-flapfix-*. Блип теперь не флапает; реальные chat в блип → gateway-фолбэк.

**ГРАБЛЯ (важно):** после правки `auto_restart` в dashboard_config.json флап ПРОДОЛЖАЛСЯ — дашборд слал SIGTERM despite `enabled:false` на диске (hot-reload Правила 8 на auto_restart НЕ сработал; старый in-memory код). Нужен рестарт дашборда. ВТОРАЯ грабля: у ops_dashboard ДВА launchd-сервиса — главный `com.cebers.ops-dashboard` (server.py, делает auto_restart) и `local.ops-dashboard-callbacks` (callback_dispatcher.py, только TG-кнопки). Рестартить надо ГЛАВНЫЙ по ТОЧНОМУ лейблу: `launchctl kickstart -k gui/$(id -u)/com.cebers.ops-dashboard` (НЕ через `launchctl list|grep dashboard|head -1` — там первым идёт callbacks, попадёшь не туда; проверяй смену PID `pgrep -f ops_dashboard/server.py`). После правильного рестарта дашборда флап ВСЁ РАВНО продолжился → значит дашборд НЕ виноват.

**НАСТОЯЩАЯ первопричина (найдена по `_state/dashboard.sqlite`):** в таблице `actions` — НОЛЬ авто-рестартов deepseek (у gigachat есть, у deepseek нет) → дашборд его не рестартит, override работал. Процесс deepseek получает чистый внешний SIGTERM каждые ~30-90 мин (лог: `INFO: Shutting down`, без краша) и launchd поднимает. КЛЮЧ: рестарт занимал **~60с** (окно degraded 05:38:32→05:39:34=62с), потому что `startup_discover` (@app.on_event startup) делал **синхронный** `_discover_models()` через xray — блокировал приём соединений на всё время старта. Health-check дашборда (раз в 60с) почти всегда попадал в это 60с-окно → degraded → пуш. **ФИКС:** startup_discover сделан фоновым (threading.Thread(_discover_models)) — сервер отвечает за **~2с** (проверено), окно down схлопнулось, health-check почти не попадает → флап исчезает. Бэкапы proxy.py.bak-flapfix-*.

**Осталось (не критично):** ЧТО именно шлёт SIGTERM deepseek каждые ~30-90 мин — не идентифицировано (не дашборд, не cron, не uvicorn-reload, не self-kill, не xray-refresh — тот рестартит только local.netproxy-xray). Теперь безвредно (2с down, gateway-фолбэк). Если понадобится — копать `log show`/dtrace по SIGTERM.

Вывод: правки поведения тайлов подтверждать рестартом ГЛАВНОГО `com.cebers.ops-dashboard` (не callbacks!) + сверять PID; но спам deepseek был не от дашборда, а от долгого (60с) блокирующего старта.

Связано: [[cebersresearch_gigachat_web]] (self-heal), планнер /research на gigachat-web.
