Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Create and validate Earth2Studio data source wrappers (DataSource, ForecastSource, DataFrameSource, ForecastFrameSource) from remote stores. Do NOT use for fetching data with existing sources, model inference, or installation tasks.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 61% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 34% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 944% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 186% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 221% | 0% |
End-to-end workflow for implementing a new Earth2Studio data source wrapper that connects a remote data store (S3, GCS, Azure, HTTP, HuggingFace) to Earth2Studio's async data fetching infrastructure — from analysis through implementation, testing, validation, and PR submission.
uv (uv run python must work)origin) and upstream (upstream) remotesUse the directory containing pyproject.toml. For Harbor evals, write to /workspace/output/ preserving paths. Never read evals/targets/.
> Python Environment: Always use uv run python or the local .venv. > Never use the system Python directly.
Follow every step in order.
> CONFIRM] gates: Only Step 1 (Source Type) and Step 12 (Sanity-Check > Plots) require explicit user approval. All other [CONFIRM] markers are > advisory — present decisions inline and proceed without blocking. > > Deliverables first: Write the source file and test file (Steps 6–7) > before extended exploration, documentation, registration, CHANGELOG, or PR > work. Skip Steps 8–14 when the user asks for implementation only. > > Before you finish: Run verification commands in the repo root so results > appear in the session log: > > bash > uv run pytest test/data/test_<source>.py -x > make format && make lint > > > Be concise: Avoid long architecture reports; summarize decisions in a > few sentences and move on to file writes. > > Hangs or User Feedback If agent becomes stuck or user provides a > correction during this skills use, conservatively review relevant part of > the skill and improve. Be concise. > > One source type per invocation. Invoke again for companion types.
Load these on demand during the relevant steps:
| File | Content | Load at | |---|---|---| | references/implementation-guide.py | Skeleton source with FILL comments | Steps 3–10 | | references/testing-guide.py | Test skeleton with FILL comments | Step 11 | | references/validation-guide.md | Plot templates, PR body template, Greptile handling | Steps 12–14 (optional, for templates) |
textStep 0: Obtain reference → Step 1: Determine type → Step 2: Dependencies → Step 3: Add deps → Step 4: Create lexicon → Step 5: Update vocab/schema → Step 6: Create skeleton → Step 7: Implement source → Step 8: Register → Step 9: Documentation → Step 10: CHANGELOG → Step 11: Tests → Step 12: Validate & plots (user confirms) → Step 13: PR + sanity comment → Step 14: Greptile review
If $ARGUMENTS is provided, use it (URL → WebFetch; file path → read).
If empty, ask:
> Please provide a URL, API documentation link, or description of the > remote data store. This will be used to understand storage format, > access pattern, variable inventory, temporal/spatial resolution.
| Protocol | Returns | Has lead_time? | Use | |---|---|---|---| | DataSource | xr.DataArray | No | Gridded analysis/reanalysis | | ForecastSource | xr.DataArray | Yes | Gridded forecast | | DataFrameSource | pd.DataFrame | No | Sparse/station obs | | ForecastFrameSource | pd.DataFrame | Yes | Sparse forecast obs |
Key factors: gridded vs sparse → DataArray vs DataFrame; analysis vs forecast → Source vs ForecastSource.
Present recommended type with justification. Ask for confirmation.
Analyze: storage backend, file format, authentication, access pattern, temporal/spatial resolution, variable inventory.
Prefer fsspec:
| Backend | Preferred | Avoid | |---|---|---| | AWS S3 | s3fs (core dep) | boto3 directly | | GCS | gcsfs (core dep) | google-cloud-storage | | Azure | adlfs | azure-storage-blob | | HTTP | fsspec (core dep) | requests | | HuggingFace | huggingface_hub (core dep) | custom scripts |
Only fall back to dedicated libraries when fsspec cannot access the store.
Check pyproject.toml — only propose packages not already present. Core deps include: s3fs, gcsfs, fsspec, zarr, netCDF4, h5py, pygrib, huggingface-hub, pandas, pyarrow.
Present: backend, fsspec filesystem, new packages (with license), auth method.
> Load references/implementation-guide.py from here through Step 10.
If new packages needed:
uv add --extra data <package>uv lockOptionalDependencyFailure patternCreate earth2studio/lexicon/<source_name>.py with:
metaclass=LexiconTypeVOCAB: dict[str, str] mapping E2S names → remote keysget_item(cls, val) returning tuple[str, Callable]:: separator for structured keysMap remote variables against E2STUDIO_VOCAB (282 entries in earth2studio/lexicon/base.py).
Present: class name, key format, full mapping table, modifiers, reference URL.
{name}{level}E2STUDIO_SCHEMASkip if no updates needed.
Follow canonical method ordering:
__init___async_init__call__fetch_create_tasksfetch_wrapperfetch_array_validate_timecache propertyavailable classmethodUse async task dataclass pattern for parallel execution.
Present: class name, file path, skeleton code, task dataclass.
> The test file is a co-equal deliverable. Create test/data/test_<filename>.py > alongside the source. Add test_<source>_call_mock for async sources.
Sync sources: Use prep_data_inputs/prep_forecast_inputs, direct __call__.
Async sources: See references/implementation-guide.py for required patterns: _sync_async, managed_session, gather_with_concurrency, async_retry, pure async I/O, try/finally cleanup. Constructor params: cache=True, verbose=True, async_timeout=600, async_workers=16, retries=3. DataFrame sources add time_tolerance.
earth2studio/data/__init__.py — alphabetical importearth2studio/lexicon/__init__.py — alphabetical importpyproject.toml depsdatasources_analysis.rst / _forecast.rst / _dataframe.rst)Add entry under the current unreleased version. See references/implementation-guide.py REGISTRATION CHECKLIST for the format.
One line per source. Do NOT add separate lexicon entries.
Run make format && make lint && make license. Load references/testing-guide.py for test skeletons. Required tests: test_<source>_fetch (slow), _cache (slow), _call_mock, _exceptions, _available. Target 90%+ coverage with --slow.
Present test file, functions, coverage.
User MUST visually inspect plots. Do not proceed without confirmation.
feat/data-source-<name>gh pr create --repo NVIDIA/earth2studio<details> block<!-- Drag and drop sanity-check image here -->Verify all steps complete before creating PR.
User approves which comments to address.
textUser: Add a data source for the NOAA GFS analysis on S3 Agent: [loads skill, proceeds through Steps 0–14]
DO: uv run python, loguru.logger, alphabetical order in __init__.py/RST/CHANGELOG, canonical method ordering, async utilities (managed_session, gather_with_concurrency, async_retry), pure async I/O, reference URLs in docstrings, try/finally cleanup.
AVOID: asyncio.to_thread, bare tqdm.gather, xarray for loading, full file downloads.
NEVER: loop.set_default_executor(), commit secrets, commit sanity-check scripts/images.
Other measured skills in the registry, with their headline benchmark lift.