juniper-data-client 0.4.0__tar.gz → 0.4.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- juniper_data_client-0.4.2/PKG-INFO +194 -0
- juniper_data_client-0.4.2/README.md +149 -0
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/juniper_data_client/__init__.py +7 -2
- juniper_data_client-0.4.2/juniper_data_client/client.py +736 -0
- juniper_data_client-0.4.2/juniper_data_client/constants.py +277 -0
- juniper_data_client-0.4.2/juniper_data_client/contract.py +125 -0
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/juniper_data_client/testing/fake_client.py +192 -70
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/juniper_data_client/testing/generators.py +54 -26
- juniper_data_client-0.4.2/juniper_data_client.egg-info/PKG-INFO +194 -0
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/juniper_data_client.egg-info/SOURCES.txt +11 -1
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/juniper_data_client.egg-info/requires.txt +4 -0
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/pyproject.toml +14 -1
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/tests/test_client.py +28 -1
- juniper_data_client-0.4.2/tests/test_contract.py +116 -0
- juniper_data_client-0.4.2/tests/test_create_dataset_tags_ttl.py +140 -0
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/tests/test_fake_client.py +38 -10
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/tests/test_fake_client_batch.py +3 -3
- juniper_data_client-0.4.2/tests/test_generator_parity.py +135 -0
- juniper_data_client-0.4.2/tests/test_malformed_json_response.py +72 -0
- juniper_data_client-0.4.2/tests/test_npzfile_resource_lifecycle.py +138 -0
- juniper_data_client-0.4.2/tests/test_on_request_hook.py +210 -0
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/tests/test_performance.py +7 -7
- juniper_data_client-0.4.2/tests/test_retry_policy.py +54 -0
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/tests/test_versioning.py +2 -2
- juniper_data_client-0.4.2/tests/test_x_request_id_propagation.py +119 -0
- juniper_data_client-0.4.0/PKG-INFO +0 -268
- juniper_data_client-0.4.0/README.md +0 -226
- juniper_data_client-0.4.0/juniper_data_client/client.py +0 -518
- juniper_data_client-0.4.0/juniper_data_client.egg-info/PKG-INFO +0 -268
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/LICENSE +0 -0
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/juniper_data_client/exceptions.py +0 -0
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/juniper_data_client/py.typed +0 -0
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/juniper_data_client/testing/__init__.py +0 -0
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/juniper_data_client.egg-info/dependency_links.txt +0 -0
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/juniper_data_client.egg-info/top_level.txt +0 -0
- {juniper_data_client-0.4.0 → juniper_data_client-0.4.2}/setup.cfg +0 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: juniper-data-client
|
|
3
|
+
Version: 0.4.2
|
|
4
|
+
Summary: HTTP client for the JuniperData dataset generation service
|
|
5
|
+
Author: Paul Calnon
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/pcalnon/juniper-data-client
|
|
8
|
+
Project-URL: Repository, https://github.com/pcalnon/juniper-data-client
|
|
9
|
+
Project-URL: Documentation, https://github.com/pcalnon/juniper-data-client#readme
|
|
10
|
+
Project-URL: Issues, https://github.com/pcalnon/juniper-data-client/issues
|
|
11
|
+
Keywords: juniper,juniper-ml,juniper-ai,artificial-intelligence,dataset,machine-learning,api-client
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
21
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
22
|
+
Classifier: Typing :: Typed
|
|
23
|
+
Requires-Python: >=3.12
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
License-File: LICENSE
|
|
26
|
+
Requires-Dist: numpy>=1.24.0
|
|
27
|
+
Requires-Dist: requests>=2.28.0
|
|
28
|
+
Requires-Dist: urllib3>=2.0.0
|
|
29
|
+
Provides-Extra: test
|
|
30
|
+
Requires-Dist: pytest>=7.0.0; extra == "test"
|
|
31
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "test"
|
|
32
|
+
Requires-Dist: pytest-timeout>=2.2.0; extra == "test"
|
|
33
|
+
Requires-Dist: responses>=0.23.0; extra == "test"
|
|
34
|
+
Requires-Dist: juniper-observability>=0.1.1; extra == "test"
|
|
35
|
+
Provides-Extra: observability
|
|
36
|
+
Requires-Dist: juniper-observability>=0.1.1; extra == "observability"
|
|
37
|
+
Provides-Extra: dev
|
|
38
|
+
Requires-Dist: juniper-data-client[test]; extra == "dev"
|
|
39
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
40
|
+
Requires-Dist: isort>=5.12.0; extra == "dev"
|
|
41
|
+
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
42
|
+
Requires-Dist: flake8>=7.0.0; extra == "dev"
|
|
43
|
+
Requires-Dist: types-requests>=2.28.0; extra == "dev"
|
|
44
|
+
Dynamic: license-file
|
|
45
|
+
|
|
46
|
+
<!-- markdownlint-disable MD013 MD033 MD041 -->
|
|
47
|
+
<!--
|
|
48
|
+
MD013 (line-length): README contains prose paragraphs that intentionally
|
|
49
|
+
exceed the 512-char ecosystem limit (canonical
|
|
50
|
+
§4 layout). Wrapping harms PyPI rendering.
|
|
51
|
+
MD033 (no-inline-html): The right-aligned logo + spacing rely on HTML.
|
|
52
|
+
MD041 (first-line-heading): The HTML logo is the first line by design.
|
|
53
|
+
Mirrors juniper-ml #283, juniper-cascor #276, juniper-cascor-worker #71.
|
|
54
|
+
-->
|
|
55
|
+
<div align="right" width="150px" height="150px" align="right" valign="top"> <img src="images/Juniper_Logo_150px.png" alt="Juniper" align="right" valign="top" width="150px" /></div>
|
|
56
|
+
<br /> <br /> <br /> <br />
|
|
57
|
+
|
|
58
|
+
# Juniper: Dynamic Neural Network Research Platform
|
|
59
|
+
|
|
60
|
+
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.
|
|
61
|
+
|
|
62
|
+
## Juniper Data Client
|
|
63
|
+
|
|
64
|
+
`juniper-data-client` is the **Python HTTP client library** for the `juniper-data` dataset-generation service. The package exposes a single `JuniperDataClient` class whose methods correspond to the REST surface of `juniper-data`: generator schemas, dataset creation, tag-based filtering, batch operations, the named-version registry, and download of the resulting NPZ artifacts as ready-to-train `numpy` arrays. It is the canonical dataset-fetch interface used by both `juniper-cascor` (for training) and `juniper-canopy` (for visualisation), and it serializes the platform's shared `X_train` / `y_train` / `X_test` / `y_test` / `X_full` / `y_full` NPZ schema (all `float32`).
|
|
65
|
+
|
|
66
|
+
## Distribution
|
|
67
|
+
|
|
68
|
+
`juniper-data-client` is published on PyPI as **[`juniper-data-client`](https://pypi.org/project/juniper-data-client/)**.
|
|
69
|
+
The package is also surfaced through the platform meta-distribution
|
|
70
|
+
**[`juniper-ml`](https://pypi.org/project/juniper-ml/)**, which installs
|
|
71
|
+
the full client stack via `pip install juniper-ml[all]`.
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pip install juniper-data-client
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Ecosystem Compatibility
|
|
78
|
+
|
|
79
|
+
This client library is part of the [Juniper](https://github.com/pcalnon/juniper-ml) ecosystem.
|
|
80
|
+
Verified compatible versions:
|
|
81
|
+
|
|
82
|
+
| juniper-data | juniper-cascor | juniper-canopy | data-client | cascor-client | cascor-worker |
|
|
83
|
+
|--------------|----------------|----------------|-------------|---------------|---------------|
|
|
84
|
+
| 0.6.x | 0.5.x | 0.5.x | >=0.4.1 | >=0.4.0 | >=0.4.0 |
|
|
85
|
+
|
|
86
|
+
For full-stack Docker deployment and integration tests, see [`juniper-deploy`](https://github.com/pcalnon/juniper-deploy).
|
|
87
|
+
|
|
88
|
+
## Architecture
|
|
89
|
+
|
|
90
|
+
`juniper-data-client` is a thin synchronous HTTP client. It does not embed any dataset-generation logic of its own: every call resolves to an HTTP request against a `juniper-data` instance, and every NPZ artifact returned has been produced server-side.
|
|
91
|
+
|
|
92
|
+
```text
|
|
93
|
+
┌────────────────────────┐ ┌──────────────────┐
|
|
94
|
+
│ Caller (e.g. │ HTTP (requests + │ juniper-data │
|
|
95
|
+
│ juniper-cascor / │ urllib3 Retry) │ REST service │
|
|
96
|
+
│ juniper-canopy / │ ──────────────────► │ Port 8100 │
|
|
97
|
+
│ research notebook) │ ◄────────────────── │ /v1/... │
|
|
98
|
+
└──────────┬─────────────┘ JSON + NPZ └──────────────────┘
|
|
99
|
+
│ uses
|
|
100
|
+
▼
|
|
101
|
+
┌────────────────────────┐
|
|
102
|
+
│ juniper-data-client │
|
|
103
|
+
│ JuniperDataClient │
|
|
104
|
+
│ (this package) │
|
|
105
|
+
└────────────────────────┘
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
The client retries idempotent verbs (GET) on transient failures via `urllib3.Retry` with exponential backoff; mutating verbs (POST, PATCH, DELETE) are **not** auto-retried, to avoid duplicate-side-effect bugs against the dataset registry. Optional `X-Request-ID` propagation and a `RequestHook` instrumentation surface are available for callers that integrate with the platform's observability stack.
|
|
109
|
+
|
|
110
|
+
## Related Services
|
|
111
|
+
|
|
112
|
+
| Service | Relationship | Notes |
|
|
113
|
+
|---------|-------------|-------|
|
|
114
|
+
| [juniper-data](https://github.com/pcalnon/juniper-data) | The HTTP service this client targets | Set `base_url` to the service's URL (default `http://localhost:8100`) |
|
|
115
|
+
| [juniper-cascor](https://github.com/pcalnon/juniper-cascor) | Primary consumer; uses this client to fetch training datasets | Reads `JUNIPER_DATA_URL` |
|
|
116
|
+
| [juniper-canopy](https://github.com/pcalnon/juniper-canopy) | Secondary consumer; uses this client to fetch visualisation data | Reads `JUNIPER_DATA_URL` |
|
|
117
|
+
|
|
118
|
+
## Active Research Components
|
|
119
|
+
|
|
120
|
+
`juniper-data-client` does not host research components of its own; it is the surface through which other components of the Juniper platform reach the research components hosted by `juniper-data`. Through this client, callers access the **ARC-AGI dataset families** (ARC-AGI-1 and ARC-AGI-2), the **named-version dataset registry** (`list_versions`, `get_latest`), the **batch dataset operations** (`batch_create`, `batch_delete`, `batch_update_tags`, `batch_export`), and the **NPZ artifact contract** that the rest of the platform consumes. Treating these as research artifacts is appropriate: each is a stable interface around which comparative experiments are composed.
|
|
121
|
+
|
|
122
|
+
## Quick Start Guide
|
|
123
|
+
|
|
124
|
+
### Prerequisites
|
|
125
|
+
|
|
126
|
+
- Python ≥ 3.12
|
|
127
|
+
- A running `juniper-data` instance reachable at the URL passed as `base_url` (typically `http://localhost:8100`)
|
|
128
|
+
|
|
129
|
+
### Installation
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
pip install juniper-data-client
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Optional extras: `[observability]` enables `X-Request-ID` propagation through `juniper-observability`; `[test]` installs the testing dependencies; `[dev]` adds linting and type-checking tools.
|
|
136
|
+
|
|
137
|
+
### Verification
|
|
138
|
+
|
|
139
|
+
```python
|
|
140
|
+
from juniper_data_client import JuniperDataClient
|
|
141
|
+
|
|
142
|
+
with JuniperDataClient("http://localhost:8100") as client:
|
|
143
|
+
health = client.health_check()
|
|
144
|
+
print(f"Service status: {health['status']}")
|
|
145
|
+
|
|
146
|
+
result = client.create_spiral_dataset(
|
|
147
|
+
n_spirals=2,
|
|
148
|
+
n_points_per_spiral=100,
|
|
149
|
+
noise=0.1,
|
|
150
|
+
seed=42,
|
|
151
|
+
)
|
|
152
|
+
arrays = client.download_artifact_npz(result["dataset_id"])
|
|
153
|
+
|
|
154
|
+
print(f"Training samples: {len(arrays['X_train'])}")
|
|
155
|
+
print(f"Test samples: {len(arrays['X_test'])}")
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
For PyTorch consumers, the returned arrays convert directly with `torch.from_numpy`:
|
|
159
|
+
|
|
160
|
+
```python
|
|
161
|
+
import torch
|
|
162
|
+
X_train = torch.from_numpy(arrays["X_train"]) # torch.float32
|
|
163
|
+
y_train = torch.from_numpy(arrays["y_train"]) # torch.float32
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Next Steps
|
|
167
|
+
|
|
168
|
+
- [`docs/QUICK_START.md`](docs/QUICK_START.md) — complete installation and verification guide
|
|
169
|
+
- [`docs/REFERENCE.md`](docs/REFERENCE.md) — full API reference, configuration, and error model
|
|
170
|
+
- [`docs/DEVELOPER_CHEATSHEET.md`](docs/DEVELOPER_CHEATSHEET.md) — quick-reference card for development tasks
|
|
171
|
+
- [`juniper-data`](https://github.com/pcalnon/juniper-data) — the upstream dataset service
|
|
172
|
+
- [`juniper-ml`](https://pypi.org/project/juniper-ml/) — platform meta-package on PyPI
|
|
173
|
+
|
|
174
|
+
## Research Philosophy
|
|
175
|
+
|
|
176
|
+
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.
|
|
177
|
+
|
|
178
|
+
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.
|
|
179
|
+
|
|
180
|
+
Within this programme, `juniper-data-client` is the canonical integration boundary between the training and data services. Its contract is the dataset-fetch interface used by every training-side consumer; changes to its surface are therefore changes to the platform's shared dataset semantics.
|
|
181
|
+
|
|
182
|
+
## Documentation
|
|
183
|
+
|
|
184
|
+
| Document | Purpose |
|
|
185
|
+
|----------|---------|
|
|
186
|
+
| [`docs/DOCUMENTATION_OVERVIEW.md`](docs/DOCUMENTATION_OVERVIEW.md) | Navigation index for all `juniper-data-client` documentation |
|
|
187
|
+
| [`docs/QUICK_START.md`](docs/QUICK_START.md) | Complete installation and verification guide |
|
|
188
|
+
| [`docs/REFERENCE.md`](docs/REFERENCE.md) | Full API reference, configuration, error model, and NPZ schema |
|
|
189
|
+
| [`docs/DEVELOPER_CHEATSHEET.md`](docs/DEVELOPER_CHEATSHEET.md) | Quick-reference card for development tasks |
|
|
190
|
+
| [`CHANGELOG.md`](CHANGELOG.md) | Version history |
|
|
191
|
+
|
|
192
|
+
## License
|
|
193
|
+
|
|
194
|
+
MIT License — see [`LICENSE`](LICENSE) for details.
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
<!-- markdownlint-disable MD013 MD033 MD041 -->
|
|
2
|
+
<!--
|
|
3
|
+
MD013 (line-length): README contains prose paragraphs that intentionally
|
|
4
|
+
exceed the 512-char ecosystem limit (canonical
|
|
5
|
+
§4 layout). Wrapping harms PyPI rendering.
|
|
6
|
+
MD033 (no-inline-html): The right-aligned logo + spacing rely on HTML.
|
|
7
|
+
MD041 (first-line-heading): The HTML logo is the first line by design.
|
|
8
|
+
Mirrors juniper-ml #283, juniper-cascor #276, juniper-cascor-worker #71.
|
|
9
|
+
-->
|
|
10
|
+
<div align="right" width="150px" height="150px" align="right" valign="top"> <img src="images/Juniper_Logo_150px.png" alt="Juniper" align="right" valign="top" width="150px" /></div>
|
|
11
|
+
<br /> <br /> <br /> <br />
|
|
12
|
+
|
|
13
|
+
# Juniper: Dynamic Neural Network Research Platform
|
|
14
|
+
|
|
15
|
+
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.
|
|
16
|
+
|
|
17
|
+
## Juniper Data Client
|
|
18
|
+
|
|
19
|
+
`juniper-data-client` is the **Python HTTP client library** for the `juniper-data` dataset-generation service. The package exposes a single `JuniperDataClient` class whose methods correspond to the REST surface of `juniper-data`: generator schemas, dataset creation, tag-based filtering, batch operations, the named-version registry, and download of the resulting NPZ artifacts as ready-to-train `numpy` arrays. It is the canonical dataset-fetch interface used by both `juniper-cascor` (for training) and `juniper-canopy` (for visualisation), and it serializes the platform's shared `X_train` / `y_train` / `X_test` / `y_test` / `X_full` / `y_full` NPZ schema (all `float32`).
|
|
20
|
+
|
|
21
|
+
## Distribution
|
|
22
|
+
|
|
23
|
+
`juniper-data-client` is published on PyPI as **[`juniper-data-client`](https://pypi.org/project/juniper-data-client/)**.
|
|
24
|
+
The package is also surfaced through the platform meta-distribution
|
|
25
|
+
**[`juniper-ml`](https://pypi.org/project/juniper-ml/)**, which installs
|
|
26
|
+
the full client stack via `pip install juniper-ml[all]`.
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pip install juniper-data-client
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Ecosystem Compatibility
|
|
33
|
+
|
|
34
|
+
This client library is part of the [Juniper](https://github.com/pcalnon/juniper-ml) ecosystem.
|
|
35
|
+
Verified compatible versions:
|
|
36
|
+
|
|
37
|
+
| juniper-data | juniper-cascor | juniper-canopy | data-client | cascor-client | cascor-worker |
|
|
38
|
+
|--------------|----------------|----------------|-------------|---------------|---------------|
|
|
39
|
+
| 0.6.x | 0.5.x | 0.5.x | >=0.4.1 | >=0.4.0 | >=0.4.0 |
|
|
40
|
+
|
|
41
|
+
For full-stack Docker deployment and integration tests, see [`juniper-deploy`](https://github.com/pcalnon/juniper-deploy).
|
|
42
|
+
|
|
43
|
+
## Architecture
|
|
44
|
+
|
|
45
|
+
`juniper-data-client` is a thin synchronous HTTP client. It does not embed any dataset-generation logic of its own: every call resolves to an HTTP request against a `juniper-data` instance, and every NPZ artifact returned has been produced server-side.
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
┌────────────────────────┐ ┌──────────────────┐
|
|
49
|
+
│ Caller (e.g. │ HTTP (requests + │ juniper-data │
|
|
50
|
+
│ juniper-cascor / │ urllib3 Retry) │ REST service │
|
|
51
|
+
│ juniper-canopy / │ ──────────────────► │ Port 8100 │
|
|
52
|
+
│ research notebook) │ ◄────────────────── │ /v1/... │
|
|
53
|
+
└──────────┬─────────────┘ JSON + NPZ └──────────────────┘
|
|
54
|
+
│ uses
|
|
55
|
+
▼
|
|
56
|
+
┌────────────────────────┐
|
|
57
|
+
│ juniper-data-client │
|
|
58
|
+
│ JuniperDataClient │
|
|
59
|
+
│ (this package) │
|
|
60
|
+
└────────────────────────┘
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
The client retries idempotent verbs (GET) on transient failures via `urllib3.Retry` with exponential backoff; mutating verbs (POST, PATCH, DELETE) are **not** auto-retried, to avoid duplicate-side-effect bugs against the dataset registry. Optional `X-Request-ID` propagation and a `RequestHook` instrumentation surface are available for callers that integrate with the platform's observability stack.
|
|
64
|
+
|
|
65
|
+
## Related Services
|
|
66
|
+
|
|
67
|
+
| Service | Relationship | Notes |
|
|
68
|
+
|---------|-------------|-------|
|
|
69
|
+
| [juniper-data](https://github.com/pcalnon/juniper-data) | The HTTP service this client targets | Set `base_url` to the service's URL (default `http://localhost:8100`) |
|
|
70
|
+
| [juniper-cascor](https://github.com/pcalnon/juniper-cascor) | Primary consumer; uses this client to fetch training datasets | Reads `JUNIPER_DATA_URL` |
|
|
71
|
+
| [juniper-canopy](https://github.com/pcalnon/juniper-canopy) | Secondary consumer; uses this client to fetch visualisation data | Reads `JUNIPER_DATA_URL` |
|
|
72
|
+
|
|
73
|
+
## Active Research Components
|
|
74
|
+
|
|
75
|
+
`juniper-data-client` does not host research components of its own; it is the surface through which other components of the Juniper platform reach the research components hosted by `juniper-data`. Through this client, callers access the **ARC-AGI dataset families** (ARC-AGI-1 and ARC-AGI-2), the **named-version dataset registry** (`list_versions`, `get_latest`), the **batch dataset operations** (`batch_create`, `batch_delete`, `batch_update_tags`, `batch_export`), and the **NPZ artifact contract** that the rest of the platform consumes. Treating these as research artifacts is appropriate: each is a stable interface around which comparative experiments are composed.
|
|
76
|
+
|
|
77
|
+
## Quick Start Guide
|
|
78
|
+
|
|
79
|
+
### Prerequisites
|
|
80
|
+
|
|
81
|
+
- Python ≥ 3.12
|
|
82
|
+
- A running `juniper-data` instance reachable at the URL passed as `base_url` (typically `http://localhost:8100`)
|
|
83
|
+
|
|
84
|
+
### Installation
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
pip install juniper-data-client
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Optional extras: `[observability]` enables `X-Request-ID` propagation through `juniper-observability`; `[test]` installs the testing dependencies; `[dev]` adds linting and type-checking tools.
|
|
91
|
+
|
|
92
|
+
### Verification
|
|
93
|
+
|
|
94
|
+
```python
|
|
95
|
+
from juniper_data_client import JuniperDataClient
|
|
96
|
+
|
|
97
|
+
with JuniperDataClient("http://localhost:8100") as client:
|
|
98
|
+
health = client.health_check()
|
|
99
|
+
print(f"Service status: {health['status']}")
|
|
100
|
+
|
|
101
|
+
result = client.create_spiral_dataset(
|
|
102
|
+
n_spirals=2,
|
|
103
|
+
n_points_per_spiral=100,
|
|
104
|
+
noise=0.1,
|
|
105
|
+
seed=42,
|
|
106
|
+
)
|
|
107
|
+
arrays = client.download_artifact_npz(result["dataset_id"])
|
|
108
|
+
|
|
109
|
+
print(f"Training samples: {len(arrays['X_train'])}")
|
|
110
|
+
print(f"Test samples: {len(arrays['X_test'])}")
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
For PyTorch consumers, the returned arrays convert directly with `torch.from_numpy`:
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
import torch
|
|
117
|
+
X_train = torch.from_numpy(arrays["X_train"]) # torch.float32
|
|
118
|
+
y_train = torch.from_numpy(arrays["y_train"]) # torch.float32
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Next Steps
|
|
122
|
+
|
|
123
|
+
- [`docs/QUICK_START.md`](docs/QUICK_START.md) — complete installation and verification guide
|
|
124
|
+
- [`docs/REFERENCE.md`](docs/REFERENCE.md) — full API reference, configuration, and error model
|
|
125
|
+
- [`docs/DEVELOPER_CHEATSHEET.md`](docs/DEVELOPER_CHEATSHEET.md) — quick-reference card for development tasks
|
|
126
|
+
- [`juniper-data`](https://github.com/pcalnon/juniper-data) — the upstream dataset service
|
|
127
|
+
- [`juniper-ml`](https://pypi.org/project/juniper-ml/) — platform meta-package on PyPI
|
|
128
|
+
|
|
129
|
+
## Research Philosophy
|
|
130
|
+
|
|
131
|
+
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.
|
|
132
|
+
|
|
133
|
+
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.
|
|
134
|
+
|
|
135
|
+
Within this programme, `juniper-data-client` is the canonical integration boundary between the training and data services. Its contract is the dataset-fetch interface used by every training-side consumer; changes to its surface are therefore changes to the platform's shared dataset semantics.
|
|
136
|
+
|
|
137
|
+
## Documentation
|
|
138
|
+
|
|
139
|
+
| Document | Purpose |
|
|
140
|
+
|----------|---------|
|
|
141
|
+
| [`docs/DOCUMENTATION_OVERVIEW.md`](docs/DOCUMENTATION_OVERVIEW.md) | Navigation index for all `juniper-data-client` documentation |
|
|
142
|
+
| [`docs/QUICK_START.md`](docs/QUICK_START.md) | Complete installation and verification guide |
|
|
143
|
+
| [`docs/REFERENCE.md`](docs/REFERENCE.md) | Full API reference, configuration, error model, and NPZ schema |
|
|
144
|
+
| [`docs/DEVELOPER_CHEATSHEET.md`](docs/DEVELOPER_CHEATSHEET.md) | Quick-reference card for development tasks |
|
|
145
|
+
| [`CHANGELOG.md`](CHANGELOG.md) | Version history |
|
|
146
|
+
|
|
147
|
+
## License
|
|
148
|
+
|
|
149
|
+
MIT License — see [`LICENSE`](LICENSE) for details.
|
|
@@ -4,18 +4,23 @@ This package provides a simple, robust client for interacting with the JuniperDa
|
|
|
4
4
|
dataset generation service, used by both JuniperCascor and juniper-canopy.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
from juniper_data_client.client import JuniperDataClient
|
|
7
|
+
from juniper_data_client.client import JuniperDataClient, RequestHook
|
|
8
|
+
from juniper_data_client.contract import validate_npz_contract
|
|
8
9
|
from juniper_data_client.exceptions import JuniperDataClientError, JuniperDataConfigurationError, JuniperDataConnectionError, JuniperDataNotFoundError, JuniperDataTimeoutError, JuniperDataValidationError
|
|
9
10
|
|
|
10
|
-
__version__ = "0.4.
|
|
11
|
+
__version__ = "0.4.2"
|
|
11
12
|
|
|
12
13
|
__all__ = [
|
|
13
14
|
"JuniperDataClient",
|
|
15
|
+
"validate_npz_contract",
|
|
14
16
|
"JuniperDataClientError",
|
|
15
17
|
"JuniperDataConfigurationError",
|
|
16
18
|
"JuniperDataConnectionError",
|
|
17
19
|
"JuniperDataNotFoundError",
|
|
18
20
|
"JuniperDataTimeoutError",
|
|
19
21
|
"JuniperDataValidationError",
|
|
22
|
+
# METRICS-MON R4.3 / seed-13: instrumentation hook type alias
|
|
23
|
+
# exported so consumers can type their hook closures.
|
|
24
|
+
"RequestHook",
|
|
20
25
|
"__version__",
|
|
21
26
|
]
|