iints-sdk-python35 1.4.0__tar.gz → 1.5.0__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 (209) hide show
  1. {iints_sdk_python35-1.4.0/src/iints_sdk_python35.egg-info → iints_sdk_python35-1.5.0}/PKG-INFO +4 -2
  2. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/README.md +3 -1
  3. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/pyproject.toml +1 -1
  4. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/__init__.py +1 -1
  5. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/ai/assistant.py +3 -0
  6. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/ai/cli.py +51 -0
  7. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/ai/prepare.py +27 -0
  8. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/ai/prompts.py +19 -1
  9. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/booth_demo.py +3 -0
  10. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/carelink_workbench.py +17 -0
  11. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/templates/demos/live_stage_demo.py +2 -0
  12. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0/src/iints_sdk_python35.egg-info}/PKG-INFO +4 -2
  13. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/cli.py +2 -1
  14. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/LICENSE +0 -0
  15. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/LICENSE-MIT-IINTS-LEGACY +0 -0
  16. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/NOTICE +0 -0
  17. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/setup.cfg +0 -0
  18. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/ai/__init__.py +0 -0
  19. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/ai/backends/__init__.py +0 -0
  20. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/ai/backends/base.py +0 -0
  21. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/ai/backends/mistral_api.py +0 -0
  22. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/ai/backends/ollama.py +0 -0
  23. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/ai/mdmp_guard.py +0 -0
  24. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/ai/model_catalog.py +0 -0
  25. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/__init__.py +0 -0
  26. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/algorithm_xray.py +0 -0
  27. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/baseline.py +0 -0
  28. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/clinical_benchmark.py +0 -0
  29. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/clinical_metrics.py +0 -0
  30. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/clinical_tir_analyzer.py +0 -0
  31. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/diabetes_metrics.py +0 -0
  32. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/edge_efficiency.py +0 -0
  33. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/edge_performance_monitor.py +0 -0
  34. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/explainability.py +0 -0
  35. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/explainable_ai.py +0 -0
  36. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/hardware_benchmark.py +0 -0
  37. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/metrics.py +0 -0
  38. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/population_report.py +0 -0
  39. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/poster.py +0 -0
  40. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/reporting.py +0 -0
  41. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/safety_index.py +0 -0
  42. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/sensor_filtering.py +0 -0
  43. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/analysis/validator.py +0 -0
  44. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/api/__init__.py +0 -0
  45. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/api/base_algorithm.py +0 -0
  46. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/api/registry.py +0 -0
  47. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/api/template_algorithm.py +0 -0
  48. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/assets/iints_logo.png +0 -0
  49. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/cli/__init__.py +0 -0
  50. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/cli/cli.py +0 -0
  51. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/__init__.py +0 -0
  52. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/algorithms/__init__.py +0 -0
  53. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/algorithms/battle_runner.py +0 -0
  54. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/algorithms/correction_bolus.py +0 -0
  55. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/algorithms/discovery.py +0 -0
  56. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/algorithms/fixed_basal_bolus.py +0 -0
  57. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/algorithms/hybrid_algorithm.py +0 -0
  58. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/algorithms/lstm_algorithm.py +0 -0
  59. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/algorithms/mock_algorithms.py +0 -0
  60. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/algorithms/pid_controller.py +0 -0
  61. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/algorithms/standard_pump_algo.py +0 -0
  62. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/device.py +0 -0
  63. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/device_manager.py +0 -0
  64. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/devices/__init__.py +0 -0
  65. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/devices/models.py +0 -0
  66. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/patient/__init__.py +0 -0
  67. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/patient/bergman_model.py +0 -0
  68. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/patient/models.py +0 -0
  69. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/patient/patient_factory.py +0 -0
  70. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/patient/profile.py +0 -0
  71. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/safety/__init__.py +0 -0
  72. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/safety/config.py +0 -0
  73. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/safety/input_validator.py +0 -0
  74. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/safety/supervisor.py +0 -0
  75. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/simulation/__init__.py +0 -0
  76. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/simulation/scenario_parser.py +0 -0
  77. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/simulator.py +0 -0
  78. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/core/supervisor.py +0 -0
  79. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/__init__.py +0 -0
  80. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/adapter.py +0 -0
  81. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/column_mapper.py +0 -0
  82. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/contracts.py +0 -0
  83. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/datasets.json +0 -0
  84. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/demo/__init__.py +0 -0
  85. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/demo/demo_cgm.csv +0 -0
  86. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/guardians.py +0 -0
  87. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/importer.py +0 -0
  88. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/ingestor.py +0 -0
  89. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/mdmp_visualizer.py +0 -0
  90. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/nightscout.py +0 -0
  91. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/quality_checker.py +0 -0
  92. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/registry.py +0 -0
  93. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/runner.py +0 -0
  94. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/synthetic_mirror.py +0 -0
  95. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/tidepool.py +0 -0
  96. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/universal_parser.py +0 -0
  97. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/virtual_patients/clinic_safe_baseline.yaml +0 -0
  98. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/virtual_patients/clinic_safe_hyper_challenge.yaml +0 -0
  99. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/virtual_patients/clinic_safe_hypo_prone.yaml +0 -0
  100. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/virtual_patients/clinic_safe_midnight.yaml +0 -0
  101. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/virtual_patients/clinic_safe_pizza.yaml +0 -0
  102. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/virtual_patients/clinic_safe_stress_meal.yaml +0 -0
  103. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/virtual_patients/default_patient.yaml +0 -0
  104. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/data/virtual_patients/patient_559_config.yaml +0 -0
  105. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/demo_assets.py +0 -0
  106. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/emulation/__init__.py +0 -0
  107. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/emulation/legacy_base.py +0 -0
  108. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/emulation/medtronic_780g.py +0 -0
  109. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/emulation/omnipod_5.py +0 -0
  110. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/emulation/tandem_controliq.py +0 -0
  111. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/highlevel.py +0 -0
  112. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/learning/__init__.py +0 -0
  113. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/learning/autonomous_optimizer.py +0 -0
  114. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/learning/learning_system.py +0 -0
  115. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/mdmp/__init__.py +0 -0
  116. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/mdmp/backend.py +0 -0
  117. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/metrics.py +0 -0
  118. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/population/__init__.py +0 -0
  119. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/population/generator.py +0 -0
  120. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/population/runner.py +0 -0
  121. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/presets/__init__.py +0 -0
  122. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/presets/evidence_sources.yaml +0 -0
  123. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/presets/forecast_calibration_profiles.yaml +0 -0
  124. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/presets/golden_benchmark.yaml +0 -0
  125. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/presets/presets.json +0 -0
  126. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/presets/safety_contract_default.yaml +0 -0
  127. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/presets/validation_profiles.yaml +0 -0
  128. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/research/__init__.py +0 -0
  129. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/research/audit.py +0 -0
  130. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/research/calibration_gate.py +0 -0
  131. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/research/config.py +0 -0
  132. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/research/dataset.py +0 -0
  133. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/research/evaluation.py +0 -0
  134. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/research/losses.py +0 -0
  135. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/research/metrics.py +0 -0
  136. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/research/model_registry.py +0 -0
  137. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/research/predictor.py +0 -0
  138. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/scenarios/__init__.py +0 -0
  139. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/scenarios/generator.py +0 -0
  140. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/templates/__init__.py +0 -0
  141. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/templates/default_algorithm.py +0 -0
  142. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/templates/demos/__init__.py +0 -0
  143. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/templates/scenarios/__init__.py +0 -0
  144. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/templates/scenarios/chaos_insulin_stacking.json +0 -0
  145. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/templates/scenarios/chaos_runaway_ai.json +0 -0
  146. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/templates/scenarios/example_scenario.json +0 -0
  147. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/templates/scenarios/exercise_stress.json +0 -0
  148. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/utils/__init__.py +0 -0
  149. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/utils/plotting.py +0 -0
  150. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/utils/run_io.py +0 -0
  151. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/validation/__init__.py +0 -0
  152. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/validation/golden.py +0 -0
  153. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/validation/replay.py +0 -0
  154. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/validation/run_validation.py +0 -0
  155. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/validation/safety_contract.py +0 -0
  156. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/validation/schemas.py +0 -0
  157. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/visualization/__init__.py +0 -0
  158. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/visualization/cockpit.py +0 -0
  159. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints/visualization/uncertainty_cloud.py +0 -0
  160. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints_sdk_python35.egg-info/SOURCES.txt +0 -0
  161. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints_sdk_python35.egg-info/dependency_links.txt +0 -0
  162. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints_sdk_python35.egg-info/entry_points.txt +0 -0
  163. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints_sdk_python35.egg-info/requires.txt +0 -0
  164. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/iints_sdk_python35.egg-info/top_level.txt +0 -0
  165. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_ai/__init__.py +0 -0
  166. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_ai/lineage.py +0 -0
  167. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/__init__.py +0 -0
  168. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/audit.py +0 -0
  169. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/bias_hooks.py +0 -0
  170. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/bundle.py +0 -0
  171. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/certification.py +0 -0
  172. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/compare.py +0 -0
  173. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/conformance.py +0 -0
  174. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/contracts.py +0 -0
  175. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/crypto.py +0 -0
  176. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/data/conformance/vectors/delegation.json +0 -0
  177. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/data/conformance/vectors/fingerprint.json +0 -0
  178. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/data/conformance/vectors/grading.json +0 -0
  179. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/data/conformance/vectors/signing.json +0 -0
  180. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/delegate.py +0 -0
  181. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/diffing.py +0 -0
  182. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/drift.py +0 -0
  183. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/exceptions.py +0 -0
  184. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/fingerprint.py +0 -0
  185. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/fingerprint_store.py +0 -0
  186. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/hf.py +0 -0
  187. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/keys/mdmp_pub_v1.pem +0 -0
  188. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/llm_provenance.py +0 -0
  189. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/migrate.py +0 -0
  190. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/policy.py +0 -0
  191. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/prov.py +0 -0
  192. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/registry.py +0 -0
  193. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/runner.py +0 -0
  194. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/schema_export.py +0 -0
  195. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/synthetic.py +0 -0
  196. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/trust.py +0 -0
  197. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_core/visualizer.py +0 -0
  198. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_flavors/__init__.py +0 -0
  199. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_integrations/__init__.py +0 -0
  200. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_integrations/dvc.py +0 -0
  201. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_integrations/mlflow.py +0 -0
  202. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/src/mdmp_integrations/wandb.py +0 -0
  203. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/tests/test_bergman.py +0 -0
  204. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/tests/test_cli_booth_demo.py +0 -0
  205. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/tests/test_cli_carelink_workbench.py +0 -0
  206. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/tests/test_cli_demo_export.py +0 -0
  207. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/tests/test_cli_poster.py +0 -0
  208. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/tests/test_install_doctor.py +0 -0
  209. {iints_sdk_python35-1.4.0 → iints_sdk_python35-1.5.0}/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.4.0
