"""Как собирается системный промпт каждой роли из гранул vault. Гранула - чистый markdown; xml-тег, в который она заворачивается, задаётся здесь. Голос идёт первым и одинаков у всех, кто говорит с Бобром; окружение зависит от вида окна (мастер, ветка, глубокий, джоб); оверлей - от роли. """ from __future__ import annotations from beaver_gateway.agents.claude import Prompts from beaver_gateway.agents.prompts import assemble from beaver_agent.vault import GRANULES, PROMPTS VOICE = tuple( (tag, GRANULES / "голос" / f"{tag}.md") for tag in ( "role", "philosophy", "user_profile", "operating_modes", "how_you_operate", "interaction_guidelines", ) ) PROFILE = ("profile", PROMPTS / "профиль.md") CORRECTIONS = ("corrections", PROMPTS / "поправки.md") VAULT_MAP = ("vault_map", GRANULES / "карта-vault.md") def environment(window: str) -> tuple[str, str]: return ("environment", str(GRANULES / "окружения" / f"{window}.md")) def overlay(tag: str, name: str) -> tuple[str, str]: return (tag, str(GRANULES / f"{name}.md")) BASE = (*VOICE, PROFILE, CORRECTIONS, VAULT_MAP) """Голос, профиль Бобра, его поправки и карта vault - у всех, кто с ним говорит.""" DISTILL_AS_JOB = (*BASE, environment("джоб"), overlay("distiller", "дистиллятор")) """Форк ветки пишет слив: тот же голос, окружение джоба, оверлей дистиллятора.""" DISPATCHER = Prompts( master=(*BASE, environment("мастер"), overlay("dispatcher", "диспетчер")), branch=(*BASE, environment("ветка"), overlay("branch", "ветка")), fork=DISTILL_AS_JOB, job=DISTILL_AS_JOB, ) DEEP = Prompts(deep=(*BASE, environment("глубокий"), overlay("deep", "глубокий"))) DISTILLER_ONLY = (PROFILE, environment("джоб"), overlay("distiller", "дистиллятор")) """Дистиллятор без голоса - иначе выжимки получаются с матом.""" DISTILLER = Prompts(fork=DISTILLER_ONLY, job=DISTILLER_ONLY) TRIAGE = Prompts(job=(PROFILE, environment("джоб"), overlay("triage", "триаж"))) CURATOR = Prompts(job=(*BASE, environment("джоб"), overlay("curator", "куратор"))) QUICK = assemble((*VOICE, PROFILE, overlay("quick", "быстрый"))) """Raycast-агенты: голос и профиль одной строкой, без vault.""" VOICE_AGENT = Prompts( branch=(*VOICE, environment("голосовой"), overlay("voice", "голосовой")) ) """Колонки: голос целиком, но без профиля, поправок и карты - vault ему не виден."""