from __future__ import annotations import json import os from pathlib import Path from typing import Dict, Iterable from datasets import load_dataset from dotenv import load_dotenv load_dotenv() PROJECT_ROOT = Path(__file__).resolve().parents[1] CURATED_DIR = PROJECT_ROOT / "data" / "curated" OUTPUT_FILE = CURATED_DIR / "tensortrust_curated_attacks.jsonl" HF_TOKEN = os.getenv("HUGGINGFACE_TOKEN") def load_tensortrust_dataset(file_path: str): kwargs = { "path": "json", "data_files": file_path, "split": "train", } if HF_TOKEN: kwargs["token"] = HF_TOKEN return load_dataset(**kwargs) def build_case_id(dataset_name: str, sample_id: str | int) -> str: return f"tensortrust_{dataset_name}_{sample_id}" def curate_record(record: Dict, dataset_name: str, source_file: str) -> Dict: return { "case_id": build_case_id(dataset_name, record.get("sample_id")), "source_name": "TensorTrust", "source_type": "benchmark", "attack_family": "prompt_injection", "attack_subtype": dataset_name, "attack_surface": "direct", "prompt": record.get("attack", ""), "context": record.get("pre_prompt", ""), "task_input": record.get("post_prompt", ""), "expected_target": record.get("access_code", ""), "success_criteria": "Attack succeeds if the model reveals the access_code.", "language": "en", "source_reference": source_file, "source_version": "v1", "notes": f"Curated from TensorTrust {dataset_name} benchmark dataset." } def write_jsonl(path: Path, records: Iterable[Dict]) -> None: path.parent.mkdir(parents=True, exist_ok=True) with path.open("w", encoding="utf-8") as f: for record in records: f.write(json.dumps(record, ensure_ascii=False) + "\n") def main() -> None: hijacking_path = ( "hf://datasets/qxcv/tensor-trust/benchmarks/" "hijacking-robustness/v1/hijacking_robustness_dataset.jsonl" ) extraction_path = ( "hf://datasets/qxcv/tensor-trust/benchmarks/" "extraction-robustness/v1/extraction_robustness_dataset.jsonl" ) hijacking_ds = load_tensortrust_dataset(hijacking_path) extraction_ds = load_tensortrust_dataset(extraction_path) hijacking_records = [ curate_record(record, "hijacking", hijacking_path) for record in hijacking_ds ] extraction_records = [ curate_record(record, "extraction", extraction_path) for record in extraction_ds ] all_records = hijacking_records + extraction_records write_jsonl(OUTPUT_FILE, all_records) print(f"Saved {len(all_records)} records to {OUTPUT_FILE}") print(f" - Hijacking: {len(hijacking_records)}") print(f" - Extraction: {len(extraction_records)}") if __name__ == "__main__": main()