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:
@@ -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)")
|
||||
|
||||
Reference in New Issue
Block a user