iints-sdk-python35 1.1.1__tar.gz → 1.1.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.
Files changed (158) hide show
  1. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/PKG-INFO +25 -6
  2. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/README.md +24 -5
  3. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/pyproject.toml +2 -1
  4. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/__init__.py +9 -1
  5. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/ai/__init__.py +2 -0
  6. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/ai/cli.py +141 -20
  7. iints_sdk_python35-1.1.2/src/iints/ai/prepare.py +342 -0
  8. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/cli/cli.py +29 -0
  9. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints_sdk_python35.egg-info/PKG-INFO +25 -6
  10. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints_sdk_python35.egg-info/SOURCES.txt +2 -0
  11. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints_sdk_python35.egg-info/entry_points.txt +1 -0
  12. iints_sdk_python35-1.1.2/tests/test_install_doctor.py +32 -0
  13. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/LICENSE +0 -0
  14. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/setup.cfg +0 -0
  15. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/ai/assistant.py +0 -0
  16. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/ai/backends/__init__.py +0 -0
  17. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/ai/backends/base.py +0 -0
  18. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/ai/backends/mistral_api.py +0 -0
  19. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/ai/backends/ollama.py +0 -0
  20. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/ai/mdmp_guard.py +0 -0
  21. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/ai/model_catalog.py +0 -0
  22. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/ai/prompts.py +0 -0
  23. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/__init__.py +0 -0
  24. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/algorithm_xray.py +0 -0
  25. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/baseline.py +0 -0
  26. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/clinical_benchmark.py +0 -0
  27. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/clinical_metrics.py +0 -0
  28. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/clinical_tir_analyzer.py +0 -0
  29. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/diabetes_metrics.py +0 -0
  30. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/edge_efficiency.py +0 -0
  31. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/edge_performance_monitor.py +0 -0
  32. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/explainability.py +0 -0
  33. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/explainable_ai.py +0 -0
  34. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/hardware_benchmark.py +0 -0
  35. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/metrics.py +0 -0
  36. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/population_report.py +0 -0
  37. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/reporting.py +0 -0
  38. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/safety_index.py +0 -0
  39. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/sensor_filtering.py +0 -0
  40. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/analysis/validator.py +0 -0
  41. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/api/__init__.py +0 -0
  42. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/api/base_algorithm.py +0 -0
  43. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/api/registry.py +0 -0
  44. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/api/template_algorithm.py +0 -0
  45. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/assets/iints_logo.png +0 -0
  46. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/cli/__init__.py +0 -0
  47. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/__init__.py +0 -0
  48. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/algorithms/__init__.py +0 -0
  49. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/algorithms/battle_runner.py +0 -0
  50. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/algorithms/correction_bolus.py +0 -0
  51. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/algorithms/discovery.py +0 -0
  52. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/algorithms/fixed_basal_bolus.py +0 -0
  53. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/algorithms/hybrid_algorithm.py +0 -0
  54. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/algorithms/lstm_algorithm.py +0 -0
  55. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/algorithms/mock_algorithms.py +0 -0
  56. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/algorithms/pid_controller.py +0 -0
  57. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/algorithms/standard_pump_algo.py +0 -0
  58. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/device.py +0 -0
  59. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/device_manager.py +0 -0
  60. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/devices/__init__.py +0 -0
  61. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/devices/models.py +0 -0
  62. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/patient/__init__.py +0 -0
  63. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/patient/bergman_model.py +0 -0
  64. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/patient/models.py +0 -0
  65. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/patient/patient_factory.py +0 -0
  66. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/patient/profile.py +0 -0
  67. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/safety/__init__.py +0 -0
  68. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/safety/config.py +0 -0
  69. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/safety/input_validator.py +0 -0
  70. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/safety/supervisor.py +0 -0
  71. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/simulation/__init__.py +0 -0
  72. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/simulation/scenario_parser.py +0 -0
  73. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/simulator.py +0 -0
  74. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/core/supervisor.py +0 -0
  75. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/__init__.py +0 -0
  76. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/adapter.py +0 -0
  77. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/column_mapper.py +0 -0
  78. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/contracts.py +0 -0
  79. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/datasets.json +0 -0
  80. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/demo/__init__.py +0 -0
  81. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/demo/demo_cgm.csv +0 -0
  82. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/guardians.py +0 -0
  83. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/importer.py +0 -0
  84. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/ingestor.py +0 -0
  85. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/mdmp_visualizer.py +0 -0
  86. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/nightscout.py +0 -0
  87. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/quality_checker.py +0 -0
  88. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/registry.py +0 -0
  89. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/runner.py +0 -0
  90. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/synthetic_mirror.py +0 -0
  91. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/tidepool.py +0 -0
  92. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/universal_parser.py +0 -0
  93. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/virtual_patients/clinic_safe_baseline.yaml +0 -0
  94. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/virtual_patients/clinic_safe_hyper_challenge.yaml +0 -0
  95. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/virtual_patients/clinic_safe_hypo_prone.yaml +0 -0
  96. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/virtual_patients/clinic_safe_midnight.yaml +0 -0
  97. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/virtual_patients/clinic_safe_pizza.yaml +0 -0
  98. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/virtual_patients/clinic_safe_stress_meal.yaml +0 -0
  99. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/virtual_patients/default_patient.yaml +0 -0
  100. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/data/virtual_patients/patient_559_config.yaml +0 -0
  101. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/emulation/__init__.py +0 -0
  102. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/emulation/legacy_base.py +0 -0
  103. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/emulation/medtronic_780g.py +0 -0
  104. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/emulation/omnipod_5.py +0 -0
  105. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/emulation/tandem_controliq.py +0 -0
  106. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/highlevel.py +0 -0
  107. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/learning/__init__.py +0 -0
  108. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/learning/autonomous_optimizer.py +0 -0
  109. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/learning/learning_system.py +0 -0
  110. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/mdmp/__init__.py +0 -0
  111. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/mdmp/backend.py +0 -0
  112. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/metrics.py +0 -0
  113. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/population/__init__.py +0 -0
  114. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/population/generator.py +0 -0
  115. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/population/runner.py +0 -0
  116. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/presets/__init__.py +0 -0
  117. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/presets/evidence_sources.yaml +0 -0
  118. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/presets/forecast_calibration_profiles.yaml +0 -0
  119. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/presets/golden_benchmark.yaml +0 -0
  120. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/presets/presets.json +0 -0
  121. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/presets/safety_contract_default.yaml +0 -0
  122. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/presets/validation_profiles.yaml +0 -0
  123. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/research/__init__.py +0 -0
  124. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/research/audit.py +0 -0
  125. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/research/calibration_gate.py +0 -0
  126. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/research/config.py +0 -0
  127. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/research/dataset.py +0 -0
  128. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/research/evaluation.py +0 -0
  129. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/research/losses.py +0 -0
  130. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/research/metrics.py +0 -0
  131. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/research/model_registry.py +0 -0
  132. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/research/predictor.py +0 -0
  133. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/scenarios/__init__.py +0 -0
  134. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/scenarios/generator.py +0 -0
  135. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/templates/__init__.py +0 -0
  136. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/templates/default_algorithm.py +0 -0
  137. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/templates/scenarios/__init__.py +0 -0
  138. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/templates/scenarios/chaos_insulin_stacking.json +0 -0
  139. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/templates/scenarios/chaos_runaway_ai.json +0 -0
  140. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/templates/scenarios/example_scenario.json +0 -0
  141. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/templates/scenarios/exercise_stress.json +0 -0
  142. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/utils/__init__.py +0 -0
  143. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/utils/plotting.py +0 -0
  144. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/utils/run_io.py +0 -0
  145. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/validation/__init__.py +0 -0
  146. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/validation/golden.py +0 -0
  147. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/validation/replay.py +0 -0
  148. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/validation/run_validation.py +0 -0
  149. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/validation/safety_contract.py +0 -0
  150. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/validation/schemas.py +0 -0
  151. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/visualization/__init__.py +0 -0
  152. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/visualization/cockpit.py +0 -0
  153. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints/visualization/uncertainty_cloud.py +0 -0
  154. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints_sdk_python35.egg-info/dependency_links.txt +0 -0
  155. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints_sdk_python35.egg-info/requires.txt +0 -0
  156. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/src/iints_sdk_python35.egg-info/top_level.txt +0 -0
  157. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/tests/test_bergman.py +0 -0
  158. {iints_sdk_python35-1.1.1 → iints_sdk_python35-1.1.2}/tests/test_population.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iints-sdk-python35
