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")
Local Execution | vr.dev Docs