feat(chat): tool get_parcel_info — курируемый градрегламент/ЗОУИТ/ЕГРН в контекст чата #2366

Merged
bot-backend merged 1 commit from fix/chat-parcel-info into main 2026-07-04 01:24:43 +00:00
Collaborator

Что

Чат по участку не мог ответить «какая зона ПЗЗ?» — journey-смоук 2026-07-04 поймал на 66:41:0204016:10: §1 показывает тер.зону Ц-2, а чат отвечает «информации нет». Корень: retrieval грузил только §22-форсайт-ран (schema "1.0"), analyze-данные до чата не доходили.

  • get_parcel_context_for_chat (retrieval.py): читает analyze-1.0 ран → плоский whitelist-срез (адрес, площадь, категория, ВРИ, кадастровая стоимость, тер.зона код/название, лимиты регламента, ЗОУИТ has/count/имена)
  • шестой секционный tool get_parcel_info (без параметров, verbatim-срез), провенанс parcel_context
  • эндпоинт мержит срез в КОПИЮ report_dict; сбой чтения — enrichment optional, чат не падает; pending-поведение без изменений
  • chat_system prompt v2→v3: модель знает про новый tool, ПЗЗ-вопросы больше не out-of-scope

§19 data-residency (главный риск — закрыт)

Сырой analyze-blob НЕ уходит: whitelist двухслойный — по ключам и по типам (только скаляры str|int|float|bool; dict/list отбрасываются на границе — доработка по ревью, ревьюер эмпирически протаскивал owner_pii через вложенный dict). Имена ЗОУИТ — отдельный str-only путь с капом 15 (заодно закрыт latent TypeError: unhashable dict в dict.fromkeys). Никакой геометрии/координат/PII. Аллоулист safe_payload.py дополнен. Негативные тесты на утечку: dict в address, list в zone_code, не-str в ЗОУИТ-именах.

Проверки

  • pytest -k chat: 97 passed, 1 skipped (+3 негативных)
  • pinned pre-commit ruff/ruff-format v0.7.4: Passed
  • code-reviewer: ⚠️ MINOR (§19 type-guard) → доработано → архитектура одобрена

Post-merge

На проде: POST /api/v1/chat/ask (66:41:0204016:10, «Какая зона ПЗЗ у участка?») → ответ называет Ц-2, grounded_in.sections содержит parcel_context.

## Что Чат по участку не мог ответить «какая зона ПЗЗ?» — journey-смоук 2026-07-04 поймал на 66:41:0204016:10: §1 показывает тер.зону Ц-2, а чат отвечает «информации нет». Корень: retrieval грузил только §22-форсайт-ран (schema "1.0"), analyze-данные до чата не доходили. - `get_parcel_context_for_chat` (retrieval.py): читает analyze-1.0 ран → **плоский whitelist-срез** (адрес, площадь, категория, ВРИ, кадастровая стоимость, тер.зона код/название, лимиты регламента, ЗОУИТ has/count/имена) - шестой секционный tool `get_parcel_info` (без параметров, verbatim-срез), провенанс `parcel_context` - эндпоинт мержит срез в КОПИЮ report_dict; сбой чтения — enrichment optional, чат не падает; pending-поведение без изменений - chat_system prompt v2→v3: модель знает про новый tool, ПЗЗ-вопросы больше не out-of-scope ## §19 data-residency (главный риск — закрыт) Сырой analyze-blob НЕ уходит: whitelist двухслойный — по ключам **и по типам** (только скаляры `str|int|float|bool`; dict/list отбрасываются на границе — доработка по ревью, ревьюер эмпирически протаскивал `owner_pii` через вложенный dict). Имена ЗОУИТ — отдельный str-only путь с капом 15 (заодно закрыт latent TypeError: unhashable dict в `dict.fromkeys`). Никакой геометрии/координат/PII. Аллоулист safe_payload.py дополнен. Негативные тесты на утечку: dict в address, list в zone_code, не-str в ЗОУИТ-именах. ## Проверки - pytest `-k chat`: **97 passed, 1 skipped** (+3 негативных) - pinned pre-commit ruff/ruff-format v0.7.4: Passed - code-reviewer: ⚠️ MINOR (§19 type-guard) → доработано → архитектура одобрена ## Post-merge На проде: `POST /api/v1/chat/ask` (66:41:0204016:10, «Какая зона ПЗЗ у участка?») → ответ называет Ц-2, grounded_in.sections содержит parcel_context.
bot-backend added 1 commit 2026-07-04 01:09:19 +00:00
feat(chat): add get_parcel_info tool exposing curated analyze градрегламент
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 9s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m8s
CI / backend-tests (pull_request) Successful in 14m34s
7b3d1a8f85
Chat could not answer 'какая зона ПЗЗ?' — retrieval loaded only the §22
forecast run (schema 1.0); тер.зона/градрегламент/ЗОУИТ/ЕГРН live in the
analyze-1.0 run and never reached the chat context.

Add get_parcel_context_for_chat: a §19-safe whitelist slice of analyze
(fixed keys AND scalar-only values — dict/list dropped at the boundary;
ЗОУИТ zone names as a dedicated str-only capped list; no geometry/PII/raw
sub-dicts) merged into a copy of report_dict under 'parcel_context';
expose it via the sixth sectional tool get_parcel_info. Bump chat_system
prompt v2->v3 so the model uses it and no longer treats the parcel's own
ПЗЗ zone as out of scope.
bot-backend merged commit 57d156973e into main 2026-07-04 01:24:43 +00:00
bot-backend deleted branch fix/chat-parcel-info 2026-07-04 01:24:43 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2366
No description provided.