Окно с индикатором вместо чёрной консоли

Маленькое окно на C#, собирается компилятором из состава Windows: ставить
нечего, зависимостей нет — как и у всего остального в проекте. Запускает
node дочерним процессом, показывает его вывод, прячется в трей, красит
значок по /api/state.

Node теперь уходит вместе с окном: окно держит его stdin, server.mjs при
DEEPSEEK_TRAY=1 слушает close на этой трубе. Job Object не подошёл бы —
он забрал бы с собой и браузер, который человеку нужен.

Окно смотрит на checked, а не только на ready: снимок обновляет сторож,
и без этой проверки окно показывало бы «готов» через секунду после смерти
браузера. Поэтому /api/state отдаёт ещё и watchdogSec.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Alex Cube
2026-08-26 16:47:34 +03:00
co-authored by Claude Opus 5
parent 52de3b91eb
commit 46ea8a9296
6 changed files with 414 additions and 9 deletions
+52 -8
View File
@@ -1,3 +1,5 @@
<img src="icon.png" alt="" width="128" align="right">
# deepseek-api
**DeepSeek, притворяющийся Ollama.**
@@ -29,13 +31,14 @@
1. [Что понадобится](#что-понадобится)
2. [Установка по шагам](#установка-по-шагам)
3. [Проверка, что всё работает](#проверка-что-всё-работает)
4. [Как подключить свою программу](#как-подключить-свою-программу)
5. [Что умеет и чего не умеет](#что-умеет-и-чего-не-умеет)
6. [Настройка](#настройка)
7. [Если не работает](#если-не-работает)
8. [Безопасность](#безопасность)
9. [Как это устроено внутри](#как-это-устроено-внутри)
3. [Окно с индикатором](#окно-с-индикатором)
4. [Проверка, что всё работает](#проверка-что-всё-работает)
5. [Как подключить свою программу](#как-подключить-свою-программу)
6. [Что умеет и чего не умеет](#что-умеет-и-чего-не-умеет)
7. [Настройка](#настройка)
8. [Если не работает](#если-не-работает)
9. [Безопасность](#безопасность)
10. [Как это устроено внутри](#как-это-устроено-внутри)
---
@@ -135,6 +138,9 @@ start.cmd
Это окно должно оставаться открытым — пока оно живо, работает и сервис.
Останов — `Ctrl+C` или просто закрыть окно.
Чёрная консоль не обязательна: рядом лежит окно с индикатором в трее —
см. [Окно с индикатором](#окно-с-индикатором).
### Шаг 5. Войти в DeepSeek
Браузер поднимается сам, но в пустом профиле вы ещё не залогинены. Дайте
@@ -160,6 +166,43 @@ curl http://localhost:11500/api/tags
---
## Окно с индикатором
Тем, кому чёрная консоль мешает, есть маленькое окно: тот же вывод, но
сворачивается в трей, а цвет значка показывает состояние сервиса.
```cmd
build.cmd
deepseek-api.exe
```
`build.cmd` собирает `deepseek-api.exe` (около 20 КБ) компилятором C# из
состава Windows — `csc.exe`, он есть на любой машине с .NET Framework 4.
Ставить ничего не нужно, прав администратора тоже. Сам `.exe` в репозиторий
не кладётся: собирается за секунду.
Окно запускает `node server.mjs` дочерним процессом и показывает его вывод.
Крестик прячет окно в трей, выход — из меню значка. Node уходит вместе с окном
в любом случае, даже если окно снять диспетчером задач; браузер переживает —
он отдельный процесс и нужен вам.
Цвет значка:
| Цвет | Что значит |
|---|---|
| зелёный | готов, вопросы принимаются |
| синий | идёт запрос: в подсказке — сколько секунд и длина очереди |
| жёлтый | браузер есть, а вкладки с чатом нет; или сервер не отвечает |
| красный | браузер не отвечает; текст беды — в подсказке и всплывающей записке |
| серый | node не запущен или снимок состояния устарел (сторож молчит) |
Второй запуск не поднимает второй сервер, а разворачивает уже открытое окно —
заодно не будет `EADDRINUSE`.
`start.cmd` никуда не делся: он для запуска без графики.
---
## Проверка, что всё работает
Откройте **вторую** командную строку (первая занята сервисом):
@@ -423,7 +466,8 @@ POST /api/chat
| `browser.mjs` | всё про браузер: CDP, разметка DeepSeek, отправка, ожидание ответа, чаты |
| `config.json` | настройки; `config.local.json` рядом перебивает их |
| `chats.json` | рабочее состояние: id живых чатов (заводится сам) |
| `start.cmd` | запуск |
| `start.cmd` | запуск в консоли |
| `tray.cs`, `build.cmd` | окно с индикатором в трее; `.exe` собирается на месте |
| `test.mjs` | проверка перевода формата, браузер не нужен |
Зависимостей нет — только то, что есть в Node 22.