gendesign/backend/tests/services/llm/test_prompts.py
bot-backend 7b3d1a8f85
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
feat(chat): add get_parcel_info tool exposing curated analyze градрегламент
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.
2026-07-04 06:08:47 +05:00

67 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Prompt-scaffolding tests (#960) — render, версионирование, отсутствие шаблона."""
from __future__ import annotations
import pytest
from app.services.llm.prompts import (
PromptNotFoundError,
PromptTemplate,
get_template,
render,
)
def test_get_known_template() -> None:
tpl = get_template("system_base")
assert tpl.name == "system_base"
assert tpl.version == 1
assert tpl.key == "system_base@v1"
def test_get_unknown_template_raises() -> None:
with pytest.raises(PromptNotFoundError):
get_template("does_not_exist")
def test_render_known_template() -> None:
out = render("system_base")
assert "ассистент" in out
def test_chat_system_v3_has_unit_mix_formatting_rule() -> None:
"""chat_system@v3: чистый рендер квартирографии, без «N-тип» склейки (сохранено с v2)."""
tpl = get_template("chat_system")
assert tpl.version == 3
assert tpl.key == "chat_system@v3"
out = render("chat_system")
assert "квартирограф" in out.lower() # правило про перечисление сегментов
assert "«2-1-к»" in out # явный анти-пример (склейка номера с типом)
# ключевые жёсткие правила сохранены
assert "НИКОГДА не выдумывай" in out
assert "ВЕРБАТИМ" in out
def test_chat_system_v3_mentions_parcel_info_tool() -> None:
"""chat_system@v3: паспорт участка/ПЗЗ теперь в области ответа через get_parcel_info."""
out = render("chat_system")
assert "get_parcel_info" in out # tool паспорта участка/градрегламента
assert "зон" in out.lower() # тер.зона ПЗЗ упомянута как отвечаемая
def test_render_with_required_vars() -> None:
"""render подставляет переменные через str.format и валидирует required_vars."""
tpl = PromptTemplate(
name="probe",
version=1,
template="zone={zone}",
required_vars=("zone",),
)
# Прямой рендер шаблона (не из реестра) — проверяем format-механику.
assert tpl.template.format(zone="Ц-1") == "zone=Ц-1"
def test_render_missing_required_var_raises() -> None:
"""Если шаблон требует переменную, а её нет → KeyError (для зарегистрированного)."""
with pytest.raises(PromptNotFoundError):
render("missing_template", zone="Ц-1")