TurboVision is Score's decentralized intelligence layer for live video and imagery. The network pairs expert models with a global community of validators and miners so raw footage becomes structured, decision-ready data in real time, with early deployments focused on professional sports.
- Validators keep the network honest by scoring submitted models on live data. Read VALIDATOR.md.
- Miners contribute models that solve Elements in the Manifest. Read MINER.md.
Install the CLI, create a coldkey and hotkey, then copy the hotkey folder and public coldkey (coldkeypub.txt) onto every host that will run TurboVision.
pip install bittensor-cli
btcli wallet new_coldkey --n_words 24 --wallet.name my-wallet
btcli wallet new_hotkey --wallet.name my-wallet --n_words 24 --wallet.hotkey my-hotkey
cp env.example .envSet these in .env:
BITTENSOR_WALLET_COLDBITTENSOR_WALLET_HOTCHUTES_API_KEYHUGGINGFACE_USERNAMEHUGGINGFACE_API_KEY
Upgrade to a developer-enabled account on chutes.ai, install the CLI, register, and mint an API key. Store it as CHUTES_API_KEY.
pip install -U chutes
chutes registerCreate (or reuse) a Hugging Face account, generate a token with write access, and set HUGGINGFACE_USERNAME and HUGGINGFACE_API_KEY.
Install the CLI with uv, then sync dependencies and verify the binary:
curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv && source .venv/bin/activate
uv sync
svThe runner executes scoring jobs per Element on a fixed block cadence. It fetches a challenge, builds ground truth (real or pseudo), scores miners, and emits results to R2.
sv -vv runnerFlow (per Element run):
- Load the active Manifest.
- Pull a challenge for the current
element_id. - Determine the window ID and start block for timing metadata.
- Build ground truth:
- If
elements[].ground_truth=true, fetch real GT from the API. - Otherwise generate pseudo-GT locally (SAM3).
- If
- Call eligible miners (from on-chain registry) and score outputs.
- Emit a shard to R2 with evaluation payload + metadata.
Scheduling:
- Runner keeps per-element timers based on
elements[].window_block(ortempo). - If an Element does not define a cadence, it uses
SV_DEFAULT_ELEMENT_TEMPO_BLOCKS(default300). - When the manifest changes, runner rebuilds its per-element schedule.
Quality gates:
- Pseudo-GT is retried until enough frames meet bbox thresholds.
- Tune retries with
SV_PGT_MAX_BBOX_RETRIESandSV_PGT_MAX_QUALITY_RETRIES.
The validator aggregates recent scores per Element, chooses winners, and submits weights on-chain via the signer service.
sv -vv validate --manifest-path path/to/manifest.ymlFlow (per window):
- Load the active Manifest for the current block.
- For each Element:
- Determine how far back to look using
elements[].eval_window(days). - Pull recent scores for that Element and window.
- Select the winner and build a per-element weight share.
- Determine how far back to look using
- Normalize total weights to 1.0 (add fallback weight if needed).
- Submit
uids+weightsto the signer. - Optionally snapshot winners to R2.
Behavior knobs:
elements[].eval_windowcontrols lookback in days (converted to blocks).elements[].weightcontrols the Element share of final weights.- Hotkey blacklist is loaded from
manifest_update/blacklist(one hotkey per line,#for comments). - Startup commit:
SCOREVISION_COMMIT_VALIDATOR_ON_START=1publishes the validator index. - Winners snapshots are emitted on every successful
set_weights(central validator only).
- Score Website
- File issues or ideas in this repo.