3
+ Version: 1.5.0
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
  License-Expression: Apache-2.0
@@ -187,6 +187,7 @@ cd iints_quickstart
187
187
  iints presets run --name baseline_t1d --algo algorithms/example_algorithm.py
188
188
  iints ai prepare results/<run_id>
189
189
  iints ai report results/<run_id>
190
+ iints ai review results/<run_id>
190
191
  ```
191
192
 
192
193
  For imported CareLink data, the matching flow is:
@@ -197,6 +198,7 @@ iints carelink-workbench \
197
198
  --output-dir results/personal_carelink
198
199
 
199
200
  iints ai report results/personal_carelink --model ministral-3:3b
201
+ iints ai review results/personal_carelink --model ministral-3:3b
200
202
  iints ai trends results/personal_carelink --model ministral-3:3b
201
203
  iints ai explain results/personal_carelink --model ministral-3:3b
202
204
  ```
@@ -217,7 +219,7 @@ Notes:
217
219
  - `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/`.
218
220
  - `iints carelink-workbench` now does the same kind of AI preparation for imported personal CareLink data and also generates a dashboard PNG/HTML pair.
219
221
  - If Ollama closes the connection during generation, the SDK now surfaces an explicit recovery hint and points users toward `ministral-3:3b` for lower-memory systems.
