easymodd 0.1.0__tar.gz → 0.2.4__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.
- easymodd-0.2.4/PKG-INFO +466 -0
- easymodd-0.2.4/README.md +426 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/pyproject.toml +5 -3
- easymodd-0.2.4/src/EasyModel/__init__.py +81 -0
- easymodd-0.2.4/src/EasyModel/app_builder.py +45 -0
- easymodd-0.2.4/src/EasyModel/artifacts.py +64 -0
- easymodd-0.2.4/src/EasyModel/backends.py +52 -0
- easymodd-0.2.4/src/EasyModel/cli.py +129 -0
- easymodd-0.2.4/src/EasyModel/compilers.py +51 -0
- easymodd-0.2.4/src/EasyModel/config.py +43 -0
- easymodd-0.2.4/src/EasyModel/decompilers.py +55 -0
- easymodd-0.2.4/src/EasyModel/encryption.py +180 -0
- easymodd-0.2.4/src/EasyModel/errors.py +29 -0
- easymodd-0.2.4/src/EasyModel/events.py +96 -0
- easymodd-0.2.4/src/EasyModel/extensions.py +88 -0
- easymodd-0.2.4/src/EasyModel/mathx.py +109 -0
- easymodd-0.2.4/src/EasyModel/networking.py +165 -0
- easymodd-0.2.4/src/EasyModel/passport.py +234 -0
- easymodd-0.2.4/src/EasyModel/process.py +73 -0
- easymodd-0.2.4/src/EasyModel/reports.py +46 -0
- easymodd-0.2.4/src/EasyModel/security.py +35 -0
- easymodd-0.2.4/src/EasyModel/simulation.py +76 -0
- easymodd-0.2.4/src/EasyModel/webui.py +172 -0
- easymodd-0.2.4/src/EasyModel/workbench.py +157 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/__init__.py +5 -1
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/cli.py +14 -1
- easymodd-0.2.4/src/easymodd/corpus.py +159 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/data.py +64 -0
- easymodd-0.2.4/src/easymodd.egg-info/PKG-INFO +466 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd.egg-info/SOURCES.txt +28 -1
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd.egg-info/entry_points.txt +1 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd.egg-info/requires.txt +3 -0
- easymodd-0.2.4/src/easymodd.egg-info/top_level.txt +2 -0
- easymodd-0.2.4/tests/test_artifacts.py +64 -0
- easymodd-0.2.4/tests/test_full_stack.py +53 -0
- easymodd-0.2.4/tests/test_multifile_project.py +51 -0
- easymodd-0.2.4/tests/test_security_and_web.py +99 -0
- easymodd-0.2.4/tests/test_training_and_math.py +66 -0
- easymodd-0.1.0/PKG-INFO +0 -231
- easymodd-0.1.0/README.md +0 -193
- easymodd-0.1.0/src/easymodd.egg-info/PKG-INFO +0 -231
- easymodd-0.1.0/src/easymodd.egg-info/top_level.txt +0 -1
- {easymodd-0.1.0 → easymodd-0.2.4}/LICENSE +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/setup.cfg +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/callbacks.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/checkpoints.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/config.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/experiments.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/losses.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/metrics.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/models/__init__.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/models/mlp.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/models/text_transformer.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/models/vision_transformer.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/nn.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/optim.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/py.typed +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/registry.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/schedulers.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/secret_store.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/serialization.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/tensor.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/training.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/transforms.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/visualization.py +0 -0
- {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd.egg-info/dependency_links.txt +0 -0
easymodd-0.2.4/PKG-INFO
ADDED
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: easymodd
|
|
3
|
+
Version: 0.2.4
|
|
4
|
+
Summary: Composable model training, artifact analysis, secure workflows, and efficient data tooling
|
|
5
|
+
Author: Vnex Lab
|
|
6
|
+
Maintainer: Vnex Lab
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
Project-URL: Homepage, https://github.com/vnex-lab/EasyMoDD
|
|
9
|
+
Project-URL: Repository, https://github.com/vnex-lab/EasyMoDD
|
|
10
|
+
Project-URL: Issues, https://github.com/vnex-lab/EasyMoDD/issues
|
|
11
|
+
Project-URL: Documentation, https://github.com/vnex-lab/EasyMoDD#readme
|
|
12
|
+
Project-URL: Support, https://ko-fi.com/vnexlab
|
|
13
|
+
Keywords: machine-learning,deep-learning,numpy,cuda,training,transformers,artifact-analysis,decompiler,compiler,encryption
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Intended Audience :: Science/Research
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
23
|
+
Requires-Python: >=3.11
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
License-File: LICENSE
|
|
26
|
+
Requires-Dist: numpy>=2.0
|
|
27
|
+
Provides-Extra: cuda
|
|
28
|
+
Requires-Dist: cupy-cuda12x>=13.6; extra == "cuda"
|
|
29
|
+
Provides-Extra: data
|
|
30
|
+
Requires-Dist: pandas>=2.0; extra == "data"
|
|
31
|
+
Requires-Dist: pyarrow>=15.0; extra == "data"
|
|
32
|
+
Requires-Dist: scikit-learn>=1.4; extra == "data"
|
|
33
|
+
Provides-Extra: security
|
|
34
|
+
Requires-Dist: cryptography>=44; extra == "security"
|
|
35
|
+
Provides-Extra: dev
|
|
36
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
37
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
38
|
+
Requires-Dist: twine>=5.0; extra == "dev"
|
|
39
|
+
Dynamic: license-file
|
|
40
|
+
|
|
41
|
+
# EasyMoDD
|
|
42
|
+
|
|
43
|
+
EasyMoDD is a configurable, training-first machine-learning library. It is
|
|
44
|
+
programmable from Python like a numerical library, with reusable tensors,
|
|
45
|
+
modules, datasets, losses, optimizers, trainers, model families, and checkpoint
|
|
46
|
+
policies.
|
|
47
|
+
|
|
48
|
+
Models initialize randomly unless a consuming project explicitly resumes from
|
|
49
|
+
its own checkpoint. EasyMoDD does not include a chatbot, web application,
|
|
50
|
+
built-in corpus, project `config.txt`, generated checkpoints, or demo data.
|
|
51
|
+
|
|
52
|
+
## Install
|
|
53
|
+
|
|
54
|
+
```powershell
|
|
55
|
+
python -m pip install easymodd
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
For a local checkout:
|
|
59
|
+
|
|
60
|
+
```powershell
|
|
61
|
+
python -m pip install -e .
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
The core distribution is source-only plus NumPy; it does not bundle model
|
|
65
|
+
weights, corpora, JDKs, native toolchains, browsers, or decompiler binaries.
|
|
66
|
+
The web console uses Python's standard library. CUDA, tabular-data tooling,
|
|
67
|
+
and AES-GCM encryption are optional extras, keeping a normal install far below
|
|
68
|
+
2 GB. Large datasets, generated apps, models, and user-selected toolchains stay
|
|
69
|
+
outside the library package.
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
The package version is controlled by `project.version` in `pyproject.toml`.
|
|
73
|
+
Increase it for every PyPI release, and do not reuse an already-uploaded
|
|
74
|
+
version.
|
|
75
|
+
|
|
76
|
+
Optional integrations:
|
|
77
|
+
|
|
78
|
+
```powershell
|
|
79
|
+
python -m pip install easymodd[cuda]
|
|
80
|
+
python -m pip install easymodd[data]
|
|
81
|
+
python -m pip install easymodd[dev]
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Python API
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
import numpy as np
|
|
88
|
+
from easymodd import ArrayDataset, MSELoss, SGD, Trainer, build_mlp
|
|
89
|
+
|
|
90
|
+
model = build_mlp(input_size=1, hidden_sizes=[8], output_size=1)
|
|
91
|
+
dataset = ArrayDataset(
|
|
92
|
+
np.array([[1.0], [2.0], [3.0]], dtype=np.float32),
|
|
93
|
+
np.array([[2.0], [4.0], [6.0]], dtype=np.float32),
|
|
94
|
+
)
|
|
95
|
+
history = Trainer(
|
|
96
|
+
SGD(model.parameters(), learning_rate=0.01),
|
|
97
|
+
MSELoss(),
|
|
98
|
+
max_steps=100,
|
|
99
|
+
).fit(model, dataset)
|
|
100
|
+
print(history.values["loss"][-1])
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
The programmable foundation includes:
|
|
104
|
+
|
|
105
|
+
- NumPy and explicit CUDA backend helpers
|
|
106
|
+
- `Module`, `Parameter`, `Linear`, `ReLU`, and `Sequential`
|
|
107
|
+
- GELU, sigmoid, tanh, and dropout layers
|
|
108
|
+
- MLP model factory
|
|
109
|
+
- Model registries for custom factories
|
|
110
|
+
- `ArrayDataset` and packed `TextDataset`
|
|
111
|
+
- `BatchLoader`, deterministic splits, and `Subset`
|
|
112
|
+
- Composable transforms and batch collation
|
|
113
|
+
- MSE and cross-entropy loss contracts
|
|
114
|
+
- L1 and Huber losses
|
|
115
|
+
- SGD, Adam, and AdamW optimizers
|
|
116
|
+
- Cosine and warmup learning-rate schedulers
|
|
117
|
+
- Reusable `Trainer` and `TrainingHistory`
|
|
118
|
+
- Accuracy, MAE, and perplexity metrics
|
|
119
|
+
- JSONL metrics logging and early stopping callbacks
|
|
120
|
+
- Local experiment tracking and dependency-free summaries
|
|
121
|
+
- Versioned model/optimizer/scheduler serialization
|
|
122
|
+
- Environment-only secrets for optional integrations
|
|
123
|
+
- Config loading and validation for consuming projects
|
|
124
|
+
- Checkpoint enable/disable, retention, and compression policy
|
|
125
|
+
- Separate text Transformer and Vision Transformer configuration modules
|
|
126
|
+
- Streaming corpus fingerprints and bounded-memory duplicate audits
|
|
127
|
+
- Memory-mapped text windows for large byte-token corpora
|
|
128
|
+
|
|
129
|
+
### Corpus audit before training
|
|
130
|
+
|
|
131
|
+
The streaming auditor fingerprints the exact source file, estimates words and
|
|
132
|
+
tokens, reports blank or malformed records, and detects normalized duplicates.
|
|
133
|
+
It stores only record hashes in a temporary SQLite file rather than loading the
|
|
134
|
+
corpus or all hashes into RAM. Optionally write a deduplicated copy:
|
|
135
|
+
|
|
136
|
+
```powershell
|
|
137
|
+
easymodd audit-corpus --source corpus.jsonl --format jsonl `
|
|
138
|
+
--text-field response.text --deduplicated-output cleaned.jsonl --json
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Plain UTF-8 text is treated as newline-delimited records. JSONL is validated
|
|
142
|
+
one record at a time. The SHA-256 fingerprint and audit counts can be saved
|
|
143
|
+
with an experiment to make dataset changes visible before expensive training.
|
|
144
|
+
|
|
145
|
+
For training on a corpus larger than available RAM, use `MMapTextDataset`:
|
|
146
|
+
|
|
147
|
+
```python
|
|
148
|
+
from easymodd import MMapTextDataset
|
|
149
|
+
|
|
150
|
+
with MMapTextDataset("corpus.txt", sequence_length=512, stride=512) as dataset:
|
|
151
|
+
inputs, next_tokens = dataset[0]
|
|
152
|
+
print(len(dataset), inputs.shape, next_tokens.shape)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
It uses raw UTF-8 bytes as token IDs 0-255, keeps the source file memory-mapped,
|
|
156
|
+
and materializes only the requested sequence window. Use `stride < sequence_length`
|
|
157
|
+
for overlapping windows; this increases training examples and I/O.
|
|
158
|
+
|
|
159
|
+
The restored prototype scripts remain available as compatibility programs for
|
|
160
|
+
existing custom checkpoints. New projects should import EasyMoDD directly.
|
|
161
|
+
|
|
162
|
+
## Consumer Project Configuration
|
|
163
|
+
|
|
164
|
+
EasyMoDD does not force users into one project layout. A consuming project can
|
|
165
|
+
create its own `config.txt` using TOML syntax and load it with:
|
|
166
|
+
|
|
167
|
+
```python
|
|
168
|
+
from easymodd import load_config
|
|
169
|
+
config = load_config("config.txt")
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
The config loader supports project-defined paths for datasets, runs, models,
|
|
173
|
+
logs, and checkpoints. The library never assumes a filename such as
|
|
174
|
+
`best.bin`.
|
|
175
|
+
|
|
176
|
+
A consumer project can configure checkpoint behavior like this:
|
|
177
|
+
|
|
178
|
+
```toml
|
|
179
|
+
[checkpoints]
|
|
180
|
+
enabled = true
|
|
181
|
+
keep_recent = 2
|
|
182
|
+
compress_old = true
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
When disabled, `CheckpointManager` creates no directory or files. When enabled,
|
|
186
|
+
older numbered checkpoints can be compressed while recent checkpoints remain
|
|
187
|
+
available.
|
|
188
|
+
|
|
189
|
+
## Package Layout
|
|
190
|
+
|
|
191
|
+
```text
|
|
192
|
+
src/easymodd/
|
|
193
|
+
models/
|
|
194
|
+
mlp.py
|
|
195
|
+
text_transformer.py
|
|
196
|
+
vision_transformer.py
|
|
197
|
+
data.py
|
|
198
|
+
losses.py
|
|
199
|
+
nn.py
|
|
200
|
+
tensor.py
|
|
201
|
+
optim.py
|
|
202
|
+
training.py
|
|
203
|
+
checkpoints.py
|
|
204
|
+
config.py
|
|
205
|
+
cli.py
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Each model family has its own module. The shared training contracts are designed
|
|
209
|
+
so new model types can be added without changing dataset or checkpoint code.
|
|
210
|
+
|
|
211
|
+
## Extending EasyMoDD
|
|
212
|
+
|
|
213
|
+
Register a custom model factory:
|
|
214
|
+
|
|
215
|
+
```python
|
|
216
|
+
from easymodd import ModelRegistry
|
|
217
|
+
|
|
218
|
+
registry = ModelRegistry()
|
|
219
|
+
registry.register("my_model", lambda width=8: build_my_model(width))
|
|
220
|
+
model = registry.create("my_model", width=32)
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Optional integrations can read environment variables without storing secrets:
|
|
224
|
+
|
|
225
|
+
```python
|
|
226
|
+
from easymodd import SecretStore
|
|
227
|
+
|
|
228
|
+
secrets = SecretStore(prefix="MY_APP_")
|
|
229
|
+
token = secrets.get("TRACKING_TOKEN")
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
EasyMoDD never writes API keys to configs, checkpoints, experiment files, or
|
|
233
|
+
logs. Provider-specific integrations can be built on top of this helper.
|
|
234
|
+
|
|
235
|
+
## Data and Training
|
|
236
|
+
|
|
237
|
+
The library does not ship a general-purpose training database. Users provide
|
|
238
|
+
legally obtained text, image, or tabular data in their own projects. EasyMoDD
|
|
239
|
+
provides dataset contracts and validation helpers; it does not pretend that a
|
|
240
|
+
small demo corpus can produce a general assistant.
|
|
241
|
+
|
|
242
|
+
## Development Status
|
|
243
|
+
|
|
244
|
+
The tensor/module API, programmable MLP training loop, dataset contracts,
|
|
245
|
+
checkpoint policy, model-family layout, and config loader are implemented.
|
|
246
|
+
Text Transformer training, Vision Transformer training, full resume manifests,
|
|
247
|
+
evaluation, schedulers, callbacks, and additional model families are active
|
|
248
|
+
parts of the public-library roadmap.
|
|
249
|
+
|
|
250
|
+
Support development on [Ko-fi](https://ko-fi.com/vnexlab).
|
|
251
|
+
|
|
252
|
+
## Tests and examples
|
|
253
|
+
|
|
254
|
+
The `tests/` directory contains individual subsystem tests plus a full-stack
|
|
255
|
+
integration test. `examples/multi_file_project/` demonstrates a real consumer
|
|
256
|
+
project layout with TOML config, multiple Python plugin files, custom web
|
|
257
|
+
routes/pages, C++ source, a CMake shared-library recipe, and a custom DLL
|
|
258
|
+
metadata backend.
|
|
259
|
+
|
|
260
|
+
The multi-file test loads that consumer config, discovers the C++ source,
|
|
261
|
+
registers the custom backend/API/page, and inspects a synthetic PE DLL without
|
|
262
|
+
loading or executing it. A C++ compiler command is dry-run only and is skipped
|
|
263
|
+
when no compatible compiler is installed. Tests also cover Java JAR/class,
|
|
264
|
+
Python bytecode, WebAssembly, training, corpus auditing, encryption, web auth,
|
|
265
|
+
simulation, math helpers, and local forwarding.
|
|
266
|
+
|
|
267
|
+
Run the suite with:
|
|
268
|
+
|
|
269
|
+
```powershell
|
|
270
|
+
python -m pip install -e ".[dev,security]"
|
|
271
|
+
python -m pytest -q
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
If a native C++ compiler is installed, the suite also verifies the compiler
|
|
275
|
+
adapter's dry-run command. It does not execute generated DLL/EXE fixtures.
|
|
276
|
+
|
|
277
|
+
## EasyModel artifact tooling
|
|
278
|
+
|
|
279
|
+
This distribution also includes the separate `EasyModel` namespace for safe,
|
|
280
|
+
configurable artifact inspection, simulations, app scaffolding, networking, and
|
|
281
|
+
compiler/decompiler adapters. It does not replace the `easymodd` training API.
|
|
282
|
+
|
|
283
|
+
The namespaces connect through `EasyModel.Workbench` and a bounded,
|
|
284
|
+
thread-safe event bus. Training, simulations, corpus audits, artifact
|
|
285
|
+
inspection, encryption, and custom tools publish redacted events to one local
|
|
286
|
+
run history. `EzMHandler` is the root facade for coordinated operations.
|
|
287
|
+
|
|
288
|
+
```python
|
|
289
|
+
from EasyModel import SecurityPolicy, detect_artifact
|
|
290
|
+
from EzDecompiler import EzDecompiler
|
|
291
|
+
|
|
292
|
+
handler = EzDecompiler(policy=SecurityPolicy(allow_native_tools=False))
|
|
293
|
+
artifact = handler.detect("application.jar")
|
|
294
|
+
report = handler.inspect("application.jar")
|
|
295
|
+
print(artifact.kind, report.to_json())
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
From a source checkout:
|
|
299
|
+
|
|
300
|
+
```powershell
|
|
301
|
+
python EzDecompiler.py detect application.jar --json
|
|
302
|
+
python EzDecompiler.py inspect application.jar --json
|
|
303
|
+
python EzDecompiler.py decompile application.jar --dry-run --json
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
After installation:
|
|
307
|
+
|
|
308
|
+
```powershell
|
|
309
|
+
easymodel detect application.jar --json
|
|
310
|
+
easymodel inspect application.jar --json
|
|
311
|
+
easymodel passport application.jar --json
|
|
312
|
+
easymodel compare original.jar --against rebuilt.jar --json
|
|
313
|
+
easymodel web
|
|
314
|
+
easymodel lan
|
|
315
|
+
easymodel app --name my_toolbox --directory ./my_toolbox --template toolbox
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
An Artifact Passport adds a streaming SHA-256 identity plus safe structural
|
|
319
|
+
metadata: JAR entry and manifest inventory, archive traversal/duplicate-name
|
|
320
|
+
warnings, PE sections and .NET marker detection, Python bytecode header details,
|
|
321
|
+
and WebAssembly section sizes. It never extracts or executes the artifact.
|
|
322
|
+
Passports can be compared to see whether rebuilt or transformed outputs changed.
|
|
323
|
+
|
|
324
|
+
### Local web workbench
|
|
325
|
+
|
|
326
|
+
`easymodel web` starts a standard-library web console at `127.0.0.1:8765`. It
|
|
327
|
+
combines artifact passports, corpus audits, file encryption, and recent shared
|
|
328
|
+
events. The server prints a random session token; enter it in the page. Remote
|
|
329
|
+
binding is rejected unless explicitly enabled with a token, and remote use must
|
|
330
|
+
be behind HTTPS. Keyboard shortcuts only operate inside the open browser page;
|
|
331
|
+
the library does not capture system-wide keystrokes.
|
|
332
|
+
|
|
333
|
+
Trusted plugins can add isolated browser pages and authenticated POST API
|
|
334
|
+
routes. A custom page can call registered routes through the parent console
|
|
335
|
+
bridge without receiving the session token. Plugins execute Python code, so
|
|
336
|
+
load only modules you trust.
|
|
337
|
+
|
|
338
|
+
### Custom pages and API plugins
|
|
339
|
+
|
|
340
|
+
Consumer-owned TOML controls plugin loading and the web address:
|
|
341
|
+
|
|
342
|
+
```toml
|
|
343
|
+
[plugins]
|
|
344
|
+
enabled = true
|
|
345
|
+
modules = ["my_project.easy_plugins"]
|
|
346
|
+
|
|
347
|
+
[web]
|
|
348
|
+
host = "127.0.0.1"
|
|
349
|
+
port = 8765
|
|
350
|
+
allow_remote = false
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
Each configured module exposes `register(workbench)`:
|
|
354
|
+
|
|
355
|
+
```python
|
|
356
|
+
from EasyModel import ApiRoute, ArtifactKind, WebPage
|
|
357
|
+
from EasyModel.compilers import CompilerBackend
|
|
358
|
+
from EasyModel.decompilers import ExternalDecompiler
|
|
359
|
+
|
|
360
|
+
def register(workbench):
|
|
361
|
+
workbench.register_component("tools", "hello", lambda: {"ready": True})
|
|
362
|
+
workbench.register_compiler_backend(CompilerBackend("cc", "cc"))
|
|
363
|
+
workbench.register_decompiler_backend(ExternalDecompiler(
|
|
364
|
+
"my-java-decompiler", "my-decompiler", {ArtifactKind.JAR, ArtifactKind.CLASS}
|
|
365
|
+
))
|
|
366
|
+
workbench.register_page(WebPage(
|
|
367
|
+
"/pages/status", "Project status",
|
|
368
|
+
"<main><h1>Project status</h1><p>Custom page content.</p></main>",
|
|
369
|
+
))
|
|
370
|
+
workbench.register_api_route(ApiRoute(
|
|
371
|
+
"/api/custom/status", lambda body, hub: {"ready": True}
|
|
372
|
+
))
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
The page runs in a sandboxed frame. It can ask the parent workbench to call
|
|
376
|
+
only registered custom POST routes:
|
|
377
|
+
|
|
378
|
+
```javascript
|
|
379
|
+
window.parent.postMessage({
|
|
380
|
+
type: "easymodel-api",
|
|
381
|
+
path: "/api/custom/status",
|
|
382
|
+
payload: {}
|
|
383
|
+
}, "*");
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
The browser hosts custom page HTML in a sandboxed frame. Custom API routes are
|
|
387
|
+
POST-only and require the same session authentication as built-in operations.
|
|
388
|
+
|
|
389
|
+
### App builder, simulation, and math
|
|
390
|
+
|
|
391
|
+
Scaffold a separate consumer project without overwriting existing files:
|
|
392
|
+
|
|
393
|
+
```powershell
|
|
394
|
+
easymodel app --name lab_app --directory ./lab_app --template web
|
|
395
|
+
easymodel app --name queue_sim --directory ./queue_sim --template simulation
|
|
396
|
+
easymodel app --name model_lab --directory ./model_lab --template training
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
The `DiscreteEventSimulator` provides deterministic event scheduling, seeded
|
|
400
|
+
randomness, and a maximum event count. Register simulation factories under
|
|
401
|
+
the `simulations` component group and run them with `easymodel simulate --config
|
|
402
|
+
config.toml --component your_simulator`. `EasyModel.mathx` provides stable
|
|
403
|
+
softmax, blockwise pairwise distances, linear solves, and Simpson integration
|
|
404
|
+
using NumPy's optimized kernels, finite-difference gradients, and deterministic memory-bounded Monte Carlo integration.
|
|
405
|
+
|
|
406
|
+
The shared component registry includes starter providers for MLP models,
|
|
407
|
+
discrete-event simulations, JAR inspection, project scaffolding, corpus audit,
|
|
408
|
+
and artifact passports. Custom plugins may register more models, simulators,
|
|
409
|
+
compilers, decompilers, apps, browser pages, and authenticated API routes.
|
|
410
|
+
|
|
411
|
+
Compiler commands are blocked unless execution is explicitly allowed. Inspect
|
|
412
|
+
the structured command first with `--dry-run`; only execute a toolchain and
|
|
413
|
+
source you trust:
|
|
414
|
+
|
|
415
|
+
```powershell
|
|
416
|
+
easymodel compile main.c --backend cc --output app --dry-run --config config.toml
|
|
417
|
+
easymodel compile main.c --backend cc --output app --allow-execution --config config.toml
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
### LAN hosting and TCP forwarding
|
|
421
|
+
|
|
422
|
+
`easymodel lan` reports private interface addresses. To intentionally make the
|
|
423
|
+
console reachable on a trusted LAN, use an environment token and explicitly
|
|
424
|
+
enable remote binding:
|
|
425
|
+
|
|
426
|
+
```powershell
|
|
427
|
+
$env:EASYMODEL_WEB_TOKEN = "a-long-random-token"
|
|
428
|
+
easymodel web --host 0.0.0.0 --allow-remote
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
`easymodel forward --port 9000 --target-host 127.0.0.1 --target-port 8000`
|
|
432
|
+
forwards a local TCP port. Non-loopback bind addresses require
|
|
433
|
+
`--allow-remote`. Forwarding does not edit router/firewall rules, configure
|
|
434
|
+
UPnP, or create an Internet tunnel. External reachability remains the network
|
|
435
|
+
owner's responsibility; never expose an unauthenticated service.
|
|
436
|
+
|
|
437
|
+
### Streaming file encryption
|
|
438
|
+
|
|
439
|
+
Install the optional security extra and keep passphrases in the environment,
|
|
440
|
+
not shell history:
|
|
441
|
+
|
|
442
|
+
```powershell
|
|
443
|
+
python -m pip install "easymodd[security]"
|
|
444
|
+
$env:EASYMODEL_PASSPHRASE = "use-a-long-unique-passphrase"
|
|
445
|
+
easymodel encrypt confidential.bin --output confidential.bin.emenc
|
|
446
|
+
easymodel decrypt confidential.bin.emenc --output restored.bin
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
Encryption uses chunked AES-256-GCM with authenticated headers/chunks,
|
|
450
|
+
truncation detection, and atomic output. Files stream through fixed-size
|
|
451
|
+
buffers rather than loading entirely into RAM. Passphrases are never saved in
|
|
452
|
+
configs, event logs, or file metadata. Losing the passphrase means the file
|
|
453
|
+
cannot be recovered.
|
|
454
|
+
|
|
455
|
+
Supported artifact families include Java JAR/class, Windows PE EXE/DLL,
|
|
456
|
+
.NET assemblies, Python bytecode, and WebAssembly detection. The first
|
|
457
|
+
release provides safe built-in JAR inspection plus optional external-tool
|
|
458
|
+
adapters. Native binaries can produce headers, imports, assembly, or
|
|
459
|
+
pseudocode, but cannot reliably restore original optimized source code.
|
|
460
|
+
|
|
461
|
+
Compiler adapters use installed toolchains such as `javac`, `.NET`, Python,
|
|
462
|
+
GCC/Clang/MSVC, or WebAssembly tools. Tool execution is policy-controlled and
|
|
463
|
+
disabled by default unless explicitly enabled by the consumer project.
|
|
464
|
+
|
|
465
|
+
Only analyze software you own or have permission to inspect. EasyModel does
|
|
466
|
+
not provide DRM, anti-tamper, or access-control bypass functionality.
|