feat: add skill learning runtime
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from skills_learning.models import FlowStep, FlowTemplateSkill, SkillMetadata
|
||||
from skills_learning.store import SkillStore
|
||||
from skills_learning.versioning import diff_flow_versions, store_synthesized_skill
|
||||
|
||||
|
||||
def _skill(
|
||||
*,
|
||||
name: str = "search",
|
||||
steps: list[FlowStep] | None = None,
|
||||
parameters: dict[str, dict[str, object]] | None = None,
|
||||
) -> FlowTemplateSkill:
|
||||
return FlowTemplateSkill(
|
||||
metadata=SkillMetadata(
|
||||
name=name,
|
||||
description="Learned search",
|
||||
originating_goal="search coffee",
|
||||
),
|
||||
steps=steps or [FlowStep("input_text", {"text": "coffee"})],
|
||||
parameters=parameters or {},
|
||||
)
|
||||
|
||||
|
||||
def test_diff_flow_versions_detects_extra_missing_and_reordered_steps() -> None:
|
||||
stored = [FlowStep("tap"), FlowStep("input_text")]
|
||||
|
||||
assert diff_flow_versions(stored, [FlowStep("tap")]).structural_divergence
|
||||
assert diff_flow_versions(
|
||||
stored,
|
||||
[FlowStep("tap"), FlowStep("input_text"), FlowStep("tap")],
|
||||
).structural_divergence
|
||||
assert diff_flow_versions(
|
||||
stored,
|
||||
[FlowStep("input_text"), FlowStep("tap")],
|
||||
).structural_divergence
|
||||
|
||||
|
||||
def test_argument_only_difference_updates_existing_version_without_bump() -> None:
|
||||
store = SkillStore()
|
||||
first = store.create_version(_skill())
|
||||
candidate = _skill(
|
||||
steps=[FlowStep("input_text", {"text": "{search_query}"})],
|
||||
parameters={"search_query": {"type": "string"}},
|
||||
)
|
||||
|
||||
result = store_synthesized_skill(store, candidate)
|
||||
|
||||
assert result.created_new_version is False
|
||||
assert result.skill.version == first.version
|
||||
assert result.skill.id == first.id
|
||||
assert result.skill.parameters == {"search_query": {"type": "string"}}
|
||||
assert store.get_latest_by_name("search") == result.skill
|
||||
|
||||
|
||||
def test_structural_divergence_creates_new_version_and_preserves_parent() -> None:
|
||||
store = SkillStore()
|
||||
first = store.create_version(_skill())
|
||||
candidate = _skill(
|
||||
steps=[
|
||||
FlowStep("tap", {"x": 1}),
|
||||
FlowStep("input_text", {"text": "coffee"}),
|
||||
]
|
||||
)
|
||||
|
||||
result = store_synthesized_skill(store, candidate)
|
||||
|
||||
assert result.created_new_version is True
|
||||
assert result.skill.version == 2
|
||||
assert result.skill.parent_version_id == first.id
|
||||
assert store.get_by_id(first.id) == first
|
||||
assert store.get_latest_by_name("search") == result.skill
|
||||
Reference in New Issue
Block a user