from synkro import ProgressReporter
from synkro.types import Plan, Trace
class CustomReporter:
"""Custom reporter implementation."""
def on_start(self, traces: int, model: str, dataset_type: str) -> None:
# Called when generation starts
pass
def on_plan_complete(self, plan: Plan) -> None:
# Called when planning completes
pass
def on_scenario_progress(self, completed: int, total: int) -> None:
# Called during scenario generation
pass
def on_response_progress(self, completed: int, total: int) -> None:
# Called during response generation
pass
def on_responses_complete(self, traces: list[Trace]) -> None:
# Called when all responses are generated
pass
def on_grading_progress(self, completed: int, total: int) -> None:
# Called during grading
pass
def on_grading_complete(self, traces: list[Trace], pass_rate: float) -> None:
# Called when grading completes
pass
def on_refinement_start(self, iteration: int, failed_count: int) -> None:
# Called when refinement iteration starts
pass
def on_grading_skipped(self) -> None:
# Called when grading is skipped
pass
def on_complete(
self,
dataset_size: int,
elapsed_seconds: float,
pass_rate: float | None,
total_cost: float | None = None,
**kwargs
) -> None:
# Called when generation completes
pass
def on_logic_map_complete(self, logic_map) -> None:
# Called when logic extraction completes
pass
def on_golden_scenarios_complete(self, scenarios, distribution) -> None:
# Called when golden scenarios are generated
pass
def on_taxonomy_extracted(self, taxonomy) -> None:
# Called when taxonomy is extracted
pass
def on_coverage_calculated(self, report) -> None:
# Called when coverage is calculated
pass
def on_coverage_improved(self, before, after, added_scenarios) -> None:
# Called when coverage is improved
pass
def spinner(self, message: str = "Thinking..."):
# Return a context manager for showing loading spinner
return NoOpContextManager()
# Use custom reporter
dataset = synkro.generate(policy, reporter=CustomReporter())