Files

77 lines
3.5 KiB
Python

"""Offline prompt A/B and real optional catalog -> skill_view probe.
Run with the repository venv; tiktoken must be available. No model API calls.
"""
import json
import os
from pathlib import Path
import subprocess
import sys
import tempfile
from types import SimpleNamespace
ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(ROOT))
def main():
with tempfile.TemporaryDirectory(prefix="property-guidance-") as temporary:
os.environ["HERMES_HOME"] = temporary
os.environ["TERMINAL_CWD"] = temporary
os.chdir(temporary)
import tiktoken
from agent import prompt_builder
from agent.system_prompt import build_system_prompt
from tools.skills_hub_official import OptionalSkillSource
from tools.skills_tool import skill_view
agent = SimpleNamespace(
load_soul_identity=False, skip_context_files=True, valid_tool_names=[],
_task_completion_guidance=False, _tool_use_enforcement=False,
_environment_probe=False, _kanban_worker_guidance="", _memory_store=None,
_memory_manager=None, model="", provider="", platform="desktop",
pass_session_id=False, session_id="", _emit_status=lambda *args: None,
)
fixed_hint = prompt_builder.PLATFORM_HINTS["desktop"]
# The original clause is taken from the pinned base, never synthesized.
source = subprocess.check_output(
["git", "show", f"{sys.argv[1]}:agent/prompt_builder.py"], cwd=ROOT,
text=True, stdin=subprocess.DEVNULL,
)
import ast
tree = ast.parse(source)
mapping = next(n.value for n in tree.body if isinstance(n, ast.Assign)
and any(isinstance(t, ast.Name) and t.id == "PLATFORM_HINTS" for t in n.targets))
base_hint = next(ast.literal_eval(value) for key, value in zip(mapping.keys, mapping.values)
if isinstance(key, ast.Constant) and key.value == "desktop")
prompt_builder.PLATFORM_HINTS["desktop"] = base_hint
before = build_system_prompt(agent)
prompt_builder.PLATFORM_HINTS["desktop"] = fixed_hint
after = build_system_prompt(agent)
assert before.replace(base_hint, fixed_hint) == after
result = {"base": sys.argv[1], "tokenizers": {}}
for name in ("cl100k_base", "o200k_base"):
enc = tiktoken.get_encoding(name)
counts = [len(enc.encode(s)) for s in (base_hint, fixed_hint, before, after)]
result["tokenizers"][name] = dict(zip(
("hint_before", "hint_after", "prompt_before", "prompt_after"), counts))
optional = OptionalSkillSource()
matches = [m for m in optional.list_local() if "property" in m.tags and "rental" in m.tags]
assert matches
bundle = optional.fetch(matches[0].identifier)
assert bundle
dest = Path(temporary) / "skills" / bundle.name
dest.mkdir(parents=True)
for name, data in bundle.files.items():
(dest / name).write_bytes(data if isinstance(data, bytes) else data.encode("utf-8"))
loaded = json.loads(skill_view(bundle.name))
assert loaded["success"], loaded
example = loaded["content"].split("```listing\n", 1)[1].split("```", 1)[0]
assert json.loads(example)["address"]
result.update(identifier=matches[0].identifier, skill_view_success=True,
non_property_prompt_byte_parity=True, example=json.loads(example))
print(json.dumps(result, indent=2))
if __name__ == "__main__":
main()