Jev robot control

September 19, 2026 ยท View on GitHub

Jev vs GPT-6 Astra vs GPT-4.1 mini: direct Cartesian control of an xArm7 in MuJoCo.

One apple. One plate. Each controller chooses an intent, then X/Y/Z movement directions and a gripper command. The shared executor applies one small motion increment and returns physical feedback. This repository includes the code, original recorded responses and trajectories, an offline verifier, and a synchronized three-column replay.

Watch/download the comparison

Final comparison

Recorded result

ControllerOutcomeCyclesAPI callsAPI costWall timeSimulation time
Jev 1.13Placed113226$0.018825181.847 s36.16 s
GPT-6 Astra, low reasoningPlaced106212$5.933624707.274 s33.92 s
GPT-4.1 mini160-cycle limit reached160320$0.288512704.253 s51.20 s

These are one seed-0 trial per controller, not success-rate estimates. The Jev/GPT-6 recordings are the latest paired run; mini is from the earlier paired run with the same initial scene, physics, action instructions and cycle budget. See the protocol and source IDs.

In these recordings, Jev's API cost was about 1/315 of GPT-6's and its wall time about 26%; GPT-6 used seven fewer control cycles. Model availability, provider pricing, network timing and fresh responses can change future results.

1. Replay the published recordings

Only Python 3.12 and the files in this repository are needed for the recorded web replay. No API key or GPU is required:

git clone https://github.com/openroboto-ai/jev-robot-control.git
cd jev-robot-control
python incremental_triple_app.py --port 8773

Open http://127.0.0.1:8773/. Click Play or Replay from start. The page aligns simulation time and holds each completed controller's actual final frame. Costs and wall times update from recorded responses. API waiting is excluded from playback and included in the wall-time metric. The server binds to loopback and offers read-only replay; it makes no model calls.

2. Verify the physical trajectories offline

Create a Python 3.12 virtual environment and install the pinned dependencies:

python -m venv .venv
# Linux/macOS:
source .venv/bin/activate
# Windows PowerShell: .venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
python check_manifest.py
python -m unittest discover -s . -p test_incremental.py -v
python verify_replay.py --output runs/replay-verification.json

The verifier checks archived source hashes, every recorded question and observation, command validation, costs and counts. It re-executes each recorded motor command in MuJoCo and compares every saved joint/fruit state (qpos) with a 1e-7 tolerance. It also checks the physical success result. No API calls, renderer, display server or learned weights are needed.

The reference run used Python 3.12 on Windows with MuJoCo 3.13.0. Dependency versions are pinned in requirements.txt. Cross-platform floating-point behavior may differ; the verifier reports differences rather than hiding them.

3. Run new model trials

New trials call OpenRouter and incur provider charges. Put your own key in the process environment or copy .env.example to .env and edit it locally. Never commit a key. Access to the listed models, including the experimental Jev decisions endpoint, is required. A model or endpoint error ends that trial; there is no silent fallback to another model.

# One controller; no OpenGL renderer required:
python reproduce.py --controller jev --seed 0 --no-render
python reproduce.py --controller gpt6 --seed 0 --no-render
python reproduce.py --controller mini --seed 0 --no-render

# All three, sequentially, including new MP4 recordings:
python reproduce.py --controller all --seed 0

Each independent trial starts from the same scene. Fresh outputs go into a new timestamped directory under runs/; the published examples stay unchanged. Use --max-cycles or --output-dir for an explicit budget or output location. The three-controller convenience command is sequential, so its wall timings are not a reconstruction of the original concurrent paired execution.

For the original two-controller live UI and concurrent independent simulations:

python incremental_compare_app.py --port 8774 --env-file .env --llm-model openai/gpt-6-astra --reasoning-effort low --pair-root runs/gpt6-pairs

Open http://127.0.0.1:8774/ and click Run comparison. Substitute openai/gpt-4.1-mini to run the earlier comparator. Rendering uses OpenGL. On a headless Linux host, configure an appropriate MuJoCo GL backend (for example MUJOCO_GL=egl with a working EGL driver), or use --no-render in reproduce.py.

What the models control

Each decision cycle uses two sequential model calls:

  1. Intent: approach, grasp, lift, carry, lower, release, withdraw or finish.
  2. Motor channels: X/Y/Z each select negative, hold or positive; the gripper selects open, hold or close.

The model selects direction, not arbitrary absolute XYZ coordinates or joint torques. The shared executor scales step magnitude to 18, 4 or 2 mm near geometric targets, preserving the selected signs. It uses fixed-orientation inverse kinematics, workspace bounds and a 0.32-second physics increment.

Observations are structured simulator geometry, signed errors, alignment checks and contact feedback. They are not camera perception. Detailed action criteria are included in the prompts. No VLA, complete scripted pick-and-place skill, object teleportation or injected random grasp failure is used in these runs.

Physical success requires the apple to rest in the plate for at least 0.4 seconds, the gripper to be open, and TCP height to reach at least 145 mm. The prompt's withdraw/finish guidance is 160โ€“170 mm; the physical stop threshold is the actual 145 mm criterion in the recorded implementation.

Model configuration and probabilities

  • Jev: requested typesafe/jev-1.13, resolved to typesafe/jev-1.13-20260917 in the latest pair; native decisions endpoint.
  • GPT-6: openai/gpt-6-astra, reasoning_effort=low, max_completion_tokens=4096, no temperature parameter, strict JSON schema.
  • Mini: openai/gpt-4.1-mini, temperature=0, max_tokens=850, strict JSON schema.
  • Requests use OpenRouter. Latest code uses a 90-second HTTP timeout. The earlier mini archive used 35 seconds; no published trial ended in an API error.

Jev bars are native model probability outputs. GPT bars are self-reported numbers in JSON. Neither is a calibrated probability of physical task success, and the values should not be compared as confidence scores across models.

Repository map

PathPurpose
incremental_env.py, simulation.pyScene, contacts, incremental physics, IK
incremental_policy.pyFull prompts, criteria, provider adapters, validation
incremental_run.py, reproduce.pyOnline trials and response/trajectory logs
incremental_pair.py, incremental_compare_app.pyConcurrent paired live runs
incremental_triple_*Read-only three-controller archive replay
verify_replay.py, test_incremental.pyOffline physical replay and tests
check_manifest.py, MANIFEST.sha256Code, recording and asset integrity
incremental-*-comparisons/Original records, videos, source snapshots
robot/Vendored xArm7 model and meshes, with original BSD license
docs/, verification/, media/Results, audit reports and rendered video

Original source snapshots are kept byte-for-byte for hash verification. The public runtime extracts only the IK helper and environment loader from earlier demo modules; physical replay verifies that this packaging preserves behavior.

License and attribution

OpenRoboto code: MIT. Robot description/meshes: UFACTORY BSD-3-Clause, via MuJoCo Menagerie; see third-party notices.

Inspired by the Jev Cartesian-control demonstration. This repository contains the simulation experiment and API adapters, not Jev model weights or real-robot deployment code.