Files
freemo 92c83ecc7e
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 16s
CI / build (pull_request) Successful in 17s
CI / quality (pull_request) Successful in 19s
CI / typecheck (pull_request) Successful in 33s
CI / security (pull_request) Successful in 35s
CI / integration_tests (pull_request) Successful in 2m41s
CI / unit_tests (pull_request) Successful in 6m18s
CI / docker (pull_request) Successful in 1m2s
CI / benchmark-regression (pull_request) Successful in 15m41s
CI / coverage (pull_request) Failing after 20m52s
Fix: Fixed linting errors
2026-02-22 14:18:24 -05:00

173 lines
5.4 KiB
Python

"""ASV benchmarks for Skill context and registry operations.
Measures the performance of:
- SkillContext creation and metadata access
- SkillContext resource resolution
- SkillContext change tracking
- SkillContext write guard enforcement
- SkillRegistry register/get/list/unregister
- SkillRegistry resolve_tools
"""
from __future__ import annotations
import sys
from pathlib import Path
try:
from cleveragents.domain.models.core.skill import (
Skill,
SkillResolver,
)
from cleveragents.skills.context import SkillContext
from cleveragents.skills.protocol import (
SkillDefinition,
SkillMetadata,
)
from cleveragents.skills.registry import SkillRegistry
except ModuleNotFoundError:
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
from cleveragents.domain.models.core.skill import (
Skill,
SkillResolver,
)
from cleveragents.skills.context import SkillContext
from cleveragents.skills.protocol import (
SkillDefinition,
SkillMetadata,
)
from cleveragents.skills.registry import SkillRegistry
# ---------------------------------------------------------------------------
# Fixtures
# ---------------------------------------------------------------------------
_SANDBOX = Path("/tmp/bench-sandbox")
_BASIC_SKILL = Skill(
name="local/bench-ctx-skill",
description="Benchmark context skill",
tool_refs=["local/tool-a", "local/tool-b"],
)
_RESOLVER = SkillResolver()
_RESOLVED = _RESOLVER.resolve_tools(_BASIC_SKILL, {})
_METADATA = SkillMetadata.from_skill(_BASIC_SKILL, resolved=_RESOLVED)
_DEFINITION = SkillDefinition(
skill=_BASIC_SKILL,
resolved_tools=_RESOLVED,
metadata=_METADATA,
)
# ---------------------------------------------------------------------------
# Context Benchmarks
# ---------------------------------------------------------------------------
class TimeSkillContextCreation:
"""Benchmark SkillContext creation throughput."""
timeout = 60
def time_create_context(self) -> None:
"""Time basic SkillContext creation."""
SkillContext(
plan_id="plan-bench",
project_id="proj-bench",
sandbox_path=_SANDBOX,
)
def time_create_context_with_bindings(self) -> None:
"""Time SkillContext creation with resource bindings."""
SkillContext(
plan_id="plan-bench",
project_id="proj-bench",
sandbox_path=_SANDBOX,
resource_bindings={
"git-checkout": "/repo/main",
"artifact-store": "/artifacts",
},
)
class TimeSkillContextOperations:
"""Benchmark SkillContext operations."""
timeout = 60
def setup(self) -> None:
"""Create a context for benchmarking."""
self.ctx = SkillContext(
plan_id="plan-ops",
project_id="proj-ops",
sandbox_path=_SANDBOX,
resource_bindings={"git-checkout": "/repo"},
)
def time_resolve_resource(self) -> None:
"""Time resource resolution."""
self.ctx.resolve_resource("git-checkout")
def time_get_plan_metadata(self) -> None:
"""Time plan metadata retrieval."""
self.ctx.get_plan_metadata()
def time_register_invocation(self) -> None:
"""Time tool invocation registration."""
self.ctx.register_tool_invocation("local/bench-tool", {"a": 1}, {"b": 2}, 5.0)
def time_enforce_write_guard_pass(self) -> None:
"""Time write guard check (non-read-only context)."""
self.ctx.enforce_write_guard("local/bench-tool")
# ---------------------------------------------------------------------------
# Registry Benchmarks
# ---------------------------------------------------------------------------
class TimeSkillRegistryOperations:
"""Benchmark SkillRegistry operations."""
timeout = 60
def setup(self) -> None:
"""Create a populated registry for benchmarking."""
self.registry = SkillRegistry()
for i in range(50):
skill = Skill(
name=f"local/bench-skill-{i:03d}",
description=f"Benchmark skill {i}",
tool_refs=["local/tool-a", "local/tool-b"],
)
resolver = SkillResolver()
resolved = resolver.resolve_tools(skill, {})
meta = SkillMetadata.from_skill(skill, resolved=resolved)
defn = SkillDefinition(skill=skill, resolved_tools=resolved, metadata=meta)
self.registry.register(defn)
def time_get_skill(self) -> None:
"""Time skill lookup."""
self.registry.get("local/bench-skill-025")
def time_list_all(self) -> None:
"""Time listing all skills."""
self.registry.list_all()
def time_resolve_tools(self) -> None:
"""Time tool resolution for a skill."""
self.registry.resolve_tools("local/bench-skill-010")
def time_register_and_unregister(self) -> None:
"""Time register + unregister cycle."""
name = "local/bench-temp"
skill = Skill(name=name, description="Temp skill")
resolver = SkillResolver()
resolved = resolver.resolve_tools(skill, {})
meta = SkillMetadata.from_skill(skill, resolved=resolved)
defn = SkillDefinition(skill=skill, resolved_tools=resolved, metadata=meta)
self.registry.register(defn)
self.registry.unregister(name)