3
- Version: 1.1.1
3
+ Version: 1.1.2
4
4
  Summary: A pre-clinical Edge-AI SDK for diabetes management validation.
5
5
  Author-email: Rune Bobbaers <rune.bobbaers@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/python35/IINTS-SDK
@@ -110,15 +110,21 @@ ollama pull ministral-3:8b
110
110
  iints ai local-check --model ministral-3:8b
111
111
  ```
112
112
 
113
- Example commands:
113
+ Recommended flow:
114
+
115
+ ```bash
116
+ iints quickstart --project-name iints_quickstart
117
+ cd iints_quickstart
118
+ iints presets run --name baseline_t1d --algo algorithms/example_algorithm.py
119
+ iints ai prepare results/<run_id>
120
+ iints ai report results/<run_id>
121
+ ```
122
+
123
+ Direct JSON mode still works if you already have your own payloads and signed MDMP artifact:
114
124
 
115
125
  ```bash
116
126
  iints ai explain results/step.json \
117
127
  --mdmp-cert results/report.signed.mdmp
118
-
119
- iints ai report results/simulation_run.json \
120
- --mdmp-cert results/report.signed.mdmp \
121
- --output results/ai_report.md
122
128
  ```
123
129
 
124
130
  Notes:
@@ -127,8 +133,21 @@ Notes:
127
133
  - The SDK now targets the open local `Ministral 3` Ollama model by default.
128
134
  - Users can choose a larger or smaller local Mistral-family model with `--model ...`.
129
135
  - Large JSON payloads are clipped automatically before prompt generation to keep local inference stable.
136
+ - `iints ai prepare <run_dir>` now creates AI-ready JSON payloads and, when MDMP is installed, a local development certificate plus keypair in `<run_dir>/ai/`.
137
+ - After `iints ai prepare`, you can point `iints ai explain|trends|anomalies|report` directly at the run directory.
130
138
  - Output is research-only and not medical advice.
131
139
 
140
+ Troubleshooting:
141
+ - If `iints ai ...` says `No such command 'ai'`, your environment usually still has a legacy `iints` package installed alongside `iints-sdk-python35`.
142
+ - Run `iints-sdk-doctor` first.
143
+ - If it reports a conflict, repair the environment with:
144
+
145
+ ```bash
146
+ python -m pip uninstall -y iints iints-sdk-python35
147
+ python -m pip install -U "iints-sdk-python35[mdmp]==1.1.2"
148
+ hash -r
149
+ ```
150
+
132
151
  ## MDMP (Short)
133
152
  MDMP is the data-quality protocol used by IINTS.
134
153
 
@@ -59,15 +59,21 @@ ollama pull ministral-3:8b
59
59
  iints ai local-check --model ministral-3:8b
60
60
  ```
