open-data-sci 0.1.0__tar.gz → 0.2.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 (301) hide show
  1. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/.env.example +1 -2
  2. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/PKG-INFO +112 -23
  3. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/README.md +110 -21
  4. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/dev/scripts/test_pypi_install.sh +0 -0
  5. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/dev/scripts/test_pypi_publish.sh +0 -0
  6. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/docs/api/agent.md +44 -6
  7. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/docs/api/config.md +17 -19
  8. open_data_sci-0.2.0/docs/api/index.md +43 -0
  9. open_data_sci-0.2.0/docs/api/memory.md +103 -0
  10. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/docs/api/open_data_sci.md +1 -1
  11. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/docs/api/session.md +16 -2
  12. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/docs/api/session_manager.md +10 -18
  13. open_data_sci-0.2.0/docs/api/skills.md +86 -0
  14. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/docs/api/types.md +17 -6
  15. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/docs/getting-started.md +41 -20
  16. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/docs/index.md +2 -2
  17. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/README.md +1 -1
  18. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/configs/config_anthropic.yaml +5 -9
  19. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/configs/config_azure.yaml +2 -2
  20. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/configs/config_bedrock.yaml +4 -4
  21. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/configs/config_gemini.yaml +2 -2
  22. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/configs/config_ollama.yaml +3 -3
  23. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/configs/config_openai.yaml +2 -2
  24. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/configs/config_openai_compatible_server.yaml +3 -3
  25. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/configs/config_vertexai.yaml +2 -2
  26. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/notebooks/030_notebook_anthropic.ipynb +1 -1
  27. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/notebooks/031_notebook_openai_compatible_server.ipynb +2 -2
  28. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/notebooks/032_notebook_bedrock.ipynb +1 -1
  29. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/scripts/021_script_openai_compatible_server.py +2 -2
  30. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/scripts/022_script_bedrock.py +1 -1
  31. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/tui/010_tui_anthropic.md +8 -4
  32. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/tui/011_tui_openai_compatible_server.md +17 -14
  33. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/tui/012_tui_bedrock.md +7 -5
  34. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/mkdocs.yaml +1 -1
  35. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/__init__.py +6 -9
  36. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_tui/adapter.py +11 -2
  37. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_tui/app.py +45 -11
  38. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_tui/commands.py +10 -3
  39. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_tui/controller.py +159 -47
  40. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_tui/file_refs.py +6 -2
  41. open_data_sci-0.2.0/opendatasci/_tui/message_queue.py +49 -0
  42. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_tui/presenter.py +41 -22
  43. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_tui/service.py +1 -1
  44. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_tui/styles.tcss +46 -49
  45. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_tui/theme.py +39 -4
  46. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_tui/tools_display.py +50 -16
  47. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_tui/widgets.py +267 -91
  48. open_data_sci-0.2.0/opendatasci/_utils/async_utils.py +22 -0
  49. open_data_sci-0.2.0/opendatasci/_utils/casing_utils.py +8 -0
  50. open_data_sci-0.2.0/opendatasci/_utils/datetime_utils.py +10 -0
  51. open_data_sci-0.2.0/opendatasci/_utils/graph_utils.py +8 -0
  52. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_utils/hash_utils.py +1 -2
  53. open_data_sci-0.2.0/opendatasci/_utils/message_utils.py +92 -0
  54. open_data_sci-0.2.0/opendatasci/_utils/mixins.py +21 -0
  55. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/agents/__init__.py +1 -7
  56. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/agents/agents.py +126 -127
  57. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/agents/agents_factory.py +15 -6
  58. open_data_sci-0.2.0/opendatasci/agents/chat_history.py +198 -0
  59. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/agents/graphs.py +6 -2
  60. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/agents/nodes.py +18 -14
  61. open_data_sci-0.2.0/opendatasci/agents/states.py +87 -0
  62. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/configs.py +46 -34
  63. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/context/__init__.py +1 -4
  64. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/context/base.py +20 -9
  65. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/context/local.py +33 -45
  66. open_data_sci-0.2.0/opendatasci/context/plans.py +17 -0
  67. open_data_sci-0.2.0/opendatasci/human_inputs/__init__.py +15 -0
  68. open_data_sci-0.2.0/opendatasci/human_inputs/human_approval.py +162 -0
  69. open_data_sci-0.2.0/opendatasci/memory/chat_memory.py +256 -0
  70. open_data_sci-0.2.0/opendatasci/memory/messages.py +179 -0
  71. {open_data_sci-0.1.0/opendatasci/agents → open_data_sci-0.2.0/opendatasci/memory}/turn_memory.py +2 -1
  72. open_data_sci-0.2.0/opendatasci/models/__init__.py +3 -0
  73. open_data_sci-0.2.0/opendatasci/models/anthropic.py +80 -0
  74. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/models/aws.py +11 -3
  75. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/models/local.py +2 -2
  76. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/prompts/__init__.py +1 -3
  77. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/prompts/builders.py +20 -34
  78. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/prompts/prompt_templates.py +14 -9
  79. open_data_sci-0.2.0/opendatasci/resources/skill_domains/competitive_data_science/manifest.md +67 -0
  80. open_data_sci-0.2.0/opendatasci/resources/skill_domains/data_science/manifest.md +51 -0
  81. open_data_sci-0.2.0/opendatasci/resources/skill_domains/data_science_education/manifest.md +45 -0
  82. open_data_sci-0.2.0/opendatasci/resources/skill_domains/deep_learning/manifest.md +69 -0
  83. open_data_sci-0.2.0/opendatasci/resources/skill_domains/machine_learning/manifest.md +57 -0
  84. open_data_sci-0.2.0/opendatasci/resources/skill_domains/quantitative_analysis/manifest.md +45 -0
  85. open_data_sci-0.2.0/opendatasci/resources/skills/competitive_data_science/baseline.md +21 -0
  86. open_data_sci-0.2.0/opendatasci/resources/skills/competitive_data_science/eda.md +26 -0
  87. open_data_sci-0.2.0/opendatasci/resources/skills/competitive_data_science/ensembling.md +31 -0
  88. open_data_sci-0.2.0/opendatasci/resources/skills/competitive_data_science/feature_engineering.md +38 -0
  89. open_data_sci-0.2.0/opendatasci/resources/skills/competitive_data_science/final_submission.md +23 -0
  90. open_data_sci-0.2.0/opendatasci/resources/skills/competitive_data_science/hyperparameter_tuning.md +23 -0
  91. open_data_sci-0.2.0/opendatasci/resources/skills/competitive_data_science/model_development.md +29 -0
  92. open_data_sci-0.2.0/opendatasci/resources/skills/competitive_data_science/phase_wiring.md +19 -0
  93. open_data_sci-0.2.0/opendatasci/resources/skills/competitive_data_science/reconnaissance.md +26 -0
  94. open_data_sci-0.2.0/opendatasci/resources/skills/competitive_data_science/validation.md +31 -0
  95. open_data_sci-0.2.0/opendatasci/resources/skills/data_science/causality_confounding.md +10 -0
  96. open_data_sci-0.2.0/opendatasci/resources/skills/data_science/communicating_findings.md +10 -0
  97. open_data_sci-0.2.0/opendatasci/resources/skills/data_science/data_quality_preparation.md +11 -0
  98. open_data_sci-0.2.0/opendatasci/resources/skills/data_science/exploratory_analysis.md +11 -0
  99. open_data_sci-0.2.0/opendatasci/resources/skills/data_science/framing_the_problem.md +9 -0
  100. open_data_sci-0.2.0/opendatasci/resources/skills/data_science/granularity_aggregation.md +9 -0
  101. open_data_sci-0.2.0/opendatasci/resources/skills/data_science/modeling_evaluation.md +13 -0
  102. open_data_sci-0.2.0/opendatasci/resources/skills/data_science/statistical_testing.md +12 -0
  103. open_data_sci-0.2.0/opendatasci/resources/skills/data_science_education/building_intuition.md +10 -0
  104. open_data_sci-0.2.0/opendatasci/resources/skills/data_science_education/calibrating_depth.md +10 -0
  105. open_data_sci-0.2.0/opendatasci/resources/skills/data_science_education/connecting_concepts.md +10 -0
  106. open_data_sci-0.2.0/opendatasci/resources/skills/data_science_education/diagnosing_understanding.md +9 -0
  107. open_data_sci-0.2.0/opendatasci/resources/skills/data_science_education/feedback_correction.md +10 -0
  108. open_data_sci-0.2.0/opendatasci/resources/skills/data_science_education/structuring_explanations.md +10 -0
  109. open_data_sci-0.2.0/opendatasci/resources/skills/data_science_education/worked_examples_code.md +10 -0
  110. open_data_sci-0.2.0/opendatasci/resources/skills/deep_learning/architecture_selection.md +27 -0
  111. open_data_sci-0.2.0/opendatasci/resources/skills/deep_learning/evaluation.md +14 -0
  112. open_data_sci-0.2.0/opendatasci/resources/skills/deep_learning/flax_nnx.md +29 -0
  113. open_data_sci-0.2.0/opendatasci/resources/skills/deep_learning/hyperparameter_tuning.md +17 -0
  114. open_data_sci-0.2.0/opendatasci/resources/skills/deep_learning/jax_fundamentals.md +23 -0
  115. open_data_sci-0.2.0/opendatasci/resources/skills/deep_learning/library_stack.md +10 -0
  116. open_data_sci-0.2.0/opendatasci/resources/skills/deep_learning/optax.md +38 -0
  117. open_data_sci-0.2.0/opendatasci/resources/skills/deep_learning/regularisation_overfitting.md +25 -0
  118. open_data_sci-0.2.0/opendatasci/resources/skills/deep_learning/sklearn_mlp.md +12 -0
  119. open_data_sci-0.2.0/opendatasci/resources/skills/deep_learning/training_loop.md +29 -0
  120. open_data_sci-0.2.0/opendatasci/resources/skills/deep_learning/when_to_use.md +13 -0
  121. open_data_sci-0.2.0/opendatasci/resources/skills/machine_learning/class_imbalance.md +10 -0
  122. open_data_sci-0.2.0/opendatasci/resources/skills/machine_learning/evaluation_diagnostics.md +12 -0
  123. open_data_sci-0.2.0/opendatasci/resources/skills/machine_learning/feature_engineering_selection.md +12 -0
  124. open_data_sci-0.2.0/opendatasci/resources/skills/machine_learning/hyperparameter_tuning.md +11 -0
  125. open_data_sci-0.2.0/opendatasci/resources/skills/machine_learning/interpretability.md +10 -0
  126. open_data_sci-0.2.0/opendatasci/resources/skills/machine_learning/model_selection_complexity.md +16 -0
  127. open_data_sci-0.2.0/opendatasci/resources/skills/machine_learning/overfitting_regularisation.md +11 -0
  128. open_data_sci-0.2.0/opendatasci/resources/skills/machine_learning/problem_framing.md +10 -0
  129. open_data_sci-0.2.0/opendatasci/resources/skills/machine_learning/splitting_strategy.md +11 -0
  130. open_data_sci-0.2.0/opendatasci/resources/skills/quantitative_analysis/backtesting_empirical_validation.md +10 -0
  131. open_data_sci-0.2.0/opendatasci/resources/skills/quantitative_analysis/communicating_results.md +10 -0
  132. open_data_sci-0.2.0/opendatasci/resources/skills/quantitative_analysis/mathematical_statistical_foundations.md +11 -0
  133. open_data_sci-0.2.0/opendatasci/resources/skills/quantitative_analysis/optimisation.md +10 -0
  134. open_data_sci-0.2.0/opendatasci/resources/skills/quantitative_analysis/problem_formulation.md +9 -0
  135. open_data_sci-0.2.0/opendatasci/resources/skills/quantitative_analysis/risk_uncertainty_quantification.md +11 -0
  136. open_data_sci-0.2.0/opendatasci/resources/skills/quantitative_analysis/time_series_signal_analysis.md +11 -0
  137. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/sandbox/srt.py +5 -1
  138. open_data_sci-0.2.0/opendatasci/session/__init__.py +4 -0
  139. open_data_sci-0.2.0/opendatasci/session/session_manager.py +113 -0
  140. open_data_sci-0.2.0/opendatasci/session/threads.py +17 -0
  141. open_data_sci-0.2.0/opendatasci/skills/__init__.py +4 -0
  142. open_data_sci-0.2.0/opendatasci/skills/base.py +71 -0
  143. open_data_sci-0.2.0/opendatasci/skills/local.py +143 -0
  144. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/streaming/__init__.py +3 -3
  145. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/streaming/events.py +17 -0
  146. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/streaming/processors.py +112 -30
  147. open_data_sci-0.2.0/opendatasci/tools/__init__.py +4 -0
  148. open_data_sci-0.2.0/opendatasci/tools/base.py +85 -0
  149. open_data_sci-0.2.0/opendatasci/tools/coding.py +393 -0
  150. open_data_sci-0.2.0/opendatasci/tools/critic.py +172 -0
  151. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/tools/dataset_info.py +142 -82
  152. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/tools/factory.py +33 -59
  153. open_data_sci-0.2.0/opendatasci/tools/planning.py +121 -0
  154. open_data_sci-0.2.0/opendatasci/tools/skills.py +215 -0
  155. open_data_sci-0.2.0/opendatasci/tools/user_interaction.py +82 -0
  156. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/tools/web.py +101 -58
  157. open_data_sci-0.2.0/opendatasci/tools/workers.py +244 -0
  158. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/tools/workspace.py +33 -16
  159. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/workspace/__init__.py +1 -4
  160. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/pyproject.toml +4 -4
  161. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/component/conftest.py +8 -6
  162. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/component/test_agent_integrations.py +46 -30
  163. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/component/test_cli_controller.py +278 -12
  164. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/component/test_lifecycle.py +0 -1
  165. open_data_sci-0.2.0/tests/component/test_model_factories.py +460 -0
  166. open_data_sci-0.2.0/tests/component/test_sandbox_runner.py +189 -0
  167. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/component/test_service.py +17 -27
  168. open_data_sci-0.2.0/tests/component/test_tui_app.py +474 -0
  169. open_data_sci-0.2.0/tests/component/test_tui_widgets.py +737 -0
  170. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/_tui/conftest.py +0 -1
  171. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/_tui/test_app.py +111 -3
  172. open_data_sci-0.2.0/tests/unit/_tui/test_commands.py +235 -0
  173. open_data_sci-0.2.0/tests/unit/_tui/test_completion.py +364 -0
  174. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/_tui/test_controller.py +208 -5
  175. open_data_sci-0.2.0/tests/unit/_tui/test_file_refs.py +402 -0
  176. open_data_sci-0.2.0/tests/unit/_tui/test_message_queue.py +259 -0
  177. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/_tui/test_presenter.py +76 -20
  178. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/_tui/test_tools_display.py +25 -19
  179. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/_tui/test_widgets.py +679 -112
  180. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/_utils/test_async_utils.py +1 -1
  181. open_data_sci-0.2.0/tests/unit/_utils/test_graph_utils.py +48 -0
  182. open_data_sci-0.2.0/tests/unit/_utils/test_message_utils.py +273 -0
  183. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/agents/test_agents.py +187 -57
  184. open_data_sci-0.2.0/tests/unit/agents/test_chat_messages.py +194 -0
  185. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/agents/test_graphs.py +3 -4
  186. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/agents/test_nodes.py +51 -71
  187. open_data_sci-0.2.0/tests/unit/agents/test_states.py +46 -0
  188. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/context/test_local_context_store.py +82 -39
  189. open_data_sci-0.2.0/tests/unit/human_inputs/test_human_approval.py +192 -0
  190. open_data_sci-0.2.0/tests/unit/memory/test_chat_memory.py +353 -0
  191. {open_data_sci-0.1.0/tests/unit/agents → open_data_sci-0.2.0/tests/unit/memory}/test_turn_memory.py +32 -31
  192. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/models/test_anthropic.py +20 -10
  193. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/models/test_local.py +4 -4
  194. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/prompts/test_builders.py +56 -108
  195. open_data_sci-0.2.0/tests/unit/sandbox/__init__.py +0 -0
  196. open_data_sci-0.2.0/tests/unit/session/__init__.py +0 -0
  197. open_data_sci-0.2.0/tests/unit/session/test_session_manager.py +124 -0
  198. open_data_sci-0.2.0/tests/unit/skills/__init__.py +0 -0
  199. open_data_sci-0.2.0/tests/unit/skills/test_local.py +314 -0
  200. open_data_sci-0.2.0/tests/unit/streaming/__init__.py +0 -0
  201. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/streaming/test_processors.py +137 -4
  202. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/test_configs.py +6 -5
  203. open_data_sci-0.2.0/tests/unit/tools/__init__.py +0 -0
  204. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/tools/test_coding.py +142 -44
  205. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/tools/test_critic.py +5 -5
  206. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/tools/test_dataset_info.py +10 -9
  207. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/tools/test_factory.py +70 -14
  208. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/tools/test_planning.py +32 -29
  209. open_data_sci-0.2.0/tests/unit/tools/test_skills.py +249 -0
  210. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/tools/test_user_interaction.py +9 -2
  211. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/tools/test_workers.py +41 -30
  212. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/uv.lock +18 -14
  213. open_data_sci-0.1.0/docs/api/index.md +0 -57
  214. open_data_sci-0.1.0/docs/api/memory.md +0 -62
  215. open_data_sci-0.1.0/opendatasci/_tui/__init__.py +0 -1
  216. open_data_sci-0.1.0/opendatasci/_tui/styles_visible.tcss +0 -245
  217. open_data_sci-0.1.0/opendatasci/_utils/async_utils.py +0 -11
  218. open_data_sci-0.1.0/opendatasci/_utils/langchain_utils.py +0 -155
  219. open_data_sci-0.1.0/opendatasci/agents/chat_memory.py +0 -397
  220. open_data_sci-0.1.0/opendatasci/agents/states.py +0 -36
  221. open_data_sci-0.1.0/opendatasci/models/__init__.py +0 -7
  222. open_data_sci-0.1.0/opendatasci/models/anthropic.py +0 -40
  223. open_data_sci-0.1.0/opendatasci/prompts/message_templates.py +0 -7
  224. open_data_sci-0.1.0/opendatasci/resources/skills/competitive_data_science.md +0 -241
  225. open_data_sci-0.1.0/opendatasci/resources/skills/data_science.md +0 -55
  226. open_data_sci-0.1.0/opendatasci/resources/skills/data_science_education.md +0 -42
  227. open_data_sci-0.1.0/opendatasci/resources/skills/deep_learning.md +0 -205
  228. open_data_sci-0.1.0/opendatasci/resources/skills/machine_learning.md +0 -68
  229. open_data_sci-0.1.0/opendatasci/resources/skills/quantitative_analysis.md +0 -45
  230. open_data_sci-0.1.0/opendatasci/skills/__init__.py +0 -9
  231. open_data_sci-0.1.0/opendatasci/skills/base.py +0 -28
  232. open_data_sci-0.1.0/opendatasci/skills/local.py +0 -131
  233. open_data_sci-0.1.0/opendatasci/tools/__init__.py +0 -58
  234. open_data_sci-0.1.0/opendatasci/tools/coding.py +0 -261
  235. open_data_sci-0.1.0/opendatasci/tools/critic.py +0 -136
  236. open_data_sci-0.1.0/opendatasci/tools/planning.py +0 -88
  237. open_data_sci-0.1.0/opendatasci/tools/skills.py +0 -90
  238. open_data_sci-0.1.0/opendatasci/tools/user_interaction.py +0 -54
  239. open_data_sci-0.1.0/opendatasci/tools/workers.py +0 -237
  240. open_data_sci-0.1.0/tests/unit/_utils/test_langchain_utils.py +0 -382
  241. open_data_sci-0.1.0/tests/unit/agents/test_chat_memory.py +0 -187
  242. open_data_sci-0.1.0/tests/unit/skills/test_local.py +0 -213
  243. open_data_sci-0.1.0/tests/unit/tools/test_skills.py +0 -152
  244. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/.gitignore +0 -0
  245. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/LICENSE +0 -0
  246. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/Makefile +0 -0
  247. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/docs/api/workbench.md +0 -0
  248. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/docs/requirements.txt +0 -0
  249. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/examples/scripts/020_script_anthropic.py +0 -0
  250. {open_data_sci-0.1.0/opendatasci/_utils → open_data_sci-0.2.0/opendatasci/_tui}/__init__.py +0 -0
  251. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_tui/completion.py +0 -0
  252. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_tui/models.py +0 -0
  253. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_tui/session.py +0 -0
  254. {open_data_sci-0.1.0/tests → open_data_sci-0.2.0/opendatasci/_utils}/__init__.py +0 -0
  255. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_utils/data_formats.py +0 -0
  256. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/_utils/streaming_utils.py +0 -0
  257. {open_data_sci-0.1.0/tests/component → open_data_sci-0.2.0/opendatasci/memory}/__init__.py +0 -0
  258. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/models/factory.py +0 -0
  259. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/models/google.py +0 -0
  260. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/models/microsoft.py +0 -0
  261. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/models/openai.py +0 -0
  262. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/models/providers.py +0 -0
  263. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/prompts/caching.py +0 -0
  264. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/sandbox/__init__.py +1 -1
  265. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/sandbox/_runner.py +0 -0
  266. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/sandbox/base.py +0 -0
  267. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/tools/mcp.py +0 -0
  268. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/workspace/base.py +0 -0
  269. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/opendatasci/workspace/local.py +0 -0
  270. {open_data_sci-0.1.0/tests/unit → open_data_sci-0.2.0/tests}/__init__.py +0 -0
  271. {open_data_sci-0.1.0/tests/unit/_tui → open_data_sci-0.2.0/tests/component}/__init__.py +0 -0
  272. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/component/test_real_streaming.py +0 -0
  273. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/component/test_streaming.py +0 -0
  274. {open_data_sci-0.1.0/tests/unit/_utils → open_data_sci-0.2.0/tests/unit}/__init__.py +0 -0
  275. {open_data_sci-0.1.0/tests/unit/agents → open_data_sci-0.2.0/tests/unit/_tui}/__init__.py +0 -0
  276. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/_tui/test_service.py +0 -0
  277. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/_tui/test_session.py +0 -0
  278. {open_data_sci-0.1.0/tests/unit/context → open_data_sci-0.2.0/tests/unit/_utils}/__init__.py +0 -0
  279. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/_utils/test_data_formats.py +0 -0
  280. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/_utils/test_hash_utils.py +0 -0
  281. {open_data_sci-0.1.0/tests/unit/models → open_data_sci-0.2.0/tests/unit/agents}/__init__.py +0 -0
  282. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/agents/test_agents_factory.py +0 -0
  283. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/conftest.py +0 -0
  284. {open_data_sci-0.1.0/tests/unit/prompts → open_data_sci-0.2.0/tests/unit/context}/__init__.py +0 -0
  285. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/context/test_local_work_context.py +0 -0
  286. {open_data_sci-0.1.0/tests/unit/sandbox → open_data_sci-0.2.0/tests/unit/human_inputs}/__init__.py +0 -0
  287. {open_data_sci-0.1.0/tests/unit/skills → open_data_sci-0.2.0/tests/unit/memory}/__init__.py +0 -0
  288. {open_data_sci-0.1.0/tests/unit/streaming → open_data_sci-0.2.0/tests/unit/models}/__init__.py +0 -0
  289. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/models/test_aws.py +0 -0
  290. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/models/test_google.py +0 -0
  291. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/models/test_microsoft.py +0 -0
  292. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/models/test_openai.py +0 -0
  293. {open_data_sci-0.1.0/tests/unit/tools → open_data_sci-0.2.0/tests/unit/prompts}/__init__.py +0 -0
  294. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/prompts/test_caching.py +0 -0
  295. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/sandbox/test_cli_validation.py +0 -0
  296. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/sandbox/test_exec_result.py +0 -0
  297. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/sandbox/test_runner.py +0 -0
  298. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/sandbox/test_srt.py +0 -0
  299. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/tools/test_mcp.py +0 -0
  300. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/tools/test_web.py +0 -0
  301. {open_data_sci-0.1.0 → open_data_sci-0.2.0}/tests/unit/tools/test_workspace.py +0 -0
