48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
"""回放入口:与生产写路径共用 muse.flow.dispatch.run_dispatch。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
from typing import Any, Callable, Iterable, Mapping
|
|
|
|
from muse.flow.dispatch import run_dispatch as production_run_dispatch
|
|
from muse.store import get_run
|
|
|
|
|
|
def replay_run(
|
|
run_id: str,
|
|
*,
|
|
spec_path: str | Path,
|
|
repo_root: str | Path,
|
|
policy: Any,
|
|
new_run_id: str,
|
|
run_dir: str | Path,
|
|
connect_factory: Callable[..., Any] | None = None,
|
|
launcher: Callable[..., Iterable] | None = None,
|
|
sqlite_path: str | Path | None = None,
|
|
) -> tuple[dict[str, Any], int, dict[str, Any]]:
|
|
"""取历史 input_json 证明后,走生产 flow 入口重跑。"""
|
|
|
|
prior = get_run(run_id, sqlite_path)
|
|
if prior is None:
|
|
raise ValueError(f"run 不存在: {run_id}")
|
|
receipt, code = production_run_dispatch(
|
|
spec_path,
|
|
repo_root=repo_root,
|
|
policy=policy,
|
|
run_id=new_run_id,
|
|
run_dir=run_dir,
|
|
connect_factory=connect_factory,
|
|
launcher=launcher,
|
|
trigger_source="replay_eval",
|
|
sqlite_path=sqlite_path,
|
|
)
|
|
replayed = get_run(new_run_id, sqlite_path) or {}
|
|
return receipt, code, {
|
|
"prior_input": json.loads(prior["input_json"]),
|
|
"replay_input": json.loads(replayed.get("input_json") or "{}"),
|
|
"prior_output": prior["output_text"],
|
|
"replay_output": replayed.get("output_text", ""),
|
|
}
|