220
- - After `iints ai prepare`, you can point `iints ai explain|trends|anomalies|report` directly at the run directory.
222
+ - After `iints ai prepare`, you can point `iints ai explain|trends|anomalies|report|review` directly at the run directory.
221
223
  - After `iints carelink-workbench`, you can point those same AI commands directly at the generated CareLink workspace directory.
222
224
  - Output is research-only and not medical advice.
223
225
 
@@ -134,6 +134,7 @@ cd iints_quickstart
134
134
  iints presets run --name baseline_t1d --algo algorithms/example_algorithm.py
135
135
  iints ai prepare results/<run_id>
136
136
  iints ai report results/<run_id>
137
+ iints ai review results/<run_id>
137
138
  ```
138
139
 
139
140
  For imported CareLink data, the matching flow is:
@@ -144,6 +145,7 @@ iints carelink-workbench \
144
145
  --output-dir results/personal_carelink
145
146
 
146
147
  iints ai report results/personal_carelink --model ministral-3:3b
148
+ iints ai review results/personal_carelink --model ministral-3:3b
147
149
  iints ai trends results/personal_carelink --model ministral-3:3b
148
150
  iints ai explain results/personal_carelink --model ministral-3:3b
149
151
  ```
@@ -164,7 +166,7 @@ Notes:
164
166
  - `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/`.
