DeepSeek через deepseek-api; память шагов переехала из чата в стенограмму

Транспорт: был дочерний процесс ask.mjs из ollama_orchestro с обменом через
временные файлы, стал POST /api/chat к сервису deepseek-api. Он держит вкладку
браузера и отдаёт наружу протокол Ollama, поэтому здесь про браузер больше
не знают: ушли проверка существования моста, временные файлы шагов вместе
с флагом --keep-temp и четыре осиротевших импорта.

Главное не в транспорте. Раньше шаги 2..N уходили с флагом --new, и ход
разговора помнил сам чат DeepSeek. Сервис памяти не имеет принципиально:
каждый запрос он кладёт в чат целиком, затирая прошлый. Поэтому стенограмму
ведём здесь — growTranscript подклеивает к отправленному тексту прошлый ответ
модели между метками === ТВОЙ ПРЕДЫДУЩИЙ ОТВЕТ === и === END ===, и следующим
шагом уезжает всё сразу.

Так надёжнее, чем было: видно в одном месте, что именно уедет модели, а чужой
потребитель, вклинившийся между нашими шагами, ничего не портит — мы всё
приносим заново. Плата — вопрос растёт на длину прошлого ответа.

--check теперь различает три состояния: сервис отвечает и браузер поднят;
сервис жив, но браузера ещё нет; сервис не запущен. Плашка в ui.html тоже.

Настройки: bridge/chat/cdpPort заменены на deepseekHost и deepseekModel.

Проверено живым многошаговым прогоном: шаг 1 — 2094 символа, ответ
NEED: deepwork.mjs; шаг 2 — 28 447 символов стенограммы, ответ дословно верный
и по вопросу из ПЕРВОГО сообщения, то есть память шагов работает. Два шага
за 17 с. --selftest пройден, --check зелёный.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Alex Cube
2026-08-26 13:40:09 +03:00
co-authored by Claude Opus 5
parent 3586e32a89
commit 44f07c8af9
4 changed files with 126 additions and 89 deletions
+34 -21
View File
@@ -1,6 +1,6 @@
# deepwork
Цикл с инструментами поверх моста `ollama_orchestro/ask.mjs`.
Цикл с инструментами поверх сервиса [deepseek-api](https://git.08h.ru/alex/deepseek-api).
DeepSeek через веб-чат видит только то, что положили ему в вопрос. Здесь у него
появляется обратное направление: он возвращает блок-запрос, программа его
@@ -45,23 +45,21 @@ node c:\#Projects\deepwork\deepwork.mjs ui тот же пульт вру
## Как устроено
Мост **не импортируется и не копируется**. `ask.mjs` разбирает `process.argv`
и исполняет команду на верхнем уровне — `import` немедленно запустил бы её.
Поэтому мост вызывается подпроцессом теми флагами, которые у него уже есть:
У веб-версии DeepSeek нет API — только вкладка в браузере. Разговором с ней
занимается отдельный сервис `deepseek-api`, а нам показывает протокол Ollama.
Здесь про браузер не знают вовсе: обычный `POST /api/chat`.
```
node ask.mjs ask --chat think --file step1.txt --out ans1.txt --quiet
node ask.mjs ask --chat think --new --file step2.txt --out ans2.txt --quiet
```
**Разговор помним мы, а не DeepSeek.** Сервис без памяти: каждый запрос он
кладёт в чат целиком, затирая прошлый. Поэтому стенограмма растёт здесь —
`growTranscript` подклеивает к отправленному тексту прошлый ответ модели
(между метками `=== ТВОЙ ПРЕДЫДУЩИЙ ОТВЕТ ===` и `=== END ===`) и результаты
запросов, и следующим шагом уезжает всё сразу.
Шаг 1 идёт без `--new`: мост правит первое сообщение, и чат остаётся из одного
обмена. Шаги 2..N — с `--new`, обычной отправкой: только так DeepSeek помнит
предыдущий шаг. Цена — переподключение к браузеру на каждом шаге, 1–2 секунды.
Взамен `ollama_orchestro` не меняется ни на строку, а его правки прилетают сюда
даром.
Чат берётся тот же, что у orchestro (`think` из его `chats.json`). Своя роль не
заводится: `chats.json` принадлежит мосту.
Раньше эту роль играл флаг `--new` у моста, и помнил всё сам чат. Своя
стенограмма надёжнее: видно в одном месте, что именно уедет модели, а чужой
потребитель, вклинившийся между нашими шагами, ничего не портит — мы всё
приносим заново. Плата — вопрос растёт на длину прошлого ответа; при `steps: 4`
это единицы килобайт против 22 КБ первого сообщения.
Цикл останавливается, когда запросов в ответе нет, когда кончились шаги или
когда пришёл тот же самый запрос второй раз подряд (петля).
@@ -71,20 +69,35 @@ node ask.mjs ask --chat think --new --file step2.txt --out ans2.txt --quiet
`config.json` (в репозиторий не попадает, образец — `config.example.json`):
```json
{ "bridge": "C:/#Projects/ollama_orchestro/ask.mjs", "chat": "think", "steps": 4 }
{ "deepseekHost": "http://localhost:11500", "deepseekModel": "deepseek:think", "steps": 4 }
```
Без файла мост ищется рядом: `../ollama_orchestro/ask.mjs`.
Без файла берётся `http://localhost:11500`.
## Проверка
```
node deepwork.mjs --selftest внутренние проверки, ничего не отправляют
node deepwork.mjs --check мост на месте, вкладка жива
node deepwork.mjs --check сервис на месте, вкладка жива
```
Браузер должен быть запущен `start-browser.cmd` из `ollama_orchestro`
с отладочным портом 9333.
`--check` различает три состояния: сервис отвечает и браузер поднят; сервис
жив, но браузера ещё нет (встанет на первом же вопросе); сервис не запущен.
Запускается сервис своим `start.cmd` в папке `deepseek-api` — браузер он
поднимает сам.
## Переезд на deepseek-api (26.08.2026)
Транспорт сменился: был дочерний процесс `ask.mjs` из `ollama_orchestro`
с обменом через временные файлы, стал `POST /api/chat` к сервису
`deepseek-api`. Заодно ушли временные файлы шагов (и флаг `--keep-temp`),
проверка существования моста и запуск браузера — всё это теперь не наша забота.
Память шагов переехала из чата DeepSeek в `growTranscript` (см. «Как устроено»).
Проверено живым прогоном: шаг 1 — 2094 символа, ответ `NEED: deepwork.mjs`;
шаг 2 — 28 447 символов стенограммы, ответ дословно верный и по вопросу
из ПЕРВОГО сообщения. Два шага за 17 с.
## Что проверено