Skip to main content
Juniper




Juniper: Dynamic Neural Network Research Platform

Juniper is an AI/ML research platform for investigating dynamic neural network architectures and novel learning paradigms. The project emphasizes ground-up implementations from primary literature, enabling a more transparent exploration of fundamental algorithms.

Juniper Data

juniper-data is the dataset-generation service of the Juniper platform. It is a FastAPI service that produces NPZ-formatted datasets from a catalogue of generators — including the classic two-spiral and concentric-circles problems, XOR and Gaussian mixtures, a CSV/JSON import path, MNIST/Fashion-MNIST, and the ARC-AGI visual-reasoning task families — and serves them through a REST surface that supports a named-version registry, batch creation and export, tag-based filtering, and per-dataset preview. juniper-data is the upstream of both juniper-cascor (training) and juniper-canopy (visualisation): the dataset identifiers it returns are the substrate on which the rest of the platform conducts comparative work.

Distribution

juniper-data is published on PyPI as juniper-data. The package is also surfaced through the platform meta-distribution juniper-ml, which installs the full client stack via pip install juniper-ml[all].

pip install juniper-data

Ecosystem Compatibility

This service is part of the Juniper ecosystem. Verified compatible versions:

juniper-data juniper-cascor juniper-canopy data-client cascor-client cascor-worker
0.6.x 0.5.x 0.5.x >=0.4.1 >=0.4.0 >=0.4.0

For full-stack Docker deployment and integration tests, see juniper-deploy.

Architecture

juniper-data is the foundational data layer of the Juniper ecosystem. Both juniper-cascor and juniper-canopy call juniper-data to generate, version, and retrieve datasets.

┌─────────────────────┐     REST+WS      ┌──────────────────────┐
│   juniper-canopy    │ ◄──────────────► │    juniper-cascor    │
│   Dashboard         │                  │    Training Svc      │
│   Port 8050         │                  │    Port 8200         │
└──────────┬──────────┘                  └──────────┬───────────┘
           │ REST                                   │ REST
           ▼                                        ▼
┌──────────────────────────────────────────────────────────────┐
│                  juniper-data  ◄── (this service)            │
│                  Dataset Service · Port 8100                 │
└──────────────────────────────────────────────────────────────┘

Data contract: datasets are served as NPZ archives with the keys X_train, y_train, X_test, y_test, X_full, y_full, all of dtype float32.

Related Services

Service Relationship Notes
juniper-cascor Consumes juniper-data for training datasets Set JUNIPER_DATA_URL
juniper-canopy Consumes juniper-data for visualisation data Set JUNIPER_DATA_URL
juniper-data-client Python HTTP client for this service pip install juniper-data-client

Service Configuration

Configuration is sourced from juniper_data/api/settings.py (Pydantic BaseSettings, env_prefix="JUNIPER_DATA_"). The complete env-var surface is listed below.

Variable Required Default Description
JUNIPER_DATA_HOST No 127.0.0.1 Bind address (override to 0.0.0.0 for Docker)
JUNIPER_DATA_PORT No 8100 Service port
JUNIPER_DATA_STORAGE_PATH No ./data/datasets Filesystem path for persisted dataset artifacts
JUNIPER_DATA_IMPORT_DIR No /data/imports Filesystem path for CSV/JSON imports
JUNIPER_DATA_LOG_LEVEL No INFO Log verbosity (DEBUG, INFO, WARNING, ERROR)
JUNIPER_DATA_LOG_FORMAT No text text or json (structured logging)
JUNIPER_DATA_CORS_ORIGINS No [] Allowed CORS origins
JUNIPER_DATA_API_KEYS No None Comma-separated or JSON-array API keys; authentication disabled when unset; Docker-secrets file path supported via the implicit *_FILE convention
JUNIPER_DATA_RATE_LIMIT_ENABLED No true Enforce per-IP request rate limiting
JUNIPER_DATA_RATE_LIMIT_REQUESTS_PER_MINUTE No 60 Per-IP rate limit
JUNIPER_DATA_SENTRY_DSN No None Sentry DSN for error tracking
JUNIPER_DATA_SENTRY_SEND_PII No false Whether Sentry should send personally identifiable information
JUNIPER_DATA_SENTRY_TRACES_SAMPLE_RATE No 0.1 Sentry tracing sample rate
JUNIPER_DATA_METRICS_ENABLED No false Expose /metrics for Prometheus scraping
JUNIPER_DATA_METRICS_TRUSTED_IPS No ["127.0.0.1", "::1"] IPs allowed to scrape /metrics

Docker Deployment

# Full stack (recommended) — see juniper-deploy:
git clone https://github.com/pcalnon/juniper-deploy.git  # (private repository)
cd juniper-deploy && docker compose up --build

# Standalone:
docker build -t juniper-data:latest .
docker run --rm -p 8100:8100 -e JUNIPER_DATA_HOST=0.0.0.0 juniper-data:latest

The Dockerfile is multi-stage (Python 3.14-slim builder + runtime). Container health is probed against /v1/health/ready.

Dependency Lockfile

The requirements.lock file pins exact dependency versions for reproducible Docker builds. The pyproject.toml retains flexible >= ranges for local development.

Regenerate after changing dependencies in pyproject.toml:

uv pip compile pyproject.toml --extra api --extra observability -o requirements.lock

The ecosystem-wide lockfile-freshness gate enforces regeneration on every PR that touches pyproject.toml; if regeneration triggers the self-pin trap of uv pip compile -o requirements.lock reading the existing file, compile to /tmp/requirements.lock and mv into place.