61
61
 
62
- Example commands:
62
+ Recommended flow:
63
+
64
+ ```bash
65
+ iints quickstart --project-name iints_quickstart
66
+ cd iints_quickstart
67
+ iints presets run --name baseline_t1d --algo algorithms/example_algorithm.py
68
+ iints ai prepare results/<run_id>
69
+ iints ai report results/<run_id>
70
+ ```
71
+
72
+ Direct JSON mode still works if you already have your own payloads and signed MDMP artifact:
63
73
 
64
74
  ```bash
65
75
  iints ai explain results/step.json \
66
76
  --mdmp-cert results/report.signed.mdmp
67
-
68
- iints ai report results/simulation_run.json \
69
- --mdmp-cert results/report.signed.mdmp \
70
- --output results/ai_report.md
71
77
  ```
72
78
 
73
79
  Notes:
@@ -76,8 +82,21 @@ Notes:
76
82
  - The SDK now targets the open local `Ministral 3` Ollama model by default.
77
83
  - Users can choose a larger or smaller local Mistral-family model with `--model ...`.
78
84
  - Large JSON payloads are clipped automatically before prompt generation to keep local inference stable.
85
+ - `iints ai prepare <run_dir>` now creates AI-ready JSON payloads and, when MDMP is installed, a local development certificate plus keypair in `<run_dir>/ai/`.
86
+ - After `iints ai prepare`, you can point `iints ai explain|trends|anomalies|report` directly at the run directory.
79
87
  - Output is research-only and not medical advice.
