Skip to main content

juniper-cascor

PyPI Python 3.12+ License: MIT

A Cascade-Correlation neural-network training service with live REST + WebSocket streaming.

juniper-cascor is a FastAPI service that implements the Fahlman & Lebiere (1990) Cascade-Correlation algorithm — a constructive network that grows itself by recruiting hidden units one at a time, each chosen to maximise correlation with the network's remaining error. Instead of fixing the architecture up front, CasCor builds it as training proceeds.

The service exposes a REST API for network and training control and live WebSocket streams for real-time introspection of the growing network. It trains on datasets from juniper-data, is driven over HTTP by juniper-cascor-client, monitored live by juniper-canopy, and can offload candidate-unit training to distributed juniper-cascor-worker instances.

Part of the Juniper platform. juniper-cascor is the Cascade-Correlation training backend of Juniper — a multi-package ML research platform built around constructive and recurrent neural networks.

Install

pip install juniper-cascor

For development from a clone:

git clone https://github.com/pcalnon/juniper-cascor.git && cd juniper-cascor
pip install -e ".[ml,api,observability]"

Run

python src/server.py                          # binds 127.0.0.1:8200
curl http://localhost:8200/v1/health/ready

A minimal train loop over the REST API — create a network, stage a dataset, start training:

curl -sX POST localhost:8200/v1/network \
  -H 'Content-Type: application/json' -d '{"config": {"input_size": 2, "output_size": 2}}'
curl -sX POST localhost:8200/v1/training/dataset \
  -H 'Content-Type: application/json' -d '{"dataset": {"generator": "spiral"}}'
curl -sX POST localhost:8200/v1/training/start \
  -H 'Content-Type: application/json' -d '{"params": {"max_epochs": 100}}'
curl -s localhost:8200/v1/training/status

API

REST routes (prefix /v1; responses wrapped in a {status, data, meta} envelope):

Route Methods Purpose
/health, /health/live, /health/ready GET Liveness / readiness probes
/network POST / GET / DELETE Create, inspect, delete the network
/network/topology, /network/stats GET Topology + statistics
/training/start, /stop, /pause, /resume, /reset POST Training control
/training/status, /training/params GET Training state + parameters
/training/dataset POST / GET / DELETE Stage / inspect / clear the training dataset

WebSocket streams: /ws/training (live metrics + topology, resumable), /ws/control (control + heartbeat), /ws/v1/workers (the distributed worker pool). WebSocket admission is capped globally across all three sockets, with an additional per-identity cap on /ws/control; over-cap clients are closed with code 1013.

Configuration

Settings load from the JUNIPER_CASCOR_ environment namespace. Common knobs (full surface in docs/install/REFERENCE.md):

Variable Default Purpose
JUNIPER_CASCOR_HOST / JUNIPER_CASCOR_PORT 127.0.0.1 / 8200 Bind address / port (0.0.0.0 under Docker).
JUNIPER_CASCOR_LOOPBACK_PUBLISH_ATTESTED false Bind attestation for a non-loopback interface: the port is reachable only via a loopback-only host publish.
JUNIPER_CASCOR_AUTH_PROXY_ATTESTED false Bind attestation for a non-loopback interface: a fronting authenticating reverse proxy terminates access.
JUNIPER_DATA_URL http://localhost:8100 Upstream juniper-data service.
JUNIPER_CASCOR_API_KEYS (unset) CSV X-API-Key values; auth disabled when unset.
JUNIPER_CASCOR_WS_MAX_CONNECTIONS_GLOBAL 200 Stack-wide WebSocket cap across training, control, and worker sockets.
JUNIPER_CASCOR_WS_MAX_CONNECTIONS_PER_IDENTITY 5 /ws/control cap per API-key identity.
JUNIPER_CASCOR_LOG_LEVEL / _LOG_FORMAT INFO / text Verbosity / text or json.
JUNIPER_CASCOR_METRICS_ENABLED false Expose /v1/metrics for Prometheus.

Docker

docker build -t juniper-cascor:latest .
docker run --rm -p 127.0.0.1:8200:8200 \
  -e JUNIPER_CASCOR_HOST=0.0.0.0 \
  -e JUNIPER_CASCOR_LOOPBACK_PUBLISH_ATTESTED=true \
  -e JUNIPER_CASCOR_API_KEYS=replace-with-a-strong-key \
  -e JUNIPER_DATA_URL=http://host.docker.internal:8100 \
  juniper-cascor:latest

The host-side publish is loopback-only; JUNIPER_CASCOR_LOOPBACK_PUBLISH_ATTESTED=true attests that boundary so the startup bind guard allows the container's internal 0.0.0.0 bind. (Behind a fronting authenticating reverse proxy instead, attest JUNIPER_CASCOR_AUTH_PROXY_ATTESTED=true.) Health is probed at /v1/health/ready. For the full stack, see juniper-deploy.

Status

Live on PyPI. The current version is shown by the badge above; see CHANGELOG.md. It trains on datasets from juniper-data (JUNIPER_DATA_URL) and is driven by juniper-cascor-client.

Documentation

License

MIT — see LICENSE.

Metadata

Release files for juniper-cascor 0.10.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for juniper-cascor 0.10.0
File Size Uploaded
juniper_cascor-0.10.0.tar.gz 475.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for juniper-cascor 0.10.0
File Interpreter ABI Platform
juniper_cascor-0.10.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.5 MB

Release files / juniper_cascor-0.10.0.tar.gz

Download URL juniper_cascor-0.10.0.tar.gz
Size 475.5 kB
Tags Source
SHA-256 checksum
How to use checksums
861250340fb71d0553319977f3edb414eab31ae621f52be88e757a1d4b2ffcea
BLAKE2b-256 checksum
How to use checksums
1c05b13c0adf3344c42a620b40121e0f2bd775d56f1aa31e7799c7d46bb6a68a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.

Transparency log

Release files / juniper_cascor-0.10.0-py3-none-any.whl

Download URL juniper_cascor-0.10.0-py3-none-any.whl
Size 1.0 MB
Tags Python 3
SHA-256 checksum
How to use checksums
a2f46ffbe1cc016f324c76b18482cfe24c99f6ea9105b64665a8c726d7330538
BLAKE2b-256 checksum
How to use checksums
cc66f8e8f002b889413e57a0f3fc2612a756bc9f22a6c2ec3c62a4dc557bd74b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.

Transparency log

Release history Release notifications | RSS feed

0.11.0

2 release files

This release

0.10.0 This release

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.3.17

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page