165
167
  - `iints carelink-workbench` now does the same kind of AI preparation for imported personal CareLink data and also generates a dashboard PNG/HTML pair.
166
168
  - If Ollama closes the connection during generation, the SDK now surfaces an explicit recovery hint and points users toward `ministral-3:3b` for lower-memory systems.
167
- - After `iints ai prepare`, you can point `iints ai explain|trends|anomalies|report` directly at the run directory.
169
+ - After `iints ai prepare`, you can point `iints ai explain|trends|anomalies|report|review` directly at the run directory.
168
170
  - After `iints carelink-workbench`, you can point those same AI commands directly at the generated CareLink workspace directory.
169
171
  - Output is research-only and not medical advice.
170
172
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "iints-sdk-python35"
7
- version = "1.4.0"
7
+ version = "1.5.0"
8
8
  authors = [
9
9
  { name="Rune Bobbaers", email="rune.bobbaers@gmail.com" },
10
10
  ]
@@ -11,7 +11,7 @@ except ImportError: # pragma: no cover - Python < 3.8 fallback
11
11
  try:
12
12
  __version__ = version("iints-sdk-python35")
13
13
  except PackageNotFoundError: # pragma: no cover - source tree fallback
14
- __version__ = "1.4.0"
14
+ __version__ = "1.5.0"
15
15
 
16
16
  # Note to developers: this SDK is currently maintained by a single author.
17
17
  # Please report bugs via GitHub issues and feel free to contribute fixes via PRs.
@@ -122,3 +122,6 @@ class IINTSAssistant:
122
122
 
123
123
  def generate_report(self, run: dict[str, Any]) -> AIResponse:
124
124
  return self._run_task("generate_report", run)
125
+
126
+ def review_realism(self, run: dict[str, Any]) -> AIResponse:
127
+ return self._run_task("review_realism", run)
@@ -43,6 +43,7 @@ def _default_prepared_payload(task: str, ai_dir: Path) -> Path:
43
43
  "trends": ["trends_payload.json"],
44
44
  "anomalies": ["anomalies_payload.json"],
45
45
  "report": ["report_payload.json"],
46
+ "review": ["review_payload.json", "report_payload.json"],
46
47
  }.get(task, [])
47
48
  for filename in candidates:
48
49
  candidate = ai_dir / filename
@@ -95,6 +96,14 @@ def _write_output(path: Path | None, response: AIResponse) -> None:
95
96
  path.write_text(response.text + "\n", encoding="utf-8")
96
97
 
97
98
 
99
+ def _default_output_for_review(input_path: Path, output: Path | None) -> Path | None:
100
+ if output is not None:
101
+ return output
102
+ if input_path.is_dir():
103
+ return input_path / "ai" / "realism_review.md"
104
+ return None
105
+
106
+
98
107
  def _render_response(console: Console, title: str, response: AIResponse, output: Path | None) -> None:
99
108
  console.print(Panel(response.text, title=title, border_style="cyan"))
