Zhouhh123's picture
Improve submission review output and keep audit metadata private
ce2bca2
Raw History Blame Contribute Delete
14.2 kB
"""Private submission persistence; local roots should be the ignored submissions/.
Use SubmissionStore(Path('submissions')) locally, or pass the private dataset
repo_id='XLearning-SCU/ARK-Bench-Evaluation' and an explicit token. Remote
operations never report local success or write a local fallback.
"""
from __future__ import annotations
from datetime import datetime, timezone
from functools import wraps
import fcntl
import json
import os
from pathlib import Path
import re
import shutil
import tempfile
class StorageError(Exception):
"""A private storage operation failed (details deliberately withheld)."""
def _private_errors(function):
@wraps(function)
def wrapped(*args, **kwargs):
try:
return function(*args, **kwargs)
except Exception:
raise StorageError('Submission operation failed.') from None
return wrapped
def _submission_id(value):
if not isinstance(value, str) or re.fullmatch(r'[0-9a-f]{32}', value) is None:
raise StorageError('Submission operation failed.')
return value
def _json_bytes(value):
return json.dumps(value, allow_nan=False, sort_keys=True, ensure_ascii=False).encode('utf-8')
def _markdown(value):
"""Render untrusted model metadata as plain Markdown text."""
text = str(value or '').replace('\r', ' ').replace('\n', ' ').strip()
for character in r'\\`*_{}[]<>|':
text = text.replace(character, '\\' + character)
return text.replace('@', '@') or '—'
def _issue_content(record):
submission_id = record['submission_id']
score = record['score']
model = score['model']
metadata = score['meta_data']
model_name = str(model['name']).replace('@', '@')
title = f"ARK-Bench submission {submission_id[:8]} — {model_name}"[:200]
rows = []
for family, metrics in (('Recall', ('R@1', 'R@5', 'R@10')),
('NDCG', ('nDCG@5', 'nDCG@10', 'nDCG@20'))):
results = score['results'][family]
for metric in metrics:
knowledge = results['knowledge_domain']['macro_avg'][metric]
reasoning = results['reasoning_skill']['macro_avg'][metric]
rows.append(f"| {metric} | {knowledge:.2f} | {reasoning:.2f} | {(knowledge + reasoning) / 2:.2f} |")
description = '\n'.join([
'A participant submitted an evaluated ARK-Bench report for maintainer review.', '',
f"- **Submission ID:** `{submission_id}`",
f"- **Model:** {_markdown(model.get('name'))}",
f"- **Model URL:** {_markdown(model.get('repo_link'))}",
f"- **Parameters (B):** {_markdown(model.get('params_b'))}",
f"- **Evaluation date:** {_markdown(metadata.get('date'))}",
f"- **Benchmark version:** {_markdown(metadata.get('benchmark_version'))}",
f"- **Dataset revision:** `{_markdown(metadata.get('dataset_revision'))}`",
f"- **Protocol:** `{_markdown(metadata.get('evaluation_protocol'))}`", '',
'| Metric | Knowledge macro | Reasoning macro | Overview |',
'| --- | ---: | ---: | ---: |', *rows, '',
f"Private artifacts: `submissions/{submission_id}/`", '',
'Review and recompute this submission with the maintainer CLI before publication.',
])
return title, description
class SubmissionStore:
@_private_errors
def __init__(self, root: Path, repo_id: str | None = None, token: str | None = None):
self.root = Path(root)
self.repo_id = repo_id
self.token = token
self.api = None
if repo_id is not None:
if not repo_id or not token:
raise ValueError()
from huggingface_hub import HfApi
self.api = HfApi(token=token)
def _private_info(self):
info = self.api.dataset_info(repo_id=self.repo_id, token=self.token)
if info.private is not True:
raise ValueError()
return info
def _local_path(self, submission_id, filename=None):
path = self.root / _submission_id(submission_id)
if path.is_symlink():
raise ValueError()
if filename:
path = path / filename
if path.is_symlink():
raise ValueError()
return path
@_private_errors
def save(self, record: dict, predictions: bytes) -> None:
submission_id = _submission_id(record['submission_id'])
if (record.get('status') not in ('evaluated', 'pending_review') or not isinstance(record.get('score'), dict)
or not isinstance(record.get('created_at'), str) or not record['created_at']
or not isinstance(predictions, bytes)):
raise ValueError()
payload = _json_bytes(record)
if self.api is not None:
from huggingface_hub import CommitOperationAdd
info = self._private_info()
prefix = f'submissions/{submission_id}/'
files = self.api.list_repo_files(repo_id=self.repo_id, repo_type='dataset',
token=self.token, revision=info.sha)
if any(name.startswith(prefix) for name in files):
raise ValueError()
self.api.create_commit(
repo_id=self.repo_id, repo_type='dataset', token=self.token,
parent_commit=info.sha, commit_message='Save private submission',
operations=[CommitOperationAdd(path_in_repo=prefix + 'predictions.jsonl',
path_or_fileobj=predictions),
CommitOperationAdd(path_in_repo=prefix + 'record.json', path_or_fileobj=payload)])
return
self.root.mkdir(parents=True, exist_ok=True, mode=0o700)
destination = self._local_path(submission_id)
staging = Path(tempfile.mkdtemp(prefix='.staging-', dir=self.root))
try:
for name, content in [('predictions.jsonl', predictions), ('record.json', payload)]:
with (staging / name).open('xb') as handle:
os.chmod(staging / name, 0o600)
handle.write(content)
handle.flush()
os.fsync(handle.fileno())
if destination.exists():
raise ValueError()
staging.rename(destination)
finally:
if staging.exists():
shutil.rmtree(staging)
def _read(self, submission_id, filename):
submission_id = _submission_id(submission_id)
if self.api is None:
return self._local_path(submission_id, filename).read_bytes()
from huggingface_hub import hf_hub_download
info = self._private_info()
path = hf_hub_download(repo_id=self.repo_id, repo_type='dataset', token=self.token,
revision=info.sha, filename=f'submissions/{submission_id}/{filename}')
return Path(path).read_bytes()
@_private_errors
def load(self, submission_id: str) -> dict:
record = json.loads(self._read(submission_id, 'record.json'))
if record['submission_id'] != submission_id:
raise ValueError()
return record
@_private_errors
def read_predictions(self, submission_id: str) -> bytes:
return self._read(submission_id, 'predictions.jsonl')
@_private_errors
def list_records(self, *, include_closed: bool = False) -> list[dict]:
if self.api is not None:
info = self._private_info()
files = self.api.list_repo_files(repo_id=self.repo_id, repo_type='dataset',
token=self.token, revision=info.sha)
ids = [name.split('/')[1] for name in files
if re.fullmatch(r'submissions/[0-9a-f]{32}/record.json', name)]
else:
ids = [path.name for path in self.root.iterdir()
if re.fullmatch(r'[0-9a-f]{32}', path.name)] if self.root.exists() else []
records = [self.load(value) for value in sorted(ids)]
if self.api is not None and not include_closed and any(
record.get('review_request', {}).get('issue_number') is not None for record in records):
closed = {discussion.num for discussion in self.api.get_repo_discussions(
repo_id=self.repo_id, repo_type='dataset', token=self.token)
if not discussion.is_pull_request and discussion.status == 'closed'}
records = [record for record in records
if record.get('review_request', {}).get('issue_number') not in closed]
return records
@_private_errors
def submit_report(self, submission_id: str) -> dict:
"""Move an evaluated draft to review and create one private Hub Issue."""
submission_id = _submission_id(submission_id)
if self.api is None:
directory_fd = os.open(self._local_path(submission_id), os.O_RDONLY)
try:
fcntl.flock(directory_fd, fcntl.LOCK_EX)
record = self.load(submission_id)
if record['status'] == 'pending_review':
return record.get('review_request', {})
if record['status'] != 'evaluated':
raise ValueError()
request = {'submitted_at': datetime.now(timezone.utc).isoformat(),
'issue_url': None, 'issue_number': None}
record.update(status='pending_review', review_request=request)
self._write_local_record(submission_id, record)
return request
finally:
os.close(directory_fd)
from huggingface_hub import CommitOperationAdd, hf_hub_download
info = self._private_info()
path = hf_hub_download(repo_id=self.repo_id, repo_type='dataset', token=self.token,
revision=info.sha, filename=f'submissions/{submission_id}/record.json')
record = json.loads(Path(path).read_bytes())
if record['submission_id'] != submission_id:
raise ValueError()
if record['status'] == 'pending_review':
return record.get('review_request', {})
if record['status'] != 'evaluated':
raise ValueError()
title, description = _issue_content(record)
issue = next((item for item in self.api.get_repo_discussions(
repo_id=self.repo_id, repo_type='dataset', token=self.token)
if not item.is_pull_request and item.title == title), None)
if issue is None:
issue = self.api.create_discussion(
repo_id=self.repo_id, repo_type='dataset', token=self.token,
title=title, description=description, pull_request=False)
request = {'submitted_at': datetime.now(timezone.utc).isoformat(),
'issue_url': issue.url, 'issue_number': issue.num}
record.update(status='pending_review', review_request=request)
self.api.create_commit(
repo_id=self.repo_id, repo_type='dataset', token=self.token,
parent_commit=info.sha, commit_message='Submit evaluation report for review',
operations=[CommitOperationAdd(
path_in_repo=f'submissions/{submission_id}/record.json',
path_or_fileobj=_json_bytes(record))])
return request
def _write_local_record(self, submission_id, record):
directory = self._local_path(submission_id)
fd, temporary = tempfile.mkstemp(prefix='.record-', dir=directory)
try:
with os.fdopen(fd, 'wb') as handle:
handle.write(_json_bytes(record))
handle.flush()
os.fsync(handle.fileno())
os.replace(temporary, self._local_path(submission_id, 'record.json'))
finally:
Path(temporary).unlink(missing_ok=True)
@_private_errors
def decide(self, submission_id: str, status: str, reviewer: str,
parent_commit: str | None = None) -> None:
if self.api is not None:
return self._decide(submission_id, status, reviewer, parent_commit)
directory_fd = os.open(self._local_path(submission_id), os.O_RDONLY)
try:
fcntl.flock(directory_fd, fcntl.LOCK_EX)
return self._decide(submission_id, status, reviewer, parent_commit)
finally:
os.close(directory_fd)
def _decide(self, submission_id, status, reviewer, parent_commit):
if status not in ('rejected', 'approved_for_publication') or not reviewer.strip():
raise ValueError()
# Pin remote read and write to the same revision to avoid lost decisions.
info = self._private_info() if self.api is not None else None
if info is not None:
from huggingface_hub import CommitOperationAdd, hf_hub_download
revision = parent_commit or info.sha
path = hf_hub_download(repo_id=self.repo_id, repo_type='dataset', token=self.token,
revision=revision, filename=f'submissions/{_submission_id(submission_id)}/record.json')
record = json.loads(Path(path).read_bytes())
else:
record = self.load(submission_id)
if record['submission_id'] != submission_id or record['status'] != 'pending_review':
raise ValueError()
record.update(status=status, review={'reviewer': reviewer,
'reviewed_at': datetime.now(timezone.utc).isoformat()})
payload = _json_bytes(record)
if info is not None:
self._private_info()
self.api.create_commit(repo_id=self.repo_id, repo_type='dataset', token=self.token,
parent_commit=revision, commit_message='Record private review decision',
operations=[CommitOperationAdd(
path_in_repo=f'submissions/{submission_id}/record.json',
path_or_fileobj=payload)])
else:
self._write_local_record(submission_id, record)