File size: 2,948 Bytes
f209a8f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import argparse
import sys
from dataclasses import dataclass
from pathlib import Path
from typing import Iterable


PROMPTS_DIR = Path(__file__).resolve().parent / "prompts"


@dataclass(frozen=True)
class PromptAsset:
    name: str
    path: Path
    description: str


PROMPT_ASSETS = {
    "system_base": PromptAsset(
        name="system_base",
        path=PROMPTS_DIR / "system_base.md",
        description="Base general-purpose system prompt for the harness.",
    ),
}


def _read_prompt_asset(asset: PromptAsset) -> str:
    return asset.path.read_text(encoding="utf-8").strip()


SYSTEM_PROMPT = _read_prompt_asset(PROMPT_ASSETS["system_base"])


def _normalize_extra_blocks(blocks: Iterable[str] | None) -> list[str]:
    normalized: list[str] = []
    for raw_block in blocks or []:
        block = str(raw_block or "").strip()
        if block:
            normalized.append(block)
    return normalized


def composed_system_prompt(*, current_date: str, extra_blocks: Iterable[str] | None = None) -> str:
    blocks = [SYSTEM_PROMPT.rstrip()]
    for block in _normalize_extra_blocks(extra_blocks):
        blocks.append(block.rstrip())
    blocks.append(f"Current date: {current_date}")
    return "\n\n".join(blocks)


def _show_asset(name: str) -> str:
    asset = PROMPT_ASSETS.get(name)
    if asset is None:
        valid = ", ".join(sorted(PROMPT_ASSETS))
        raise ValueError(f"Unknown prompt asset '{name}'. Available assets: {valid}")
    return _read_prompt_asset(asset)


def main(argv: list[str] | None = None) -> int:
    parser = argparse.ArgumentParser(description="Inspect prompt assets.")
    parser.add_argument("--show-system", action="store_true", help="Print the composed system prompt.")
    parser.add_argument("--show-asset", metavar="NAME", help="Print one prompt asset by name.")
    parser.add_argument("--list-assets", action="store_true", help="List registered prompt assets.")
    parser.add_argument(
        "--with-extra-file",
        action="append",
        default=[],
        dest="extra_files",
        help="Append one extra prompt block file when printing the composed system prompt. May be passed multiple times.",
    )
    args = parser.parse_args(argv)

    extra_blocks = [Path(path).read_text(encoding="utf-8") for path in args.extra_files]

    if args.list_assets:
        for asset in sorted(PROMPT_ASSETS.values(), key=lambda item: item.name):
            print(f"{asset.name}: {asset.description}")
        return 0

    if args.show_asset:
        print(_show_asset(args.show_asset))
        return 0

    if args.show_system:
        print(composed_system_prompt(current_date="<DATE>", extra_blocks=extra_blocks))
        return 0

    print(f"prompt_asset_dir={PROMPTS_DIR}")
    print(f"system_prompt_chars={len(composed_system_prompt(current_date='<DATE>', extra_blocks=extra_blocks))}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main(sys.argv[1:]))