100
109
  console.print(
@@ -438,3 +447,45 @@ def report(
438
447
  except Exception as exc:
439
448
  console.print(f"[bold red]Error:[/bold red] {exc}")
440
449
  raise typer.Exit(code=1)
450
+
451
+
452
+ @app.command("review")
453
+ def review(
454
+ input_json: Annotated[Path, typer.Argument(help="Prepared run directory or JSON file with run-level simulation outputs.")],
455
+ mdmp_cert: Annotated[Optional[Path], typer.Option(help="Signed MDMP artifact required before AI analysis can run.")] = None,
456
+ mode: Annotated[str, typer.Option(help="AI backend mode. Use 'local' for Ollama/Ministral.")] = "auto",
457
+ model: Annotated[str, typer.Option(help="Ollama model name to use.")] = DEFAULT_MINISTRAL_MODEL,
458
+ minimum_grade: Annotated[str, typer.Option(help="Minimum MDMP grade required to allow analysis.")] = "research_grade",
459
+ public_key: Annotated[Optional[Path], typer.Option(help="Explicit MDMP public key for verification.")] = None,
460
+ trust_store: Annotated[Optional[Path], typer.Option(help="MDMP trust store for verification.")] = None,
461
+ ollama_host: Annotated[Optional[str], typer.Option(help="Override the Ollama base URL.")] = None,
462
+ timeout_seconds: Annotated[float, typer.Option(help="HTTP timeout for Ollama generation requests.")] = 120.0,
463
+ output: Annotated[Optional[Path], typer.Option(help="Optional file path to save the realism review.")] = None,
464
+ ) -> None:
465
+ console = Console()
466
+ try:
467
+ resolved_input, resolved_cert, resolved_public_key = _resolve_cli_inputs(
468
+ task="review",
469
+ input_path=input_json,
470
+ mdmp_cert=mdmp_cert,
471
+ public_key=public_key,
472
+ trust_store=trust_store,
473
+ )
474
+ payload = _load_json_payload(resolved_input, "Input JSON")
475
+ assistant = _build_assistant(
476
+ mdmp_cert=resolved_cert,
477
+ mode=mode,
478
+ model=model,
479
+ minimum_grade=minimum_grade,
480
+ public_key=resolved_public_key,
481
+ trust_store=trust_store,
482
+ ollama_host=ollama_host,
483
+ timeout_seconds=timeout_seconds,
484
+ )
485
+ resolved_output = _default_output_for_review(input_json, output)
486
+ response = assistant.review_realism(payload)
487
+ _write_output(resolved_output, response)
488
+ _render_response(console, "IINTS AI Realism Review", response, resolved_output)
489
+ except Exception as exc:
490
+ console.print(f"[bold red]Error:[/bold red] {exc}")
491
+ raise typer.Exit(code=1)
@@ -97,6 +97,13 @@ def _sample_trace(df: pd.DataFrame, *, max_rows: int = 48) -> list[dict[str, Any
97
97
  return [_normalize_series_record(record) for record in sampled.to_dict(orient="records")]
98
98
 
99
99
 
100
+ def _max_glucose_delta_per_step(df: pd.DataFrame, glucose_column: str) -> float:
101
+ clean = pd.to_numeric(df[glucose_column], errors="coerce").dropna()
102
+ if clean.empty or len(clean) < 2:
103
+ return 0.0
104
+ return float(clean.diff().abs().dropna().max())
105
+
106
+
100
107
  def _position_for_label(df: pd.DataFrame, label: Any) -> int:
101
108
  location = df.index.get_loc(label)
102
109
  if isinstance(location, int):
@@ -166,9 +173,12 @@ def _build_summary(df: pd.DataFrame, run_metadata: dict[str, Any], audit_summary
166
173
  "mean_glucose_mgdl": _normalize_value(float(glucose.mean())),
167
174
  "min_glucose_mgdl": _normalize_value(float(glucose.min())),
168
175
  "max_glucose_mgdl": _normalize_value(float(glucose.max())),
176
+ "max_glucose_delta_per_step_mgdl": _normalize_value(_max_glucose_delta_per_step(df, glucose_column)),
169
177
  "time_in_range_70_180_pct": _normalize_value(_time_in_band_pct(glucose, 70.0, 180.0)),
170
178
  "time_below_70_pct": _normalize_value(float((glucose < 70.0).mean() * 100.0)),
179
+ "time_below_54_pct": _normalize_value(float((glucose < 54.0).mean() * 100.0)),
171
180
  "time_above_180_pct": _normalize_value(float((glucose > 180.0).mean() * 100.0)),
181
+ "time_above_250_pct": _normalize_value(float((glucose > 250.0).mean() * 100.0)),
172
182
  "delivered_insulin_total_units": _normalize_value(_safe_sum(df, "delivered_insulin_units")),
173
183
  "recommended_insulin_total_units": _normalize_value(_safe_sum(df, "algo_recommended_insulin_units")),
174
184
  "safety_trigger_count": _bool_sum(df, "safety_triggered"),
@@ -228,6 +238,23 @@ def _build_payloads(
228
238
  "trace_sample": trace_sample,
229
239
  "baseline_comparison": baseline_comparison,
230
240
  },
241
+ "review_payload.json": {
242
+ **common,
243
+ "audit_summary": audit_summary,
244
+ "baseline_comparison": baseline_comparison,
245
+ "trace_sample": trace_sample,
246
+ "review_focus": {
247
+ "goal": "Judge whether the simulation or imported dataset looks physiologically plausible and internally coherent.",
248
+ "checks": [
249
+ "glucose range plausibility",
250
+ "excursion size and recovery behavior",
251
+ "time in range and severe hypo/hyper exposure",
252
+ "insulin delivery realism relative to observed glucose behavior",
253
+ "safety trigger and override consistency",
254
+ ],
255
+ },
256
+ "run_manifest": run_manifest,
257
+ },
231
258
  "step_riskiest.json": {
232
259
  **common,
233
260
  **risk_payload,
@@ -4,7 +4,13 @@ import json
4
4
  from typing import Any, Literal
5
5
 
6
6
 
7
- TaskName = Literal["explain_decision", "analyze_trends", "detect_anomalies", "generate_report"]
7
+ TaskName = Literal[
8
+ "explain_decision",
9
+ "analyze_trends",
10
+ "detect_anomalies",
11
+ "generate_report",
12
+ "review_realism",
13
+ ]
8
14
  MAX_PROMPT_PAYLOAD_CHARS = 12000
9
15
 
10
16
  SYSTEM_PROMPT = (
@@ -52,6 +58,18 @@ TASK_TEMPLATES: dict[TaskName, str] = {
52
58
  "5. Research-only conclusion\n\n"
53
59
  "Input JSON:\n{data}"
54
60
  ),
61
+ "review_realism": (
62
+ "Review this simulation or imported-data payload and judge whether the results look physiologically plausible for research use.\n"
63
+ "Be conservative and do not overclaim. If the payload is incomplete, say so clearly.\n"
64
+ "Respond in markdown with these sections:\n"
65
+ "1. Overall realism verdict (Likely realistic / Needs review / Likely unrealistic)\n"
66
+ "2. Strong realism signals\n"
67
+ "3. Questionable or unrealistic patterns\n"
68
+ "4. Concrete feedback points the SDK developer can improve\n"
69
+ "5. Suggested follow-up validation checks\n\n"
70
+ "Focus on glycemic ranges, excursion patterns, insulin behavior, safety overrides, and whether the data looks internally coherent.\n\n"
71
+ "Input JSON:\n{data}"
72
+ ),
55
73
  }
56
74
 
57
75
 
@@ -196,6 +196,7 @@ def _build_jury_brief(
196
196
  "```bash",
197
197
  "iints ai local-check --model ministral-3:3b",
198
198
  f"iints ai report {run_outputs['03_supervisor_override']['output_dir']} --model ministral-3:3b",
199
+ f"iints ai review {run_outputs['03_supervisor_override']['output_dir']} --model ministral-3:3b",
199
200
  f"iints ai explain {run_outputs['03_supervisor_override']['output_dir']} --model ministral-3:3b",
200
201
  "```",
201
202
  "",
@@ -247,6 +248,7 @@ def _build_commands_markdown(
247
248
  "```bash\n"
248
249
  "iints ai local-check --model ministral-3:3b\n"
249
250
  f"iints ai report {supervisor_dir} --model ministral-3:3b\n"
251
+ f"iints ai review {supervisor_dir} --model ministral-3:3b\n"
250
252
  f"iints ai explain {supervisor_dir} --model ministral-3:3b\n"
251
253
  "```\n"
252
254
  )
@@ -296,6 +298,7 @@ def _build_live_demo_script_text(
296
298
  "- If Ollama is ready, run:\n"
297
299
  " iints ai local-check --model ministral-3:3b\n"
298
300
  f" iints ai report {run_outputs['03_supervisor_override']['output_dir']} --model ministral-3:3b\n"
301
+ f" iints ai review {run_outputs['03_supervisor_override']['output_dir']} --model ministral-3:3b\n"
299
302
  f" iints ai explain {run_outputs['03_supervisor_override']['output_dir']} --model ministral-3:3b\n"
300
303
  "- Say: the local model explains the result, but only after the SDK has prepared the run artifacts.\n\n"
301
304
  "7. IF THE JURY ASKS WHY THIS MATTERS\n"
@@ -202,6 +202,23 @@ def _prepare_ai_payloads(
202
202
  "profile_24h": profile_records,
203
203
  "trace_sample": trace_sample,
204
204
  },
205
+ "review_payload.json": {
206
+ **common,
207
+ "daily_summary": daily_records,
208
+ "profile_24h": profile_records,
209
+ "trace_sample": trace_sample,
210
+ "top_alerts": alert_counts,
211
+ "top_sensor_exceptions": sensor_exception_counts,
212
+ "review_focus": {
213
+ "goal": "Judge whether the imported glucose history looks internally coherent and physiologically plausible.",
214
+ "checks": [
215
+ "time in range versus extreme exposure",
216
+ "daily variability and day-to-day stability",
217
+ "consistency between glucose, carbs, and insulin logs",
218
+ "frequency of alerts and sensor exceptions",
219
+ ],
220
+ },
221
+ },
205
222
  "anomalies_payload.json": {
206
223
  **common,
207
224
  "lowest_readings": [
@@ -254,6 +254,7 @@ def _build_jury_talk_track(summary: dict[str, Any]) -> str:
254
254
  "```bash",
255
255
  "iints ai local-check --model ministral-3:3b",
256
256
  f"iints ai report {summary['scenarios'][2]['output_dir']} --model ministral-3:3b",
257
+ f"iints ai review {summary['scenarios'][2]['output_dir']} --model ministral-3:3b",
257
258
  f"iints ai explain {summary['scenarios'][2]['output_dir']} --model ministral-3:3b",
258
259
  "```",
259
260
  "",
@@ -304,6 +305,7 @@ def _build_run_commands(summary: dict[str, Any]) -> str:
304
305
  "```bash\n"
305
306
  "iints ai local-check --model ministral-3:3b\n"
306
307
  f"iints ai report {supervisor_dir} --model ministral-3:3b\n"
308
+ f"iints ai review {supervisor_dir} --model ministral-3:3b\n"
307
309
  f"iints ai explain {supervisor_dir} --model ministral-3:3b\n"
308
310
  "```\n"
309
311
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iints-sdk-python35
3
- Version: 1.4.0
3
+ Version: 1.5.0
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
  License-Expression: Apache-2.0
@@ -187,6 +187,7 @@ cd iints_quickstart
187
187
  iints presets run --name baseline_t1d --algo algorithms/example_algorithm.py
188
188
  iints ai prepare results/<run_id>
189
189
  iints ai report results/<run_id>
190
+ iints ai review results/<run_id>
190
191
  ```
191
192
 
192
193
  For imported CareLink data, the matching flow is:
@@ -197,6 +198,7 @@ iints carelink-workbench \
197
198
  --output-dir results/personal_carelink
198
199
 
199
200
  iints ai report results/personal_carelink --model ministral-3:3b
201
+ iints ai review results/personal_carelink --model ministral-3:3b
200
202
  iints ai trends results/personal_carelink --model ministral-3:3b
201
203
  iints ai explain results/personal_carelink --model ministral-3:3b
202
204
  ```
@@ -217,7 +219,7 @@ Notes:
217
219
  - `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/`.
218
220
  - `iints carelink-workbench` now does the same kind of AI preparation for imported personal CareLink data and also generates a dashboard PNG/HTML pair.
219
221
  - If Ollama closes the connection during generation, the SDK now surfaces an explicit recovery hint and points users toward `ministral-3:3b` for lower-memory systems.
220
- - After `iints ai prepare`, you can point `iints ai explain|trends|anomalies|report` directly at the run directory.
222
+ - After `iints ai prepare`, you can point `iints ai explain|trends|anomalies|report|review` directly at the run directory.
221
223
  - After `iints carelink-workbench`, you can point those same AI commands directly at the generated CareLink workspace directory.
222
224
  - Output is research-only and not medical advice.
223
225
 
@@ -1,7 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
- from pathlib import Path
4
3
  import json
4
+ import os
5
+ from pathlib import Path
5
6
 
6
7
  import pandas as pd
7
8
  import typer