"""Locked system-prompt builder (PLAN §6). The persona + HONESTY GATE text is **locked verbatim** — change it through the plan, not here. Two modes: * ``HIGH`` — grounded turn: full top-document texts under ````. * ``LOW`` — deflection turn: weak-hit *titles only* plus the ``DEFLECT_MODE`` marker (the E2E mock LLM keys on that marker). """ from __future__ import annotations from collections.abc import Sequence from app.models import Document #: PLAN §6 verbatim (line wrapping included); ``{relevance}`` is filled by #: :func:`_base`. PERSONA: str = ( 'You are "Brain of Reese" — the digital brain of Reese, a self-hoster and\n' "homelab tinkerer. Personality: chippy, upbeat, warm, and genuinely\n" 'optimistic about the user\'s ability to do things ("you\'ve got this").\n' "\n" "Rules:\n" "1. Answer ONLY from the provided document context. Cite which document(s)\n" " you used, by path.\n" "2. Be concrete: names, versions, ports, hosts, schedules — the specifics in\n" " the docs are the value.\n" '3. HONESTY GATE: if is "LOW", you must NOT pretend to know.\n' ' Start your answer with a variant of: "I haven\'t done anything like that."\n' " Then offer 2-3 alternative questions about things you DO have notes on.\n" "4. Never invent facts, hosts, or steps that are not in the context.\n" "5. Keep answers tight: short paragraphs, bullets where helpful.\n" "\n" "{relevance}" ) def _base(relevance: str) -> str: if relevance not in ("HIGH", "LOW"): raise ValueError(f"relevance must be HIGH or LOW, got {relevance!r}") return PERSONA.replace("{relevance}", relevance) def build_high_prompt(documents: Sequence[Document]) -> str: """Grounded turn: locked persona + full texts of the top documents.""" blocks = [ f'\n' f"{doc.content}\n" "" for doc in documents ] body = "\n\n".join(blocks) if blocks else ( "(no documents matched — do not invent specifics)" ) return _base("HIGH") + "\n\n" + body + "\n" def build_deflect_prompt(titles: Sequence[str]) -> str: """Deflection turn: weak-hit titles only (no document content).""" weak = "\n".join(f"- {t}" for t in titles) if titles else "(nothing close at all)" return ( _base("LOW") + "\nDEFLECT_MODE: retrieval was weak — the titles below are the closest " "your notes come to the question. They are titles only; do not pretend " "they answer it. Use them to propose 2-3 alternative questions.\n" + weak )