openspec: change-ы manual-direction (ручное направление без LLM) и extract-post-sources (извлечение источников из постов) + sources/extract.py

This commit is contained in:
kpa39l
2026-09-22 17:37:07 +00:00
parent 1ae4b14d24
commit 6a1c894ff7
7 changed files with 316 additions and 0 deletions
@@ -0,0 +1,3 @@
schema: spec-driven
created: 2026-09-16
skip_specs: true
@@ -0,0 +1,55 @@
# manual-direction
## Design
### web/app.py
`post_reclassify(post_id, request, group_by, direction, own, q, src, manual_direction: str = Form(""))`:
- передать `manual_direction` в `impl_reclassify`.
`impl_reclassify(post_id, manual_direction: str = "")`:
```python
def impl_reclassify(post_id: int, manual_direction: str = ""):
from classifier.classify import classify_text
from classifier.keywords import DIRECTIONS_CANON
conn = _db()
p = conn.execute("SELECT * FROM posts WHERE id=?", (post_id,)).fetchone()
if not p:
conn.close()
raise ValueError("notfound")
md = (manual_direction or "").strip()
if md in DIRECTIONS_CANON:
# ручное направление: без LLM, classified=1, как словарное попадание
conn.execute(
"UPDATE posts SET direction=?, relevance=?, interest=?, summary=?, classified=1 WHERE id=?",
(md, "low", 1, "", post_id),
)
conn.commit()
conn.close()
return
res = classify_text(dict(p))
... # как раньше
```
### web/templates/selected.html
В форме reclassify (кнопка «🤖 Обработать моделью») добавить select:
```html
<form method="post" action="/posts/{{ selected.id }}/reclassify" class="d-inline-flex align-items-center gap-1">
{{ hid }}
<select name="manual_direction" class="form-select form-select-sm w-auto">
<option value="">— модель —</option>
{% for d in directions %}
<option value="{{ d }}">{{ d }}</option>
{% endfor %}
</select>
<button class="btn btn-info" type="submit">🤖 Обработать моделью</button>
</form>
```
Поведение:
- «— модель —»: прежнее поведение (LLM).
- выбор направления: установится принудительно, без LLM.
@@ -0,0 +1,29 @@
# manual-direction
Возможность вручную указывать/менять направление поста при анализе.
## Why
Пост без классификации отображается со значком «?» (published.html: `direction or '?'`).
Кнопка «Обработать моделью» перезапускает LLM, но если модель не выдаёт каноническое
направление — пост так и остаётся без него. Пользователю нужен способ явно задать
направление вручную (linux/tech/politics/games/electronics/llm) — например, когда
классификатор ошибся или не смог определить тему.
## What Changes
- **web/app.py** `post_reclassify`/`impl_reclassify`: новый параметр `manual_direction`
(select в форме). Если задан и входит в DIRECTIONS_CANON — направление пишется в БД
напрямую (без LLM), `classified=1`, relevance/interest — как при словарном попадании.
- **web/templates/selected.html**: перед кнопкой «🤖 Обработать моделью» — select
направлений («— модель —» по умолчанию = оставить как есть). Если выбрать конкретное
направление — задастся принудительно.
- **web/templates/candidates.html**: аналогичный select у формы reclassify? В кандидатах
reclassify нет (только «Отобрать»/«Отклонить») — добавление не требуется, но для
полноты добавим select кнопке reclassify в selected.html (единственное место с reclassify).
## Impact
- Пользователь может вручную исправить/добавить направление, не дожидаясь LLM.
- Даёт пост классификацию даже если модель «не знает» — важно для публикации
(published.html без «?»).