dataerai-sdk 0.2.0b20__tar.gz → 0.2.0.dev1__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.
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/PKG-INFO +1 -137
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/README.md +0 -127
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/__init__.py +1 -18
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/_daemon.py +6 -25
- dataerai_sdk-0.2.0.dev1/dataerai/_errors.py +17 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/_types.py +1 -62
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/_version.py +1 -1
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/client.py +30 -275
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/access.py +3 -55
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/attribution/client.py +1 -2
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/croissant.py +1 -1
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/lineage.py +6 -11
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/staging.py +2 -2
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai_sdk.egg-info/PKG-INFO +1 -137
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai_sdk.egg-info/SOURCES.txt +0 -12
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai_sdk.egg-info/requires.txt +0 -11
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/pyproject.toml +1 -13
- dataerai_sdk-0.2.0b20/dataerai/_errors.py +0 -59
- dataerai_sdk-0.2.0b20/dataerai/_transport.py +0 -278
- dataerai_sdk-0.2.0b20/dataerai/magics.py +0 -126
- dataerai_sdk-0.2.0b20/dataerai/nn/__init__.py +0 -20
- dataerai_sdk-0.2.0b20/dataerai/nn/system.py +0 -202
- dataerai_sdk-0.2.0b20/dataerai/nn/tensorflow.py +0 -535
- dataerai_sdk-0.2.0b20/dataerai/notebook.py +0 -264
- dataerai_sdk-0.2.0b20/dataerai/notebook_trace.py +0 -699
- dataerai_sdk-0.2.0b20/tests/test_collections.py +0 -195
- dataerai_sdk-0.2.0b20/tests/test_notebook.py +0 -223
- dataerai_sdk-0.2.0b20/tests/test_notebook_trace.py +0 -611
- dataerai_sdk-0.2.0b20/tests/test_terms_gate.py +0 -218
- dataerai_sdk-0.2.0b20/tests/test_transport.py +0 -151
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/LICENSE +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/_agent.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/_framing.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/_timeparse.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/bambu/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/bambu/capture.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/bambu/cli.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/bambu/fleet_hub.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/bambu/integration.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/bambu/journal.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/bambu/models.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/bambu/recorder.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/api.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/bases.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/bio/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/bio/alignment.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/bio/fcs.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/bio/gff.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/bio/sequence.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/bio/vcf.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/checksum.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/compchem/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/compchem/molfile.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/compchem/qchem_output.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/compchem/structure.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/compchem/xyz.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/containers/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/containers/fits.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/containers/hdf5.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/containers/image.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/containers/matlab.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/containers/netcdf.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/containers/nexus.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/containers/numpy_array.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/containers/parquet.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/containers/tiff.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/containers/zarr_store.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/converter.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/converters/AFM/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/converters/AFM/oxfordAFM/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/converters/AFM/oxfordAFM/ibw.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/converters/RHEED/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/converters/RHEED/ksa/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/converters/RHEED/ksa/imm.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/converters/Xray/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/converters/Xray/panalytical/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/converters/Xray/panalytical/xrdml.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/converters/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/core.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/crystallography/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/crystallography/cif.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/crystallography/vasp.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/data_type.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/data_type_definitions.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/AFM/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/AFM/bandexcitation/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/AFM/bandexcitation/h5.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/AFM/bruker/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/AFM/bruker/nanoscope.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/AFM/oxfordAFM/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/AFM/oxfordAFM/ibw.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/EM/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/EM/dm/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/EM/dm/dm3.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/EM/dm/dm4.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/RHEED/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/RHEED/ksa/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/RHEED/ksa/imm.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/Xray/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/Xray/panalytical/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/Xray/panalytical/xrdml.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/instruments/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/massspec/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/massspec/imzml.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/massspec/mzml.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/massspec/mzxml.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/massspec/thermo_raw.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/medical/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/medical/dicom.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/medical/edf.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/medical/nifti.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/medical/nwb.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/microscopy/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/microscopy/czi.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/microscopy/leica_lif.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/microscopy/nd2.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/microscopy/olympus.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/registry.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/spectroscopy/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/spectroscopy/bruker_opus.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/spectroscopy/jcamp.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/spectroscopy/renishaw_wdf.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/spectroscopy/thermo_spc.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/units.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/utils.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/instruments/Xray/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/instruments/Xray/panalytical/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/instruments/Xray/panalytical/xrd.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/instruments/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/instruments/oxford/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/instruments/oxford/afms/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/instruments/oxford/afms/afm.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/instruments/oxford/afms/dart_pfm.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/instruments/oxford/afms/single_frequency_pfm.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/instruments/oxford/afms/vector_pfm.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/instruments/oxford/afms/visualize.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/layout.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/maps.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/metadata.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/metadata_schemas/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/metadata_schemas/afm.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/metaextract/viz/router.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/ai_ready_reader.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/attribution/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/attribution/calibration.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/attribution/codes.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/attribution/hooks.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/attribution/inference.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/attribution/sae.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/attribution/training.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/bench.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/cache.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/gpu.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/hls4ml.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/io.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/keras_dataset.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/loader.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/report.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/stream/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/stream/_docs.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/stream/errors.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/stream/live.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/stream/reader.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/stream/session.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/stream/timeseries.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/stream/video.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/stream/writer.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/telemetry.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/train_reference.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/ml/zarr_dataset.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/__main__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/agent.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/api.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/artifacts.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/capabilities.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/cli.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/config.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/device_auth.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/executor.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/handlers/__init__.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/handlers/bench.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/handlers/stage.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/handlers/train.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/heartbeat.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/sigv4.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/state.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai/runner/telemetry.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai_sdk.egg-info/dependency_links.txt +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai_sdk.egg-info/entry_points.txt +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/dataerai_sdk.egg-info/top_level.txt +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/setup.cfg +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_agent.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ai_ready_croissant_external.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ai_ready_croissant_external_mlc.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_attribution_inference.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_attribution_sae.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_attribution_training.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_client.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_framing.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_keras_hls4ml.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_lineage_client.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_access_ttl.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_ai_ready_croissant.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_ai_ready_reader.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_bench.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_cache.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_content_pinning.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_cred_lifecycle.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_distributed.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_gpu.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_gpu_path.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_io.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_loader.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_packaging.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_read_path.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_review_followups.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_review_followups_torch.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_sampler_correctness.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_staging.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_ml_telemetry.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_stream_core.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_stream_live.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_stream_timeseries.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_stream_video.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_timeparse.py +0 -0
- {dataerai_sdk-0.2.0b20 → dataerai_sdk-0.2.0.dev1}/tests/test_zarr_dataset.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dataerai-sdk
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.0.dev1
|
|
4
4
|
Summary: Python SDK for the Dataerai transfer daemon
|
|
5
5
|
Author: Dataerai
|
|
6
6
|
License: DATAERAI PROPRIETARY SOFTWARE LICENSE AGREEMENT
|
|
@@ -370,15 +370,6 @@ License-File: LICENSE
|
|
|
370
370
|
Provides-Extra: dev
|
|
371
371
|
Requires-Dist: pytest>=8; extra == "dev"
|
|
372
372
|
Requires-Dist: pytest-mock>=3; extra == "dev"
|
|
373
|
-
Requires-Dist: ipython>=8; extra == "dev"
|
|
374
|
-
Provides-Extra: notebook
|
|
375
|
-
Requires-Dist: ipython>=8; extra == "notebook"
|
|
376
|
-
Provides-Extra: nn-tensorflow
|
|
377
|
-
Requires-Dist: ipython>=8; extra == "nn-tensorflow"
|
|
378
|
-
Requires-Dist: tensorflow<2.19,>=2.18; extra == "nn-tensorflow"
|
|
379
|
-
Requires-Dist: numpy<3,>=2; extra == "nn-tensorflow"
|
|
380
|
-
Requires-Dist: psutil>=5.9; extra == "nn-tensorflow"
|
|
381
|
-
Requires-Dist: nvidia-ml-py>=12; extra == "nn-tensorflow"
|
|
382
373
|
Provides-Extra: bambu
|
|
383
374
|
Requires-Dist: imageio-ffmpeg>=0.6; extra == "bambu"
|
|
384
375
|
Provides-Extra: ml-io
|
|
@@ -495,8 +486,6 @@ Optional ML adapters are installed separately so the base SDK stays small:
|
|
|
495
486
|
pip install --pre "dataerai-sdk[ml]>=0.2.0b1,<0.3" # PyTorch Zarr datasets
|
|
496
487
|
pip install --pre "dataerai-sdk[ml-keras]>=0.2.0b1,<0.3" # Keras batches
|
|
497
488
|
pip install --pre "dataerai-sdk[ml-hls4ml]>=0.2.0b1,<0.3" # HLS4ML conversion
|
|
498
|
-
pip install --pre "dataerai-sdk[notebook]>=0.2.0b1,<0.3" # IPython %dataerai magic
|
|
499
|
-
pip install --pre "dataerai-sdk[nn-tensorflow]>=0.2.0b1,<0.3" # TensorFlow provenance
|
|
500
489
|
```
|
|
501
490
|
|
|
502
491
|
## Quick start
|
|
@@ -548,126 +537,6 @@ with DataeraiClient(binary_path="/usr/local/bin/dataerai") as client:
|
|
|
548
537
|
print(f"Linked via {relationship.type} to {related_id}")
|
|
549
538
|
```
|
|
550
539
|
|
|
551
|
-
## Notebook magic
|
|
552
|
-
|
|
553
|
-
After signing in with the Dataerai CLI, a notebook only needs a destination
|
|
554
|
-
path. The first component names the project; the notebook magic creates that
|
|
555
|
-
project when it is missing, then creates any missing collection components
|
|
556
|
-
beneath it:
|
|
557
|
-
|
|
558
|
-
```python
|
|
559
|
-
DESTINATION_COLLECTION_PATH = "Research / Experiments / July"
|
|
560
|
-
|
|
561
|
-
%load_ext dataerai.magics
|
|
562
|
-
%dataerai $DESTINATION_COLLECTION_PATH
|
|
563
|
-
```
|
|
564
|
-
|
|
565
|
-
The magic publishes a `dataerai_session` variable. Its uploads automatically
|
|
566
|
-
target the selected project and collection:
|
|
567
|
-
|
|
568
|
-
```python
|
|
569
|
-
dataset = dataerai_session.find_asset(
|
|
570
|
-
"did:dataerai:beta:asset:...",
|
|
571
|
-
title="input.csv",
|
|
572
|
-
)
|
|
573
|
-
dataerai_session.download(dataset, "source-data")
|
|
574
|
-
result = dataerai_session.upload(
|
|
575
|
-
"analysis.csv",
|
|
576
|
-
metadata={"component": "derived-output"},
|
|
577
|
-
)
|
|
578
|
-
```
|
|
579
|
-
|
|
580
|
-
Use `%dataerai --as run $DESTINATION_COLLECTION_PATH` to choose a different
|
|
581
|
-
session variable. Regular Python code can call
|
|
582
|
-
`connect_notebook(DESTINATION_COLLECTION_PATH)` instead.
|
|
583
|
-
|
|
584
|
-
### Trace a notebook run
|
|
585
|
-
|
|
586
|
-
Add `--trace` to capture every subsequent cell's source, timestamps, stdout,
|
|
587
|
-
stderr, structured Python logging records, rich display outputs, returned
|
|
588
|
-
value, and error. Uploads and downloads through the session join the same run
|
|
589
|
-
automatically, following the run-centered provenance pattern used by the QICK
|
|
590
|
-
integration:
|
|
591
|
-
|
|
592
|
-
```python
|
|
593
|
-
%dataerai --trace --notebook analysis.ipynb --title "July analysis" $DESTINATION_COLLECTION_PATH
|
|
594
|
-
|
|
595
|
-
# Run analysis cells and upload their products through dataerai_session.
|
|
596
|
-
result = dataerai_session.upload(
|
|
597
|
-
"analysis.csv",
|
|
598
|
-
record_type="analysis",
|
|
599
|
-
metadata={"component": "derived-output"},
|
|
600
|
-
)
|
|
601
|
-
|
|
602
|
-
%dataerai --finish
|
|
603
|
-
```
|
|
604
|
-
|
|
605
|
-
`%dataerai --finish` waits until its cell completes, then uploads a JSON
|
|
606
|
-
execution-log asset with `record_type="log"`. Every uploaded asset carries a
|
|
607
|
-
shared `notebook_run_id` plus `dataerai-notebook-trace` and
|
|
608
|
-
`notebook-run:<run-id>` tags. The log is linked to each recorded input and
|
|
609
|
-
product with `records_telemetry`, and the published result is available as
|
|
610
|
-
`dataerai_trace`. Run identity is merged onto an existing same-title asset, so
|
|
611
|
-
re-running a fixed notebook or output filename keeps both run tags searchable.
|
|
612
|
-
If a traced cell fails, its source, outputs, error, and traceback are published
|
|
613
|
-
immediately; an explicit `%dataerai --finish` is not required for that failed
|
|
614
|
-
run.
|
|
615
|
-
|
|
616
|
-
Tracing is deliberately opt-in because cell source and output can contain
|
|
617
|
-
secrets or sensitive research data. Review the notebook before enabling it.
|
|
618
|
-
The recorder does not read environment-variable values or scan/upload arbitrary
|
|
619
|
-
files; a file becomes a recorded product only when the notebook uploads it
|
|
620
|
-
through the traced session. Finish an active trace before starting another one
|
|
621
|
-
in the same Python kernel.
|
|
622
|
-
|
|
623
|
-
## TensorFlow neural-network provenance
|
|
624
|
-
|
|
625
|
-
`TensorFlowProvenanceTracker` implements the complete preservation contract
|
|
626
|
-
ported from
|
|
627
|
-
[DataFed_TorchFlow](https://github.com/m3-learning/DataFed_TorchFlow). It saves
|
|
628
|
-
native `.keras` checkpoints containing model and optimizer state, writes a
|
|
629
|
-
machine-readable manifest, captures architecture and hyperparameters, data and
|
|
630
|
-
training-code checksums, outcomes, and full runtime/system properties, and
|
|
631
|
-
authors `derived-from` links to datasets, the notebook, and prior checkpoints.
|
|
632
|
-
|
|
633
|
-
```python
|
|
634
|
-
from dataerai.nn import TensorFlowProvenanceTracker
|
|
635
|
-
|
|
636
|
-
tracker = TensorFlowProvenanceTracker(
|
|
637
|
-
model,
|
|
638
|
-
session=dataerai_session,
|
|
639
|
-
run_name="mnist-mlp",
|
|
640
|
-
dataset_references=[
|
|
641
|
-
{
|
|
642
|
-
"asset_id": dataset_asset.asset_id,
|
|
643
|
-
"source_asset_did": SOURCE_ASSET_DID,
|
|
644
|
-
"filename": DATA_PATH.name,
|
|
645
|
-
"sha256": dataset_sha,
|
|
646
|
-
}
|
|
647
|
-
],
|
|
648
|
-
notebook_path=NOTEBOOK_PATH,
|
|
649
|
-
notebook_asset_id=notebook_asset.asset_id,
|
|
650
|
-
)
|
|
651
|
-
history = model.fit(
|
|
652
|
-
x_train,
|
|
653
|
-
y_train,
|
|
654
|
-
epochs=2,
|
|
655
|
-
callbacks=[tracker.callback(training_parameters={"batch_size": 128})],
|
|
656
|
-
)
|
|
657
|
-
final = tracker.save_checkpoint(
|
|
658
|
-
epoch=2,
|
|
659
|
-
label="final",
|
|
660
|
-
record_name="mnist-mlp",
|
|
661
|
-
metrics={"test_accuracy": 0.91},
|
|
662
|
-
training_parameters={"batch_size": 128, "epochs": 2},
|
|
663
|
-
)
|
|
664
|
-
```
|
|
665
|
-
|
|
666
|
-
System capture intentionally does not enumerate environment variables. It
|
|
667
|
-
records OS/host, CPU and memory properties, TensorFlow-visible devices,
|
|
668
|
-
optional NVML GPU memory, Python/framework/package versions, and only a small
|
|
669
|
-
allowlist of determinism and thread settings.
|
|
670
|
-
|
|
671
540
|
## API reference
|
|
672
541
|
|
|
673
542
|
### `DataeraiClient(*, socket_path, binary_path, auto_start, start_timeout_s, request_timeout_s)`
|
|
@@ -687,11 +556,6 @@ Use as a context manager (`with DataeraiClient(...) as client:`) for automatic c
|
|
|
687
556
|
| Method | Returns | Description |
|
|
688
557
|
|---|---|---|
|
|
689
558
|
| `auth_status()` | `AuthStatus` | Logged-in user ID, email, and token expiry; `user_id` is `None` with older daemons |
|
|
690
|
-
| `list_tree()` | `list[TreeNode]` | List visible workspaces, projects, and collections |
|
|
691
|
-
| `create_collection(title, *, owner_type, owner_id, parent_id=None)` | `Collection` | Create a collection |
|
|
692
|
-
| `ensure_collection_path(path, *, create_project=False, project_description="")` | `CollectionDestination` | Resolve `Project / Collection / ...`, creating missing collection components and optionally the project |
|
|
693
|
-
| `search_assets(query, ...)` | `AssetSearchPage` | Search one page of visible assets |
|
|
694
|
-
| `find_assets(query, ...)` | `list[AssetSummary]` | Search and collect every result page |
|
|
695
559
|
| `create_project(name, *, description="")` | `Project` | Create a project (+ root collection, owner membership, default allocation); requires write scope |
|
|
696
560
|
| `upload(local_path, *, title, owner_type, owner_id, record_type=None, ...)` | `UploadResult` | Upload a file with an optional server-validated record type; blocks until complete |
|
|
697
561
|
| `download(asset_id, dest_dir, ...)` | `DownloadResult` | Download latest asset content; blocks until complete |
|
|
@@ -24,8 +24,6 @@ Optional ML adapters are installed separately so the base SDK stays small:
|
|
|
24
24
|
pip install --pre "dataerai-sdk[ml]>=0.2.0b1,<0.3" # PyTorch Zarr datasets
|
|
25
25
|
pip install --pre "dataerai-sdk[ml-keras]>=0.2.0b1,<0.3" # Keras batches
|
|
26
26
|
pip install --pre "dataerai-sdk[ml-hls4ml]>=0.2.0b1,<0.3" # HLS4ML conversion
|
|
27
|
-
pip install --pre "dataerai-sdk[notebook]>=0.2.0b1,<0.3" # IPython %dataerai magic
|
|
28
|
-
pip install --pre "dataerai-sdk[nn-tensorflow]>=0.2.0b1,<0.3" # TensorFlow provenance
|
|
29
27
|
```
|
|
30
28
|
|
|
31
29
|
## Quick start
|
|
@@ -77,126 +75,6 @@ with DataeraiClient(binary_path="/usr/local/bin/dataerai") as client:
|
|
|
77
75
|
print(f"Linked via {relationship.type} to {related_id}")
|
|
78
76
|
```
|
|
79
77
|
|
|
80
|
-
## Notebook magic
|
|
81
|
-
|
|
82
|
-
After signing in with the Dataerai CLI, a notebook only needs a destination
|
|
83
|
-
path. The first component names the project; the notebook magic creates that
|
|
84
|
-
project when it is missing, then creates any missing collection components
|
|
85
|
-
beneath it:
|
|
86
|
-
|
|
87
|
-
```python
|
|
88
|
-
DESTINATION_COLLECTION_PATH = "Research / Experiments / July"
|
|
89
|
-
|
|
90
|
-
%load_ext dataerai.magics
|
|
91
|
-
%dataerai $DESTINATION_COLLECTION_PATH
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
The magic publishes a `dataerai_session` variable. Its uploads automatically
|
|
95
|
-
target the selected project and collection:
|
|
96
|
-
|
|
97
|
-
```python
|
|
98
|
-
dataset = dataerai_session.find_asset(
|
|
99
|
-
"did:dataerai:beta:asset:...",
|
|
100
|
-
title="input.csv",
|
|
101
|
-
)
|
|
102
|
-
dataerai_session.download(dataset, "source-data")
|
|
103
|
-
result = dataerai_session.upload(
|
|
104
|
-
"analysis.csv",
|
|
105
|
-
metadata={"component": "derived-output"},
|
|
106
|
-
)
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
Use `%dataerai --as run $DESTINATION_COLLECTION_PATH` to choose a different
|
|
110
|
-
session variable. Regular Python code can call
|
|
111
|
-
`connect_notebook(DESTINATION_COLLECTION_PATH)` instead.
|
|
112
|
-
|
|
113
|
-
### Trace a notebook run
|
|
114
|
-
|
|
115
|
-
Add `--trace` to capture every subsequent cell's source, timestamps, stdout,
|
|
116
|
-
stderr, structured Python logging records, rich display outputs, returned
|
|
117
|
-
value, and error. Uploads and downloads through the session join the same run
|
|
118
|
-
automatically, following the run-centered provenance pattern used by the QICK
|
|
119
|
-
integration:
|
|
120
|
-
|
|
121
|
-
```python
|
|
122
|
-
%dataerai --trace --notebook analysis.ipynb --title "July analysis" $DESTINATION_COLLECTION_PATH
|
|
123
|
-
|
|
124
|
-
# Run analysis cells and upload their products through dataerai_session.
|
|
125
|
-
result = dataerai_session.upload(
|
|
126
|
-
"analysis.csv",
|
|
127
|
-
record_type="analysis",
|
|
128
|
-
metadata={"component": "derived-output"},
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
%dataerai --finish
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
`%dataerai --finish` waits until its cell completes, then uploads a JSON
|
|
135
|
-
execution-log asset with `record_type="log"`. Every uploaded asset carries a
|
|
136
|
-
shared `notebook_run_id` plus `dataerai-notebook-trace` and
|
|
137
|
-
`notebook-run:<run-id>` tags. The log is linked to each recorded input and
|
|
138
|
-
product with `records_telemetry`, and the published result is available as
|
|
139
|
-
`dataerai_trace`. Run identity is merged onto an existing same-title asset, so
|
|
140
|
-
re-running a fixed notebook or output filename keeps both run tags searchable.
|
|
141
|
-
If a traced cell fails, its source, outputs, error, and traceback are published
|
|
142
|
-
immediately; an explicit `%dataerai --finish` is not required for that failed
|
|
143
|
-
run.
|
|
144
|
-
|
|
145
|
-
Tracing is deliberately opt-in because cell source and output can contain
|
|
146
|
-
secrets or sensitive research data. Review the notebook before enabling it.
|
|
147
|
-
The recorder does not read environment-variable values or scan/upload arbitrary
|
|
148
|
-
files; a file becomes a recorded product only when the notebook uploads it
|
|
149
|
-
through the traced session. Finish an active trace before starting another one
|
|
150
|
-
in the same Python kernel.
|
|
151
|
-
|
|
152
|
-
## TensorFlow neural-network provenance
|
|
153
|
-
|
|
154
|
-
`TensorFlowProvenanceTracker` implements the complete preservation contract
|
|
155
|
-
ported from
|
|
156
|
-
[DataFed_TorchFlow](https://github.com/m3-learning/DataFed_TorchFlow). It saves
|
|
157
|
-
native `.keras` checkpoints containing model and optimizer state, writes a
|
|
158
|
-
machine-readable manifest, captures architecture and hyperparameters, data and
|
|
159
|
-
training-code checksums, outcomes, and full runtime/system properties, and
|
|
160
|
-
authors `derived-from` links to datasets, the notebook, and prior checkpoints.
|
|
161
|
-
|
|
162
|
-
```python
|
|
163
|
-
from dataerai.nn import TensorFlowProvenanceTracker
|
|
164
|
-
|
|
165
|
-
tracker = TensorFlowProvenanceTracker(
|
|
166
|
-
model,
|
|
167
|
-
session=dataerai_session,
|
|
168
|
-
run_name="mnist-mlp",
|
|
169
|
-
dataset_references=[
|
|
170
|
-
{
|
|
171
|
-
"asset_id": dataset_asset.asset_id,
|
|
172
|
-
"source_asset_did": SOURCE_ASSET_DID,
|
|
173
|
-
"filename": DATA_PATH.name,
|
|
174
|
-
"sha256": dataset_sha,
|
|
175
|
-
}
|
|
176
|
-
],
|
|
177
|
-
notebook_path=NOTEBOOK_PATH,
|
|
178
|
-
notebook_asset_id=notebook_asset.asset_id,
|
|
179
|
-
)
|
|
180
|
-
history = model.fit(
|
|
181
|
-
x_train,
|
|
182
|
-
y_train,
|
|
183
|
-
epochs=2,
|
|
184
|
-
callbacks=[tracker.callback(training_parameters={"batch_size": 128})],
|
|
185
|
-
)
|
|
186
|
-
final = tracker.save_checkpoint(
|
|
187
|
-
epoch=2,
|
|
188
|
-
label="final",
|
|
189
|
-
record_name="mnist-mlp",
|
|
190
|
-
metrics={"test_accuracy": 0.91},
|
|
191
|
-
training_parameters={"batch_size": 128, "epochs": 2},
|
|
192
|
-
)
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
System capture intentionally does not enumerate environment variables. It
|
|
196
|
-
records OS/host, CPU and memory properties, TensorFlow-visible devices,
|
|
197
|
-
optional NVML GPU memory, Python/framework/package versions, and only a small
|
|
198
|
-
allowlist of determinism and thread settings.
|
|
199
|
-
|
|
200
78
|
## API reference
|
|
201
79
|
|
|
202
80
|
### `DataeraiClient(*, socket_path, binary_path, auto_start, start_timeout_s, request_timeout_s)`
|
|
@@ -216,11 +94,6 @@ Use as a context manager (`with DataeraiClient(...) as client:`) for automatic c
|
|
|
216
94
|
| Method | Returns | Description |
|
|
217
95
|
|---|---|---|
|
|
218
96
|
| `auth_status()` | `AuthStatus` | Logged-in user ID, email, and token expiry; `user_id` is `None` with older daemons |
|
|
219
|
-
| `list_tree()` | `list[TreeNode]` | List visible workspaces, projects, and collections |
|
|
220
|
-
| `create_collection(title, *, owner_type, owner_id, parent_id=None)` | `Collection` | Create a collection |
|
|
221
|
-
| `ensure_collection_path(path, *, create_project=False, project_description="")` | `CollectionDestination` | Resolve `Project / Collection / ...`, creating missing collection components and optionally the project |
|
|
222
|
-
| `search_assets(query, ...)` | `AssetSearchPage` | Search one page of visible assets |
|
|
223
|
-
| `find_assets(query, ...)` | `list[AssetSummary]` | Search and collect every result page |
|
|
224
97
|
| `create_project(name, *, description="")` | `Project` | Create a project (+ root collection, owner membership, default allocation); requires write scope |
|
|
225
98
|
| `upload(local_path, *, title, owner_type, owner_id, record_type=None, ...)` | `UploadResult` | Upload a file with an optional server-validated record type; blocks until complete |
|
|
226
99
|
| `download(asset_id, dest_dir, ...)` | `DownloadResult` | Download latest asset content; blocks until complete |
|
|
@@ -3,25 +3,18 @@
|
|
|
3
3
|
from ._version import __version__
|
|
4
4
|
from .client import DataeraiClient
|
|
5
5
|
from ._agent import DataeraiAgent, run_agent
|
|
6
|
-
from ._errors import DaemonError, DaemonTimeoutError
|
|
6
|
+
from ._errors import DaemonError, DaemonTimeoutError
|
|
7
7
|
from ._types import (
|
|
8
8
|
AssetMetadata,
|
|
9
|
-
AssetSearchPage,
|
|
10
|
-
AssetSummary,
|
|
11
9
|
AuthStatus,
|
|
12
|
-
Collection,
|
|
13
|
-
CollectionDestination,
|
|
14
10
|
CollectionDownloadResult,
|
|
15
11
|
DownloadedFile,
|
|
16
12
|
DownloadResult,
|
|
17
13
|
Project,
|
|
18
14
|
ProgressEvent,
|
|
19
15
|
Relationship,
|
|
20
|
-
TreeNode,
|
|
21
16
|
UploadResult,
|
|
22
17
|
)
|
|
23
|
-
from .notebook import NotebookSession, connect_notebook
|
|
24
|
-
from .notebook_trace import NotebookExecutionTrace, NotebookTraceResult
|
|
25
18
|
|
|
26
19
|
__all__ = [
|
|
27
20
|
"__version__",
|
|
@@ -30,14 +23,8 @@ __all__ = [
|
|
|
30
23
|
"run_agent",
|
|
31
24
|
"DaemonError",
|
|
32
25
|
"DaemonTimeoutError",
|
|
33
|
-
"TermsAcceptanceRequired",
|
|
34
26
|
"AuthStatus",
|
|
35
27
|
"Project",
|
|
36
|
-
"Collection",
|
|
37
|
-
"TreeNode",
|
|
38
|
-
"CollectionDestination",
|
|
39
|
-
"AssetSummary",
|
|
40
|
-
"AssetSearchPage",
|
|
41
28
|
"Relationship",
|
|
42
29
|
"UploadResult",
|
|
43
30
|
"DownloadedFile",
|
|
@@ -45,8 +32,4 @@ __all__ = [
|
|
|
45
32
|
"CollectionDownloadResult",
|
|
46
33
|
"ProgressEvent",
|
|
47
34
|
"AssetMetadata",
|
|
48
|
-
"NotebookSession",
|
|
49
|
-
"NotebookExecutionTrace",
|
|
50
|
-
"NotebookTraceResult",
|
|
51
|
-
"connect_notebook",
|
|
52
35
|
]
|
|
@@ -3,39 +3,23 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
|
-
import re
|
|
7
6
|
import subprocess
|
|
8
|
-
import sys
|
|
9
7
|
import tempfile
|
|
10
8
|
import time
|
|
11
9
|
from pathlib import Path
|
|
12
10
|
|
|
13
|
-
from ._transport import endpoint_exists
|
|
14
|
-
|
|
15
11
|
|
|
16
12
|
def default_socket_path() -> str:
|
|
17
|
-
"""Return the default
|
|
13
|
+
"""Return the default Unix socket path.
|
|
18
14
|
|
|
19
15
|
Resolution order:
|
|
20
16
|
1. ``$DATAERAI_SOCKET`` environment variable
|
|
21
|
-
2.
|
|
22
|
-
|
|
23
|
-
3. ``$XDG_RUNTIME_DIR/dataerai-transfer.sock`` (Linux / systemd)
|
|
24
|
-
4. ``<tempdir>/dataerai-transfer.sock`` (macOS and other platforms)
|
|
25
|
-
|
|
26
|
-
The Windows derivation is kept in lockstep with the daemon's own default
|
|
27
|
-
(``cli/cmd/dataerai-transfer/main.go`` ``defaultSocketPath``) and the Node
|
|
28
|
-
SDK (``sdk/nodejs/src/daemon.ts``): same ``USERNAME`` source, same
|
|
29
|
-
``[^A-Za-z0-9._-] -> _`` sanitisation, so all three resolve to one pipe.
|
|
17
|
+
2. ``$XDG_RUNTIME_DIR/dataerai-transfer.sock`` (Linux / systemd)
|
|
18
|
+
3. ``<tempdir>/dataerai-transfer.sock`` (macOS and other platforms)
|
|
30
19
|
"""
|
|
31
20
|
env = os.environ.get("DATAERAI_SOCKET")
|
|
32
21
|
if env:
|
|
33
22
|
return env
|
|
34
|
-
if sys.platform == "win32":
|
|
35
|
-
# Per-user suffix so concurrent Windows sessions do not collide in the
|
|
36
|
-
# machine-global pipe namespace.
|
|
37
|
-
user = re.sub(r"[^A-Za-z0-9._-]", "_", os.environ.get("USERNAME") or "default")
|
|
38
|
-
return rf"\\.\pipe\dataerai-transfer-{user}"
|
|
39
23
|
xdg = os.environ.get("XDG_RUNTIME_DIR")
|
|
40
24
|
if xdg:
|
|
41
25
|
return str(Path(xdg) / "dataerai-transfer.sock")
|
|
@@ -59,15 +43,12 @@ def spawn_daemon(binary_path: str, socket_path: str) -> subprocess.Popen:
|
|
|
59
43
|
|
|
60
44
|
|
|
61
45
|
def wait_for_socket(socket_path: str, timeout_s: float = 10.0) -> None:
|
|
62
|
-
"""Poll until
|
|
46
|
+
"""Poll until *socket_path* exists or *timeout_s* elapses.
|
|
63
47
|
|
|
64
|
-
Raises :class:`TimeoutError` if
|
|
65
|
-
"available" means the AF_UNIX socket file exists; on Windows a named pipe is
|
|
66
|
-
not in the filesystem namespace, so ``endpoint_exists`` probes for a live
|
|
67
|
-
listener instead (see :func:`dataerai._transport.endpoint_exists`).
|
|
48
|
+
Raises :class:`TimeoutError` if the socket does not appear in time.
|
|
68
49
|
"""
|
|
69
50
|
deadline = time.monotonic() + timeout_s
|
|
70
|
-
while not
|
|
51
|
+
while not Path(socket_path).exists():
|
|
71
52
|
if time.monotonic() >= deadline:
|
|
72
53
|
raise TimeoutError(
|
|
73
54
|
f"Daemon socket '{socket_path}' not available after {timeout_s:.0f}s. "
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class DaemonError(Exception):
|
|
5
|
+
"""Raised when the daemon returns a coded error response."""
|
|
6
|
+
|
|
7
|
+
def __init__(self, code: str, message: str) -> None:
|
|
8
|
+
super().__init__(message)
|
|
9
|
+
self.code = code
|
|
10
|
+
self.message = message
|
|
11
|
+
|
|
12
|
+
def __repr__(self) -> str: # pragma: no cover
|
|
13
|
+
return f"DaemonError(code={self.code!r}, message={self.message!r})"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class DaemonTimeoutError(TimeoutError):
|
|
17
|
+
"""Raised when a request to the daemon (or a transfer) exceeds its timeout."""
|
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from dataclasses import dataclass, field
|
|
6
6
|
from datetime import datetime
|
|
7
|
-
from typing import Any, Optional
|
|
7
|
+
from typing import Any, Callable, Optional
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
# ─── Auth ─────────────────────────────────────────────────────────────────────
|
|
@@ -39,67 +39,6 @@ class Project:
|
|
|
39
39
|
created_at: Optional[str] = None
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
# ─── Project tree and collections ─────────────────────────────────────────────
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
@dataclass
|
|
46
|
-
class Collection:
|
|
47
|
-
"""A collection returned by the project-tree and create APIs."""
|
|
48
|
-
|
|
49
|
-
collection_id: str
|
|
50
|
-
title: str
|
|
51
|
-
parent_id: Optional[str] = None
|
|
52
|
-
owner_user_id: Optional[str] = None
|
|
53
|
-
owner_project_id: Optional[str] = None
|
|
54
|
-
is_root: bool = False
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
@dataclass
|
|
58
|
-
class TreeNode:
|
|
59
|
-
"""A user workspace or project in :meth:`DataeraiClient.list_tree`."""
|
|
60
|
-
|
|
61
|
-
type: str
|
|
62
|
-
id: str
|
|
63
|
-
name: str
|
|
64
|
-
root_collection_id: Optional[str] = None
|
|
65
|
-
collections: list[Collection] = field(default_factory=list)
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
@dataclass
|
|
69
|
-
class CollectionDestination:
|
|
70
|
-
"""A name-resolved project collection created by ``ensure_collection_path``."""
|
|
71
|
-
|
|
72
|
-
path: str
|
|
73
|
-
project_id: str
|
|
74
|
-
project_name: str
|
|
75
|
-
collection_id: str
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
# ─── Asset search ──────────────────────────────────────────────────────────────
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
@dataclass
|
|
82
|
-
class AssetSummary:
|
|
83
|
-
"""One asset returned by collection listing or global search."""
|
|
84
|
-
|
|
85
|
-
asset_id: str
|
|
86
|
-
title: str
|
|
87
|
-
alias: Optional[str] = None
|
|
88
|
-
record_type: Optional[str] = None
|
|
89
|
-
size_bytes: int = 0
|
|
90
|
-
has_content: bool = False
|
|
91
|
-
updated_at: Optional[str] = None
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
@dataclass
|
|
95
|
-
class AssetSearchPage:
|
|
96
|
-
"""One page returned by :meth:`DataeraiClient.search_assets`."""
|
|
97
|
-
|
|
98
|
-
assets: list[AssetSummary] = field(default_factory=list)
|
|
99
|
-
has_more: bool = False
|
|
100
|
-
next_cursor: Optional[str] = None
|
|
101
|
-
|
|
102
|
-
|
|
103
42
|
# ─── Provenance relationship ────────────────────────────────────────────────────
|
|
104
43
|
|
|
105
44
|
|