feat(ai-search): wyszukiwanie przez AI (NL→DjangoQL) + konfigurowalny backend (Anthropic/lokalny)#451
feat(ai-search): wyszukiwanie przez AI (NL→DjangoQL) + konfigurowalny backend (Anthropic/lokalny)#451mpasternak wants to merge 24 commits into
Conversation
NL (polski) -> Claude (SDK anthropic, Sonnet 5) -> DjangoQL -> redirect na istniejace 'szukaj zapytaniem'. Nowa apka src/ai_search/, budzety w PLN (NBP FX), log kosztu, walidacja+bounded retry z konkretnym bledem DjangoQL. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… mult) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…obetnij BppUser Zamyka realny wyciek danych: z Rekord dało się dojść przez autorzy.autor.user.password_change_required do password_policies. excluded() odcina aplikacje bezpieczeństwa/PII/systemu (HARD) i robocze/narzędziowe (SOFT) oraz tabele cache_* z grafu DjangoQL; get_fields() obcina BppUser do allowlisty username/nazwisko/imiona. Graf modeli (BFS z Rekord) spada z 216 do 87. pbn_api celowo NIE wykluczone (niesie pbn_uid). Wszystkie istniejące suity (test_zapytanie, djangoql/multiseek, admin) zielone. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Migruje reczne przycinanie BppUser w BppQLSchema na deklaratywne include_fields z djangoql-iplweb>=0.30 i dodaje analogiczne przyciecie dla Uczelnia (tylko id/nazwa/skrot/pbn_uid - bez pol konfiguracyjnych typu haseł do zewnetrznych API, integracji PBN/DSpace/ORCID/Clarivate). Dwa realne ryzyka obejscia filtra zalatane w tym samym commicie: - RelPickerSchemaMixin dokladal picker <fk>__rel dla KAZDEGO FK modelu, wiec mogl odslonic pole ktore include_fields wlasnie ukryl - poprawka dodaje picker tylko gdy bazowe pole przetrwalo super().get_fields(). - Wbudowane w ExtrasSchema mixiny (AggregateSchemaMixin: <rel>__count, DatePartsSchemaMixin: <pole>__year itp.) tez iteruja model._meta.get_fields() bezposrednio, wiec dla BppUser/Uczelnia i tak przeciekaly pochodne pola (np. password_history_entries__count, last_login__year) - dodany finalny re-trim w BppQLSchema.get_fields po wszystkich mixinach. Nowe testy w test_djangoql_schema_hardening.py pokrywaja oba przypadki. Rozmiar compact dumpu schematu Rekord: 103507 -> 88015 B (-15%). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…angoql>=0.30.1
djangoql-iplweb 0.30.1 w auto-mode describe_schema_for_llm zaczal emitowac
related_values dla malych slownikow -- w tym loginy BppUser przez jedyna
eksponowana relacje bpp.autor.user. Jawny fk_options={Autor: {"user": False}}
uszczelnia to belt-and-suspenders obok istniejacych wykluczen (nie wplywa
na edytor/admin, ktore fk_options nie czytaja).
…ions z settings Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ie z cache_control
…irect na zapytanie) Wiaze budget guard, translator i logowanie kosztu AISearchQuery z istniejacym edytorem zapytan: ZapytanieAIView przyjmuje pytanie PL, sprawdza budzet, tlumaczy na DjangoQL, loguje koszt (USD->PLN) i albo przekierowuje do bpp:zapytanie z gotowym DSL-em, albo pokazuje blad. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…t, testy galezi bledow, docs Celery beat (ai_search.tasks.regenerate_schemas, codziennie 3:45) odswieza cache compact-schematu dla "rekord"/"autor", zeby nowe wartosci slownikowe z bazy pojawialy sie w promptcie LLM bez czekania na TTL. Admin AISearchQuery jest read-only (log kosztow/audytu). Dodano smoke accuracy-set (skipif bez ANTHROPIC_API_KEY, wylaczony z realnego CI), management command ai_search_schema_dump do inspekcji/pomiaru rozmiaru schematu, dwa testy brakujacych galezi bledow z Task 11 review (translate() rzuca wyjatek -> przyjazny komunikat + Rollbar; cost_usd_from_usage() rzuca KeyError -> log z kosztem zerowym + Rollbar) oraz krotka dokumentacja feature'u.
…xRate tiebreaker, martwy kwarg/logger, docstring) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tible dla modeli lokalnych) + docs Nowy ai_search/backends.py wydziela wywolanie modelu z translator.py: AnthropicBackend (natywny SDK, bez zmiany zachowania) i OpenAICompatibleBackend (openai SDK, dla Ollama/llama.cpp/vLLM/LM Studio/LocalAI). Wybor przez BPP_AI_BACKEND (domyslnie "anthropic"). Widok pomija budzet/cennik/FX dla backendu "openai" (lokalny = darmowy). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…+ docstring/docs/config-guard Literowka w BPP_AI_BACKEND (np. "Anthropic") kierowala get_backend() na platne Anthropic API, podczas gdy views.py (por. do settings.BPP_AI_BACKEND == "anthropic") traktowal ja jak backend darmowy - pomijal budzet i logowal koszt 0. Dodaje backends.active_backend_name() jako jedyne zrodlo prawdy (uzywane przez get_backend() i views.py) - nieznana wartosc trafia zawsze na bezpieczna sciezke anthropic+budzet, nigdy na darmowa-sciezke z realnym wydatkiem. Plus: aktualny docstring translatora, ostrzezenie w docs o trybie "thinking" Qwen3 (ucina JSON przy max_tokens=500) i czytelny ImproperlyConfigured gdy backend openai bez BPP_AI_BASE_URL. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
| GitGuardian id | GitGuardian status | Secret | Commit | Filename | |
|---|---|---|---|---|---|
| 34572324 | Triggered | Username Password | bbbcc2f | src/bpp/tests/test_djangoql_schema_hardening.py | View secret |
🛠 Guidelines to remediate hardcoded secrets
- Understand the implications of revoking this secret by investigating where it is used in your code.
- Replace and store your secret safely. Learn here the best practices.
- Revoke and rotate this secret.
- If possible, rewrite git history. Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.
To avoid such incidents in the future consider
- following these best practices for managing and storing secrets including API keys and other credentials
- install secret detection on pre-commit to catch secret before it leaves your machine and ease remediation.
🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.
…tive w auto-mode) Konsumuje PR #16 djangoql-iplweb: systemowa obrona AUTH_USER_MODEL w auto-mode (zadna relacja do modelu uzytkownika nie emituje wartosci). fk_options {Autor:{user:False}} zostaje jako pas bezpieczenstwa. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…(false-positive GitGuardian) Prefiks 'sk-' wygladal jak klucz OpenAI i wywalal secret-scan; to tylko placeholder dla lokalnych serwerow OpenAI-compatible ktore nie wymagaja auth. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Code reviewFound 1 issue:
Lines 14 to 26 in b5510b9 Lines 37 to 39 in b5510b9 Lines 60 to 62 in b5510b9 Lines 85 to 87 in b5510b9 🤖 Generated with Claude Code - If this code review was useful, please react with 👍. Otherwise, react with 👎. |
- fx.usd_to_pln_rate: zdeformowana odpowiedź NBP z HTTP 200 (puste "rates" → IndexError, mid=null → decimal.InvalidOperation, rates nie-listą → TypeError) uciekała z except i łamała kontrakt „Nigdy nie podnosi wyjątku", wywalając request już po opłaconym wywołaniu LLM; poszerzono tuple o LookupError/TypeError/ArithmeticError + 3 testy regresyjne (TDD red→green) - views._log: date.today() → timezone.localdate() przy wyborze tieru cenowego (spójnie z budget.py, poprawny dzień przy TZ != Warszawa) - translator: docstring modułu opisuje twardy limit min(BPP_AI_MAX_RETRIES, 2) zamiast sugerować brak capu - test_graph_significantly_smaller: docstring poprawiony na stan faktyczny — 86 modeli (bpp + pbn_api + taggit), pbn_export_queue nieosiągalne Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Wnioski z review naprawione w 559c8fe5f5324b1069cd93cbd07c761e9a86234c: poszerzony |
Co to robi
Nowy tryb wyszukiwania „przez sztuczną inteligencję" (menu top-bar „szukaj").
Użytkownik pisze pytanie po polsku → Claude tłumaczy je na zapytanie DjangoQL →
po walidacji następuje redirect na istniejące
/bpp/zapytanie/, które jewykonuje. Maksymalny reuse: nie budujemy nowego silnika zapytań.
Główne elementy
src/ai_search/: translator (NL→DjangoQL), walidacja składniDjangoQL + bounded retry z konkretnym błędem (linia/kolumna), log kosztu
(
AISearchQuery), admin read-only, Celery-beat regeneracja cache schematu.anthropic(domyślny, płatny) — oficjalny SDK, prompt caching, structuredoutputs,
thinkingwyłączone; koszt liczony zusage× cennik (Decimal,intro-pricing), przeliczany USD→PLN kursem NBP (cache + trwały fallback).
openai(OpenAI-compatible, modele lokalne: Ollama / llama.cpp / vLLM /LM Studio / LocalAI) — jeden backend na cały ekosystem; darmowy → budżet i
koszt nieaktywne. Wybór backendu przez jedno źródło prawdy
(
active_backend_name, odporne na literówki → bezpieczny fallback naanthropic-z-budżetem).
blok, re-check przed każdym wywołaniem/retry, cap retry = 2, twardy
max_tokensBppQLSchema(używanej też przez istniejącyedytor „zapytaniem" i adminy):
autorzy.autor.user.password_change_requiredniejest już wyrażalny;
BppUser→ tylkousernamebez wartości (fk_options);uczelniaprzyciętado id/nazwa/skrot/pbn_uid; wykluczone modele nie-użytkowe/cache/test;
język, typ_odpowiedzialności) emitują teraz wartości
nazwadla lepszejtrafności; compact schema ~22–31k tokenów.
djangoql-iplweb>=0.30.1(field-level include/exclude + LLMschema),
anthropic,openai.docs/deweloper/ai-search.md— konfiguracja, przykład Ollama,szacunek kontekstu (~22–31k tok → model ≥32k, albo
BPP_AI_MAX_FK_OPTIONS=0)i zalecane modele OSS (Qwen3 głównie; Llama 3.1 8B / Gemma 2 9B; llama.cpp
Konfiguracja (env/settings)
BPP_AI_SEARCH_ENABLED,BPP_AI_BACKEND(anthropic|openai),BPP_AI_MODEL,ANTHROPIC_API_KEY/ (BPP_AI_BASE_URL+BPP_AI_API_KEYdla openai),BPP_AI_DAILY_BUDGET_PLN,BPP_AI_MONTHLY_BUDGET_PLN,BPP_AI_MAX_RETRIES,BPP_AI_MAX_FK_OPTIONS. Domyślnie feature wyłączony.Bezpieczeństwo / prywatność
BppUsernie trafiają do modelu(auto-mode omija duże tabele + jawne
fk_options=Falsena relacji do usera).Enumy
choicesi wartości małych słowników — tak (użyteczne, bezpieczne).Testy
Pełna suita lokalnie: 5764 passed, 6 skipped, 1 xfailed (0 failures).
Feature pokryty (translator/backendy/budget/fx/pricing/schema-hardening/widok/
menu + testy gałęzi błędów; accuracy-set pod
skipif ANTHROPIC_API_KEY).Uwagi do scalenia
make baseline-updateprzy scalaniu (migracjeai_search0001/0002) — zgodnie z polityką repo (nie w gałęzi).systemowa obrona) → po release 0.30.2 bump pinu (obecnie
fk_optionszamykajedyną żywą ścieżkę).
Proces: spec → plan → TDD task-by-task z per-task i finalnym whole-branch review
(
docs/superpowers/).🤖 Generated with Claude Code