refactor: split config.py into the beaver_agent package (vault, prompts, skills, policy, hands, agents, frontends, texts, memory, jobs)

This commit is contained in:
hh
2026-09-02 00:24:31 +02:00
parent f4043a7bfd
commit ac4a8d1fae
38 changed files with 1302 additions and 935 deletions
+60
View File
@@ -0,0 +1,60 @@
"""Как собирается системный промпт каждой роли из гранул 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."""