Skip to main content

juniper-recurrence

Project: Juniper — Cascade Correlation Neural Network Research Platform Application: juniper-recurrence (FastAPI + CLI service) Author: Paul Calnon License: MIT License Version: 0.2.0

FastAPI + CLI service that wraps the Δt-native Legendre Memory Unit regressor (juniper-recurrence-model) on the shared juniper-service-core framework. It loads 3-D windowed sequences (equities_seq, the WS-1 irregular-Δt contract) through juniper-data-client and trains / serves the LMU over HTTP.

This is the application layer (WS-4b): the first real consumer of service-core's create_app + TrainingLifecycle. The model, the data foundation, and the service framework ship separately; this package is the glue + the HTTP/CLI surface.

Install

pip install juniper-recurrence
pip install "juniper-recurrence[torch]"   # adds the torch MLP readout (DP-3 Rung 2b)

All upstreams resolve from PyPI: juniper-service-core, juniper-model-core, juniper-recurrence-model, juniper-data-client, plus fastapi / uvicorn.

Run

# Serve the API (single worker, in-process state). Binds 0.0.0.0:8210 by default;
# set JUNIPER_RECURRENCE_HOST=127.0.0.1 for local-only.
juniper-recurrence serve
juniper-recurrence serve --host 127.0.0.1 --port 8210

Once running, the API exposes (every /v1/* route below requires X-API-Key when API keys are configured; health + docs are always exempt):

Route Method Behavior
/v1/health, /v1/health/ready GET Liveness / readiness (exempt).
/v1/train POST Train the LMU on a dataset (synchronous); returns the TrainResult.
/v1/training/status GET idle / trained + last metrics + training events.
/v1/crossval POST Walk-forward cross-validation over the whole dataset (the full split — the artifact's own *_full when present, otherwise rebuilt from train | val | test) (synchronous); returns aggregated per-fold metrics.
/v1/crossval/status GET Most recent cross-validation result (aggregate + per-fold).
/v1/predict POST Continuous predictions for inline X (+ dt) or a dataset ref.
/v1/model GET Current model topology + regression metrics.
/v1/dataset GET Descriptor of the trained-on dataset.
/v1/metrics GET Prometheus metrics — IP-allowlist gated; needs the [observability] extra.
/docs GET OpenAPI / Swagger UI (exempt).

Both POST /v1/train and POST /v1/crossval run inline (closed-form solves) and return their result in the response — no background jobs or WebSocket streams in v1. A second cross-validation run while one is in progress returns 409.

POST /v1/train and POST /v1/crossval accept a readout selector (DP-3): "linear" (default, closed-form least squares), "rff" (nonlinear random-Fourier-features readout, with rff_features / rff_gamma), or "mlp" (a torch MLP with the mlp_* knobs — needs the [torch] extra; returns 503 if torch is not installed). ridge accepts a float or "gcv" (closed-form generalized-cross-validation selection). See the juniper-recurrence-model README for the spectrum.

# Train on a juniper-data dataset, then inspect the model.
curl -sX POST localhost:8210/v1/train \
  -H 'Content-Type: application/json' \
  -d '{"dataset": {"dataset_id": "<id>"}, "d": 16}'
curl -s localhost:8210/v1/model

Train (headless CLI)

# Fit the LMU on a dataset and persist it — no server.
juniper-recurrence train --dataset <id> --d 16 --out model.npz
juniper-recurrence train --name equities_seq_v1 --split train

Configuration

All settings read the JUNIPER_RECURRENCE_ environment namespace (e.g. JUNIPER_RECURRENCE_PORT). Secrets honor the Docker _FILE indirection (JUNIPER_RECURRENCE_API_KEYS_FILE, JUNIPER_DATA_API_KEY_FILE). When no API keys are configured, authentication is disabled (open access — development default).

Variable Default Purpose
JUNIPER_RECURRENCE_HOST 0.0.0.0 Bind host (container default; 127.0.0.1 locally).
JUNIPER_RECURRENCE_PORT 8210 Bind port (deploy maps host 8211 → container 8210).
JUNIPER_RECURRENCE_API_KEYS (unset) CSV or JSON-array of valid X-API-Key values.
JUNIPER_DATA_URL http://localhost:8100 Upstream juniper-data base URL.
JUNIPER_DATA_API_KEY (unset) Outbound X-API-Key to juniper-data.

Development

pip install -e ".[test]"
pytest tests/ -v

Publishing

Releases are published to PyPI via GitHub Actions (.github/workflows/publish-recurrence-app.yml) on a juniper-recurrence-v* tag — TestPyPI first (with a --no-deps install verification), then PyPI, via OIDC trusted publishing (no API tokens). The model package (juniper-recurrence-model) publishes separately on juniper-recurrence-model-v* tags.

# Cut a GitHub Release on a juniper-recurrence-v* tag (the ecosystem convention — not a
# bare `git push <tag>`); the Release drives publish-recurrence-app.yml (TestPyPI → PyPI).
gh release create juniper-recurrence-v0.2.0 --generate-notes

Ecosystem

Part of the Juniper ML research platform. See the WS-4b build plan (notes/JUNIPER_RECURRENCE_WS4B_APP_BUILD_PLAN_2026-06-15.md in juniper-ml) for the design of record.

Metadata

Release files for juniper-recurrence 0.5.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-recurrence 0.5.0
File Size Uploaded Provenance Actions
juniper_recurrence-0.5.0.tar.gz 62.5 kB With provenance Details for juniper_recurrence-0.5.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for juniper-recurrence 0.5.0
File Interpreter ABI Platform Actions
juniper_recurrence-0.5.0-py3-none-any.whl Python 3 none any Details for juniper_recurrence-0.5.0-py3-none-any.whl

Total release size: 103.4 kB

Release files / juniper_recurrence-0.5.0.tar.gz

Download URL juniper_recurrence-0.5.0.tar.gz
Size 62.5 kB
Tags Source
SHA-256 checksum
How to use checksums
967402cd8b669263e073abac8609775b0df4b7418f2513e204707965c7f16403
BLAKE2b-256 checksum
How to use checksums
3ec4f463102afefc6ff9601060341dba69861e3907273730f816e9d8d589df4e
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 Sep 11, 2026.

Transparency log

Release files / juniper_recurrence-0.5.0-py3-none-any.whl

Download URL juniper_recurrence-0.5.0-py3-none-any.whl
Size 40.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c113a9b94fad6f9019645d46bba91d64f8f0989596619102433c4e0444667b27
BLAKE2b-256 checksum
How to use checksums
f973e439a2dbf3f112230ddff425cea90410bc101e80962b87785f964513acf1
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 Sep 11, 2026.

Transparency log

Security for juniper-recurrence 0.5.0

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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for juniper_recurrence-0.5.0.tar.gz

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 Sep 11, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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