80
88
 
89
+ Troubleshooting:
90
+ - If `iints ai ...` says `No such command 'ai'`, your environment usually still has a legacy `iints` package installed alongside `iints-sdk-python35`.
91
+ - Run `iints-sdk-doctor` first.
92
+ - If it reports a conflict, repair the environment with:
93
+
94
+ ```bash
95
+ python -m pip uninstall -y iints iints-sdk-python35
96
+ python -m pip install -U "iints-sdk-python35[mdmp]==1.1.2"
97
+ hash -r
98
+ ```
99
+
81
100
  ## MDMP (Short)
82
101
  MDMP is the data-quality protocol used by IINTS.
83
102
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "iints-sdk-python35"
7
- version = "1.1.1"
7
+ version = "1.1.2"
8
8
  authors = [
9
9
  { name="Rune Bobbaers", email="rune.bobbaers@gmail.com" },
10
10
  ]
@@ -65,6 +65,7 @@ mdmp = [
65
65
 
66
66
  [project.scripts]
67
67
  iints = "iints.cli.cli:app"
68
+ iints-sdk-doctor = "iints_sdk_python35_doctor:main"
68
69
 
69
70
  [project.entry-points."iints.algorithms"]
70
71
  "PID Controller" = "iints.core.algorithms.pid_controller:PIDController"
@@ -3,7 +3,15 @@
3
3
  import pandas as pd # Required for type hints like pd.DataFrame
4
4
  from typing import Optional
5
5
 
6
- __version__ = "0.1.22"
6
+ try:
7
+ from importlib.metadata import PackageNotFoundError, version
8
+ except ImportError: # pragma: no cover - Python < 3.8 fallback
9
+ from importlib_metadata import PackageNotFoundError, version # type: ignore
10
+
11
+ try:
12
+ __version__ = version("iints-sdk-python35")
13
+ except PackageNotFoundError: # pragma: no cover - source tree fallback
14
+ __version__ = "1.1.2"
7
15
 
8
16
  # Note to developers: this SDK is currently maintained by a single author.
9
17
  # Please report bugs via GitHub issues and feel free to contribute fixes via PRs.
@@ -2,6 +2,7 @@ from .assistant import AIResponse, IINTSAssistant
2
2
  from .backends import DEFAULT_MINISTRAL_MODEL, DEFAULT_OLLAMA_HOST, OllamaBackend
3
3
  from .mdmp_guard import GuardResult, MDMPGuard
4
4
  from .model_catalog import LocalMistralModelProfile, list_local_mistral_models
5
+ from .prepare import prepare_ai_ready_artifacts
5
6
 
6
7
  __all__ = [
7
8
  "AIResponse",
@@ -13,4 +14,5 @@ __all__ = [
13
14
  "MDMPGuard",
14
15
  "LocalMistralModelProfile",
15
16
  "list_local_mistral_models",
17
+ "prepare_ai_ready_artifacts",
16
18
  ]
@@ -13,6 +13,7 @@ from typing_extensions import Annotated
13
13
  from .assistant import AIResponse, IINTSAssistant
14
14
  from .backends import DEFAULT_MINISTRAL_MODEL, OllamaBackend
15
15
  from .model_catalog import list_local_mistral_models
16
+ from .prepare import prepare_ai_ready_artifacts
16
17
 
17
18
 
18
19
  app = typer.Typer(help="Research-only AI assistant commands gated by MDMP certification.")
@@ -36,6 +37,57 @@ def _load_json_payload(path: Path, label: str) -> Any:
36
37
  return payload
37
38
 
38
39
 
40
+ def _default_prepared_payload(task: str, ai_dir: Path) -> Path:
41
+ candidates = {
42
+ "explain": ["step_riskiest.json", "step_latest.json"],
43
+ "trends": ["trends_payload.json"],
44
+ "anomalies": ["anomalies_payload.json"],
45
+ "report": ["report_payload.json"],
46
+ }.get(task, [])
47
+ for filename in candidates:
48
+ candidate = ai_dir / filename
49
+ if candidate.is_file():
50
+ return candidate
51
+ expected = ", ".join(candidates) if candidates else "prepared payload"
52
+ raise typer.BadParameter(
53
+ f"No prepared AI payload found in {ai_dir}. Expected one of: {expected}. "
54
+ "Run `iints ai prepare <run_dir>` first."
55
+ )
56
+
57
+
58
+ def _resolve_cli_inputs(
59
+ *,
60
+ task: str,
61
+ input_path: Path,
62
+ mdmp_cert: Path | None,
63
+ public_key: Path | None,
64
+ trust_store: Path | None,
65
+ ) -> tuple[Path, Path, Path | None]:
66
+ resolved_input = input_path
67
+ resolved_cert = mdmp_cert
68
+ resolved_public_key = public_key
69
+
70
+ if input_path.is_dir():
71
+ ai_dir = input_path / "ai"
72
+ resolved_input = _default_prepared_payload(task, ai_dir)
73
+ if resolved_cert is None:
74
+ candidate_cert = ai_dir / "report.signed.mdmp"
75
+ if candidate_cert.is_file():
76
+ resolved_cert = candidate_cert
77
+ if resolved_public_key is None and trust_store is None:
78
+ candidate_public_key = ai_dir / "keys" / "mdmp_pub_v1.pem"
79
+ if candidate_public_key.is_file():
80
+ resolved_public_key = candidate_public_key
81
+
82
+ if resolved_cert is None:
83
+ raise typer.BadParameter(
84
+ "No MDMP certificate provided. Pass --mdmp-cert or run "
85
+ "`iints ai prepare <run_dir>` to generate a local development certificate."
86
+ )
87
+
88
+ return resolved_input, resolved_cert, resolved_public_key
89
+
90
+
39
91
  def _write_output(path: Path | None, response: AIResponse) -> None:
40
92
  if path is None:
41
93
  return
@@ -117,6 +169,47 @@ def models() -> None:
117
169
  )
118
170
 
119
171
 
172
+ @app.command("prepare")
173
+ def prepare(
174
+ run_dir: Annotated[Path, typer.Argument(help="Run output directory containing results.csv and run_metadata.json.")],
175
+ create_dev_mdmp_cert: Annotated[
176
+ bool,
177
+ typer.Option(
178
+ "--create-dev-mdmp-cert/--no-create-dev-mdmp-cert",
179
+ help="Generate a local development MDMP certificate and keypair for AI commands.",
180
+ ),
181
+ ] = True,
182
+ grade: Annotated[str, typer.Option(help="Grade to embed in the local development MDMP certificate.")] = "research_grade",
183
+ expires_days: Annotated[int, typer.Option(help="Certificate expiry window in days for local development certs.")] = 30,
184
+ key_dir: Annotated[Optional[Path], typer.Option(help="Optional directory to store the generated local MDMP keypair.")] = None,
185
+ ) -> None:
186
+ console = Console()
187
+ try:
188
+ outputs = prepare_ai_ready_artifacts(
189
+ run_dir,
190
+ create_dev_mdmp_cert=create_dev_mdmp_cert,
191
+ grade=grade,
192
+ expires_days=expires_days,
193
+ key_dir=key_dir,
194
+ )
195
+ except Exception as exc:
196
+ console.print(f"[bold red]Error:[/bold red] {exc}")
197
+ raise typer.Exit(code=1)
198
+
199
+ table = Table(title="IINTS AI Prepared Artifacts")
200
+ table.add_column("Artifact", style="cyan")
201
+ table.add_column("Path", overflow="fold")
202
+ for key, value in outputs.items():
203
+ table.add_row(key, value)
204
+ console.print(table)
205
+ console.print("[green]Prepared AI payloads are ready.[/green]")
206
+ if "mdmp_cert" in outputs:
207
+ console.print(
208
+ "[green]You can now run:[/green] "
209
+ f"`iints ai report {run_dir}` or `iints ai explain {run_dir}`"
210
+ )
211
+
212
+
120
213
  def _build_assistant(
121
214
  *,
122
215
  mdmp_cert: Path,
@@ -169,8 +262,8 @@ def local_check(
169
262
 
170
263
  @app.command("explain")
171
264
  def explain(
172
- input_json: Annotated[Path, typer.Argument(help="JSON file with a single simulation step or decision context.")],
173
- mdmp_cert: Annotated[Path, typer.Option(help="Signed MDMP artifact required before AI analysis can run.")],
265
+ input_json: Annotated[Path, typer.Argument(help="Prepared run directory or JSON file with a single simulation step or decision context.")],
266
+ mdmp_cert: Annotated[Optional[Path], typer.Option(help="Signed MDMP artifact required before AI analysis can run.")] = None,
174
267
  mode: Annotated[str, typer.Option(help="AI backend mode. Use 'local' for Ollama/Ministral.")] = "auto",
175
268
  model: Annotated[str, typer.Option(help="Ollama model name to use.")] = DEFAULT_MINISTRAL_MODEL,
176
269
  minimum_grade: Annotated[str, typer.Option(help="Minimum MDMP grade required to allow analysis.")] = "research_grade",
@@ -182,13 +275,20 @@ def explain(
182
275
  ) -> None:
183
276
  console = Console()
184
277
  try:
185
- payload = _load_json_payload(input_json, "Input JSON")
186
- assistant = _build_assistant(
278
+ resolved_input, resolved_cert, resolved_public_key = _resolve_cli_inputs(
279
+ task="explain",
280
+ input_path=input_json,
187
281
  mdmp_cert=mdmp_cert,
282
+ public_key=public_key,
283
+ trust_store=trust_store,
284
+ )
285
+ payload = _load_json_payload(resolved_input, "Input JSON")
286
+ assistant = _build_assistant(
287
+ mdmp_cert=resolved_cert,
188
288
  mode=mode,
189
289
  model=model,
190
290
  minimum_grade=minimum_grade,
191
- public_key=public_key,
291
+ public_key=resolved_public_key,
192
292
  trust_store=trust_store,
193
293
  ollama_host=ollama_host,
194
294
  timeout_seconds=timeout_seconds,
@@ -203,8 +303,8 @@ def explain(
203
303
 
204
304
  @app.command("trends")
205
305
  def trends(
206
- input_json: Annotated[Path, typer.Argument(help="JSON file with glucose trace data or a run payload.")],
207
- mdmp_cert: Annotated[Path, typer.Option(help="Signed MDMP artifact required before AI analysis can run.")],
306
+ input_json: Annotated[Path, typer.Argument(help="Prepared run directory or JSON file with glucose trace data or a run payload.")],
307
+ mdmp_cert: Annotated[Optional[Path], typer.Option(help="Signed MDMP artifact required before AI analysis can run.")] = None,
208
308
  mode: Annotated[str, typer.Option(help="AI backend mode. Use 'local' for Ollama/Ministral.")] = "auto",
209
309
  model: Annotated[str, typer.Option(help="Ollama model name to use.")] = DEFAULT_MINISTRAL_MODEL,
210
310
  minimum_grade: Annotated[str, typer.Option(help="Minimum MDMP grade required to allow analysis.")] = "research_grade",
@@ -216,13 +316,20 @@ def trends(
216
316
  ) -> None:
217
317
  console = Console()
218
318
  try:
219
- payload = _load_json_payload(input_json, "Input JSON")
220
- assistant = _build_assistant(
319
+ resolved_input, resolved_cert, resolved_public_key = _resolve_cli_inputs(
320
+ task="trends",
321
+ input_path=input_json,
221
322
  mdmp_cert=mdmp_cert,
323
+ public_key=public_key,
324
+ trust_store=trust_store,
325
+ )
326
+ payload = _load_json_payload(resolved_input, "Input JSON")
327
+ assistant = _build_assistant(
328
+ mdmp_cert=resolved_cert,
222
329
  mode=mode,
223
330
  model=model,
224
331
  minimum_grade=minimum_grade,
225
- public_key=public_key,
332
+ public_key=resolved_public_key,
226
333
  trust_store=trust_store,
227
334
  ollama_host=ollama_host,
228
335
  timeout_seconds=timeout_seconds,
@@ -237,8 +344,8 @@ def trends(
237
344
 
238
345
  @app.command("anomalies")
239
346
  def anomalies(
240
- input_json: Annotated[Path, typer.Argument(help="JSON file with simulation results or run summary.")],
241
- mdmp_cert: Annotated[Path, typer.Option(help="Signed MDMP artifact required before AI analysis can run.")],
347
+ input_json: Annotated[Path, typer.Argument(help="Prepared run directory or JSON file with simulation results or run summary.")],
348
+ mdmp_cert: Annotated[Optional[Path], typer.Option(help="Signed MDMP artifact required before AI analysis can run.")] = None,
242
349
  mode: Annotated[str, typer.Option(help="AI backend mode. Use 'local' for Ollama/Ministral.")] = "auto",
243
350
  model: Annotated[str, typer.Option(help="Ollama model name to use.")] = DEFAULT_MINISTRAL_MODEL,
244
351
  minimum_grade: Annotated[str, typer.Option(help="Minimum MDMP grade required to allow analysis.")] = "research_grade",
@@ -250,13 +357,20 @@ def anomalies(
250
357
  ) -> None:
251
358
  console = Console()
252
359
  try:
253
- payload = _load_json_payload(input_json, "Input JSON")
254
- assistant = _build_assistant(
360
+ resolved_input, resolved_cert, resolved_public_key = _resolve_cli_inputs(
361
+ task="anomalies",
362
+ input_path=input_json,
255
363
  mdmp_cert=mdmp_cert,
364
+ public_key=public_key,
365
+ trust_store=trust_store,
366
+ )
367
+ payload = _load_json_payload(resolved_input, "Input JSON")
368
+ assistant = _build_assistant(
369
+ mdmp_cert=resolved_cert,
256
370
  mode=mode,
257
371
  model=model,
258
372
  minimum_grade=minimum_grade,
259
- public_key=public_key,
373
+ public_key=resolved_public_key,
260
374
  trust_store=trust_store,
261
375
  ollama_host=ollama_host,
262
376
  timeout_seconds=timeout_seconds,
@@ -271,8 +385,8 @@ def anomalies(
271
385
 
272
386
  @app.command("report")
273
387
  def report(
274
- input_json: Annotated[Path, typer.Argument(help="JSON file with run-level simulation outputs.")],
275
- mdmp_cert: Annotated[Path, typer.Option(help="Signed MDMP artifact required before AI analysis can run.")],
388
+ input_json: Annotated[Path, typer.Argument(help="Prepared run directory or JSON file with run-level simulation outputs.")],
389
+ mdmp_cert: Annotated[Optional[Path], typer.Option(help="Signed MDMP artifact required before AI analysis can run.")] = None,
276
390
  mode: Annotated[str, typer.Option(help="AI backend mode. Use 'local' for Ollama/Ministral.")] = "auto",
277
391
  model: Annotated[str, typer.Option(help="Ollama model name to use.")] = DEFAULT_MINISTRAL_MODEL,
278
392
  minimum_grade: Annotated[str, typer.Option(help="Minimum MDMP grade required to allow analysis.")] = "research_grade",
@@ -284,13 +398,20 @@ def report(
284
398
  ) -> None:
285
399
  console = Console()
286
400
  try:
287
- payload = _load_json_payload(input_json, "Input JSON")
288
- assistant = _build_assistant(
401
+ resolved_input, resolved_cert, resolved_public_key = _resolve_cli_inputs(
402
+ task="report",
403
+ input_path=input_json,
289
404
  mdmp_cert=mdmp_cert,
405
+ public_key=public_key,
406
+ trust_store=trust_store,
407
+ )
408
+ payload = _load_json_payload(resolved_input, "Input JSON")
409
+ assistant = _build_assistant(
410
+ mdmp_cert=resolved_cert,
290
411
  mode=mode,
291
412
  model=model,
292
413
  minimum_grade=minimum_grade,
293
- public_key=public_key,
414
+ public_key=resolved_public_key,
294
415
  trust_store=trust_store,
295
416
  ollama_host=ollama_host,
296
417
  timeout_seconds=timeout_seconds,