feat: more instropectable skill config

Toward #296.
This commit is contained in:
Tres Seaver 2026-03-03 15:45:42 -05:00
parent 8a859fbe3c
commit 8eee4fabb9
No known key found for this signature in database
GPG key ID: F2A968348913D1D8
2 changed files with 48 additions and 12 deletions

View file

@ -36,6 +36,27 @@ class RAGState(BaseModel):
documents: list[DocumentInfo] = Field(default_factory=list) documents: list[DocumentInfo] = Field(default_factory=list)
reports: list[ResearchEntry] = Field(default_factory=list) reports: list[ResearchEntry] = Field(default_factory=list)
STATE_NAMESPACE = "haiku.rag.skills.rag"
STATE_TYPE = RAGState
_skill_path = Path(__file__).parent / "rag"
_skill_metadata = None
_instructions = None
def _parse_skill():
global _skill_metadata
global _instructions
_skill_metadata, _instructions = parse_skill_md(_skill_path / "SKILL.md")
def skill_metadata():
if _skill_metadata is None:
_parse_skill()
return _skill_metadata
def instructions():
if _instructions is None:
_parse_skill()
return _instructions
def create_skill( def create_skill(
db_path: Path | None = None, db_path: Path | None = None,
@ -62,9 +83,6 @@ def create_skill(
else: else:
db_path = config.storage.data_dir / "haiku.rag.lancedb" db_path = config.storage.data_dir / "haiku.rag.lancedb"
path = Path(__file__).parent / "rag"
metadata, instructions = parse_skill_md(path / "SKILL.md")
async def _find_relevant_prior_qa( async def _find_relevant_prior_qa(
state: RAGState, query: str state: RAGState, query: str
) -> list[QAHistoryEntry]: ) -> list[QAHistoryEntry]:
@ -323,10 +341,10 @@ def create_skill(
return "\n".join(parts) return "\n".join(parts)
return Skill( return Skill(
metadata=metadata, metadata=skill_metadata(),
source=SkillSource.ENTRYPOINT, source=SkillSource.ENTRYPOINT,
path=path, path=_skill_path,
instructions=instructions, instructions=instructions(),
tools=[ tools=[
search, search,
list_documents, list_documents,

View file

@ -19,6 +19,27 @@ class AnalysisEntry(BaseModel):
class RLMState(BaseModel): class RLMState(BaseModel):
analyses: list[AnalysisEntry] = [] analyses: list[AnalysisEntry] = []
STATE_NAMESPACE = "haiku.rag.skills.rag-rlm"
STATE_TYPE = RLMState
_skill_path = Path(__file__).parent / "rag-rlm"
_skill_metadata = None
_instructions = None
def _parse_skill():
global _skill_metadata
global _instructions
_skill_metadata, _instructions = parse_skill_md(_skill_path / "SKILL.md")
def skill_metadata():
if _skill_metadata is None:
_parse_skill()
return _skill_metadata
def instructions():
if _instructions is None:
_parse_skill()
return _instructions
def create_skill( def create_skill(
db_path: Path | None = None, db_path: Path | None = None,
@ -45,9 +66,6 @@ def create_skill(
else: else:
db_path = config.storage.data_dir / "haiku.rag.lancedb" db_path = config.storage.data_dir / "haiku.rag.lancedb"
path = Path(__file__).parent / "rag-rlm"
metadata, instructions = parse_skill_md(path / "SKILL.md")
async def analyze( async def analyze(
ctx: RunContext[SkillRunDeps], ctx: RunContext[SkillRunDeps],
question: str, question: str,
@ -85,10 +103,10 @@ def create_skill(
return output return output
return Skill( return Skill(
metadata=metadata, metadata=skill_metadata(),
source=SkillSource.ENTRYPOINT, source=SkillSource.ENTRYPOINT,
path=path, path=_skill_path,
instructions=instructions, instructions=instructions(),
tools=[analyze], tools=[analyze],
state_type=RLMState, state_type=RLMState,
state_namespace="rlm", state_namespace="rlm",