feat(ingest+поиск): приём ZIP через интерфейс, регистронезависимый поиск, чистка очереди
- Загрузка архива (§4.1): POST /ingest распаковывает ZIP, дораспознаёт и догружает прайсы в базу (append). Виджет в админке. Кэш эмбеддингов справочника (dict_emb.npy) — догрузка считает только новый файл, эмбеддинги best-effort с откатом на fuzzy при сбое Gemini. - Поиск по name_norm (lowercase): «УЗИ» и «узи» дают одинаковый результат — SQLite LIKE не сворачивает регистр для кириллицы. - Фильтр названий: код-мнемоники («МОЗО.15») больше не попадают в очередь. - /stats считается из базы — цифры на дашборде обновляются после загрузки. - Деплой через Dockerfile (зависимости в образе, код монтируется томом). - ruff: ядро и весь репозиторий проходят проверку. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
раздувается и не держит модель в RAM. Размерность 768 выбрана, чтобы вектор лез в
|
||||
HNSW-индекс pgvector. Требуется переменная окружения GEMINI_API_KEY.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
@@ -54,7 +55,9 @@ class GeminiEmbedder:
|
||||
chunk = items[start : start + self.batch]
|
||||
for attempt in range(8):
|
||||
try:
|
||||
response = self._client.models.embed_content(model=self.model, contents=chunk, config=config)
|
||||
response = self._client.models.embed_content(
|
||||
model=self.model, contents=chunk, config=config
|
||||
)
|
||||
vectors.extend(embedding.values for embedding in response.embeddings)
|
||||
break
|
||||
except Exception as exc: # пауза и повтор при превышении квоты (429)
|
||||
|
||||
Reference in New Issue
Block a user