Синтезируем контекст из полей самой magnet-ссылки (dn, xl, tr/xs, kt) без сети и дополняем им текст от транспорта: пользовательский текст первым, при пустом — синтез единственный. Обогащённый контекст идёт только в download.Context (его читают recognition и веб-UI); вход namer и отображаемое имя не меняются — строки-факты (Размер:/Трекер:) в display_name не текут. - magnet.Info: поля ExactLength/Sources/Keywords + Info.Context() (синтез, отсев dn-заглушек *-topic-<id>, домен трекера, человекочитаемый размер) - Parse устойчив к ссылке в процент-кодировке (разовый QueryUnescape) - ingest: mergeContext → download.Context, namer на сыром req.Context - Влита дельта capability ingest в openspec/specs, change заархивирован Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4.9 KiB
Why
Приём по «голому» magnet (без сопроводительного текста бота) уже проходит, но
контекст распознавания при этом пуст: download.Context уходит в recognition
почти пустым, и LLM-матч работает почти вслепую до докачки метаданных
qBittorrent. При этом сама magnet-ссылка несёт полезные поля (имя релиза dn,
размер xl, трекеры tr/источники xs), которые сейчас в контекст не
попадают: парсим лишь xt, dn, tr, причём dn идёт только подсказкой в
namer и в download.Context (а значит и в recognition) не сохраняется. Выжав
эти поля в контекст распознавания, мы даём recognition реальный сигнал даже
когда пользователь прислал один magnet.
What Changes
- Парсер
internal/magnetизвлекает дополнительные поля ссылки:xl(размер в байтах),xs(exact source),kt(keywords).dnиtrуже парсятся. - Ingest синтезирует текст контекста из полей magnet и дополняет им контекст, пришедший из транспорта: факты из полей добавляются к пользовательскому тексту (пользовательский — первым), а при пустом тексте становятся единственным контекстом. Синтез — из самой ссылки, без сетевых запросов.
- В синтез входят: имя релиза (
dn, если это содержательное имя, а не заглушка-идентификатор вида*-topic-<id>), размер (человекочитаемо изxl), происхождение по домену трекера/источника (tr/xs) как слабый сигнал языка/типа, ключевые слова (kt). - Обогащённый контекст сохраняется в
download.Context— его читают recognition (LLM-промпт) и веб-UI (страница загрузки). Вывод отображаемого имени (namer) не меняется: он по-прежнему получает пользовательский текст иdn-подсказку, а помеченные строки-факты (Размер:,Трекер:) в имя не попадают. - Явно фиксируем поддержку приёма только по magnet (пустой текст) как штатный сценарий во всех транспортах.
Вне объёма (сознательно): дообогащение со страницы трекера
(*-topic-<id> → HTTP-запрос) — отдельная будущая задача; контекст берём
только из полей ссылки. Поведение namer/отображаемого имени не меняем.
Capabilities
New Capabilities
Нет. Изменение укладывается в существующую capability ingest.
Modified Capabilities
ingest: добавляется требование «синтез контекста распознавания из полей magnet и дополнение им контекста транспорта» (обогащённый контекст → толькоdownload.Context; отображаемое имя не затрагивается) и явно фиксируется приём при пустом тексте. Существующие требования по выводу отображаемого имени остаются без изменений (namer получает тот же вход).
Impact
- Код:
internal/magnet(новые поляInfo+ синтез контекста),internal/ingest(слияниеreq.Context+ синтез вdownload.ContextдоCreateDownload).internal/namingне затрагивается — вход namer тот же (req.Context,dn-hint). - Данные:
download.Contextначинает содержать синтезированный текст — влияет на вход recognition и на отображение контекста в веб-UI; схема БД не меняется. - Транспорты (
httpapi,tgbot): поведение при пустом контексте становится штатным; изменений API не требуется. - Внешние системы: без новых зависимостей и сетевых вызовов.