Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
A comprehensive collection of Agent Skills for context engineering, multi-agent architectures, and production agent systems.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
examples/interleaved-thinking/reasoning_trace_optimizer/cli.py
1"""2CLI interface for Reasoning Trace Optimizer.34Provides command-line access to the optimization tools.5"""67import argparse8import json9import sys10from pathlib import Path1112from rich.console import Console1314from reasoning_trace_optimizer.analyzer import TraceAnalyzer, format_analysis_report15from reasoning_trace_optimizer.capture import TraceCapture, format_trace_for_display16from reasoning_trace_optimizer.loop import OptimizationLoop, LoopConfig17from reasoning_trace_optimizer.skill_generator import SkillGenerator181920console = Console()212223def cmd_capture(args: argparse.Namespace) -> None:24"""Run a task and capture reasoning trace."""25capture = TraceCapture(26api_key=args.api_key,27base_url=args.base_url,28model=args.model,29)3031console.print(f"[cyan]Capturing trace for task: {args.task}[/cyan]")3233trace = capture.run(34task=args.task,35system_prompt=args.system_prompt or "You are a helpful assistant.",36max_turns=args.max_turns,37)3839# Output trace40output = format_trace_for_display(trace)41if args.output:42Path(args.output).write_text(output)43console.print(f"[green]Trace saved to: {args.output}[/green]")44else:45console.print(output)464748def cmd_analyze(args: argparse.Namespace) -> None:49"""Analyze a captured reasoning trace."""50# For now, run capture + analyze together51# In future, could load trace from file5253capture = TraceCapture(54api_key=args.api_key,55base_url=args.base_url,56model=args.model,57)58analyzer = TraceAnalyzer(59api_key=args.api_key,60base_url=args.base_url,61model=args.model,62)6364console.print(f"[cyan]Capturing and analyzing: {args.task}[/cyan]")6566trace = capture.run(67task=args.task,68system_prompt=args.system_prompt or "You are a helpful assistant.",69)7071analysis = analyzer.analyze(trace)7273# Output analysis74output = format_analysis_report(analysis)75if args.output:76Path(args.output).write_text(output)77console.print(f"[green]Analysis saved to: {args.output}[/green]")78else:79console.print(output)808182def cmd_optimize(args: argparse.Namespace) -> None:83"""Run full optimization loop."""84config = LoopConfig(85max_iterations=args.max_iterations,86convergence_threshold=args.convergence_threshold,87min_score_threshold=args.min_score,88save_artifacts=True,89artifacts_dir=args.artifacts_dir,90verbose=True,91)9293loop = OptimizationLoop(94config=config,95api_key=args.api_key,96base_url=args.base_url,97model=args.model,98)99100console.print(f"[cyan]Starting optimization for: {args.task}[/cyan]")101102result = loop.run(103task=args.task,104initial_prompt=args.system_prompt or "You are a helpful assistant.",105)106107# Output final prompt108if args.output:109Path(args.output).write_text(result.final_prompt)110console.print(f"[green]Optimized prompt saved to: {args.output}[/green]")111112# Generate skill if requested113if args.generate_skill:114generator = SkillGenerator(115api_key=args.api_key,116base_url=args.base_url,117model=args.model,118)119skill_path = generator.generate(120result=result,121skill_name=args.skill_name or "optimized-agent",122output_dir=args.skills_dir,123)124console.print(f"[green]Generated skill at: {skill_path}[/green]")125126127def cmd_generate_skill(args: argparse.Namespace) -> None:128"""Generate a skill from optimization artifacts."""129# Load summary from artifacts130artifacts_dir = Path(args.artifacts_dir)131summary_path = artifacts_dir / "summary.json"132133if not summary_path.exists():134console.print("[red]Error: No optimization summary found. Run optimize first.[/red]")135sys.exit(1)136137with open(summary_path) as f:138summary = json.load(f)139140# Create minimal loop result from summary141from reasoning_trace_optimizer.models import LoopResult, LoopIteration, ReasoningTrace, AnalysisResult142143# Load final prompt144final_prompt_path = artifacts_dir / "final_prompt.txt"145final_prompt = final_prompt_path.read_text() if final_prompt_path.exists() else ""146147result = LoopResult(148task=summary.get("task", "Unknown task"),149final_prompt=final_prompt,150total_iterations=summary.get("total_iterations", 0),151initial_score=summary.get("initial_score", 0),152final_score=summary.get("final_score", 0),153improvement_percentage=summary.get("improvement_percentage", 0),154converged=summary.get("converged", False),155)156157generator = SkillGenerator(158api_key=args.api_key,159base_url=args.base_url,160model=args.model,161)162163skill_path = generator.generate(164result=result,165skill_name=args.skill_name,166output_dir=args.output_dir,167)168169console.print(f"[green]Generated skill at: {skill_path}[/green]")170171172def main() -> None:173"""Main CLI entry point."""174parser = argparse.ArgumentParser(175prog="rto",176description="Reasoning Trace Optimizer - Debug and optimize AI agents using M2.1's interleaved thinking",177)178179# Global arguments180parser.add_argument(181"--api-key",182help="MiniMax API key (or set ANTHROPIC_API_KEY env var)",183)184parser.add_argument(185"--base-url",186default="https://api.minimax.io/anthropic",187help="API base URL",188)189parser.add_argument(190"--model",191default="MiniMax-M2.1",192choices=["MiniMax-M2.1", "MiniMax-M2.1-lightning", "MiniMax-M2"],193help="Model to use",194)195196subparsers = parser.add_subparsers(dest="command", required=True)197198# Capture command199capture_parser = subparsers.add_parser(200"capture",201help="Capture reasoning trace for a task",202)203capture_parser.add_argument("task", help="Task to execute")204capture_parser.add_argument("--system-prompt", "-s", help="System prompt")205capture_parser.add_argument("--max-turns", type=int, default=10)206capture_parser.add_argument("--output", "-o", help="Output file path")207capture_parser.set_defaults(func=cmd_capture)208209# Analyze command210analyze_parser = subparsers.add_parser(211"analyze",212help="Capture and analyze reasoning trace",213)214analyze_parser.add_argument("task", help="Task to analyze")215analyze_parser.add_argument("--system-prompt", "-s", help="System prompt")216analyze_parser.add_argument("--output", "-o", help="Output file path")217analyze_parser.set_defaults(func=cmd_analyze)218219# Optimize command220optimize_parser = subparsers.add_parser(221"optimize",222help="Run full optimization loop",223)224optimize_parser.add_argument("task", help="Task to optimize for")225optimize_parser.add_argument("--system-prompt", "-s", help="Initial system prompt")226optimize_parser.add_argument("--max-iterations", type=int, default=5)227optimize_parser.add_argument("--convergence-threshold", type=float, default=5.0)228optimize_parser.add_argument("--min-score", type=float, default=80.0)229optimize_parser.add_argument(230"--artifacts-dir",231default="./optimization_artifacts",232help="Directory for artifacts",233)234optimize_parser.add_argument("--output", "-o", help="Output file for final prompt")235optimize_parser.add_argument(236"--generate-skill",237action="store_true",238help="Generate Agent Skill from results",239)240optimize_parser.add_argument("--skill-name", help="Name for generated skill")241optimize_parser.add_argument(242"--skills-dir",243default="./generated_skills",244help="Directory for generated skills",245)246optimize_parser.set_defaults(func=cmd_optimize)247248# Generate skill command249skill_parser = subparsers.add_parser(250"generate-skill",251help="Generate skill from optimization artifacts",252)253skill_parser.add_argument("skill_name", help="Name for the skill")254skill_parser.add_argument(255"--artifacts-dir",256default="./optimization_artifacts",257help="Directory with optimization artifacts",258)259skill_parser.add_argument(260"--output-dir",261default="./generated_skills",262help="Output directory for skill",263)264skill_parser.set_defaults(func=cmd_generate_skill)265266args = parser.parse_args()267args.func(args)268269270if __name__ == "__main__":271main()272