From 9d0c2c053383e406eb3515c8bb2d30baef4b0f01 Mon Sep 17 00:00:00 2001 From: vitya Date: Sat, 22 Aug 2026 17:58:20 +0300 Subject: [PATCH] =?UTF-8?q?meta(tasks):=20=D0=BF=D0=BE=D0=B4=D0=B7=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D1=87=D0=B0=20llm-web-proxy-qwen-web=20(=D0=BF.4,?= =?UTF-8?q?=20DNS-=D0=B1=D0=BB=D0=BE=D0=BA=D0=B5=D1=80=20=D1=81=D0=BD?= =?UTF-8?q?=D1=8F=D1=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .tasks/STATUS.md | 14 ++++++++- .tasks/llm-web-proxy-qwen-web.md | 53 ++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 .tasks/llm-web-proxy-qwen-web.md diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index edd8c53..c0c7526 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,5 +1,5 @@ # Admin Task Board -_Updated: 2026-08-22 — ⚪ **[llm-web-proxy] заведена** (спека .tasks/llm-web-proxy.md: кастомный web-LLM провайдер для pi + Claude Code — web-чаты, эмуляция тулов, без оверкилла omniroute; делать в следующей сессии). 🟢 **[sched-pipelines-local-stack] ЗАКРЫТА** (ритуал закрытия, решение vitya): мок-кампания финализирована ранее (0.1.0 published оба воркера, повторные раны noop, 0.2.0-кейс проверен симуляцией и откачен; фикс #7 httpGet fetch-Response контракта принят). Реальный деплой apilki — за отмашкой юзера (в «Спроси user'а»); VDS-миграция — таска sched-vds-deploy (paused). Wiki: +2 концепта в shared (verdaccio-token-buildkit-secret, msys-no-pathconv-docker-windows). +_Updated: 2026-08-22 — 🆕 подзадача ⚪ **[llm-web-proxy-qwen-web]** заведена (п.4 qwen-web: DNS EAI_AGAIN перепроверен — chat.qwen.ai резолвится, блокер снят; ключ есть; комбо добавить в lwp)._ (спека .tasks/llm-web-proxy.md: кастомный web-LLM провайдер для pi + Claude Code — web-чаты, эмуляция тулов, без оверкилла omniroute; делать в следующей сессии). 🟢 **[sched-pipelines-local-stack] ЗАКРЫТА** (ритуал закрытия, решение vitya): мок-кампания финализирована ранее (0.1.0 published оба воркера, повторные раны noop, 0.2.0-кейс проверен симуляцией и откачен; фикс #7 httpGet fetch-Response контракта принят). Реальный деплой apilki — за отмашкой юзера (в «Спроси user'а»); VDS-миграция — таска sched-vds-deploy (paused). Wiki: +2 концепта в shared (verdaccio-token-buildkit-secret, msys-no-pathconv-docker-windows). _Updated: 2026-08-21 — 🟢 **[sched-fnf-daemon-image-storage] F&F ЗАКРЫТ: 7/7 + фиксы F1/F2/N1/N2 ПРИНЯТЫ** (их письмо 23:40Z, commit e755b52, daemon 0.10.1). Ретест затронутых поверхностей на `registry.kzntsv.site/sched-daemon:0.10.1` (digest 269093a08f6e…): F1 — 0.10.1 стартует против исправленного `deploy/tasks.json` (schedules); F2 — рецепт из доков (BuildKit secret + npmMinimalAgeGate:0) собран 1-в-1, history 0 JWT, storage-mongo 0.4.0, +смоук ступени 4 (коллекции, ран); N2 — баннер `storage=custom module=./my-storage.mjs` (тест пинит module=); N1 — нота MSYS_NO_PATHCONV в доках. Регресс 1/2/3/5 на 0.10.1 — тексты фейлов идентичны. Акцепт: `sched/.agents/inbox/2026-08-21T23-41-30Z-admin.md`. _Updated: 2026-08-21 — 🟢 **[sched-fnf-daemon-image-storage] F&F 7/7 PASS** (их письмо 23:12Z, таска sched 🟢 done). Образ `registry.kzntsv.site/sched-daemon:0.10.0` из опубликованного `@sched/daemon` + storage-композиция: 1) sqlite-дефолт баннер `storage=sqlite db=…` + раны в sqlite; 2) XOR `--storage mongo --db x.db` → точный отказ; 3) env fail-fast ДО старта (`MONGO_URL is not set`); 4) mongo-композицию собрал САМ (BuildKit secret, `@sched/storage-mongo@0.4.0` из verdaccio) → коллекции sched_tasks/runs/schedules + ран в mongo, баннер `storage=mongo db=…`; 5) missing-адаптер → хинт `add @sched/storage-mysql to your image`; 6) BYO `./my-storage.mjs` (MemoryStorage-порт пинового референса) → `storage=custom`, негатив без createStorage → точная ошибка контракта; 7) креды в connstring → весь лог = 1 строка баннера, 0 утечек. Находки: **F1** `deploy/tasks.json` (монтируется docker-compose.dev.yml, док. в 13.self-hosting) на старом ключе `schedule` → daemon 0.10.0 fatal (док. `docker compose up` не стартует); **F2** рецепт производного образа в 13.self-hosting без `ARG VERDACCIO_TOKEN` → YN0041 anonymous-auth при сборке 1-в-1 по докам; при фиксе через --build-arg токен оседает в image history (видно в их `schedd-mongo:0.10.0`; моя secret-сборка — 0 вхождений). N1: на винде git-bash нужен `MSYS_NO_PATHCONV=1` (иначе /app/… → `C:/Program Files/Git/…`). N2: BYO-баннер `db=default`. Репорт: `sched/.agents/inbox/2026-08-21T23-27-41Z-admin.md`. Стенд: `.tmp/fnf-daemon-image/` (gitignored), mongo-стенд возвращён в исходное. _Updated: 2026-08-20 — 🟡 **[sched-pipelines-local-stack]** schedd **0.9.0 применён + cancel-тест ЗЕЛЁНЫЙ**. **Мок-publish: режект #7 ozon** — фиксы #1-#6 приняты: npm ✅ create ✅ clone ✅ commit ✅ push fast-forward ✅ (2-й ран), release-409 ветка добавлена. 7-й баг: 409-ветка падает на стенде — `GET existing → 200` throw, т.к. прод httpGetFn=fetch отдаёт Response (.body=ReadableStream), а тест мокал `{body:{id:42}}` — разрыв тест/прод #2 (как режект #2, только httpGet). Gitea реально отдаёт id:114. Письмо 00:05Z. Ждём фикс #7. @@ -16,6 +16,18 @@ _Updated: 2026-08-20 — 🟡 **[sched-pipelines-local-stack]** schedd **0.9.0 --- +## ⚪ [llm-web-proxy-qwen-web] — добавить qwen-web комбо в lwp (подзадача llm-web-proxy, п.4) + +**Status:** ready +**Where I stopped:** (not started) — DNS-блокер перепроверен 2026-08-22: chat.qwen.ai резолвится (EAI_AGAIN ушёл, 47.91.78.155/47.254.175.31); ключ есть (креды omniroute, wiki omniroute-combo-deepseek-web-tuning.md:58); qwen-executor'а в lwp ещё нет (только deepseek, 4 комбо) +**Next action:** вытащить executors/qwen-web.ts из omniroute-образа (паттерн deepseek-web), userToken chat.qwen.ai в key-store, комбо qwen-web в конфиг, TDD-тесты (round-robin/failover/tool-парсинг), live-smoke `lwp test qwen-web` +**Branch:** master +**Weight:** needs-claude +**Notify:** OpeItcLoc03/admin + + +--- + ## 🟢 [sched-pipelines-local-stack] — локальный стенд: sched daemon + ym/ozon воркеры + browser/ntfy/alert-bridge, потом VDS **Status:** done **Closing note:** ЗАКРЫТА 2026-08-22 (ритуал закрытия, решение vitya). Мок-кампания финализирована ранее: оба воркера publish 0.1.0, повторные раны noop, кейс «спека→0.2.0» проверен симуляцией и откачен; фикс #7 (httpGet fetch-Response контракт) принят. Реальный деплой (npmjs + github.com) — отдельное решение юзера, в «Спроси user'а» handoff'а; VDS-миграция — таска sched-vds-deploy (paused). diff --git a/.tasks/llm-web-proxy-qwen-web.md b/.tasks/llm-web-proxy-qwen-web.md new file mode 100644 index 0000000..7bc3471 --- /dev/null +++ b/.tasks/llm-web-proxy-qwen-web.md @@ -0,0 +1,53 @@ +# llm-web-proxy-qwen-web + +Подзадача [llm-web-proxy] (п.4). Родитель: `.tasks/llm-web-proxy.md`. + +## Goal + +Добавить комбо `qwen-web` в llm-web-proxy (lwp): web-чат chat.qwen.ai как провайдер +(executor + ключ + конфиг + тесты + live-smoke). Модель — Qwen, эмуляция тулов +(`emulated`, как у deepseek-web). Отдельное комбо, НЕ смешивать с deepseek-комбо. + +## Почему (контекст) + +- В спеке llm-web-proxy qwen-web заявлен как будущее комбо («позже: qwen-web, gemini-web, kimi-web, grok-web — отдельные комбо, свои executors»). +- Оригинальный блокер: **DNS EAI_AGAIN chat.qwen.ai** — сетевой глюк, не ключ + (.wiki/concepts/omniroute-combo-deepseek-web-tuning.md:43). +- **Проверено 2026-08-22: DNS резолвится** (nslookup chat.qwen.ai → 47.91.78.155 / 47.254.175.31, aliases) — блокер, похоже, снят. +- Ключ есть: wiki `omniroute-combo-deepseek-web-tuning.md:58` — «qwen-web (✅ ключ есть, DNS-глюк)». userToken chat.qwen.ai — в кредах omniroute (не в pass; источник — конфиг/креды omniroute, паттерн deepseek-аккаунтов megan/yulia/vitya). +- Эмуляция тулов у qwen-web: `"emulated"` (webTools.ts парсер зоопарка ``-форматов — уже в lwp, общий для deepseek-web и qwen-web). +- В lwp сейчас ТОЛЬКО deepseek: 4 комбо (flash/pro ± search), 3 аккаунта. qwen-executor'а в пакете нет (проверено 2026-08-22). + +## Что брать из omniroute + +- `open-sse/executors/qwen-web.ts` — из docker-образа `diegosouzapw/omniroute:latest` (`/app/`), паттерн вытаскивания deepseek-web.ts (уже отработан в llm-web-proxy). +- Парсеры тулов общие — `webTools.ts` уже есть, переиспользовать. + +## Что писать в lwp + +1. executor `qwen-web` (по паттерну deepseek-web, но НЕ копипастить логику тул-эмуляции — общий модуль). +2. Ключ userToken chat.qwen.ai → в lwp key-store (паттерн deepseek-аккаунтов). +3. Комбо `qwen-web` в конфиг (аккаунт, модель, timeout). +4. Тесты: TDD — round-robin, failover, ``-парсинг (зоопарк), smoke против live. +5. Live-smoke: `lwp test qwen-web` / curl `/v1/chat/completions` model=qwen-web. + +## Ожидаемый результат + +- `lwp combo list` показывает qwen-web. +- `lwp test qwen-web` — 200, стриминг, tool-calls работают. +- Лог lwp: req/upstream/session/stream события для qwen (raw-reply виден). + +## Open questions + +- [ ] Актуальный userToken chat.qwen.ai жив? (проверить при работе — EAI_AGAIN мог быть и от бана/истечения) +- [ ] Какая модель по умолчанию у qwen-web (qwen3-max? qwen3-flash?) — смотреть executor omniroute. + +## Completed steps + +- [x] 2026-08-22: DNS-блокер перепроверен — chat.qwen.ai резолвится (EAI_AGAIN ушёл). +- [x] 2026-08-22: подтверждено, что qwen-executor'а в lwp ещё нет (только deepseek). + +## Notes + +- Родитель llm-web-proxy — 🔴 active (claimed 2026-08-22, vitya). Эта подзадача ⚪ ready, берётся в работу после/параллельно с п.2 (mac/linux autostart). +- «Настоящий» web-чат Qwen без подписки — бесплатный, тул-эмуляция emulated (wiki:58).