This repository contains the Valkyrie benchmark-service adapter for
SkillsBench. It is intended to be consumed by
vals-ai/public-benchmark-services-registry as the skillsbench service.
For the full porting guide, see PORTING.md.
The adapter exposes SkillsBench task directories through the public
benchmark_service.BenchmarkService contract used by Valkyrie:
retrieve_task()mapstask.tomlto a sandbox image/snapshot, resources, working directory, and agent timeout.setup_task()writesinstruction.mdto the sandbox and can optionally injectenvironment/skills/for paired with-skills runs.evaluate_instance()uploadstests/after the agent run, executes/tests/test.sh, and parses/logs/verifier/reward.txtor/logs/verifier/reward.json.calculate_final_score()aggregates task rewards into a Valkyrie final score.
The service currently exposes these datasets:
default: tasks fromtasks/, no skills injected.with-skills: tasks fromtasks/, injectsenvironment/skills/when a task has skills.extra: tasks fromtasks-extra/, no skills injected.extra-with-skills: tasks fromtasks-extra/, injects skills when present.
tasks-extra/ remains opt-in because many of those tasks require credentials,
GPU resources, or external integrations.
The SkillsBench task source is included as the skillsbench/ git submodule.
The service automatically discovers that submodule. To point at another checkout
or mounted dataset, set:
export SKILLSBENCH_REPO_ROOT=/path/to/skillsbenchValkyrie creates sandboxes from an image or snapshot. SkillsBench stores
per-task Dockerfiles, so production use should prebuild each
tasks/<task>/environment/Dockerfile and provide an image manifest.
Set:
export SKILLSBENCH_REPO_ROOT=/path/to/skillsbench
export SKILLSBENCH_VALKYRIE_IMAGE_MANIFEST=/path/to/image-manifest.jsonManifest shape:
{
"default_image": "python:3.12-slim",
"tasks": {
"latex-formula-extraction": {
"image": "ghcr.io/benchflow-ai/skillsbench-latex-formula-extraction:sha",
"cwd": "/root",
"resources": { "vcpu": 4, "memory": 10, "disk": 20 }
},
"some-snapshot-task": {
"snapshot": "skillsbench-some-snapshot-task-sha"
}
}
}If no manifest entry exists, the service falls back to
SKILLSBENCH_VALKYRIE_DEFAULT_IMAGE and then python:3.12-slim. That fallback
is only useful for smoke tests or very simple tasks; real SkillsBench tasks need
their Dockerfiles prebuilt.
Build a small verification slice and write the manifest:
python scripts/build_task_images.py \
--registry <account>.dkr.ecr.us-east-1.amazonaws.com/skillsbench-task-images \
--output image-manifest.json \
--push \
dialogue-parser llm-prefix-cache-replayFor hosted Valkyrie/Daytona, publish images to a registry Daytona can pull without local Docker credentials and build for the hosted runner platform:
python scripts/build_task_images.py \
--registry public.ecr.aws/<alias>/skillsbench-task-images \
--output image-manifest.json \
--platform linux/amd64 \
--push \
dialogue-parser llm-prefix-cache-replayuv sync --locked
uv run uvicorn skillsbench_valkyrie.main:app --host 127.0.0.1 --port 8001Then register the service with Valkyrie:
valkyrie config service set skillsbench http://localhost:8001For public Valkyrie runs, expose the service through the usual tunnel or deployment path accepted by your Valkyrie environment.
The corresponding public-benchmark-services-registry entry should point to
this repository as an HTTPS submodule:
services:
skillsbench:
path: skillsbench-benchmark-service
repository: https://github.com/benchflow-ai/skillsbench-benchmark-service.git
branch: main
public_dependencies:
- create-benchmark-service
- skillsbench
dataset_submodules:
- https://github.com/benchflow-ai/skillsbench.gitThis port was completed primarily by an agent using the Valkyrie onboarding doc,
create-benchmark-service, and examples from the public benchmark registry.
The process was mostly hands-off once the benchmark-service contract was clear.
Useful improvements for future agent-assisted ports:
- Put the "registry PR" end state directly in the onboarding checklist: create a
standalone benchmark-service repo, then add it as a submodule and
services.yamlentry inpublic-benchmark-services-registry. - Make the required production image strategy explicit. SkillsBench needs one pullable image or snapshot per task because every task has its own Dockerfile.
- Call out that hosted Daytona runners need public or otherwise pullable
linux/amd64images. Private ECR images fail late and can look like sandbox naming/retry issues. - Include a minimal working
DockerfileandMakefilein the scaffold so the service can be deployed without reverse-engineering the ASGI command. - Include a checklist for leakage safety: upload
tests/only inevaluate_instance, keepsolution/out of the sandbox, and inject skills only for with-skills datasets.