FiftyOne Remote Model Zoo — Integration Guide
When to use
Triggers: new remote zoo source; debugging an existing one; registration "succeeds" but model not loadable; ModuleNotFoundError from DataLoader workers; custom fom.Model / TorchModelMixin; VLM/structured-output integrations.
Not this skill: plugins, operators, panels, brain methods. Route via Phase 0.
Phase 0 — Confirm the integration surface
| User wants to… |
Surface |
Skill |
Apply a model (dataset.apply_model) |
Remote zoo model |
this skill |
| UI panels, buttons, side-effects |
Plugin / operator |
fiftyone-develop-plugin |
| Embeddings, similarity, uniqueness |
Brain method |
brain docs |
Required output: one-line confirmation. Example: "Zoo model integration because user wants dataset.apply_model(model) to write predictions." If you cannot write that line, stop.
Phase 1 — Scaffold
Copy template/:
manifest.json — top-level name required (silent skip if missing).
__init__.py — exports download_model, load_model, optional resolve_input. Relative imports: from .zoo import ....
zoo.py — config + model class.
Phase 2 — Implement
- Class hierarchy, properties, predict/predict_all input dispatch → MODEL-CLASS.md.
- Label return types, single-
fo.Label rule, coordinates → LABEL-TYPES.md.
- DataLoader pickle, worker import resolution → DATALOADER.md.
- VLM / generative-structured-output (uses
generate() with prompts/schemas) → also VLM-PATTERNS.md.
Phase 3 — Validate
On failure, route by symptom:
| Symptom |
First look at |
Registration "succeeds" but load_zoo_model fails |
MANIFEST.md, MODEL-CLASS.md |
ModuleNotFoundError / pickle error from workers |
DATALOADER.md |
| Predictions in unexpected fields or not stored |
LABEL-TYPES.md |
| Spatial outputs (boxes/points) in wrong location |
LABEL-TYPES.md; VLM: VLM-PATTERNS.md |
| Output is schema-correct but values are wrong |
DEBUGGING-PRINCIPLES.md — Schema compliance ≠ correctness |
| Backend / device error (OOM, op unimplemented) |
DEBUGGING-PRINCIPLES.md — Document upstream constraints |
Key Directives
Canonical names; other files cite by name. Full failure modes and diagnostic moves in DEBUGGING-PRINCIPLES.md.
- Runtime parameters are setters. NEVER make users reconstruct the model to change a
generate() / forward kwarg, a prompt, an operation selector, or a post-processing threshold. Why: weights are large; anything that feeds into model(...) is per-call input, not model identity.
- Framework-first. ALWAYS use FiftyOne primitives before custom code. Why: framework classes are worker-importable; yours aren't.
- Worker-pickle constraint. NEVER define pickle-bound objects in
zoo.py. Why: spawned DataLoader workers can't import modules loaded via importlib.util.spec_from_file_location.
- Reference implementations need verification. NEVER copy a pattern from another zoo source without running it under multi-worker first. Why: widely-copied references silently break.
- Schema compliance ≠ correctness. NEVER trust schema-conformant outputs as proof of correctness. Why: models echo your wrong field names back unchanged.
- Read specs, don't patch parsers. NEVER patch a parser more than twice — find the format spec. Why: each patch shifts the failure elsewhere; the cycle is unbounded.
- Bounded repair scope. NEVER grow repair logic past a few common malformations. Why: unbounded repair masks model-quality regressions.
Quick reference index
- MANIFEST.md — schema, entry points, idempotent
download_model.
- MODEL-CLASS.md — hierarchy, properties, predict dispatch.
- DATALOADER.md — worker pickle WHY, primitives, wrong fixes that look right.
- LABEL-TYPES.md — return types, coordinate normalization.
- DEBUGGING-PRINCIPLES.md — six rules with failure modes and diagnostic moves.
- VLM-PATTERNS.md — tool calling, generation budget, thinking, vision tokens, delimiters, multi-tier parser, coordinate quirks.
1---2name: fiftyone-zoo-remote-model3description: Use when integrating a model into FiftyOne's remote model zoo — detection, classification, segmentation, embedding, keypoint, or vision-language (VLM) models loaded via `register_zoo_model_source` and `load_zoo_model`, then applied with `dataset.apply_model`. Also for debugging zoo registration, `manifest.json` issues, custom `fom.Model` / `TorchModelMixin` subclasses, DataLoader pickle errors, or worker `ModuleNotFoundError` from spawned DataLoader workers.4---56# FiftyOne Remote Model Zoo — Integration Guide78## When to use910Triggers: new remote zoo source; debugging an existing one; registration "succeeds" but model not loadable; `ModuleNotFoundError` from DataLoader workers; custom `fom.Model` / `TorchModelMixin`; VLM/structured-output integrations.1112Not this skill: plugins, operators, panels, brain methods. Route via Phase 0.1314## Phase 0 — Confirm the integration surface1516| User wants to… | Surface | Skill |17|---|---|---|18| Apply a model (`dataset.apply_model`) | Remote zoo model | this skill |19| UI panels, buttons, side-effects | Plugin / operator | `fiftyone-develop-plugin` |20| Embeddings, similarity, uniqueness | Brain method | brain docs |2122**Required output**: one-line confirmation. Example: "Zoo model integration because user wants `dataset.apply_model(model)` to write predictions." If you cannot write that line, stop.2324## Phase 1 — Scaffold2526Copy `template/`:2728- `manifest.json` — top-level `name` required (silent skip if missing).29- `__init__.py` — exports `download_model`, `load_model`, optional `resolve_input`. Relative imports: `from .zoo import ...`.30- `zoo.py` — config + model class.3132## Phase 2 — Implement3334- Class hierarchy, properties, predict/predict_all input dispatch → [MODEL-CLASS.md](references/MODEL-CLASS.md).35- Label return types, single-`fo.Label` rule, coordinates → [LABEL-TYPES.md](references/LABEL-TYPES.md).36- DataLoader pickle, worker import resolution → [DATALOADER.md](references/DATALOADER.md).37- **VLM / generative-structured-output** (uses `generate()` with prompts/schemas) → also [VLM-PATTERNS.md](references/VLM-PATTERNS.md).3839## Phase 3 — Validate4041- [ ] `manifest.json` has top-level `name`.42- [ ] `__init__.py` uses relative imports.43- [ ] Image ops return single `fo.Label` (dicts only for video frame-level, integer keys).44- [ ] One-known-example coordinate check passed.45- [ ] `dataset.apply_model(model)` runs with default `num_workers`.46- [ ] On macOS, run `dataset.apply_model(model, ...)` with default `num_workers` and confirm no `ModuleNotFoundError` from spawned workers.4748**On failure**, route by symptom:4950| Symptom | First look at |51|---|---|52| Registration "succeeds" but `load_zoo_model` fails | [MANIFEST.md](references/MANIFEST.md), [MODEL-CLASS.md](references/MODEL-CLASS.md) |53| `ModuleNotFoundError` / pickle error from workers | [DATALOADER.md](references/DATALOADER.md) |54| Predictions in unexpected fields or not stored | [LABEL-TYPES.md](references/LABEL-TYPES.md) |55| Spatial outputs (boxes/points) in wrong location | [LABEL-TYPES.md](references/LABEL-TYPES.md); VLM: [VLM-PATTERNS.md](references/VLM-PATTERNS.md) |56| Output is schema-correct but values are wrong | [DEBUGGING-PRINCIPLES.md](references/DEBUGGING-PRINCIPLES.md) — *Schema compliance ≠ correctness* |57| Backend / device error (OOM, op unimplemented) | [DEBUGGING-PRINCIPLES.md](references/DEBUGGING-PRINCIPLES.md) — *Document upstream constraints* |5859## Key Directives6061Canonical names; other files cite by name. Full failure modes and diagnostic moves in [DEBUGGING-PRINCIPLES.md](references/DEBUGGING-PRINCIPLES.md).6263- **Runtime parameters are setters.** NEVER make users reconstruct the model to change a `generate()` / forward kwarg, a prompt, an operation selector, or a post-processing threshold. *Why:* weights are large; anything that feeds into `model(...)` is per-call input, not model identity.64- **Framework-first.** ALWAYS use FiftyOne primitives before custom code. *Why:* framework classes are worker-importable; yours aren't.65- **Worker-pickle constraint.** NEVER define pickle-bound objects in `zoo.py`. *Why:* spawned DataLoader workers can't import modules loaded via `importlib.util.spec_from_file_location`.66- **Reference implementations need verification.** NEVER copy a pattern from another zoo source without running it under multi-worker first. *Why:* widely-copied references silently break.67- **Schema compliance ≠ correctness.** NEVER trust schema-conformant outputs as proof of correctness. *Why:* models echo your wrong field names back unchanged.68- **Read specs, don't patch parsers.** NEVER patch a parser more than twice — find the format spec. *Why:* each patch shifts the failure elsewhere; the cycle is unbounded.69- **Bounded repair scope.** NEVER grow repair logic past a few common malformations. *Why:* unbounded repair masks model-quality regressions.7071## Quick reference index7273- [MANIFEST.md](references/MANIFEST.md) — schema, entry points, idempotent `download_model`.74- [MODEL-CLASS.md](references/MODEL-CLASS.md) — hierarchy, properties, predict dispatch.75- [DATALOADER.md](references/DATALOADER.md) — worker pickle WHY, primitives, wrong fixes that look right.76- [LABEL-TYPES.md](references/LABEL-TYPES.md) — return types, coordinate normalization.77- [DEBUGGING-PRINCIPLES.md](references/DEBUGGING-PRINCIPLES.md) — six rules with failure modes and diagnostic moves.78- [VLM-PATTERNS.md](references/VLM-PATTERNS.md) — tool calling, generation budget, thinking, vision tokens, delimiters, multi-tier parser, coordinate quirks.