Active Research Components

juniper-data contributes three research components to the Juniper platform: the ARC-AGI dataset families (ARC-AGI-1 and ARC-AGI-2), loadable from the Hugging Face Hub or from local copies and exposed through the same NPZ-artifact contract as the simpler generators, which makes them directly usable as the substrate for comparative architecture-growth experiments; the named-version dataset registry (POST /v1/datasets with a name parameter auto-increments meta.dataset_version; GET /v1/datasets/versions and /v1/datasets/latest resolve the history), which gives experiments reproducible dataset references rather than opaque UUIDs; and the dataset-API surface itself — preview, filtering by tags, batch operations, and tag-based metadata queries — which together comprise the operational interface through which platform users compose and curate dataset corpora. The implementation of these surfaces is engineering rather than research; the availability of curated datasets and stable versioned references is itself the research artifact.

Quick Start Guide

Prerequisites

  • Python ≥ 3.12 (Docker image uses 3.14)
  • Conda environment JuniperData
  • For ARC-AGI loading from the Hub: internet access at first load; subsequent loads are cached

Installation

git clone https://github.com/pcalnon/juniper-data.git
cd juniper-data
conda activate JuniperData
pip install -e ".[all]"

The PyPI release is installable via pip install juniper-data; the editable-clone form above is the standard for active development. The optional-dependency extras are api, arc-agi, observability, test, dev, and all.

Verification

Start the service:

uvicorn --factory juniper_data.api.app:get_app --reload

Confirm the service responds:

curl http://localhost:8100/v1/health
curl http://localhost:8100/v1/health/ready
curl http://localhost:8100/v1/generators

Generate a small dataset directly from Python:

from juniper_data.generators.spiral import SpiralGenerator

generator = SpiralGenerator()
dataset = generator.generate(n_points=100, n_spirals=2, noise=0.1)

Next Steps

Research Philosophy

The Juniper platform exists to study learning algorithms whose network architecture is not fixed in advance. Its initial anchor is the Cascade-Correlation algorithm of Fahlman and Lebiere (1990), implemented from the primary literature without recourse to higher-level abstractions that elide the algorithm's operational detail. The organising commitment is that algorithm implementations remain inspectable at the level at which they were originally specified: candidate units, correlation objectives, weight-freezing semantics, and the structural events that grow the network are first-class artifacts of the codebase rather than internal details of a library wrapper. This permits comparative work — across algorithms, datasets, and hyperparameter regimes — to be conducted on a known and reproducible substrate.

The current platform comprises a Cascade-Correlation training service exposing a REST and WebSocket interface, a dataset-generation service with a named-version registry that includes the ARC-AGI families, a real-time monitoring dashboard for inspecting training dynamics as they occur, and a distributed worker that parallelises candidate-unit training across hosts. Near-term work extends the architectural-growth catalogue beyond Cascade-Correlation, introduces multi-network orchestration for comparative experiments at the level of network populations rather than individual runs, and tightens the dataset–training–monitoring loop into a reproducible research workbench. The longer-term direction is the systematic empirical study of constructive and architecture-growing learning algorithms, with first-class infrastructure for the ablation, comparison, and replication that such a study requires.

Documentation

Document Purpose
docs/DOCUMENTATION_OVERVIEW.md Navigation index for all juniper-data documentation
docs/QUICK_START.md Get running in five minutes
docs/USER_MANUAL.md Comprehensive usage guide
docs/REFERENCE.md Configuration, environment variables, and operational reference
docs/ENVIRONMENT_SETUP.md Conda environment and editable-install setup
docs/DEVELOPER_CHEATSHEET.md Quick-reference card for development tasks
docs/api/JUNIPER_DATA_API.md Complete REST endpoint reference
CHANGELOG.md Version history

License

MIT License — Copyright (c) 2024-2026 Paul Calnon

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

juniper_data-0.8.0.tar.gz (256.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

juniper_data-0.8.0-py3-none-any.whl (325.8 kB view details)

Uploaded Python 3

File details

Details for the file juniper_data-0.8.0.tar.gz.

File metadata

  • Download URL: juniper_data-0.8.0.tar.gz
  • Upload date:
  • Size: 256.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for juniper_data-0.8.0.tar.gz
Algorithm Hash digest
SHA256 ec26dffbf33fe641ba57d6c51b1654a4eeea093706c880fd56c17b09b35a1a71
MD5 ebe00cc1682a405618627910cf6d3fba
BLAKE2b-256 3463c733121c57f882f804ecf135c5e804fae35af98b4f8dcbb7ea49bac8d9b9

See more details on using hashes here.

Provenance

The following attestation bundles were made for juniper_data-0.8.0.tar.gz:

Publisher: publish.yml on pcalnon/juniper-data

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file juniper_data-0.8.0-py3-none-any.whl.

File metadata

  • Download URL: juniper_data-0.8.0-py3-none-any.whl
  • Upload date:
  • Size: 325.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for juniper_data-0.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fc4ef41d748bfc1e6a0f7455d8a2a2664db56bc2cc19f185b8d862b8084d4bfa
MD5 6dd11ded09446504a8efe9f80bbe6f48
BLAKE2b-256 cfb41ca59c1b43b943a8a6aceee252a3bd4c46aa04e98759d76be17d1cacbfd5

See more details on using hashes here.

Provenance

The following attestation bundles were made for juniper_data-0.8.0-py3-none-any.whl:

Publisher: publish.yml on pcalnon/juniper-data

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page