@@ -78,9 +78,8 @@ LLM_SERVER_BASE_URL=
78
78
  # (falls back to "EMPTY" when unset, which works for most local servers):
79
79
  # OPENAI_API_KEY=
80
80
 
81
- # ── Sampling & reasoning ───────────────────────────────
81
+ # ── Sampling ───────────────────────────────────────────
82
82
  TEMPERATURE=
83
- THINKING_BUDGET=
84
83
 
85
84
  # ── Agent customization ────────────────────────────────
86
85
  NAME=
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: open-data-sci
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: AI agent for data science and machine learning
5
5
  Project-URL: Homepage, https://github.com/f4roukb/open-data-sci
6
6
  Project-URL: Repository, https://github.com/f4roukb/open-data-sci
@@ -218,7 +218,7 @@ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
218
218
  Requires-Python: <3.13,>=3.12
219
219
  Requires-Dist: catboost<2.0.0,>=1.2.0
220
220
  Requires-Dist: category-encoders<3.0.0,>=2.6.0
221
- Requires-Dist: connectorx<1.0.0,>=0.3.0
221
+ Requires-Dist: duckdb<2.0.0,>=1.0.0
222
222
  Requires-Dist: duckduckgo-search<7.0.0,>=6.0.0
223
223
  Requires-Dist: httpx<1.0.0,>=0.27.0
