DATAFOODING / TASK NOTEBOOK연구 목록

make_task.py

이 글의 원장 예제에 포함된 코드입니다. 압축을 푼 폴더의 rewrite-v2/examples/make_task.py와 같습니다.

전체 예제 ZIP / 실행법

"""Author-owned Harbor task builder. Standard library; no network/model calls."""
from pathlib import Path
import argparse, json, shutil, sys

ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(ROOT / 'experiments'))
from common import cases
sys.path.insert(0, str(ROOT / 'experiments/harbor'))
from generate_tasks import IMAGE, NETWORK_PROBE, ORACLE, GRADER

def build(out: Path, case_name: str):
    if out.exists():
        raise SystemExit('Output already exists; choose a new empty path.')
    control = next(c for c in cases() if c.name == case_name)
    for name in ['environment', 'solution', 'tests/fixtures']:
        (out / name).mkdir(parents=True, exist_ok=True)
    (out / 'instruction.md').write_text((ROOT / 'experiments/fixtures/instruction.txt').read_text()
        + '\nRead /app/ledger.json. Write /app/submission/output.json.\n')
    (out / 'task.toml').write_text('''schema_version = "1.4"
artifacts = ["/app/submission"]
[task]
name = "tutorial/ledger-%s"
description = "Original synthetic ledger tutorial; scripted control"
authors = []
[agent]
timeout_sec = 30.0
[environment]
network_mode = "public"
build_timeout_sec = 300.0
cpus = 1
memory_mb = 512
storage_mb = 2048
[verifier]
timeout_sec = 30.0
environment_mode = "separate"
[verifier.environment]
network_mode = "public"
build_timeout_sec = 300.0
cpus = 1
memory_mb = 512
storage_mb = 2048
''' % case_name)
    shutil.copyfile(ROOT / 'experiments/fixtures/ledger.json', out / 'environment/ledger.json')
    (out / 'environment/Dockerfile').write_text(f'FROM {IMAGE}\nWORKDIR /app\nCOPY ledger.json /app/ledger.json\nRUN mkdir -p /app/submission\n')
    for directory in ['environment', 'tests']:
        (out / directory / 'docker-compose.yaml').write_text('services:\n  main:\n    network_mode: none\n')
    if case_name == 'oracle':
        actor = ORACLE
    elif case_name == 'noop':
        actor = '# Leave the submission directory empty.\n'
    else:
        actor = "from pathlib import Path\nPath('/app/submission/output.json').write_text(" + repr(control.output) + ")\n"
    actor += "\nfrom pathlib import Path\nPath('/app/agent-only-sentinel').write_text('must not be copied')\n"
    (out / 'solution/actor.py').write_text(NETWORK_PROBE + actor)
    (out / 'solution/solve.sh').write_text('#!/bin/sh\nset -eu\npython /solution/actor.py\n')
    shutil.copyfile(ROOT / 'experiments/common.py', out / 'tests/common.py')
    shutil.copyfile(ROOT / 'experiments/fixtures/expected.json', out / 'tests/fixtures/expected.json')
    (out / 'tests/grade.py').write_text(NETWORK_PROBE + GRADER)
    (out / 'tests/test.sh').write_text('#!/bin/sh\nset -eu\npython /tests/grade.py\n')
    (out / 'tests/Dockerfile').write_text(f'FROM {IMAGE}\nWORKDIR /app\nCOPY . /tests\nRUN mkdir -p /app/submission\n')
    return {'case':case_name, 'files':sorted(str(p.relative_to(out)) for p in out.rglob('*') if p.is_file()), 'expected_reward':control.expected_reward}

if __name__ == '__main__':
    p=argparse.ArgumentParser()
    p.add_argument('--output', required=True, type=Path)
    p.add_argument('--case', choices=['oracle','wrong_total','noop'], default='oracle')
    a=p.parse_args()
    print(json.dumps(build(a.output,a.case),ensure_ascii=False,indent=2))

SHA-256: 931701bf5d8be168289686af7a0b4dbdab0e807f03f1f1728d0b3ca527747d2e

그림과 본문으로 돌아가기