"""프롬프트/모델 버전 상수 — telemetry 기록용 (Phase E.1) 목적: ask_events / analyze_events 에 prompt_version 과 model_name 을 기록해서 튜닝 전/후 비교와 실험 분기를 식별 가능하게 함. 규칙: - 프롬프트 파일이 의미 있게 바뀌면 해당 상수 문자열을 bump (예: v1-400char → v2-600char) - 하드코딩 금지. 파이프라인은 여기 상수만 참조. - 모델명은 런타임 config(settings.ai.primary.model)에서 읽어서 resolve_primary_model() 사용. E.3 배포 타임라인: - v1-400char → 현재 (search_synthesis.txt 17행 "400 characters max") - v2-600char → E.3 배포 시 bump (동일 파일 "600 characters max") """ from __future__ import annotations # ─── ask (/search/ask) 프롬프트 버전 ───────────────────────── # synthesis_service.py 가 로드하는 app/prompts/search_synthesis.txt 기준 ASK_PROMPT_VERSION: str = "search_synthesis.v2-600char" # ─── /analyze 프롬프트 버전 ────────────────────────────────── # documents.py analyze 라우트가 로드하는 app/prompts/document_analyze.txt 기준 ANALYZE_PROMPT_VERSION: str = "document_analyze.v1" def resolve_primary_model() -> str | None: """런타임 config에서 primary 모델명을 resolve. settings.ai 가 미구성이면 None. telemetry 기록은 None 허용 (측정 필드는 nullable). """ try: from core.config import settings if settings.ai and settings.ai.primary: return settings.ai.primary.model except Exception: pass return None # ─── Policy-layer prompt version helper (PR-A) ────────────────────── # domain_policy.yaml + 정책 template 의 결합 해시로 automatic version 산출. # analyze_events.policy_version 컬럼에 기록되어 drift 추적. # # 기존 ASK_PROMPT_VERSION / ANALYZE_PROMPT_VERSION 상수는 그대로 유지 — PR-B 에서 # 정책 렌더된 프롬프트로 전환 시 compute_policy_version() 결과로 대체할지 병기할지 결정. def compute_policy_version( task: str, *, policy_path: str | None = None ) -> str: """sha256(yaml_bytes + template_bytes)[:12] — deterministic hash. task: policy template 이름 (예: 'p3a_short_summary'). app/prompts/policy/ 하위. policy_path: override (테스트용). None 이면 loader 기본값. import 지연 — app.policy 는 아직 worker 경로에서 쓰지 않는다 (PR-A 런타임 격리). """ from policy.prompt_render import policy_version as _pv return _pv(task, policy_path=policy_path)