224
224
  Requires-Dist: imbalanced-learn<1.0.0,>=0.12.0
@@ -300,6 +300,7 @@ A production-grade AI agent for data science and machine learning. See the [proj
300
300
  - [Python SDK](#python-sdk)
301
301
  - [Models](#models)
302
302
  - [Configuration](#configuration)
303
+ - [Custom Skills](#custom-skills)
303
304
  - [Environment Variables](#environment-variables)
304
305
 
305
306
  ---
@@ -384,7 +385,7 @@ To use a different provider, pass `--provider`:
384
385
 
385
386
  ```bash
386
387
  opendatasci data.csv --provider openai --api-key sk-...
387
- opendatasci data.csv --provider ollama --model llama3.2:3b # local, no key needed
388
+ opendatasci data.csv --provider ollama --model qwen3.5:9b # local, no key needed
388
389
  ```
389
390
 
390
391
  ### Setup with a config file
@@ -394,11 +395,10 @@ For a reusable configuration across projects, create a YAML file and pass it wit
394
395
  ```yaml
395
396
  # datasci.yaml
396
397
  provider: anthropic
397
- model: claude-sonnet-4-6
398
+ model: claude-sonnet-5
398
399
  secondary_provider: openai
399
- secondary_model: gpt-4o-mini
400
+ secondary_model: gpt-5.6-luna
400
401
  temperature: 0.1
401
- thinking_budget: 8000
402
402
  ```
403
403
 
404
404
  ```bash
@@ -445,7 +445,6 @@ opendatasci PATH [OPTIONS]
445
445
  | `--secondary-model` | *(provider default)* | Secondary model name for lightweight tasks (summarisation, etc.) |
446
446
  | `--api-key` | *(env var)* | API key for the primary provider. Falls back to the standard env var for the selected provider |
447
447
  | `--theme` | `default` | Colour palette. Choices: `default`, `accessible`, `light`, `solarized`, `dracula`. Run `/themes` inside the TUI for descriptions |
448
- | `--debug` | `false` | Enable debug output — writes a detailed `opendatasci_debug.log` |
449
448
  | `--config` | *(none)* | Path to a YAML file containing `OpenDataSciConfig` fields; explicit TUI flags take precedence |
450
449
  | `--list-providers` | | Print all supported providers and their default models, then exit |
451
450
  | `--version` | | Print the installed version, then exit |
@@ -457,7 +456,7 @@ opendatasci PATH [OPTIONS]
457
456
  opendatasci data.xlsx
458
457
 
459
458
  # Switch provider and primary model
460
- opendatasci data.csv --provider openai --model gpt-4o
459
+ opendatasci data.csv --provider openai --model gpt-5.6-sol
461
460
 
462
461
  # Bedrock with a region
463
462
  REGION=us-west-2 opendatasci ./project/ --provider bedrock
@@ -466,7 +465,7 @@ REGION=us-west-2 opendatasci ./project/ --provider bedrock
466
465
  opendatasci data.parquet --theme accessible
467
466
 
468
467
  # Mix providers — heavy model on one, lightweight secondary on another
469
- opendatasci data.csv --provider anthropic --secondary-provider openai --secondary-model gpt-5.4-mini
468
+ opendatasci data.csv --provider anthropic --secondary-provider openai --secondary-model gpt-5.6-luna
470
469
 
471
470
  # See all available providers
472
471
  opendatasci --list-providers
@@ -480,6 +479,8 @@ Type `/` in the input box to trigger autocomplete. All commands are available at
480
479
 
481
480
  | Command | Description |
482
481
  |---------|-------------|
482
+ | `/cancel-all-messages` | Cancel all messages queued while the agent was busy |
483
+ | `/cancel-message` | Cancel the most recently queued message |
483
484
  | `/clear` | Clear conversation context (preserves session variables and loaded data) |
484
485
  | `/compact` | Summarise and compress conversation history to free up context |
485
486
  | `/help` | Show all available commands |
@@ -490,6 +491,8 @@ Type `/` in the input box to trigger autocomplete. All commands are available at
490
491
  | `/themes` | List available colour themes with descriptions |
491
492
  | `/exit` | Quit OpenDataSci |
492
493
 
494
+ Sending a message while the agent is still working doesn't reject it — it's pinned above the input box as a queued message and run automatically, in order, once the agent finishes (unless the agent is waiting on your answer to a question). Use `/cancel-message` or `/cancel-all-messages` to discard queued messages instead of waiting for them to run.
495
+
493
496
  ---
494
497
 
495
498
  ## File Attachments
@@ -554,7 +557,7 @@ from opendatasci import OpenDataSciConfig, create_agent
554
557
 
555
558
  config = OpenDataSciConfig(
556
559
  provider="openai",
557
- model="gpt-4o",
560
+ model="gpt-5.6-sol",
558
561
  openai_api_key="sk-...",
559
562
  temperature=0.2,
560
563
  )
@@ -580,7 +583,18 @@ async with create_agent("data.parquet", config=config) as agent:
580
583
  | `google_cloud_project` | GCP project ID for Vertex AI (env: `GOOGLE_CLOUD_PROJECT`) |
581
584
  | `google_cloud_location` | Vertex AI region (env: `GOOGLE_CLOUD_LOCATION`) |
582
585
  | `azure_endpoint` | Azure OpenAI resource endpoint URL (env: `AZURE_OPENAI_ENDPOINT`) |
586
+ | `azure_api_version` | Azure OpenAI API version — defaults to `2025-01-01-preview` (env: `AZURE_OPENAI_API_VERSION`) |
583
587
  | `llm_server_base_url` | Custom API base URL — required for `ollama` and `openai_compatible_server` (env: `LLM_SERVER_BASE_URL`) |
588
+ | `temperature` | Sampling temperature — not sent to Claude 4.6+ / Sonnet 5 models, which use adaptive thinking (env: `TEMPERATURE`) |
589
+ | `name` | Display name for the agent — defaults to `"Sai"` (env: `NAME`) |
590
+ | `mcp_servers` | List of MCP server URLs the agent may connect to (env: `MCP_SERVERS`) |
591
+ | `extra_web_domains` | Additional hostnames the `fetch_url` tool may retrieve, on top of the built-in allowlist (env: `EXTRA_FETCH_DOMAINS`) |
592
+ | `override_web_domains` | When set, replaces the built-in domain allowlist entirely — `extra_web_domains` is still applied on top |
593
+ | `skills_directory` | Path to a directory of custom skill files loaded in addition to built-ins (env: `SKILLS_DIRECTORY`) |
594
+ | `builtin_skills_directory` | Path to the built-in skills directory — override only to replace defaults entirely (env: `BUILTIN_SKILLS_DIRECTORY`) |
595
+ | `worker_timeout_seconds` | Max seconds to wait for spawned workers to finish — `null` disables the timeout, default `300` (env: `WORKER_TIMEOUT_SECONDS`) |
596
+ | `midturn_compaction_threshold` | Token count at which context is compacted mid-turn — default `96000` (env: `MIDTURN_COMPACTION_THRESHOLD`) |
597
+ | `local_code_exec_timeout` | Max seconds for a single sandboxed code-execution run — default `1800` (env: `CODE_EXEC_TIMEOUT`) |
584
598
 
585
599
  ---
586
600
 
@@ -590,14 +604,14 @@ OpenDataSci supports every major LLM provider. Pass `--provider` to the TUI or s
590
604
 
591
605
  | Provider | Flag | Extra required | Default model |
592
606
  |----------|------|----------------|---------------|
593
- | Anthropic | `anthropic` | *(none — default)* | `claude-sonnet-4-6` |
594
- | OpenAI | `openai` | *(none)* | `gpt-5.5` |
595
- | OpenAI-compatible server (e.g. vLLM) | `openai_compatible_server` | *(none)* | `meta-llama/Llama-3.2-3B-Instruct` |
596
- | AWS Bedrock | `bedrock` | `open-data-sci[aws]` | `us.anthropic.claude-sonnet-4-6` |
597
- | Google Gemini | `gemini` | `open-data-sci[gemini]` | `gemini-2.5-pro` |
598
- | Google Vertex AI | `vertexai` | `open-data-sci[gcp]` | `gemini-2.5-pro` |
599
- | Azure OpenAI | `azure` | `open-data-sci[azure]` | `gpt-4o` |
600
- | Ollama | `ollama` | `open-data-sci[ollama]` | `llama3.2:3b` |
607
+ | Anthropic | `anthropic` | *(none — default)* | `claude-sonnet-5` |
608
+ | OpenAI | `openai` | *(none)* | `gpt-5.6-sol` |
609
+ | OpenAI-compatible server (e.g. vLLM) | `openai_compatible_server` | *(none)* | `Qwen/Qwen3.5-4B` |
610
+ | AWS Bedrock | `bedrock` | `open-data-sci[aws]` | `us.anthropic.claude-sonnet-5` |
611
+ | Google Gemini | `gemini` | `open-data-sci[gemini]` | `gemini-3.5-flash` |
612
+ | Google Vertex AI | `vertexai` | `open-data-sci[gcp]` | `gemini-3.5-flash` |
613
+ | Azure OpenAI | `azure` | `open-data-sci[azure]` | `gpt-5.6-sol` |
614
+ | Ollama | `ollama` | `open-data-sci[ollama]` | `qwen3.5:9b` |
601
615
 
602
616
  Pass `--list-providers` to print this table from the TUI at any time.
603
617
 
@@ -611,19 +625,94 @@ Place these files inside your workspace's `.opendatasci/` directory:
611
625
 
612
626
  | Path | Purpose |
613
627
  |------|---------|
614
- | `.opendatasci/mcp.json` | MCP server URLs — connects the agent to external tool servers |
628
+ | `.opendatasci/mcp.json` | MCP server definitions — connects the agent to external tool servers |
615
629
  | `.opendatasci/plans/` | Persisted plan files — auto-managed, one file per planning session |
616
630
 
631
+ `mcp.json` uses the same convention as Cursor:
632
+
633
+ ```json
634
+ {
635
+ "mcpServers": {
636
+ "my-server": { "url": "http://localhost:8080" },
637
+ "another": { "url": "http://localhost:9000" }
638
+ }
639
+ }
640
+ ```
641
+
642
+ ---
643
+
644
+ ## Custom Skills
645
+
646
+ Skills are Markdown (or YAML/JSON) files that give the agent a specialised persona and instruction set. OpenDataSci ships several built-in skills; you can add your own at the workspace level or point the agent at any directory you choose.
647
+
648
+ ### Workspace skills (recommended)
649
+
650
+ Place skill files inside `.opendatasci/skills/` in your workspace directory — they are picked up automatically, no configuration needed:
651
+
652
+ ```
653
+ <workspace>/
654
+ └── .opendatasci/
655
+ ├── skills/
656
+ │ ├── my_skill.md # standalone skill named "my_skill"
657
+ │ └── my_domain/
658
+ │ └── specialist.md # domain-scoped skill: "my_domain::specialist"
659
+ └── skill_domains/
660
+ └── my_domain/
661
+ └── manifest.md # optional domain manifest
662
+ ```
663
+
664
+ Subdirectories create *domain-scoped* skills. The agent refers to them with the `domain::skill` naming convention (e.g. `my_domain::specialist`).
665
+
666
+ ### File format
667
+
668
+ Skill files must be `.md`. The filename stem becomes the skill name and the file body is the prompt content. Files with any other extension are silently ignored.
669
+
670
+ ```markdown
671
+ <!-- .opendatasci/skills/forecasting.md -->
672
+ You are a time-series forecasting specialist. When analysing data, always...
673
+ ```
674
+
675
+ ### Global skills directory
676
+
677
+ To share skills across workspaces, set `SKILLS_DIRECTORY` in your environment or `.env` file:
678
+
679
+ ```bash
680
+ SKILLS_DIRECTORY=/home/user/my-skills
681
+ ```
682
+
683
+ This directory is scanned *in addition to* the workspace `.opendatasci/skills/` directory and the built-in skills. When two sources define a skill with the same name, the later source wins (built-ins → workspace → `SKILLS_DIRECTORY`).
684
+
685
+ You can also pass `skills_directory` directly when using the Python SDK:
686
+
687
+ ```python
688
+ from opendatasci import OpenDataSciConfig, create_agent
689
+
690
+ config = OpenDataSciConfig(skills_directory="/home/user/my-skills")
691
+
692
+ async with create_agent("data.csv", config=config) as agent:
693
+ ...
694
+ ```
695
+
617
696
  ### Environment variables
618
697
 
619
698
  | Variable | Description |
620
699
  |----------|-------------|
621
700
  | `ANTHROPIC_API_KEY` | API key for the Anthropic provider |
622
- | `OPENAI_API_KEY` | API key for the OpenAI provider |
623
- | `REGION` | Cloud provider region |
701
+ | `OPENAI_API_KEY` | API key for the OpenAI / OpenAI-compatible server provider |
702
+ | `GOOGLE_API_KEY` | API key for the Google Gemini provider |
703
+ | `AZURE_OPENAI_API_KEY` | API key for the Azure OpenAI provider |
704
+ | `REGION` | AWS region for Bedrock |
705
+ | `GOOGLE_CLOUD_PROJECT` | GCP project ID for Vertex AI |
706
+ | `GOOGLE_CLOUD_LOCATION` | Vertex AI region / location |
707
+ | `AZURE_OPENAI_ENDPOINT` | Azure OpenAI resource endpoint URL |
708
+ | `AZURE_OPENAI_API_VERSION` | Azure OpenAI API version (default: `2025-01-01-preview`) |
624
709
  | `LLM_SERVER_BASE_URL` | Custom API base URL — used by `ollama` and `openai_compatible_server` providers |
625
- | `SKILLS_DIRECTORY` | Path to a directory of user-defined skill files (overrides none by default) |
626
- | `BUILTIN_SKILLS_DIRECTORY` | Path to the built-in skills directory (defaults to the bundled `resources/skills`) |
710
+ | `TEMPERATURE` | LLM sampling temperature |
711
+ | `MCP_SERVERS` | Comma-separated list of MCP server URLs |
712
+ | `SKILLS_DIRECTORY` | Path to a directory of user-defined skill files |
713
+ | `BUILTIN_SKILLS_DIRECTORY` | Path to the built-in skills directory (defaults to the bundled skills) |
714
+ | `WORKER_TIMEOUT_SECONDS` | Max seconds to wait for spawned workers (default: `300`) |
715
+ | `MIDTURN_COMPACTION_THRESHOLD` | Token count at which context is compacted mid-turn (default: `96000`) |
627
716
  | `CODE_EXEC_TIMEOUT` | Max seconds for a single sandboxed code execution (default: `1800`) |
628
717
 
629
718
  A `.env` file in the working directory is loaded automatically at startup.
@@ -14,6 +14,7 @@ A production-grade AI agent for data science and machine learning. See the [proj
14
14
  - [Python SDK](#python-sdk)
15
15
  - [Models](#models)
16
16
  - [Configuration](#configuration)
17
+ - [Custom Skills](#custom-skills)
17
18
  - [Environment Variables](#environment-variables)
18
19
 
19
20
  ---
@@ -98,7 +99,7 @@ To use a different provider, pass `--provider`:
98
99
 
99
100
  ```bash
100
101
  opendatasci data.csv --provider openai --api-key sk-...
101
- opendatasci data.csv --provider ollama --model llama3.2:3b # local, no key needed
102
+ opendatasci data.csv --provider ollama --model qwen3.5:9b # local, no key needed
102
103
  ```
103
104
 
104
105
  ### Setup with a config file
@@ -108,11 +109,10 @@ For a reusable configuration across projects, create a YAML file and pass it wit
108
109
  ```yaml
109
110
  # datasci.yaml
110
111
  provider: anthropic
111
- model: claude-sonnet-4-6
112
+ model: claude-sonnet-5
112
113
  secondary_provider: openai
113
- secondary_model: gpt-4o-mini
114
+ secondary_model: gpt-5.6-luna
114
115
  temperature: 0.1
115
- thinking_budget: 8000
116
116
  ```
117
117
 
118
118
  ```bash
@@ -159,7 +159,6 @@ opendatasci PATH [OPTIONS]
159
159
  | `--secondary-model` | *(provider default)* | Secondary model name for lightweight tasks (summarisation, etc.) |
160
160
  | `--api-key` | *(env var)* | API key for the primary provider. Falls back to the standard env var for the selected provider |
161
161
  | `--theme` | `default` | Colour palette. Choices: `default`, `accessible`, `light`, `solarized`, `dracula`. Run `/themes` inside the TUI for descriptions |
162
- | `--debug` | `false` | Enable debug output — writes a detailed `opendatasci_debug.log` |
163
162
  | `--config` | *(none)* | Path to a YAML file containing `OpenDataSciConfig` fields; explicit TUI flags take precedence |
164
163
  | `--list-providers` | | Print all supported providers and their default models, then exit |
165
164
  | `--version` | | Print the installed version, then exit |
@@ -171,7 +170,7 @@ opendatasci PATH [OPTIONS]
171
170
  opendatasci data.xlsx
172
171
 
173
172
  # Switch provider and primary model
174
- opendatasci data.csv --provider openai --model gpt-4o
173
+ opendatasci data.csv --provider openai --model gpt-5.6-sol
175
174
 
176
175
  # Bedrock with a region
177
176
  REGION=us-west-2 opendatasci ./project/ --provider bedrock
@@ -180,7 +179,7 @@ REGION=us-west-2 opendatasci ./project/ --provider bedrock
180
179
  opendatasci data.parquet --theme accessible
181
180
 
182
181
  # Mix providers — heavy model on one, lightweight secondary on another
183
- opendatasci data.csv --provider anthropic --secondary-provider openai --secondary-model gpt-5.4-mini
182
+ opendatasci data.csv --provider anthropic --secondary-provider openai --secondary-model gpt-5.6-luna
184
183
 
185
184
  # See all available providers
186
185
  opendatasci --list-providers
@@ -194,6 +193,8 @@ Type `/` in the input box to trigger autocomplete. All commands are available at
194
193
 
195
194
  | Command | Description |
196
195
  |---------|-------------|
196
+ | `/cancel-all-messages` | Cancel all messages queued while the agent was busy |
197
+ | `/cancel-message` | Cancel the most recently queued message |
197
198
  | `/clear` | Clear conversation context (preserves session variables and loaded data) |
198
199
  | `/compact` | Summarise and compress conversation history to free up context |
199
200
  | `/help` | Show all available commands |
@@ -204,6 +205,8 @@ Type `/` in the input box to trigger autocomplete. All commands are available at
204
205
  | `/themes` | List available colour themes with descriptions |
205
206
  | `/exit` | Quit OpenDataSci |
206
207
 
208
+ Sending a message while the agent is still working doesn't reject it — it's pinned above the input box as a queued message and run automatically, in order, once the agent finishes (unless the agent is waiting on your answer to a question). Use `/cancel-message` or `/cancel-all-messages` to discard queued messages instead of waiting for them to run.
209
+
207
210
  ---
208
211
 
209
212
  ## File Attachments
@@ -268,7 +271,7 @@ from opendatasci import OpenDataSciConfig, create_agent
268
271
 
269
272
  config = OpenDataSciConfig(
270
273
  provider="openai",
271
- model="gpt-4o",
274
+ model="gpt-5.6-sol",
272
275
  openai_api_key="sk-...",
273
276
  temperature=0.2,
274
277
  )
@@ -294,7 +297,18 @@ async with create_agent("data.parquet", config=config) as agent:
294
297
  | `google_cloud_project` | GCP project ID for Vertex AI (env: `GOOGLE_CLOUD_PROJECT`) |
295
298
  | `google_cloud_location` | Vertex AI region (env: `GOOGLE_CLOUD_LOCATION`) |
296
299
  | `azure_endpoint` | Azure OpenAI resource endpoint URL (env: `AZURE_OPENAI_ENDPOINT`) |
300
+ | `azure_api_version` | Azure OpenAI API version — defaults to `2025-01-01-preview` (env: `AZURE_OPENAI_API_VERSION`) |
297
301
  | `llm_server_base_url` | Custom API base URL — required for `ollama` and `openai_compatible_server` (env: `LLM_SERVER_BASE_URL`) |
302
+ | `temperature` | Sampling temperature — not sent to Claude 4.6+ / Sonnet 5 models, which use adaptive thinking (env: `TEMPERATURE`) |
303
+ | `name` | Display name for the agent — defaults to `"Sai"` (env: `NAME`) |
304
+ | `mcp_servers` | List of MCP server URLs the agent may connect to (env: `MCP_SERVERS`) |
305
+ | `extra_web_domains` | Additional hostnames the `fetch_url` tool may retrieve, on top of the built-in allowlist (env: `EXTRA_FETCH_DOMAINS`) |
306
+ | `override_web_domains` | When set, replaces the built-in domain allowlist entirely — `extra_web_domains` is still applied on top |
307
+ | `skills_directory` | Path to a directory of custom skill files loaded in addition to built-ins (env: `SKILLS_DIRECTORY`) |
308
+ | `builtin_skills_directory` | Path to the built-in skills directory — override only to replace defaults entirely (env: `BUILTIN_SKILLS_DIRECTORY`) |
309
+ | `worker_timeout_seconds` | Max seconds to wait for spawned workers to finish — `null` disables the timeout, default `300` (env: `WORKER_TIMEOUT_SECONDS`) |
310
+ | `midturn_compaction_threshold` | Token count at which context is compacted mid-turn — default `96000` (env: `MIDTURN_COMPACTION_THRESHOLD`) |
311
+ | `local_code_exec_timeout` | Max seconds for a single sandboxed code-execution run — default `1800` (env: `CODE_EXEC_TIMEOUT`) |
298
312
 
299
313
  ---
300
314
 
@@ -304,14 +318,14 @@ OpenDataSci supports every major LLM provider. Pass `--provider` to the TUI or s
304
318
 
305
319
  | Provider | Flag | Extra required | Default model |
306
320
  |----------|------|----------------|---------------|
307
- | Anthropic | `anthropic` | *(none — default)* | `claude-sonnet-4-6` |
308
- | OpenAI | `openai` | *(none)* | `gpt-5.5` |
309
- | OpenAI-compatible server (e.g. vLLM) | `openai_compatible_server` | *(none)* | `meta-llama/Llama-3.2-3B-Instruct` |
310
- | AWS Bedrock | `bedrock` | `open-data-sci[aws]` | `us.anthropic.claude-sonnet-4-6` |
311
- | Google Gemini | `gemini` | `open-data-sci[gemini]` | `gemini-2.5-pro` |
312
- | Google Vertex AI | `vertexai` | `open-data-sci[gcp]` | `gemini-2.5-pro` |
313
- | Azure OpenAI | `azure` | `open-data-sci[azure]` | `gpt-4o` |
314
- | Ollama | `ollama` | `open-data-sci[ollama]` | `llama3.2:3b` |
321
+ | Anthropic | `anthropic` | *(none — default)* | `claude-sonnet-5` |
322
+ | OpenAI | `openai` | *(none)* | `gpt-5.6-sol` |
323
+ | OpenAI-compatible server (e.g. vLLM) | `openai_compatible_server` | *(none)* | `Qwen/Qwen3.5-4B` |
324
+ | AWS Bedrock | `bedrock` | `open-data-sci[aws]` | `us.anthropic.claude-sonnet-5` |
325
+ | Google Gemini | `gemini` | `open-data-sci[gemini]` | `gemini-3.5-flash` |
326
+ | Google Vertex AI | `vertexai` | `open-data-sci[gcp]` | `gemini-3.5-flash` |
327
+ | Azure OpenAI | `azure` | `open-data-sci[azure]` | `gpt-5.6-sol` |
328
+ | Ollama | `ollama` | `open-data-sci[ollama]` | `qwen3.5:9b` |
315
329
 
316
330
  Pass `--list-providers` to print this table from the TUI at any time.
317
331
 
@@ -325,19 +339,94 @@ Place these files inside your workspace's `.opendatasci/` directory:
325
339
 
326
340
  | Path | Purpose |
327
341
  |------|---------|
328
- | `.opendatasci/mcp.json` | MCP server URLs — connects the agent to external tool servers |
342
+ | `.opendatasci/mcp.json` | MCP server definitions — connects the agent to external tool servers |
329
343
  | `.opendatasci/plans/` | Persisted plan files — auto-managed, one file per planning session |
330
344
 
345
+ `mcp.json` uses the same convention as Cursor:
346
+
347
+ ```json
348
+ {
349
+ "mcpServers": {
350
+ "my-server": { "url": "http://localhost:8080" },
351
+ "another": { "url": "http://localhost:9000" }
352
+ }
353
+ }
354
+ ```
355
+
356
+ ---
357
+
358
+ ## Custom Skills
359
+
360
+ Skills are Markdown (or YAML/JSON) files that give the agent a specialised persona and instruction set. OpenDataSci ships several built-in skills; you can add your own at the workspace level or point the agent at any directory you choose.
361
+
362
+ ### Workspace skills (recommended)
363
+
364
+ Place skill files inside `.opendatasci/skills/` in your workspace directory — they are picked up automatically, no configuration needed:
365
+
366
+ ```
367
+ <workspace>/
368
+ └── .opendatasci/
369
+ ├── skills/
370
+ │ ├── my_skill.md # standalone skill named "my_skill"
371
+ │ └── my_domain/
372
+ │ └── specialist.md # domain-scoped skill: "my_domain::specialist"
373
+ └── skill_domains/
374
+ └── my_domain/
375
+ └── manifest.md # optional domain manifest
376
+ ```
377
+
378
+ Subdirectories create *domain-scoped* skills. The agent refers to them with the `domain::skill` naming convention (e.g. `my_domain::specialist`).
379
+
380
+ ### File format
381
+
382
+ Skill files must be `.md`. The filename stem becomes the skill name and the file body is the prompt content. Files with any other extension are silently ignored.
383
+
384
+ ```markdown
385
+ <!-- .opendatasci/skills/forecasting.md -->
386
+ You are a time-series forecasting specialist. When analysing data, always...
387
+ ```
388
+
389
+ ### Global skills directory
390
+
391
+ To share skills across workspaces, set `SKILLS_DIRECTORY` in your environment or `.env` file:
392
+
393
+ ```bash
394
+ SKILLS_DIRECTORY=/home/user/my-skills
395
+ ```
396
+
397
+ This directory is scanned *in addition to* the workspace `.opendatasci/skills/` directory and the built-in skills. When two sources define a skill with the same name, the later source wins (built-ins → workspace → `SKILLS_DIRECTORY`).
398
+
399
+ You can also pass `skills_directory` directly when using the Python SDK:
400
+
401
+ ```python
402
+ from opendatasci import OpenDataSciConfig, create_agent
403
+
404
+ config = OpenDataSciConfig(skills_directory="/home/user/my-skills")
405
+
406
+ async with create_agent("data.csv", config=config) as agent:
407
+ ...
408
+ ```
409
+
331
410
  ### Environment variables
332
411
 
333
412
  | Variable | Description |
334
413
  |----------|-------------|
335
414
  | `ANTHROPIC_API_KEY` | API key for the Anthropic provider |
336
- | `OPENAI_API_KEY` | API key for the OpenAI provider |
337
- | `REGION` | Cloud provider region |
415
+ | `OPENAI_API_KEY` | API key for the OpenAI / OpenAI-compatible server provider |
416
+ | `GOOGLE_API_KEY` | API key for the Google Gemini provider |
417
+ | `AZURE_OPENAI_API_KEY` | API key for the Azure OpenAI provider |
418
+ | `REGION` | AWS region for Bedrock |
419
+ | `GOOGLE_CLOUD_PROJECT` | GCP project ID for Vertex AI |
420
+ | `GOOGLE_CLOUD_LOCATION` | Vertex AI region / location |
421
+ | `AZURE_OPENAI_ENDPOINT` | Azure OpenAI resource endpoint URL |
422
+ | `AZURE_OPENAI_API_VERSION` | Azure OpenAI API version (default: `2025-01-01-preview`) |
338
423
  | `LLM_SERVER_BASE_URL` | Custom API base URL — used by `ollama` and `openai_compatible_server` providers |
339
- | `SKILLS_DIRECTORY` | Path to a directory of user-defined skill files (overrides none by default) |
340
- | `BUILTIN_SKILLS_DIRECTORY` | Path to the built-in skills directory (defaults to the bundled `resources/skills`) |
424
+ | `TEMPERATURE` | LLM sampling temperature |
425
+ | `MCP_SERVERS` | Comma-separated list of MCP server URLs |
426
+ | `SKILLS_DIRECTORY` | Path to a directory of user-defined skill files |
427
+ | `BUILTIN_SKILLS_DIRECTORY` | Path to the built-in skills directory (defaults to the bundled skills) |
428
+ | `WORKER_TIMEOUT_SECONDS` | Max seconds to wait for spawned workers (default: `300`) |
429
+ | `MIDTURN_COMPACTION_THRESHOLD` | Token count at which context is compacted mid-turn (default: `96000`) |
341
430
  | `CODE_EXEC_TIMEOUT` | Max seconds for a single sandboxed code execution (default: `1800`) |
342
431
 
343
432
  A `.env` file in the working directory is loaded automatically at startup.
@@ -1,6 +1,6 @@
1
1
  # Agent
2
2
 
3
- `Agent` is the core conversational AI agent. It wraps a LangGraph state machine that orchestrates LLM calls, tool execution, concurrent workers, and rolling memory.
3
+ `Agent` is the core conversational AI agent. It orchestrates LLM calls, tool execution, concurrent workers, and rolling memory automatically, so you only need to send queries and consume the resulting stream.
4
4
 
5
5
  ## Lifecycle
6
6
 
@@ -55,8 +55,8 @@ async for event in agent.astream(query):
55
55
  | Method | Description |
56
56
  |--------|-------------|
57
57
  | `clear_chat_history()` | Remove all messages and rolling memory summaries. Preserves sandbox state. |
58
- | `rewind_turn()` | Remove only the last turn (user message + agent response) from the graph state. |
59
- | `compact_chat_history()` | Use the LLM to summarise old turns, then discard them. Returns the summary text. Use this instead of `clear_chat_history` when you want to keep context across a long session without blowing up the context window. |
58
+ | `rewind_turn()` | Remove only the last turn (user message + agent response) from the conversation. |
59
+ | `compact_chat_history()` | Fold all turn summaries and any existing compaction into a single `ChatHistoryCompaction` record. Returns the compaction text. Use this instead of `clear_chat_history` when you want to preserve context across a long session. |
60
60
 
61
61
  ```python
62
62
  # After many turns, compact instead of clearing:
@@ -72,11 +72,49 @@ print("Compacted:", summary)
72
72
  show_source: false
73
73
  members:
74
74
  - astream
75
- - resume_with_input
76
75
  - rewind_turn
77
76
  - clear_chat_history
78
77
  - compact_chat_history
79
- - graph
78
+
79
+ ---
80
+
81
+ ## Session manager
82
+
83
+ A session manager tracks the mapping from a session to its conversation threads in the graph checkpointer. Clearing the conversation (`clear_chat_history`) creates a new thread, so no prior state is visible to the LLM on the next turn.
84
+
85
+ The default `LocalSessionManager` persists this mapping to `.opendatasci/session.json` inside the workspace. For cloud or multi-process deployments — where two agent instances must share a conversation — replace it with a custom `BaseSessionManager` backed by shared storage:
86
+
87
+ ```python
88
+ import uuid
89
+ from opendatasci.session.session_manager import BaseSessionManager
90
+
91
+ class RedisSessionManager(BaseSessionManager):
92
+ def get_or_create_thread(self) -> uuid.UUID: ...
93
+ def create_thread(self) -> uuid.UUID: ...
94
+ def get_current_thread(self) -> uuid.UUID: ...
95
+
96
+ from opendatasci.agents.agents import Agent
97
+ from opendatasci import LocalWorkspace, OpenDataSciConfig
98
+
99
+ async with Agent(
100
+ workspace=LocalWorkspace("data/"),
101
+ session_manager=RedisSessionManager(),
102
+ config=OpenDataSciConfig(),
103
+ ) as agent:
104
+ ...
105
+ ```
106
+
107
+ ::: opendatasci.session.session_manager.BaseSessionManager
108
+ options:
109
+ show_root_heading: true
110
+ show_source: false
111
+
112
+ ---
113
+
114
+ ::: opendatasci.session.session_manager.LocalSessionManager
115
+ options:
116
+ show_root_heading: true
117
+ show_source: false
80
118
 
81
119
  ---
82
120
 
@@ -89,4 +127,4 @@ print("Compacted:", summary)
89
127
  show_root_heading: true
90
128
  show_source: false
91
129
  members:
92
- - run
130
+ - ainvoke
@@ -1,6 +1,6 @@
1
1
  # OpenDataSciConfig
2
2
 
3
- `OpenDataSciConfig` is the single configuration object accepted by `create_agent` and `Agent`. It extends Pydantic's `BaseSettings`, so every field can be set via:
3
+ `OpenDataSciConfig` is the single configuration object accepted by `create_agent` and `Agent`. Every field can be set via:
4
4
 
5
5
  1. Direct constructor argument
6
6
  2. Environment variable (see the alias column below)
@@ -14,13 +14,13 @@ TUI flags always take precedence over all of the above.
14
14
  ```python
15
15
  from opendatasci import OpenDataSciConfig
16
16
 
17
- # Defaults — uses Anthropic with claude-sonnet-4-6
17
+ # Defaults — uses Anthropic with claude-sonnet-5
18
18
  config = OpenDataSciConfig()
19
19
 
20
20
  # OpenAI with custom temperature
21
21
  config = OpenDataSciConfig(
22
22
  provider="openai",
23
- model="gpt-4o",
23
+ model="gpt-5.6-sol",
24
24
  openai_api_key="sk-...",
25
25
  temperature=0.2,
26
26
  )
@@ -29,7 +29,7 @@ config = OpenDataSciConfig(
29
29
  config = OpenDataSciConfig(
30
30
  provider="anthropic",
31
31
  secondary_provider="openai",
32
- secondary_model="gpt-4o-mini",
32
+ secondary_model="gpt-5.6-luna",
33
33
  openai_api_key="sk-...",
34
34
  )
35
35
 
@@ -72,15 +72,14 @@ config = OpenDataSciConfig.from_yaml("opendatasci_config.yaml")
72
72
 
73
73
  | Field | Env var | Default | Description |
74
74
  |-------|---------|---------|-------------|
75
- | `temperature` | `TEMPERATURE` | `0.0` | LLM sampling temperature |
76
- | `thinking_budget` | `THINKING_BUDGET` | `8192` | Extended-thinking token budget (Anthropic / Bedrock) |
75
+ | `temperature` | `TEMPERATURE` | `0.0` | LLM sampling temperature (not sent to Claude 4.6+ / Sonnet 5 models) |
77
76
 
78
77
  ### Agent behaviour
79
78
 
80
79
  | Field | Env var | Default | Description |
81
80
  |-------|---------|---------|-------------|
82
81
  | `name` | `NAME` | `"Sai"` | Agent display name, injected into all system prompts |
83
- | `midturn_compaction_threshold` | `MIDTURN_COMPACTION_THRESHOLD` | `80000` | Token count after which the agent's context is compacted mid-turn |
82
+ | `midturn_compaction_threshold` | `MIDTURN_COMPACTION_THRESHOLD` | `96000` | Token count after which the agent's context is compacted mid-turn |
84
83
  | `worker_timeout_seconds` | `WORKER_TIMEOUT_SECONDS` | `300.0` | Max seconds for all spawned workers to finish (`null` = no timeout) |
85
84
 
86
85
  ### Web access
@@ -115,14 +114,14 @@ config = OpenDataSciConfig.from_yaml("opendatasci_config.yaml")
115
114
 
116
115
  | Provider | Primary model | Secondary model |
117
116
  |----------|--------------|-----------------|
118
- | `anthropic` | `claude-sonnet-4-6` | `claude-haiku-4-5` |
119
- | `openai` | `gpt-5.5` | `gpt-5.4-mini` |
120
- | `bedrock` | `us.anthropic.claude-sonnet-4-6` | `us.anthropic.claude-haiku-4-5-20251001-v1:0` |
121
- | `gemini` | `gemini-2.5-pro` | `gemini-2.5-flash` |
122
- | `vertexai` | `gemini-2.5-pro` | `gemini-2.5-flash` |
123
- | `azure` | `gpt-4o` | `gpt-4o-mini` |
124
- | `ollama` | `llama3.2:3b` | `llama3.2:3b` |
125
- | `openai_compatible_server` | `meta-llama/Llama-3.2-3B-Instruct` | `meta-llama/Llama-3.2-3B-Instruct` |
117
+ | `anthropic` | `claude-sonnet-5` | `claude-haiku-4-5` |
118
+ | `openai` | `gpt-5.6-sol` | `gpt-5.6-luna` |
119
+ | `bedrock` | `us.anthropic.claude-sonnet-5` | `us.anthropic.claude-haiku-4-5-20251001-v1:0` |
120
+ | `gemini` | `gemini-3.5-flash` | `gemini-3.1-flash-lite` |
121
+ | `vertexai` | `gemini-3.5-flash` | `gemini-3.1-flash-lite` |
122
+ | `azure` | `gpt-5.6-sol` | `gpt-5.6-luna` |
123
+ | `ollama` | `qwen3.5:9b` | `qwen3.5:9b` |
124
+ | `openai_compatible_server` | `Qwen/Qwen3.5-4B` | `Qwen/Qwen3.5-4B` |
126
125
 
127
126
  ---
128
127
 
@@ -131,13 +130,12 @@ config = OpenDataSciConfig.from_yaml("opendatasci_config.yaml")
131
130
  ```yaml
132
131
  # opendatasci_config.yaml
133
132
  provider: anthropic
134
- model: claude-sonnet-4-6
133
+ model: claude-sonnet-5
135
134
 
136
135
  secondary_provider: openai
137
- secondary_model: gpt-4o-mini
136
+ secondary_model: gpt-5.6-luna
138
137
 
139
138
  temperature: 0.1
140
- thinking_budget: 8000
141
139
 
142
140
  name: Sai
143
141
 
@@ -153,7 +151,7 @@ midturn_compaction_threshold: 80000
153
151
  config = OpenDataSciConfig.from_yaml("opendatasci_config.yaml")
154
152
  ```
155
153
 
156
- Unknown keys in the YAML file raise `ValueError` with a clear message listing the valid fields.
154
+ Unknown keys in the YAML file are ignored, so config files written for other versions keep loading.
157
155
 
158
156
  ---
159
157