FastAPI + CLI service wrapping the Δt-native LMU recurrence model on the juniper-service-core framework
Project description
juniper-recurrence
Project: Juniper — Cascade Correlation Neural Network Research Platform Application: juniper-recurrence (FastAPI + CLI service) Author: Paul Calnon License: MIT License Version: 0.1.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
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/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. |
/docs |
GET | OpenAPI / Swagger UI (exempt). |
Training runs inline (a one-shot closed-form solve), so POST /v1/train returns the
result in the response — no background jobs or WebSocket streams in v1.
# 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.
git tag juniper-recurrence-v0.1.0
git push origin juniper-recurrence-v0.1.0
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file juniper_recurrence-0.1.0.tar.gz.
File metadata
- Download URL: juniper_recurrence-0.1.0.tar.gz
- Upload date:
- Size: 25.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
deefcfa36f76d7a936c2058643e77de9c6b0c74fb0013c32c566c9a3b85271dd
|
|
| MD5 |
ff8e015dc6ec26143f7aad9e87910328
|
|
| BLAKE2b-256 |
d65c6346e8bf8f7af98f2babfc412f04c138e6786308e01ecc1553d1fc8c1cbf
|
Provenance
The following attestation bundles were made for juniper_recurrence-0.1.0.tar.gz:
Publisher:
publish-recurrence-app.yml on pcalnon/juniper-recurrence
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
juniper_recurrence-0.1.0.tar.gz -
Subject digest:
deefcfa36f76d7a936c2058643e77de9c6b0c74fb0013c32c566c9a3b85271dd - Sigstore transparency entry: 1854876943
- Sigstore integration time:
-
Permalink:
pcalnon/juniper-recurrence@f7aedcc204cbf81763eb227a211d7887e10b85d1 -
Branch / Tag:
refs/tags/juniper-recurrence-v0.1.0 - Owner: https://github.com/pcalnon
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-recurrence-app.yml@f7aedcc204cbf81763eb227a211d7887e10b85d1 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file juniper_recurrence-0.1.0-py3-none-any.whl.
File metadata
- Download URL: juniper_recurrence-0.1.0-py3-none-any.whl
- Upload date:
- Size: 22.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2e16518afc3dd21ca2617835b413a00e45bc9bef854df117ae3db7a0269d8af4
|
|
| MD5 |
b134f3544e7636783ce8f71dc6158830
|
|
| BLAKE2b-256 |
589e7c715e2089e1f2ba57c6e477782c35295273209d1ef63224bba2366b8c81
|
Provenance
The following attestation bundles were made for juniper_recurrence-0.1.0-py3-none-any.whl:
Publisher:
publish-recurrence-app.yml on pcalnon/juniper-recurrence
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
juniper_recurrence-0.1.0-py3-none-any.whl -
Subject digest:
2e16518afc3dd21ca2617835b413a00e45bc9bef854df117ae3db7a0269d8af4 - Sigstore transparency entry: 1854876980
- Sigstore integration time:
-
Permalink:
pcalnon/juniper-recurrence@f7aedcc204cbf81763eb227a211d7887e10b85d1 -
Branch / Tag:
refs/tags/juniper-recurrence-v0.1.0 - Owner: https://github.com/pcalnon
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-recurrence-app.yml@f7aedcc204cbf81763eb227a211d7887e10b85d1 -
Trigger Event:
workflow_dispatch
-
Statement type: