Сборка без OpenCV

На CI модуль зависал. Для i2i без него оставил консервативную проверку.
This commit is contained in:
MpakobecEx 2026-10-14 19:48:00 +05:00
parent 960672818f
commit b2f743b5da
5 changed files with 12 additions and 6 deletions

View File

@ -118,7 +118,7 @@ BLOCKED_PUBLIC_FIGURES=
- экстремизм + инструкции/символика;
- обходные написания (`n_u_d_e`, `l0li`, `ch1ld` и т.п.).
Для i2i OpenCV проверяет наличие лица/человека на входном фото: NSFW-промпт в этом случае блокируется.
Для i2i: если установлен OpenCV, проверяется наличие лица/человека. В базовом образе OpenCV нет, поэтому NSFW-промпты в i2i блокируются консервативно — как если бы на фото был человек.
При блокировке пользователь получает «Запрос нарушает правила. Звёзды не списаны.», а запись с `user_id`, временем, промптом и причиной сохраняется в таблицу `blocked_requests`.

View File

@ -324,7 +324,7 @@ ON requests(user_id) WHERE status IN ('queued', 'running');
- [x] Админы из `ADMIN_USER_IDS` обходят фильтр.
- [x] Логирование блокировок в `blocked_requests`.
- [x] Ответ «Запрос нарушает правила. Звёзды не списаны.».
- [x] i2i: детекция лица/человека через OpenCV.
- [x] i2i: OpenCV-детекция при наличии; иначе консервативный ручной флаг.
- [x] Тесты правил и очереди.
**DoD:** небезопасный промпт не попадает в очередь, причина пишется в БД, админ может отправлять без фильтра.

View File

@ -301,12 +301,18 @@ def is_prompt_allowed(
def detect_person(path: str | Path) -> bool:
"""Ищет лицо или человека через OpenCV. При ошибке считает, что человека нет."""
"""Ищет лицо или человека через OpenCV.
Если OpenCV не установлен, консервативно считаем, что человек есть:
NSFW-запросы в i2i будут блокироваться.
"""
try:
import cv2 # type: ignore[import-not-found]
except ImportError:
logger.warning("OpenCV не установлен, детекция людей отключена")
return False
logger.warning(
"OpenCV не установлен: для i2i считаем, что на фото есть человек"
)
return True
try:
image = cv2.imread(str(path))

View File

@ -7,4 +7,3 @@ fastapi>=0.115,<1
uvicorn>=0.30,<1
jinja2>=3.1,<4
pillow>=10,<13
opencv-python-headless>=4.10,<5

View File

@ -63,6 +63,7 @@ def test_extra_public_figures() -> None:
def test_detect_person_blank_image(tmp_path) -> None:
pytest.importorskip("cv2")
path = tmp_path / "blank.png"
with Image.new("RGB", (320, 240), (255, 255, 255)) as image:
image.save(path)