Wire OptimizationLoop to project metrics and add metrics optimize.

Add from_metrics_store factory, OptimizerStore persistence, metrics optimize
CLI, consolidate duplicate optimization agent, and add integration tests.
This commit is contained in:
2026-06-16 01:41:26 +02:00
parent 97b7eb8cba
commit 2711a3ebcc
11 changed files with 340 additions and 351 deletions

View File

@@ -11,7 +11,8 @@ from typing import List, Optional
from .registry import AgentRegistry, AgentCategory
from .installer import AgentInstaller, ProjectInitializer, InstallationConfig
from .metrics import MetricsStore
from .metrics import MetricsStore, OptimizerStore
from .optimization import OptimizationLoop, MIN_SAMPLES_FOR_RECOMMENDATIONS
def safe_cli_wrapper():
@@ -1039,6 +1040,63 @@ def metrics_list(target: str):
click.echo(f"{name} ({count} executions)")
@metrics.command("optimize")
@click.argument("agent_name", required=False)
@click.option("--target", "-t", default=".", help="Project root (default: current)")
@click.option(
"--min-samples",
default=MIN_SAMPLES_FOR_RECOMMENDATIONS,
show_default=True,
help="Minimum execution records required for recommendations",
)
def metrics_optimize(agent_name: Optional[str], target: str, min_samples: int):
"""Run optimizer analysis on project metrics and write recommendations."""
project_root = _project_root(target)
agents = [agent_name] if agent_name else MetricsStore.list_agents(project_root)
if not agents:
click.echo("No agent metrics found to optimize.")
click.echo(" Record executions with: kaizen-agentic metrics record <agent> --success")
return
optimizer_store = OptimizerStore(project_root)
combined_reports = []
for name in agents:
store = MetricsStore(project_root, name)
records = store.read_executions()
loop = OptimizationLoop.from_metrics_store(store, min_samples=1)
report = loop.get_optimization_report_json()
report["sample_threshold"] = min_samples
report["meets_sample_threshold"] = len(records) >= min_samples
combined_reports.append(report)
click.echo(f"Agent: {name}")
click.echo("=" * 40)
click.echo(json.dumps(report, indent=2))
if len(records) >= min_samples:
optimizer_store.append_recommendations(
name,
report["recommendations"],
metrics_count=len(records),
)
else:
click.echo(
f" Note: {len(records)} record(s) — need {min_samples} for actionable recommendations"
)
click.echo()
analysis_payload = {
"project": project_root.name,
"optimized_at": _today(),
"min_samples": min_samples,
"agents": combined_reports,
}
analysis_path = optimizer_store.write_analysis(analysis_payload)
click.echo(f"Wrote optimizer analysis: {analysis_path}")
@metrics.command("export")
@click.argument("agent_name")
@click.option("--target", "-t", default=".", help="Project root (default: current)")