Local Execution
vr.dev is designed to run entirely locally. No API server required. No dependency on vr.dev infrastructure in the hot path. No cloud lock-in.
Why Local?
RL training loops run thousands of episodes. Each episode needs fast, deterministic reward computation. HTTP overhead kills throughput.
Note: "Local" means no dependency on the hosted API. HARD verifiers may still talk directly to target systems (databases, filesystems, HTTP endpoints) unless you use BYOS/pre_result to avoid all live I/O. AGENTIC verifiers require network access to probe external services (browsers, IMAP, etc.).
SDK-First Architecture
The vrdev Python SDK contains all verifier logic. The API server is optional - it wraps the same SDK for remote access.
# This runs 100% locally - no HTTP, no API key needed
from vrdev import get_verifier, VerifierInput
v = get_verifier("vr/code.python.tests_pass")
result = v.verify(VerifierInput(
completions=["Tests pass"],
ground_truth={"repo": ".", "test_cmd": "pytest"},
))
Local + BYOS = Maximum Speed
Combine local execution with pre_result for sub-millisecond verification:
# No database, no HTTP, no filesystem - pure computation
v = get_verifier("vr/database.row.exists")
result = v.verify(VerifierInput(
completions=["Row inserted"],
ground_truth={
"table": "users",
"match_columns": {"id": 1},
"pre_result": {"exists": True},
},
))
# Takes < 0.1ms
When to Use the API Server
The API server (vr-api) is useful for:
- Multi-language teams: Call from TypeScript, Go, Rust via REST
- Centralized evidence storage: Evidence records stored in one place
- Dashboard: View verification history and statistics
- CI/CD integration: Webhook-based verification triggers
Installation for Local Use
pip install vrdev
That's it. No Docker, no database, no API keys. The SDK includes all 38 verifiers.
RL Framework Integration
# TRL integration - local, no hosted-API dependency
from vrdev import get_verifier, compose, export_to_trl
from vrdev.core.types import PolicyMode
pipeline = compose(
[get_verifier("vr/tau2.retail.order_cancelled"),
get_verifier("vr/tau2.retail.refund_processed")],
policy_mode=PolicyMode.FAIL_CLOSED,
)
# Verify batch of episodes
results = [pipeline.verify(episode) for episode in episodes]
# Export to TRL reward format
export_to_trl(results, output="rewards.jsonl")