diff --git a/CHANGELOG.md b/CHANGELOG.md index e0b5bf5f..db64339c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Added - **Chunk visualization for generated skills**: `visualize_chunk(chunk_id)` function exposed in generated skill packages, enabling callers to render visual grounding from chunk IDs in skill state +- **Configurable generated skills**: Generated skill `create_skill()` now accepts optional `db_path` and `config` parameters, enabling post-discovery reconfiguration via `skill.reconfigure()` (requires haiku.skills >= 0.11.0) ### Fixed diff --git a/haiku_rag_slim/haiku/rag/skill_generator/templates/__init__.py.j2 b/haiku_rag_slim/haiku/rag/skill_generator/templates/__init__.py.j2 index eaf36767..27c130af 100644 --- a/haiku_rag_slim/haiku/rag/skill_generator/templates/__init__.py.j2 +++ b/haiku_rag_slim/haiku/rag/skill_generator/templates/__init__.py.j2 @@ -2,6 +2,7 @@ from pathlib import Path from pydantic import BaseModel, Field +from haiku.rag.config.models import AppConfig from haiku.skills.models import Skill from haiku.skills.parser import parse_skill_md {% if "ask" in tool_names or "research" in tool_names %} @@ -62,12 +63,21 @@ def _get_config(): return get_config() -def create_skill() -> Skill: +def create_skill( + db_path: Path | None = None, + config: AppConfig | None = None, +) -> Skill: from haiku.rag.skills._tools import create_skill_tools metadata, instructions = parse_skill_md(Path(__file__).parent / "SKILL.md") - config = _get_config() - tools = create_skill_tools(_DB_PATH, config, SkillState, _TOOL_NAMES) + + if config is None: + config = _get_config() + + if db_path is None: + db_path = _DB_PATH + + tools = create_skill_tools(db_path, config, SkillState, _TOOL_NAMES) return Skill( metadata=metadata, instructions=instructions, diff --git a/haiku_rag_slim/haiku/rag/skills/rag.py b/haiku_rag_slim/haiku/rag/skills/rag.py index da81680d..10270e2a 100644 --- a/haiku_rag_slim/haiku/rag/skills/rag.py +++ b/haiku_rag_slim/haiku/rag/skills/rag.py @@ -1,11 +1,11 @@ import os from functools import cache from pathlib import Path -from typing import Any from pydantic import BaseModel, Field from haiku.rag.agents.research.models import Citation +from haiku.rag.config.models import AppConfig from haiku.rag.skills._tools import ResearchEntry from haiku.rag.store.models.chunk import SearchResult from haiku.rag.tools.document import DocumentInfo @@ -61,7 +61,7 @@ def state_metadata() -> StateMetadata: def create_skill( db_path: Path | None = None, - config: Any = None, + config: AppConfig | None = None, ) -> Skill: """Create a RAG skill for searching and analyzing documents. diff --git a/haiku_rag_slim/haiku/rag/skills/rlm.py b/haiku_rag_slim/haiku/rag/skills/rlm.py index 463e524f..7b48bbad 100644 --- a/haiku_rag_slim/haiku/rag/skills/rlm.py +++ b/haiku_rag_slim/haiku/rag/skills/rlm.py @@ -1,10 +1,10 @@ import os from functools import cache from pathlib import Path -from typing import Any from pydantic import BaseModel +from haiku.rag.config.models import AppConfig from haiku.rag.skills._tools import AnalysisEntry from haiku.skills.models import Skill, SkillMetadata, SkillSource, StateMetadata from haiku.skills.parser import parse_skill_md @@ -42,7 +42,7 @@ def state_metadata() -> StateMetadata: def create_skill( db_path: Path | None = None, - config: Any = None, + config: AppConfig | None = None, ) -> Skill: """Create an RLM analysis skill for computational document analysis. diff --git a/tests/test_skill_generator.py b/tests/test_skill_generator.py index 37f3d06c..9025f84e 100644 --- a/tests/test_skill_generator.py +++ b/tests/test_skill_generator.py @@ -142,9 +142,7 @@ class TestRenderTemplates: ) init = tmp_path / "docs-skill" / "docs_skill" / "__init__.py" content = init.read_text() - assert ( - "create_skill_tools(_DB_PATH, config, SkillState, _TOOL_NAMES)" in content - ) + assert "create_skill_tools(db_path, config, SkillState, _TOOL_NAMES)" in content def test_tool_names_in_init(self, tmp_path): render_templates( @@ -273,6 +271,18 @@ class TestRenderTemplates: assert "skill_visualize_chunk" not in content assert "HaikuRAG" in content + def test_create_skill_accepts_optional_params(self, tmp_path): + render_templates( + output_dir=tmp_path, + name="docs", + description="A docs skill.", + tool_names=["search"], + ) + init = tmp_path / "docs-skill" / "docs_skill" / "__init__.py" + content = init.read_text() + assert "db_path: Path | None = None" in content + assert "config: AppConfig | None = None" in content + def test_generated_python_is_valid(self, tmp_path): render_templates( output_dir=tmp_path,