from __future__ import annotations import argparse from flashtrace import FlashTrace, load_model_and_tokenizer def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(description="FlashTrace quickstart example.") parser.add_argument("--model", required=True, help="Hugging Face model id or local model path.") parser.add_argument("--prompt", required=True, help="Prompt text.") parser.add_argument("--target", help="Target response text.") parser.add_argument("--output-span", default=None, help="Inclusive generation-token span START:END.") parser.add_argument("--reasoning-span", default=None, help="Inclusive generation-token span START:END.") parser.add_argument("--html", default="trace.html", help="Output HTML path.") parser.add_argument("--use-chat-template", action="store_true", help="Format prompts with the tokenizer chat template.") return parser def parse_span(value: str | None) -> tuple[int, int] | None: from flashtrace.cli import parse_span as parse_cli_span return parse_cli_span(value) def main() -> int: args = build_parser().parse_args() model, tokenizer = load_model_and_tokenizer(args.model) tracer = FlashTrace(model, tokenizer, use_chat_template=args.use_chat_template) trace = tracer.trace( prompt=args.prompt, target=args.target, output_span=parse_span(args.output_span), reasoning_span=parse_span(args.reasoning_span), ) for item in trace.topk_inputs(10): print(f"{item.index}\t{item.score:.6f}\t{item.token!r}") trace.to_html(args.html) print(f"wrote {args.html}") return 0 if __name__ == "__main__": raise SystemExit(main())