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.

Download files

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

Source Distribution

juniper_cascor-0.6.0.tar.gz (1.1 MB view details)

Uploaded Source

Built Distribution

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

juniper_cascor-0.6.0-py3-none-any.whl (1.8 MB view details)

Uploaded Python 3

File details

Details for the file juniper_cascor-0.6.0.tar.gz.

File metadata

  • Download URL: juniper_cascor-0.6.0.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for juniper_cascor-0.6.0.tar.gz
Algorithm Hash digest
SHA256 3e04fa85861e6edfb6b26cfc56bdc92b23093c0cc5751959128af1e8c20fcccb
MD5 2df14c07f2b8492b5cd847bcdc57a0be
BLAKE2b-256 0970744d0e4e895e9ba1d6e9c1861e3a24cb661672fe5775d4d1e614f1246ee8

See more details on using hashes here.

Provenance

The following attestation bundles were made for juniper_cascor-0.6.0.tar.gz:

Publisher: publish.yml on pcalnon/juniper-cascor

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_cascor-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: juniper_cascor-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for juniper_cascor-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1e53faadd2ff945aa9c8e67965926dc931ac1263c18bd2ed9a1b2962bb547842
MD5 bdda7a3920cb16fa23f80ad6c6619458
BLAKE2b-256 1f1e8c832d9071b697cb2c6590f20b1ca55df82e05eecefb4c6d1cd2a1171c04

See more details on using hashes here.

Provenance

The following attestation bundles were made for juniper_cascor-0.6.0-py3-none-any.whl:

Publisher: publish.yml on pcalnon/juniper-cascor

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