v0.12: stabilize search routing and profile-driven phase4 pipeline
This commit is contained in:
+124
-40
@@ -16,6 +16,17 @@ from pathlib import Path
|
||||
|
||||
|
||||
REPO_ROOT = Path(__file__).resolve().parent.parent
|
||||
if str(REPO_ROOT) not in sys.path:
|
||||
sys.path.insert(0, str(REPO_ROOT))
|
||||
|
||||
from scripts.lib.model_config import (
|
||||
ModelConfigError,
|
||||
list_model_profiles,
|
||||
parse_model_overrides,
|
||||
resolve_model_profile,
|
||||
)
|
||||
|
||||
|
||||
PROJECTS_DIR = REPO_ROOT / "projects"
|
||||
CODEX_COMMANDS_DIR = REPO_ROOT / ".codex" / "commands"
|
||||
CODEX_COMMAND_TEMPLATES_DIR = REPO_ROOT / "codex_adapter_templates" / "codex" / "commands"
|
||||
@@ -152,48 +163,82 @@ def cmd_glossary(args: argparse.Namespace) -> int:
|
||||
|
||||
def cmd_finalize(args: argparse.Namespace) -> int:
|
||||
project_root = resolve_project(args.project)
|
||||
steps = [
|
||||
[
|
||||
sys.executable,
|
||||
str(REPO_ROOT / "scripts" / "translate.py"),
|
||||
str(project_root),
|
||||
"--workers",
|
||||
str(args.translate_workers),
|
||||
],
|
||||
[
|
||||
sys.executable,
|
||||
str(REPO_ROOT / "scripts" / "build_glossary.py"),
|
||||
str(project_root),
|
||||
"--workers",
|
||||
str(args.glossary_workers),
|
||||
],
|
||||
[
|
||||
sys.executable,
|
||||
str(REPO_ROOT / "scripts" / "apply_glossary.py"),
|
||||
str(project_root),
|
||||
"--input",
|
||||
"phase4/final_zh.md",
|
||||
],
|
||||
[
|
||||
sys.executable,
|
||||
str(REPO_ROOT / "scripts" / "polish.py"),
|
||||
str(project_root),
|
||||
"--workers",
|
||||
str(args.polish_workers),
|
||||
],
|
||||
[
|
||||
sys.executable,
|
||||
str(REPO_ROOT / "scripts" / "build_report.py"),
|
||||
str(project_root),
|
||||
],
|
||||
try:
|
||||
resolved = resolve_model_profile(
|
||||
profile=args.model_profile,
|
||||
overrides=parse_model_overrides(args.model_override),
|
||||
)
|
||||
except ModelConfigError as exc:
|
||||
raise SystemExit(f"model profile resolution failed: {exc}") from exc
|
||||
roles = resolved["roles"]
|
||||
|
||||
cmd = [
|
||||
sys.executable,
|
||||
str(REPO_ROOT / "scripts" / "phase4_pipeline.py"),
|
||||
str(project_root),
|
||||
"--translate-workers",
|
||||
str(args.translate_workers),
|
||||
"--glossary-workers",
|
||||
str(args.glossary_workers),
|
||||
"--polish-workers",
|
||||
str(args.polish_workers),
|
||||
"--translate-model",
|
||||
roles.get("translate", "anthropic/claude-sonnet-4.6"),
|
||||
"--glossary-model",
|
||||
roles.get("glossary", "anthropic/claude-haiku-4.5"),
|
||||
"--polish-model",
|
||||
roles.get("polish", "anthropic/claude-sonnet-4.6"),
|
||||
"--glossary-mode",
|
||||
args.glossary_mode,
|
||||
]
|
||||
for step in steps:
|
||||
rc = run_cmd(step, dry_run=args.dry_run)
|
||||
if rc != 0:
|
||||
return rc
|
||||
if args.dry_run:
|
||||
cmd.append("--dry-run")
|
||||
return run_cmd(cmd, dry_run=False)
|
||||
|
||||
|
||||
def cmd_models(args: argparse.Namespace) -> int:
|
||||
if args.list:
|
||||
for name in list_model_profiles():
|
||||
print(name)
|
||||
return 0
|
||||
|
||||
try:
|
||||
resolved = resolve_model_profile(
|
||||
profile=args.profile,
|
||||
overrides=parse_model_overrides(args.model_override),
|
||||
)
|
||||
except ModelConfigError as exc:
|
||||
raise SystemExit(f"model profile resolution failed: {exc}") from exc
|
||||
|
||||
if args.json:
|
||||
print(json.dumps(resolved, ensure_ascii=False, indent=2))
|
||||
return 0
|
||||
|
||||
print(f"Profile: {resolved['profile']}")
|
||||
if resolved["description"]:
|
||||
print(f"Description: {resolved['description']}")
|
||||
print("Roles:")
|
||||
for role in sorted(resolved["roles"]):
|
||||
print(f" {role}: {resolved['roles'][role]}")
|
||||
return 0
|
||||
|
||||
|
||||
def cmd_apply_models(args: argparse.Namespace) -> int:
|
||||
cmd = [
|
||||
sys.executable,
|
||||
str(REPO_ROOT / "scripts" / "apply_model_profile.py"),
|
||||
"--profile",
|
||||
args.profile,
|
||||
"--target",
|
||||
args.target,
|
||||
]
|
||||
for item in args.model_override:
|
||||
cmd += ["--model-override", item]
|
||||
if args.dry_run:
|
||||
cmd.append("--dry-run")
|
||||
return run_cmd(cmd, dry_run=False)
|
||||
|
||||
|
||||
def build_parser() -> argparse.ArgumentParser:
|
||||
parser = argparse.ArgumentParser(description="Deep Research platform-neutral CLI")
|
||||
sub = parser.add_subparsers(dest="cmd", required=True)
|
||||
@@ -219,12 +264,51 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
|
||||
finalize = sub.add_parser("finalize", help="Run Phase 4 deterministic pipeline")
|
||||
finalize.add_argument("project", help="Project slug or path")
|
||||
finalize.add_argument("--translate-workers", type=int, default=4)
|
||||
finalize.add_argument("--translate-workers", type=int, default=0)
|
||||
finalize.add_argument("--glossary-workers", type=int, default=4)
|
||||
finalize.add_argument("--polish-workers", type=int, default=4)
|
||||
finalize.add_argument("--polish-workers", type=int, default=0)
|
||||
finalize.add_argument(
|
||||
"--glossary-mode",
|
||||
choices=["off", "low-confidence", "full"],
|
||||
default="low-confidence",
|
||||
)
|
||||
finalize.add_argument("--model-profile", help="Model profile name from configs/models.yaml")
|
||||
finalize.add_argument(
|
||||
"--model-override",
|
||||
action="append",
|
||||
default=[],
|
||||
metavar="ROLE=MODEL",
|
||||
help="Override one role model, repeatable",
|
||||
)
|
||||
finalize.add_argument("--dry-run", action="store_true")
|
||||
finalize.set_defaults(func=cmd_finalize)
|
||||
|
||||
models = sub.add_parser("models", help="Resolve and print model profile")
|
||||
models.add_argument("--profile", help="Profile name from configs/models.yaml")
|
||||
models.add_argument("--list", action="store_true", help="List available profiles")
|
||||
models.add_argument(
|
||||
"--model-override",
|
||||
action="append",
|
||||
default=[],
|
||||
metavar="ROLE=MODEL",
|
||||
help="Override one role model, repeatable",
|
||||
)
|
||||
models.add_argument("--json", action="store_true", help="Emit JSON")
|
||||
models.set_defaults(func=cmd_models)
|
||||
|
||||
apply_models = sub.add_parser("apply-models", help="Apply profile to agent files")
|
||||
apply_models.add_argument("--profile", required=True, help="Profile name from configs/models.yaml")
|
||||
apply_models.add_argument("--target", choices=["opencode", "codex", "both"], default="both")
|
||||
apply_models.add_argument(
|
||||
"--model-override",
|
||||
action="append",
|
||||
default=[],
|
||||
metavar="ROLE=MODEL",
|
||||
help="Override one role model, repeatable",
|
||||
)
|
||||
apply_models.add_argument("--dry-run", action="store_true")
|
||||
apply_models.set_defaults(func=cmd_apply_models)
|
||||
|
||||
return parser
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user